トップページ⇒tech
1001コメント316KB

【初心者歓迎】C/C++室 Ver.9【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (html化待ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(html化待ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(html化待ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/l50

【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい
0153デフォルトの名無しさんNGNG
>>152
そうかなあ、>149はちゃんと正しく書いてるのに。
int*が4と覚えられたらまずいと思うな。
0154デフォルトの名無しさんNGNG
>>153
正しくないよ。

>size = sizeof(a);//コンパイル時に size = 100;になる
size = intのサイズ*100になる
0155デフォルトの名無しさんNGNG
>>154
ほんとだ
0156143NGNG
「静的次元配列に sizeof を使うと、配列全体のサイズを返します」
C解説サイトに書いてました。なんとなく腑に落ちたような。
int*が4とは限らないというのは一応知っているつもりですが。いちおう...
>>148
確かにそういう風に思ってたかも。でも、演算子ってなんなんだ
って逆に思ってしまった。なんだか、キリがないですね。すみません。
0157デフォルトの名無しさんNGNG
アドレスからサイズを求めているのではなく、その変数の型情報からサイズを求めている
という感じかな?
だから

>int a[100];
>int* p = a;
>size = sizeof(p);

sizeof(p)はsizeof(a)ではなくsizeof(int*)と同じになる。
0158デフォルトの名無しさんNGNG
配列とポインタを混同するな。
int a[100], *p; とあったとき、aとpは全然別物。
似たような使い方ができるだけであって、特別に何かをしているわけじゃない。
0159デフォルトの名無しさん NGNG
fooクラスをhogeクラスのメンバ(コンポジション)として使いたい時、

class hoge
{
private:
 int i;
 int j;
 foo myfoo(i,j);//エラー
public:
 hoge();
};

hoge::hoge()
{
 i=100;
 j=200;
}

のように、hogeオブジェクト生成時にそのメンバ変数を引数として
fooオブジェクトを作成することはできないのでしょうか。
上のような書き方ではエラーでコンパイルできませんでした。
引数を取らずにfoo myfoo();と定義すれば
うまくいくようなのですが、これでは別の場所でhogeのi,j値を
渡さないといけないので面倒くさいしなんかかっこ悪いです。
ですがそうしないといけないものなのでしょうか。
0160デフォルトの名無しさんNGNG
ほげ::ほげ():i(100),j(200),まいふー(i,j){}
0161デフォルトの名無しさんNGNG
age
0162デフォルトの名無しさんNGNG
>>159
foo myfoo(); では、foo型のオブジェクトを返すmyfooという名前の関数の
宣言になってしまう。
0163159NGNG
>>160
なんか見たことの無い書き方で
何がどうなってるのか分からないんですが
普通に整形したらどういう感じになるんでしょうか…
0164デフォルトの名無しさんNGNG
>>163
constructorでのmember/base classの初期化構文。
0165デフォルトの名無しさんNGNG
#include <iostream>

class foo {
 double i, j;
public:
 foo(double x = 0, double y = 0) : i(x), j(y) {}
 void printfoo() const { std::cout << std::fixed << i << ", " << j << std::endl; }
};

class hoge {
 int i;
 int j;
 foo myfoo;
public:
 hoge(int x = 100, int y = 100) : i(x), j(y), myfoo(i, j) {}
 void printfoo() { myfoo.printfoo(); }
};

int main()
{
 hoge h;
 h.printfoo();
}
0166159NGNG
>>165
ありがとうございます。
度々申し訳ないのですが、↓のような感じの書き方はできないんでしょうか?
慣れてないものでシンプルな書き方じゃないとよく分からないのです。
試したらエラーがでましたが、>>165とは意味が違ってきてしまうのでしょうか。

class hoge{
private:
 int i;
 int j;
 foo myfoo;
bublic:
 hoge();
}

hoge::hoge()
{
 i=100;
 j=200
 myfoo(i,j);
{
0167デフォルトの名無しさんNGNG
>>166
意味が違うからエラーが出るに決まってんじゃン。

>>165が正しい書き方なのでこれを理解して覚えること。
メンバの初期化に引数つきコンストラクタを呼ぶにはこうするしかない。
メンバ初期設定リストで調べてみ。
0168デフォルトの名無しさんNGNG
少しは自分で調べろよ
検索語句も示されてるのに
知障か?
0169デフォルトの名無しさんNGNG
>>166
何度もいいますようにmyfoo(i, j);というのは関数の呼び出しです。コンストラクタの
呼び出しではありません。そしてmyfoo(int, int)という関数が宣言されていないので
エラーになるのだと思います。

どうしても初期化リストではなくコンストラクタ内からコンストラクタを呼び出すので
あれば、newの配置構文(placement-new)を使うか、単純にfoo型の一時オブジェクト
を作って代入してやればよいです。

class hoge {
int i;
int j;
foo myfoo;
public:
hoge() {
i = 100;
j = 200;
  myfoo = foo(i, j); //foo型の一時変数を代入
// new (&myfoo) foo(i, j); //こちらでもよい
}
void printfoo() const { myfoo.printfoo(); }
};
0170デフォルトの名無しさんNGNG
初めまして、学校の課題で摂氏を華氏に直すプログラムをC++で作ってるのですが
どうもうまくいかなくて行き詰ってしまったので助けてください><
#include<iostream>

using namespace std;

void CalcTemp(float, float,float&);

int main()
{
float tempCel,
float tempFahr,

CalcTemp(tempCel);

cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
cout << "tempCel Celcius Degree = tempFahr Degree Fahrenheit ";


return 0;
}
void CalcTemp(float tempCel);
{
tempFahr = 9/5 * tempCel + 32 ;
}
0171デフォルトの名無しさんNGNG
>>170
void CalcTemp(float tempCel);
{
tempFahr = 9/5 * tempCel + 32 ;
}
じゃなくて、
void CalcTemp(float* tempCel)
{
tempFahr = 9/5 * tempCel + 32 ;
}

CalcTemp(tempCel);
じゃなくて、
CalcTemp(&tempCel);
0172デフォルトの名無しさんNGNG
#include<iostream>

using namespace std;

float CalcTemp( float );

int main()
{
float tempCel;
float tempFahr;

tempFahr = CalcTemp( tempCel );

cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
cout << tempCel << " Celcius Degree = " << tempFahr << " Degree Fahrenheit ";


return 0;
}

float CalcTemp(float tempCel)
{
return 9/5 * tempCel + 32 ;
}
0173デフォルトの名無しさんNGNG
void Fahr911() { for(;;) puts( "NO MORE BUSH!" ); }
0174デフォルトの名無しさんNGNG
>>171さん
>>172さん
レスありがとうございます。起動までこぎつけることができました。感謝感激です!
ただ、実際に数字を入れてみると-1.07e+008みたいな感じになってしまいます。
これはどうしたら直せますか?ご教授お願いします。
0175デフォルトの名無しさんNGNG
std::setiosflags( std::ios::showpoint )
std::setiosflags( std::ios::fixed )
0176デフォルトの名無しさんNGNG
>>174
ソースをもっとよく見直せ。いったい何を計算してるんだ?
cinから貰ったtempCel の値で tempFahr を求めるんだろうが。
0177デフォルトの名無しさんNGNG
>>176さん
レスありがとうございます。
float CalcTemp(float&);
float CalcTemp(float& tempCel)
に変えてみたのですが同じような結果になってしまいました。
根本的に勘違いしてるところがあると思うのでもしよろしければ
教えて頂けませんか?
0178デフォルトの名無しさんNGNG
>>177
cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
tempFahr = CalcTemp( tempCel );
cout << tempCel << " Celcius Degree = " << tempFahr << " Degree Fahrenheit ";
0179デフォルトの名無しさんNGNG
>>169
> // new (&myfoo) foo(i, j); //こちらでもよい

よくねーよ。
0180デフォルトの名無しさんNGNG
>>179
理由は?
0181デフォルトの名無しさんNGNG
>>178さん
ありがとうございます!!できました。
つまりcinで数値を入れた後に計算するようになってなかったのが
原因と理解しましたが合ってますか?
0182デフォルトの名無しさんNGNG
>>179
お前もしかしてplacement new構文を知らないんじゃないか?
もう一度よく勉強してみろ。
0183デフォルトの名無しさんNGNG
>>180
すでにデフォルトコンストラクタで構築されたmyfooが解体されずに
新たに配置newでコンストラクトしてる。
だと思う。
0184デフォルトの名無しさんNGNG
>>183
それはおかしい。myfooのデフォルトコンストラクタはいつ呼ばれているというんだ。
0185デフォルトの名無しさんNGNG
>>184
hogeのコンストラクタが呼ばれる前だよ。
あるクラスのコンストラクタが呼ばれるときには、基底クラス・メンバの構築は完了してる。
0186デフォルトの名無しさんNGNG
>>185
これやってみ。aがデフォルトコンストラクタで構築された後、解体されずにまた構築されるから。

struct A {
A() { cout << "A::A()" << endl; }
A(int) { cout << "A::A(int)" << endl; }
~A() { cout << "A::~A()" << endl; }
};

struct B {
A a;
B(int i) {
cout << "B::B()" << endl;
new(&a) A(i);
}
};

B b(10);
0187186NGNG
× >>185
○ >>184
アンカー間違えた。
0188179NGNG
>>183,>>185,>>186 フォロー感謝。
0189デフォルトの名無しさんNGNG
(部分特別化の出来ない)VC6で使えるdelegateクラス誰か作ってください
0190デフォルトの名無しさんNGNG
>>189 boost::function はダメだったっけ?
0191デフォルトの名無しさんNGNG
>>189
いくらで買ってくれますか?
0192デフォルトの名無しさんNGNG
>>190
function1とかfunction2と明示してやんないとダメみたいです。
0193デフォルトの名無しさんNGNG
>>192
それは「使える」に入らないのか?
0194デフォルトの名無しさんNGNG
>>193
入らない。
struct C{
 template<class T>
 void apply(boost::function<T> fn){ fn(); } };
3行で書けるものがfunctionの引数に応じたapplyのオーバーロードを書かなあかん。
それによって悪い悪臭を放つ。
0195デフォルトの名無しさんNGNG
>>194
delegateとして使うなら引数の型と個数は静的に決定されてるんだから
そんな屁理屈が出てこないはずなんだが。 
0196164NGNG
スルーかよ。アフォが。
0197194NGNG
うっ。悔しいがあんたが大将さ。
漏れはおととい出直してくるわ。
0198デフォルトの名無しさんNGNG
freadで読み込んだバイナリデータを
アスキーに変換csvに出力するにはどうしたらいいでしょうか?

0199デフォルトの名無しさんNGNG
>>198
そんな仕様書じゃ作れません
0200デフォルトの名無しさんNGNG
それはしようがないね
0201デフォルトの名無しさんNGNG
”a=1かつb=2でないなら”
は
”!((a==1)&(b==2))”
でいいのでしょうか?
0202デフォルトの名無しさんNGNG
>>201
いいえ。駄目です。
0203デフォルトの名無しさんNGNG
>>201 曖昧。
0204デフォルトの名無しさんNGNG
>>202
>>203
どうすればいいのでしょうか?
0205デフォルトの名無しさんNGNG
>>204
!((a == 1) && (b == 2))
(a == 1) && (b != 2)
ご注文はどっち?
0206デフォルトの名無しさんNGNG
>>205
!((a == 1) && (b == 2)) の方でした
&が二ついるんですねw
ありがとうございました
0207デフォルトの名無しさんNGNG
ファイルの特定のアドレスにある情報を調べるにはどうすればいいのでしょうか?
例えば、ファイルの先頭から12 byte目の情報を調べたい時です
0208デフォルトの名無しさんNGNG
>>207 open → seek → get
0209デフォルトの名無しさんNGNG
>>208
レスありがとうございます
seekについて調べてみたのですが使い方が載っていませんでした
よろしければ使い方も教えてください
0210 ◆FIcNi4f8js NGNG
載っていない訳がない
0211デフォルトの名無しさんNGNG
>>210
「seek ファイル」で検索してみたのですがCのseekについては見つかりませんでした
0212デフォルトの名無しさんNGNG
fseek
0213デフォルトの名無しさんNGNG
>>212
fseekでヒットしました
これから読んできます

ありがとうございました
0214フフフNGNG
BorlandC++5,5をインストールし、DirectX9 SDKをインストールし、
コマンドラインからDirectXのサンプルプログラムをコンパイル
したのですがコンパイルエラーが出てしまいます。

リンカの設定をしないとダメだと聞いたので
bcc.cfgファイルに
-I"C:\DX90SDK\Include"
-L"C:\DX90SDK\Lib"
ilink32.cfgファイルに
-L"C:\DX90SDK\Lib"

と追加したのですが
Fatal: オプションが必要 :LC:\DX90SDK\Lib
と、コンパイルエラーが出てしまいます。
どうしたらいいのか教えてください。

0215デフォルトの名無しさんNGNG
>>214 こっち
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50
0216デフォルトの名無しさんNGNG
37のn乗{n=1,2,3,…}を計算する時、下3桁が示すパターン周期を求めよ。って問題があるんですが
どうすれば下3桁だけを比較できるのか全く検討がつきません。

どうすればいいか教えてくださいお願いします。
0217デフォルトの名無しさんNGNG
>>216
long long int x;
x = 100100;
として
下三桁は x - x / 1000
0218デフォルトの名無しさんNGNG
下三桁は x % 1000
0219デフォルトの名無しさんNGNG
>>217
嘘

long long int tmp;
も宣言

tmp = x / 1000;
x - x * 1000;
0220216NGNG
即レスありがとうございます。
がんばってみます。
0221デフォルトの名無しさんNGNG
整数値の有効桁数を高速に求めるアルゴリズムってありますか?
何も考えないで書くとこんなのになるんですが・・・。

int x = 0x80000000;
int count = 0;
while (x) {
x >>= 1;
count++;
}
0222デフォルトの名無しさんNGNG
桁数ってビット数?
int count = sizeof(int)<<3;
それとも最大整数値?
int count = ~(1<<((sizeof(int)<<3)-1));

int型って32bitCPUと64bitCPUで有効桁数変わったっけ?(うろ覚え
0223デフォルトの名無しさんNGNG
対数とるんじゃ駄目?
0224デフォルトの名無しさんNGNG
>>222
>>221のプログラムも見ずに聞き返すなよ
0225デフォルトの名無しさんNGNG
>>221
sizeof(int)*8
0226デフォルトの名無しさんNGNG
sizeof(int) * CHAR_BITS
だな
0227221NGNG
すみません、文章がわかりにくかったですね。
>>221で言った有効桁数ってこういう意味でいっていました。
整数値 = 桁数
0x00000001 = 1
0x00000002 = 2
0x00000004 = 3
0x00000008 = 4
0x00000010 = 5
・・・
0x80000000 = 32
ようは立っているビットの最上位ビットの位置のことです。
言葉の使い方がわるかったです、スミマセン。
0228デフォルトの名無しさんNGNG
つ ttp://www.nminoru.jp/~nminoru/programming/bitcount.html
0229デフォルトの名無しさんNGNG
インラインアセンブリで BSR 命令を使うとか
0230デフォルトの名無しさんNGNG
#include <stdio.h>

int log2(int arg)
{
int r;
__asm {
mov eax, -1;
bsr eax, arg;
inc eax
mov r, eax;
}

return r;
}

int main()
{
int testvalues[] = { 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010 };
int i, max = sizeof(testvalues) / sizeof(int);
for(i = 0; i < max; i++)
{
printf("%08X = %d\n", testvalues[i], log2(testvalues[i]));
}
getchar();
return 0;
}
0231デフォルトの名無しさんNGNG
C言語で配列の個数の調べ方をおしえてください。
こんな感じの場合の配列aの個数です。

int i;
int a[] = {1,2,3,4};

for(i=0;i<aの配列の個数;i++){
}
0232デフォルトの名無しさんNGNG
>>231
#include<stdio.h>
main(){
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)/4);
return 0;
}
0233デフォルトの名無しさんNGNG
4ってのはどこからやってきたのだろうか
0234デフォルトの名無しさんNGNG
int は4byteだから。
0235デフォルトの名無しさんNGNG
>>234
あほか。アホか。阿呆か。
0236デフォルトの名無しさんNGNG
sizeof (a)/sizeof(a[0])
0237デフォルトの名無しさんNGNG
そういやどっかで
#define NUMOF( array ) ( sizeof( ( array ) ) / sizeof( ( array[ 0 ] ) ) )
なんていう糞マクロ見たっけなあ
0238231NGNG
>>232-237
Σ(゚Д゚;≡;゚д゚)
どれが一番ポピュラーな方法なんでしょうか??
こんな感じですか??

int i;
nt a[] = {1,2,3,4};
int size = sizeof (a)/sizeof(a[0]);
for(i=0;i<size;i++){
}
0239デフォルトの名無しさんNGNG
そうだよ
0240デフォルトの名無しさんNGNG
>>237
有名なマクロだよ。
Cでは良く使われるし糞とは言えない。
C++だったらテンプレートでやるべきだけど。
0241デフォルトの名無しさんNGNG
要素数を得るためのテンプレートなんてトリッキーすぎて
「べき」なんて言えないよ。
0242デフォルトの名無しさんNGNG
どっちにしろ >>237 はエラーになる
0243デフォルトの名無しさんNGNG
(sizeof(array)/sizeof(array)[0])
とかそういう話?
0244デフォルトの名無しさんNGNG
>>243 (^Д^) キャハハ何言ってんのこいつ
0245デフォルトの名無しさんNGNG
ttp://www.tietew.jp/cppll/archive/8996
0246デフォルトの名無しさんNGNG
>>231はC言語で、といってるが。
テンプレートの話はひとまず置いておいたほうが混乱させなくてよいとおもうぞ。
インタプリンタ系言語だと、a.countとかa.indexみたいな感じで配列の要素数一発で調べられたりするからね。
初心者さんにはつまずきやすいところではあるな。
0247デフォルトの名無しさんNGNG
>>246
お前のレスのほうがよっぽど混乱させる文だな
0248デフォルトの名無しさんNGNG
>>245
それは私が別スレで取り上げたのと同じやつ^^;
0249デフォルトの名無しさんNGNG
でも、マクロはいろいろ取り扱いが危険なので、なるべく使うべきでは無いと思うよ。
マクロは結局単なる置き換えに過ぎないし、コンパイラの機能ではないから、
マクロでエラーが発生したときにエラーメッセージからどこが問題かを判断し
にくいということがある。
良くある間違いは置き換えであることを忘れて-つまり関数と勘違いして-
マクロを書いてしまうと括弧を付け忘れたりして予想もしない計算結果になること
もある。

具体的にどうすれば良いかと言うと、配列の要素数を求める計算自体は
それほど複雑でもないので、
o 配列を宣言したすぐ後で要素数を入れる変数を用意しておくか、
o その場その場でsizeof(array)/sizeof(array[0])を実行するか、
した方が良いと思う。
0250デフォルトの名無しさんNGNG
マクロの中身を括弧でくくっておくのは普通にやる事じゃなかったのか?
そうすりゃ計算結果が狂うなんてまずないし。
0251デフォルトの名無しさんNGNG
そういう問題じゃないだろ。
汎用マクロにしたら配列とポインタを混同してしまう危険があるだろ。
ポインタで渡してもエラーにならないし。
0252デフォルトの名無しさんNGNG
有名なのだと
#define max(n, m) (n > m ? n : m)
c=max(++a, ++b);
みたいなのだな。numofマクロならそんな事はないだろうけど。
■ このスレッドは過去ログ倉庫に格納されています