【初心者歓迎】C/C++室 Ver.29【環境依存OK】
2?
>1 乙
問題集でどうしても解けないとこが...orz 図書館で借りたため答えがついてないorz 問 $ ./calc 9 - 8 + 7 - 6 + 5 - 4 + 3 - 2 + 1 9 - 8 + 7 - 6 + 5 - 4 + 3 - 2 + 1 = 5 $ ●入力した数式とその計算結果を表示してください ●演算は加算(+)と減算(−)をサポートして下さい ●数式の数値の入力個数には制限がないものとしてください 本当に初心者の質問なんですが・・・どうか御協力お願いします・・・
学生なら自分でやらないと後で損するよ
6 :
5 :2006/07/10(月) 19:57:52
>>4 そうですよね。甘えてた自分が恥ずかしいです。
もうちょっと自力で考えてみます!ありがとうございます!
宿題スレというあまり本人の為にならないスレがあるよ!
質問者から考える力を吸い取って回答者の糧とするスレだな
10 :
デフォルトの名無しさん :2006/07/11(火) 04:32:10
>>10 行末のバックスラッシュは改行文字をエスケープするわけだけど、
その例では何の役にも立ってない気がする。
12 :
デフォルトの名無しさん :2006/07/11(火) 09:16:31
>>11 さん
確かに意味が無いようで、消してもエラーにはなりませんでした
ただ、何か意図があって、\を付加したと思うので、気になってしまいます。
元は次の行があったのをコピペミスしたんだと思われ
Cで、配列の長さを変える(伸ばす)事って出来ませんよね? a[100]と宣言したのを、後でa[500]まで伸ばすっていう。 配列じゃなくてポインタを使って、 int *p; p = (int *) malloc(sizeof(int) * 100); ... p = (int *) realloc(p, sizeof(int) * 500); とすれば配列を伸ばすのとほぼ同じようなことが出来るのかな
その通り。
>>14 realloc が失敗した時に悲しくなるから
一度別のポインタに入れてヌルチェックしてから
p に入れたほうがいいよ。
>>17 reallocに失敗した場合、元の領域は解放されない。
上の場合問答無用でpに上書きしてるので、失敗した場合元の領域のポインタを失ってしまう。
Linux上でCのプログラムをgccで普通にコンパイルした時と-Oオプションをつけて最適化してコンパイルしたとき、 実行後のプログラムの動作が異なる場合、どんなミスを疑ったらいいんでしょうか? 2週間ほど悩んでおります
自分が入れたバグ
単なる初期化忘れだろ。
class A{ string m; public: string &x(){ return m; } }; int main(){ A a; a.x()="aaa"; cout << a.x() << endl; return 0; } このようなコードがあるとき、mainを変えずに、a.x()で値を取得するときと、a.x()=で値を代入 するときとで挙動を変えることはできるのでしょうか。 x()の返り値を別なクラスにして、operator=とoperator string()などを使えばできそうで もうすこし簡単にやる方法はありますか?
>>22 > x()の返り値を別なクラスにして、operator=とoperator string()などを使えばできそうで
普通はこうする
普通はそもそも値を得る方と設定する方を別の関数にするという設計にする。
参照をそのまま返すのではpublicと変わんない。 つか意味あるのって感じ
26 :
19 :2006/07/11(火) 21:27:42
>>20 そうだとは思っているのですがいかんせん原因が全くつかめません
>>21 2次元配列の初期化をfor文の2重ループでしていますが、
コンパイルによっては初期化が正しくなされていなかったりしているような状態にはなります
>26 まずは症状が再現する最小限のソースをうp
28 :
19 :2006/07/11(火) 21:43:17
配列の添字は0から
C++の質問です。 class C { size_t b_size; struct { int a; int b[]; int c; ... } st; }; ↑のようなクラスを作りたいのですが、st の中身をバイトストリームから直に読み込むので a, b[0], b[1], ... b[b_size-1], c ... が連続した領域に確保されるようにしたいです。 b_size の値はコンストラクタが呼ばれたときにはまだ分かりません。こういうのを作ることは可能ですか? int *data メンバを作って int a() { return data[0]; } int b(int i) { return data[1 + i]; } int c() { return data[b_size + 1]; } とかしこしこ書いていったほうがいいですか?
>>30 各メンバが連続して配置されなくてもいいように、
バイトストリームから読み込むべき。
読み込むときに連続して読み込むことと、
読み込んだデータを格納しておく時に連続させることは別問題。
32 :
デフォルトの名無しさん :2006/07/12(水) 22:35:41
const char* について質問です。 const char* hoge = "Hello"; char* foo = hoge; をすると、「error C2440: '初期化中' : 'const char *' から 'char *' に変換できません。変換で修飾子が失われます。」 とエラーが出ます。 どうしたらいいんですか? 環境 Visual C++ 2005 EE WindowsXP + SP2
const_castでconst外せるが何がしたいんだ? その状況でやると危険だぞ。
レガシーAPIが本来const char*を要求するところでchar*を要求しているとか
初心者には何が危険かちゃんといってあげなきゃわかんないよ。 とかいってる私もわかんないんだけど。
>>32 foo を削除して、かわりに hoge を使えばいいよ。
>>35 文字列リテラルを変更する危険がある。
文字列リテラルを変更した場合は未定義動作。
鼻から悪魔が出てくる可能性がある
class CLASS { private: enum { A=0, B, C }; const char str[][32] = {"A","B","C"}; }; こんなのってダメでした?
40 :
コンパイラが変? :2006/07/13(木) 00:55:15
class A { public: A(){}; operator=(A &other){}; operator<<(A &other){}; }; class B : public A { public: B(){}; }; int main(void) { A aa ; B bb ; // bb = aa ; こっちはコンパイルエラーになります。 bb << aa ;//こっちはOK。 return 0; }
>>40 operator=もoperator<<も戻り値の型が指定されていない。
メンバ関数の定義の終わりにセミコロンは要らない。
>>39 strが静的メンバでも良ければ対処のしようがある。
>>40 基底クラスのメンバは派生クラスの同名のメンバによって隠される。
operator= はユーザーが宣言しない場合もコンパイラがデフォルトの宣言を
追加してしまうので、常に宣言されることになり、常に隠される。
あと
>>41 ね。
44 :
40 :2006/07/13(木) 01:01:29
>>41 サンクス。直した。
class A
{
public:
A(){};
void operator=(A &other){}
void operator<<(A &other){}
};
class B : public A
{
public:
B(){};
};
int main(void)
{
A aa ; B bb ;
bb = aa ;
bb << aa ;
return 0;
}
45 :
40 :2006/07/13(木) 01:03:21
>>43 回答ありがと。むずそうだがなんとなくわかった。
コンストラクタのセミコロン残ってるよ。
47 :
デフォルトの名無しさん :2006/07/13(木) 02:22:05
普通に動いたよ
49 :
47 :2006/07/13(木) 02:35:48
Visual Windows for BC++ を使っているのですが、それだとエラーが出てしまうんです…
>>47 配列は固定長で確保
double y1[101];
可変長配列のサポートはC99から
51 :
47 :2006/07/13(木) 02:46:02
>>50 あ、配列の長さを固定したら動作しました。
夜遅くにわざわざありがとうございます(´▽`)
linuxのiconv関数とかが引数にポインタのポインタを とりますが 関数の引数としてポインタのポインタを渡す理由は なんでしょうか? 大きな構造体を渡す際のメモリコピーを避けるためなら ポインタのポインタでなくてポインタだけで十分だと 思うのですが
iconv関数は、呼び出し元が渡したポインタを変更する仕様だから。
54 :
52 :2006/07/13(木) 11:40:12
>>53 ありがとうございます
後もう一個質問させて下さい
ポインタのポインタって
ポインタのアドレスのことですよね?
55 :
デフォルトの名無しさん :2006/07/13(木) 12:00:36
* ビットマップ用のメモリ確保 * ピクセルから値の取得 * ピクセルに値を設定 * 画像のファイルからの読み込み * 画像のファイルへの書きだし ぐらいのことをやりたいのですが、適切なライブラリを教えてください。 画像のフォーマットは一般的なものならなんでもいいです。 pnm とかでも可。 多機能でなくていいので、なるべく小さなライブラリを探しています。 開発環境は linux + gcc です。
>>54 typede char* CharPtr;
と置き換えれば多少は分かりやすかろう。
CharPtr p; // ポインタ
CharPtr* pp = &p; // ポインタのポインタ
57 :
54 :2006/07/13(木) 12:16:25
>>56 ありがとうです
ということは
ポインタのポインタ=ポインタのアドレス
でOKてことですね
>>55 libjpegってそのものずばりなのがあるが
>>55 単体のフォーマットでよければlibpng, libjpeg, libgifなどなど
色々扱いたければDevILとか
ライセンスに緩い物であればFreeImageあたりか
C++でクラスから作ったオブジェクトのメモリ構造に関する質問です。 クラスのオブジェクトでは、メンバ変数はクラスで記述した順番にメ モリ配置されますか? class A { int m; int n; }; とするとAのオブジェクトtempのメモリ構造は|m用の領域|n用の領域| の様になるのでしょうか?それとも環境に依存するのでしょうか?
>>57 そもそも変数の型の名前としてアドレスという言葉を使うのは間違い。
CharPtr p; // アドレス
CharPtr* pp = &p; // アドレスのアドレス
と言ったら違和感が伝わるだろうか
61 :
57 :2006/07/13(木) 14:32:19
>>60 あ、わかってきました
ppはポインタのアドレスを指すポインタですね
うぁはは、何この嫌がらせ。 折角ポインタのポインタって教えてるのに強硬にアドレスアドレスってw
アドレスって言葉の方が理解しやすい人もいるってことでは
>>59 ドット演算子やアロー演算子を利用したアクセスは保証される。
メモリ上の配置が宣言通りの順で格納されている保証はない。
>>61 ppはキャラ変数のアドレスを指すポインタのアドレスを指すポインタです。
・・・素直にポインタのポインタで納得していただけんだろうか
>>64 お前、ポインタのこと良く分かってないだろ
いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす 外部ファイルにこのような文字列が登録されています。 指定した行にある文字列を指定した配列に書き出したいのですが、どうしたらよいのでしょうか?
> (共用体ではない)クラスの非静的メンバがアクセス指定子が間に入らずに宣言された場合、 > 後で宣言されたデータメンバの方が、クラスオブジェクト内でより高位のアドレスになるように > 割り当てられる。 > アクセス指定子で分離された非静的メンバの割り当て順序は、未規定とする。 > 処理系によっては、境界調整の必要性から、二つの連続するメンバの一方を > 他方の直後に割り付けないことも起こりうる。
71 :
デフォルトの名無しさん :2006/07/13(木) 20:32:08
1000ページくらいのC++の本を買ってきました。 (プログラミング言語C++第三版) これ、半分以上〜全部覚えていかないと、C++ってものにならないんですか?
>>68-69 >>59 の例に限れば保証される。
これは保証されない。
class B {
public:
int o;
private:
int p;
};
保障したい場合は構造体にしといたら?
>>71 読む必要があるか? No
読んだ方がいいか? Yes
覚えないといけないか? No
理解する必要があるか? Yes
>半分以上〜全部覚えていかないと、C++ってものにならないんですか?
それはあなた次第
76 :
デフォルトの名無しさん :2006/07/13(木) 20:44:13
>>71 そうだよ。まあでもよく使うことは自然と実に付くし、あまり使わないことは当然知らなくても困らない。
それに、ほかの言語はもっと覚えることが少ないかというとそうでもない。どれも似たようなもの。
78 :
デフォルトの名無しさん :2006/07/13(木) 20:45:32
>>77 ほかの言語でも同じですか。
やっぱり、がんばります。
ありがとうございました。
ポインタってどんなときに役に立つんですか?
80 :
デフォルトの名無しさん :2006/07/13(木) 20:59:50
ちょっと質問。 仕事で書いてるプログラムに3000行のswitch文があるんだが、 これを短く圧縮する場合にifにするのは馬鹿げてるよね?
メモリの上でかけっこするとき
>>80 書き換えるとハマる悪寒。
switch..case はそのままで
中身の処理をサブルーチンとして抜き出すぐらいにしとけば?
switch(x){ case 1: case 2: case 3: 処理 break; case 4: case 5: case 6: 処理 break; ..... case 32765: case 32766: case 32768: 処理 break; default: 処理 } みたいにマヌケな状況になってるなら if 使う意味はあるね
規則的なら関数テーブルで飛ばしたら?
すみません
>>85 の関数テーブルで飛ばす
とは具体的にどういうコードなんでしょうか?
ふつーのコンパイラはcaseが多くてある程度連続していれば、 switch文を関数テーブルに直してくれるよ。
>>88 「ppはポインタのアドレスを指すポインタですね」と相手が納得しているのに
わざわざ言い換えるところが間抜け
C++のクラスの実装の仕方について質問です。 sizeof() でインスタンスのサイズを調べると、メンバ変数の分しかメモリ領域が 確保されていないようなのですが、メンバ関数はどう言う風に実装されているんですか? 今までは、すべてのインスタンスでメンバ関数は共有されていて、呼び出されたときに インスタンスの情報も一緒に渡されて、メンバ変数の参照が出来るのかなと思っていたのですが 関数にstatic指定子を付けたらメンバ変数にアクセスできなくなったので もしかしたら違うのかなと。
>今までは、すべてのインスタンスでメンバ関数は共有されていて、呼び出されたときに >インスタンスの情報も一緒に渡されて、メンバ変数の参照が出来るのかなと思っていたのですが コンパイラ依存だと思うが、VC++の場合はこういう実装になっている。 >関数にstatic指定子を付けたらメンバ変数にアクセスできなくなった staticメンバ関数として当然の挙動です。
>>90 仮想関数がある場合は'vtbl'というものが追加されて、そのポインタ分だけ
sizeofが大きくなる。
仮想関数がない場合は'vtbl'はないので、構造体と同じしくみでsizeが決定される。
メンバ関数内でメンバ変数が参照できるのは、各メンバ変数にthisが渡されるため。
各メンバ変数にthisが渡されるため ↓ 各メンバ関数にthisが渡されるため
>>91 レスどうも。おかげですっきりしました。
staticメンバのことも了解しました。
仕様上そう設計しているということですね。
>>92 リロードしないで書き込んでしまったので、入れ違いになってしまいましたが
とても参考になりました。
今BCCで試してみましたが、仮想関数があると先頭に4byte分
なんか付いているみたいでした。
>>95 その4byteが'vtbl'へのポインタ。
vtblが何者であるかはググって
ポインタ≠アドレス
ポインタ=アドレスを格納する変数
>>89 おまえが間抜け。その解釈が合っていると思ってるのか?
型名にアドレスなんて使っちゃダメ。
自分の中で納得するのは勝手だが、「ポインタのアドレスを指すポインタ」なんて
他人に言ったら間違いなく伝わらない。「ああ、ポインタのポインタの事ね」って呆れ顔で訂正されるだけ。
中途半端な知識で初心者に嘘教えるなよ。
つまり、自分の言葉で説明できないということですね。 やっぱりポインタのことわかってなかったんだ。
特定の型のインスタンスを指し示すもの。 実装上、多くの場合はそのインスタンスの存在するアドレスが格納されている。 従って、ポインタのポインタは単に対象となるインスタンスがポインタであると言うだけのポインタである。
>>103 で、「ppはポインタのアドレスを指すポインタ」のどこが間違ってると?
106 :
103 :2006/07/14(金) 13:07:16
>>105 実装に踏み入る必要はない。ポインタにアドレスが格納されている必然性がないのだから。
敢えて踏み入るなら、はじめからポインタと言わなければいい。
>>106 段々苦しくなってきましたねぇ。
C/C++の話ですよ?
あのねぇ、質問者は「ポインタのポインタ」って何ですかって質問してるんですよ。
111 :
103 :2006/07/14(金) 13:13:10
>>107 それがなにか?
例えばMS-DOSのラージデータモデルでは一般のポインタで想像されるような、
連続したメモリ空間を指さないセグメント:アドレスモデルでしたが。
また、ある実装では全てのポインタがハンドルなので、その中身はインスタンスのアドレスじゃありませんが。
寧ろ私は>107が何故アドレスと言いたいのか知りたく思いますね。
>>110 嘘こくなよ
>>54 >ポインタのポインタって
>ポインタのアドレスのことですよね?
>>111 さぁ?何故でしょうね。Cには'&'があるからでしょうか。
>>112 で、「ppはポインタのアドレスを指すポインタ」のどこが間違ってると?
なんなの?この人たち。
>>117 「ポインタ アドレス」でググると数多くのページがHitしますが、
それに関してはどう思いますか?
>>111 いや、それでもアドレスでしょ。
アドレスじゃないと言い張る?
123 :
デフォルトの名無しさん :2006/07/14(金) 13:30:40
質問さしてください。 簡単なtemplateのclassを作ったソースを書いたのですが (operator,destractor,copyconstractorの実装は、はぶいてます) ソース↓ #include <iostream> #include <string> namespace Mine{ template <typename T1, typename T2> class Testclass{ private: T1 Data_like_T1;T2 Data_like_T2; public: Testclass():Data_like_T1(T1()),Data_like_T2(T2()){} Testclass(T1 inidata1, T2 inidata2) { Data_like_T1 = inidata1; Data_like_T2 = inidata2; } void CoutPvateMember() { std::cout << Data_like_T1 << ' ' << Data_like_T2 << '\n'; } }; } int main() { using namespace std; using namespace Mine; Testclass<int, double> Tobj1; Tobj1.CoutPvateMember(); Testclass<int, double> Tobj2(5, 1.5); Tobj2.CoutPvateMember(); Testclass<int, string> Tobj3; Tobj3.CoutPvateMember(); Testclass<int, string> Tobj4(1, "abc"); Tobj4.CoutPvateMember(); return 0; } 上記のソースでのdefault_costractorでのTestclass():Data_like_T1(T1()),Data_like_T2(T2()){} の部分で、[Data_like_T1(T1()),Data_like_T2(T2())]の(T1())T2(T2())の部分で T1がintならint()という形になりますしstringならstring()となりますが このT1()のような書き方は、いったい、どんな書籍、もしくわサイトで解説してるんでしょうか たまたま買った、C++効率的最速学習という本で、この使い方が載っていたんですが この本には、例えばint()のような書き方をサンプルソースで使われてるんですが この書き方の詳細は載ってませんでした。int型クラスがあるとも思えないし、EffectiveC++だと constractorでint型のmemberがあったなら、明示的に(0)を渡しているようですし この書き方の詳細については、いったい何の参考文献を見ればいいのでしょうか 稚拙な質問かもしれませんが、どなたか教えていただきたいです。
不毛な言い合いをしてるな…
>>122 横槍だけど、ポインタの中身は「実体を参照できるもの」かつ「intに変換できるもの」ならば何でもいい。
事実、アドレスではない、ただのIDを参照としてポインタに格納している処理系もある。
(そういう環境があるからこそ、規格でアドレスだと限定していないわけだが)
一般的なPC環境ではアドレスが格納されるのが普通だけどな。
>>124 処理系ごとの実装はともかく、アドレス演算子の結果を保存するのが
ポインタ変数でしょ?
この処理系は、実際はメモリ上のアドレスじゃないから、というのは
それこそ実装に踏み込んでるよ。
>>125 アドレス演算子の結果はアドレスじゃないと言いたいんだよ。
「おい、あの女見ろよ、乳でけー!」←ボインだ 「ちょwwその2人横の方がすごくね?!」←ボインだのボインだ
>>124 また初心者スレでデマを。
intに変換できるものってなんだよ一体。
おまえの脳は20年前で止まってるだろ。
>>119 への返答がありませんが、リロードは止めたということでしょうか。
何が問題なのかさっぱりわからん。 ポインタは、それが指し示す変数へのアドレスであり、 ポインタのポインタは、それが指し示すポインタへのアドレスじゃないのか? 俺は今までそう理解してきたが。
>>129 これのことだろ
6.3.2.3
任意のポインタ型は整数型に型変換できる。
>>131 「アドレス」という言葉は使っちゃいけないらしいです
>>132 俺、規格に全然詳しくないけど、それってLP64が規格に反してるってことか?
>>132 int型と整数型というのは違うよ。
charもlongも整数型だ。
そして、intとポインタのサイズが違う処理系はいくらでもある。
>>134 結果は処理系定義で、サイズをオーバーしても知らんってことになってるから
変換をエラーにしなければ規格には適合してることになるね
137 :
134 :2006/07/14(金) 14:00:25
138 :
134 :2006/07/14(金) 14:05:47
みんなこの話に飽きたみたいだなw
int型ではないが整数型に変換できる&変換しても元に戻せるってのが条件じゃなかったっけ?
まあ実際、intptr_tとかUINT_PTRとか 「ポインタと相互変換できる整数型」というのを 最近の処理系(&C99)は用意している。
>>131 俺漏れも。
というか
>>99 と
>>103 ,
>>106 で言ってる事ちがくね?
>99ではポインタのアドレスを指すポインタという表現そのものが間違いであると言ってるけど
>103>106では、特定の実装上ではポインタはアドレスを指すこともあるって…。
>>138 正しい知識のある奴が結局一人もいなかったからなw
>>123 C++の入門レベル本になら大抵書いてあるはずだと思うが、それはそこでだけ有効な一時オブジェクトを作る式。
括弧の中はコンストラクタ引数を書く。(intなど)組み込み型の場合、型変換(キャスト)として扱われる。
引数がない場合は当然デフォルトコンストラクタが呼ばれる。組み込み型の場合、0初期化される。
ちなみにその例では単にData_like_T1(), Data_like_T2()と書いてよいはず。
誰も型名なんて聞いてないのに、これだから知識自慢厨は・・・
知識自慢厨は無能の証だから生暖かく見守るべし
void call(void(*)(int,int,int)) という型の関数にstaticでないメンバ関数へのポインタをそのインスタンスといっしょに 渡すにはどうしたらいいのでしょうか。教えてください。 callfuncでエラーが出ちゃうサンプル #include <iostream> using namespace std; void call(void(*func)(int,int,int)){ func(1,2,3); } void func1(int a,int b,int c){ cout << "func1(" << a << "," << b << "," << c << ")" << endl; } class A{ public: void func2(int a,int b,int c){ cout << "func2(" << a << "," << b << "," << c << ")" << endl; } void callfunc(){ typedef void(A::*Afunction)(int,int,int); Afunction af=&A::func2; call(&(this->*af)); } }; int main(){ call(&func1); A a; a.callfunc(); }
#include <iostream> using namespace std; class A; void call(A* a, void (A::*func)(int, int, int)); class A{ public: void func2(int a,int b,int c) { cout << "func2(" << a << "," << b << "," << c << ")" << endl; } void callfunc() { typedef void(A::*Afunction)(int, int, int); Afunction af = &A::func2; call(this, af); } }; void call(A* a, void (A::*func2)(int, int, int)) { a->func2(1,2,3); } void func1(int a,int b,int c) { cout << "func1(" << a << "," << b << "," << c << ")" << endl; } int main(){ // call(func1); A a; a.callfunc(); }
>>149 回答ありがとうございます。
callは、Cで書かれた別のライブラリの関数で、書き換えることができないんです。
>>150 じゃ、諦めな。メンバ関数へのポインタは、通常の関数へのポインタとは
全然違うから。
その3つの引数のうち、1つはこっちですくに使わせてくれるのなら楽。でもたぶんそうでないのだろう。 マルチスレッドを考慮しなくてよければグローバル変数を使え。考慮する必要があるならTLSを使え。 テンプレートを使えばもっと汎用的にできる。 class Hoge { public: void func(int, int, int); }; namespace { void* ptr; void (Hoge::*mem_ptr)(int, int, int); void callEntry(int a, int b, int c) { (ptr->*mem_ptr)(a, b, c); } void call(Hoge& hoge, void (Hoge::*fn)(int, int, int)) { ptr = hoge; } int main(){ Hoge hoge; call(hoge, &Hoge::func); } 或いはメンバ関数を呼び出すための「サンク」を作る方法もある。
間違えた。正しくはこう。 void call(Hoge& hoge, void (Hoge::*fn)(int, int, int)) { ptr = hoge; call(callEntry); }
154 :
123 :2006/07/14(金) 20:33:49
>>145 さん
それがですね・・・・
俺が買った入門書が、やっぱ駄目駄目なようで
ついでにSTLについての本も買ったんですが・・・・・
2つともハーバート・シルト著で[独習C++]と[STL標準講座]でっす!!
ただ、疑問に思うのは、独習C++もSTL標準講座も、本当に原著
通りのサンプルソースを載せてるのか?とも思う点です。
特に[STL標準講座]は、サンプルソースに間違いがあったり
<algorithm>のlower_bound()の解説が「一致する最初の要素を返す」
となってるけど、実際のreturn value は "greater than or equal"
だと、googleで検索してようやくわかったぐらいで、あとremove()とかも・・・
ま、結局思うのは、翻訳と監修してる人は、本当にちゃんと翻訳監修をしては
いないんだろうと、「わかんねーから省いちゃえ」ってな感じで翻訳監修作業を
してるんだろうと思うところです。
(しっかし、[STL標準講座]のソースは、一貫性がなさすぎて訳がわからん
あっちのソースではstd::cout文の後に"\n"つかって、こっちのソースではendl使って
キャストはc言語タイプのキャストしてるし、そりゃc言語タイプのキャストでも良いけど
こっちはc++勉強してんだからstatic_cast<>()使うのが筋ってなもんだろって思ったり・・・
入門書の内容を疑いながら読まなきゃならない入門書って、いったいなんなんだよ)
以上、独り言の愚痴でした
俺は「標準C++の基礎知識」、「標準C++STLの基礎知識」、「極めるVC++」、という怪しげな本とwebで一通りC++の仕組みは。 さらに突っ込んだ内容は、もっと分厚い本を読んだけど。 あとなんか、図書館で買ったiostreamの本も役に立ったな。一冊丸ごとiostreamの本。
156 :
148 :2006/07/14(金) 21:52:04
関数呼び出し規約的には、最後にインスタンス(this)をpushするようなので、
インスタンスとメンバ関数で、staticなメンバ関数を作れるかとおもったら、そうもいかないみたいですね。
マルチスレッドは考慮しなくていいので、callの宣言がかわらないように、
>>152 さんの方法を書き換えて
使うことにします。ありがとうございました。
class A{
private:
static A *p;
static void (A::*p2)(int,int,int);
public:
void func2(int a,int b,int c){
cout << "func2(" << a << "," << b << "," << c << ")" << endl;
}
void callfunc(){
A::p=this;
A::p2=&A::func2;
call(&callfunc2);
}
static void callfunc2(int a,int b,int c){
(p->*p2)(a,b,c);
}
};
A *A::p;
void (A::*A::p2)(int,int,int);
ひどいプログラムだな。
>callの宣言がかわらないように ( ゚д゚)ポカーン
初心者は無茶するなあ。
>という型の関数にstaticでないメンバ関数へのポインタをそのインスタンスといっしょに >渡すにはどうしたらいいのでしょうか。教えてください。 >callは、Cで書かれた別のライブラリの関数で、書き換えることができないんです。 CのライブラリにC++クラスのインスタンスを渡すのか? 無茶言うね。 というか >void call(void(*)(int,int,int)) この関数の宣言を買えずに、どうやってインスタンスが渡せるんだ?
>>160 C++の基本からやり直すべきじゃないかい?
163 :
148 :2006/07/15(土) 01:06:55
glutというCで書かれたライブラリがあって、 void glutMouseFunc(void (*func)(int button, int state, int x, int y)); みたいな形でコールバック関数を登録するようになっていて、そこにstaticでない 自作のメンバ関数を登録したかったのです。Cでオブジェクトの概念を使っている gtkみたいに、インスタンスとメンバ関数ポインタをくっつけて、普通の関数ポインタとして、 渡したかったわけなのですが、綺麗に書く方法がないということは、 やはりちょっと無茶だったのかもしれません。
>>154 K&R の原著と、その訳書の 石田晴久 の本との違いもそんな感じだよ
>gtkみたいに、インスタンスとメンバ関数ポインタをくっつけて GTKってこんな機能あったっけ? GTKだって、シグナルコネクト関数でコールバック登録するときは、第一パラメータがwidgetのポインタだったと思うが。 インスタンスとコールバック関数をくっつけるのではなく、インスタンス(へのポインタ)とコールバックを、別々の引数と して渡して、関連付けを行うんだと思ったが。
もうこうなったらサンクしかない
引数を持たないコンストラクタが存在しないクラスの配列を作るのはどうしたらいいですか。 test t=new test[4]; とかやるとコンストラクタがないというエラーになってしまいます。。
test *t=new test[4]; のまちがいです
for (int i=0; i<4; ++i) t[i] = new test(hoge);
>>167 いまのところできない。
169のようにポインタの配列を持つようにするか、std::vectorか何かを使うしかない。
>>169 それだと delete[] が使えないね。まあ仕方ないだろうが
test * p = reinterpret_cast<test *> ( new char[sizeof(test) * 4] ) ; std::uninitialized_fill( &p[0], &p[4], test("hoge") ) ;
173 :
デフォルトの名無しさん :2006/07/15(土) 20:21:16
最近趣味でCの勉強を始めて、今UNIXのコマンドラインみたいなものを作ってみようと頑張っているのですが、TABで補完させることと、入力間違いをBSで消去することの両方をするところがうまく書けません。 良いアイデアはないでしょうか?
readlineライブラリを使う
ありがとうございます!!!! ポインタの配列か、vectorのどっちかを使おうとおもいます!!
>>175 にはptr_vectorを使うのが一番安全で分かりやすいいんでないかい?
177 :
173 :2006/07/15(土) 21:42:25
readlineライブラリですね。 ネットでしばらく情報探してみましたが、他言語のreadlineがひっかかるようですので、 明日にでも書店・図書館で調べてみます。 ありがとうございました。
179 :
173 :2006/07/15(土) 22:08:06
WindowsXPでMinGW使ってます。 これで答えになってますでしょうか?
void kakuho(int *p) { p = malloc(sizeof(int) * 10); } void kaihou(int *p)
181 :
180 :2006/07/15(土) 23:31:29
ごめんなさいまちがえました
#define C_TBL_MAX(TYPE)\ class C_MAX_##TYPE \ この##って何?連結?
そう プリプロセッサだけ走らせればわかるよ あとは#で引数の文字列評価とか
185 :
183 :2006/07/16(日) 11:24:40
>>184 thx!!
でもプリプロセッサだけ走らせるってどうやるの?
VC++6.0SP6なんですが。
/P
187 :
173 :2006/07/16(日) 13:20:17
>>182 さっそくreadline-4.3-2-mingw32.zipの中身をコピーして試してみたのですが、
C:\(パス)\Temp/ccaYbaaa.o(.text+0x57c):command_test.c: undefined reference to `_imp__readline'
collect2: ld returned 1 exit status
という警告が出てしまいます。
おそらくどこかでreadlineの追加分の定義が必要なのかなとは思うのですが。。。
MinGWインスコしてないから試せないんだけど、-lreadlineは付けてるよね?
189 :
173 :2006/07/16(日) 13:57:40
いえ、付けてませんでした。 gcc -lreadlineを試してみると、 /mingw/lib/libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `WinMain@16' collect2: ld returned 1 exit status とメッセージ内容は変わりましたが、やっぱり警告が出てしまいます。
え?WinMain? どんなコードをコンパイルしようとしてるの? ちなみにhistoryも使える最小限のコードは以下。-lreadline付けてコンパイルしてみて。 #include <stdio.h> #include <readline/readline.h> #include <readline/history.h> int main() { char *p; using_history(); while (1) { p = readline("$ "); add_history(p); } return 0; }
191 :
173 :2006/07/16(日) 14:20:02
C:\(パス)\Temp/cckPaaaa.o(.text+0x2b):test.c: undefined reference to `_imp__using_history' C:\(パス)\Temp/cckPaaaa.o(.text+0x39):test.c: undefined reference to `_imp__readline' C:\(パス)\Temp/cckPaaaa.o(.text+0x49):test.c: undefined reference to `_imp__add_history' collect2: ld returned 1 exit status の警告が出ました。 ちなみにCの入門書を2冊やり終えたくらいのレベルです。 で、UNIXのコマンドラインのようなものを作ってみようとチャレンジ中だったのですが、 TAB補完と入力間違いしたときのBSで消すことを両方させるところで壁に当たってしまいました。 とりあえずTAB補完だけ・BSだけならgetcheやfgets,getcharあたりでできたのですが。 このレベルじゃまだしんどそうなら、さらに勉強してからチャレンジしてみます。
警告とエラーは違う。
それライブラリへのパスが通ってないよ。 readlineのlib*を他のライブラリが入ってるディレクトリにコピーしてみて。
入門書をいくら勉強しても、ライブラリの導入は覚えられないんだよね。 で、ライブラリがないと結局たいしたことはできないと。
普通は、make; make installでインストールできちゃうから、誰でも インストールできるんだけどね。 readlineもsrc packageならそうなってるかもしれん。
196 :
173 :2006/07/16(日) 14:48:37
182さんのところから落としてきたreadline-4.3-2-mingw32の中にある bin,doc,include,libをそれぞれMinGW内の同じところへコピーしてみた (し直してみた)けどダメでした。 さっきと同じエラー(でいいですよね?192さん)が出てしまいます。 これができたら、次はオライリーのC実践プログラミングで勉強しようと 思ってたのですが(評判よさそうなので)、ライブラリの勉強とでしたら どちらが先の方がいいでしょうか?
>>196 俺回線が細くて、今すぐMinGWインストールできないから、これ以上の
アドバイスは出来ん。
今すぐreadlineを使ったアプリを作りたいってわけじゃなさそうだから、
勉強のほうを進めれば?
ちなみにCygwinなら確実にreadlineを使える。
199 :
173 :2006/07/16(日) 15:01:44
そうですね、いい目標ができたのでそれに向けてとりあえず勉強進めます。 Cygwinは今いれると目標への熱意が冷めてしまいそうなので、今回の件を ちゃんと理解できるようになってから試してみることにします。 たくさんのアドバイスありがとうございました。
出遅れちゃったけど>182のreadlineを試してみた。 ディレクトリ構成 解凍パス/bin 解凍パス/doc 解凍パス/include 解凍パス/lib 解凍パス/test.c (>190さんのサンプル) 解凍パス/readline.dll (binから移動) コンパイル gcc -Iinclude -Llib test.c -lreadline 結果 問題無し。-lreadline をつける場所を間違えたんじゃね?
201 :
デフォルトの名無しさん :2006/07/16(日) 18:37:38
ビットマップ読み込み用クラスを作成しているのですが、 typedef struct { unsigned short file_type; unsigned int file_size; unsigned short reserved1; unsigned short reserved2; unsigned int offset; }BmpFileHeader; という、サイズが14バイトのつもりのヘッダ構造体を作ったのですが、 sizeof (BmpFileHeader); としてやると16という値が出てしまいます。 何かプログラム間違ってるでしょうか?
つ パディング
ttp://lists.boost.org/Archives/boost/2003/04/47008.php のコードの一部の引用です
#define OP_ASSERT(x) do { \
std::stringstream out_str; \
bool bTestOk = true; \
(x); \
if ( !bTestOk) std::cout << "Assertion failed: \n'" << #x << "'\n" <<
out_str.str() << std::endl; \
} while(0)
こういうマクロを見かけたんですがこのマクロはどうして
do { } while(0)
なんてことをしているのでしょうか?
単純に{ } とブロックで囲むのとはどこか違うのでしょうか?
そもそもどうしてブロックで囲んでいるのでしょうか?
>>203 {} で囲むのは、中で使う変数のためのスコープを作るため。
do while(0) するのは、マクロ呼び出しの後のセミコロンを必須にするため。
>>203 if (...) OP_ASSERT(...);
としたときのための深謀遠慮。
206 :
204 :2006/07/16(日) 19:03:36
>>205 あーなんか忘れてると思ったらそれだ。 else が。
>>201 もしWindowsならPlatform SDKのBITMAPFILEHEADERを使うべきだよ。
そうでないなら自分で定義するしかないけど。
208 :
203 :2006/07/16(日) 19:19:47
お二方ありがとうございます。
ちょっと理解するのに時間かかりそうです
>>204 変数のスコープ作成のためというのは理解できました
マクロ記述以前の部分で同名変数あったらまずいですものね
マクロ呼出し後のセミコロンを必須とするためというのも理解できました
文の最後に;がないのは気持ち悪いですものね
do {} while(0)で囲むことによって
OP_ASSERT(3)
とか;が抜かった場合ちゃんとコンパイルエラーになってくれますね
で、
>>205 が理解できてません
頭をひねっていますあと30分考えれば理解できるだろうか・・・やってみます
if() {}; else{} if() do{}while(0); else{} 上だとelseが浮いてエラーでしょ?
210 :
デフォルトの名無しさん :2006/07/16(日) 19:49:54
>>202 ありがとうございます。ググってみてなんとなく理解しました。
>>207 最終的にはそうするかもです。
211 :
203 :2006/07/16(日) 19:49:55
elseがどう関係するんだろうと思ってたんですが、 やっと理解できました if (...) OP_ASSERT(...); else printf("else"); としたときにマクロをdo { } while (0) で囲ってないと elseとifが対応しないというコンパイルエラーになるんですね これで合ってますか?
212 :
203 :2006/07/16(日) 20:02:24
>>209 あ、先に答え書いてくれてたんですね。
ありがとうございます
ただ、どうしてdo {} while(0);だとコンパイルエラーにならないのかが
わかりません
if ()
{};
else{};
だと二行目の{};でif文の終わりと解釈されてエラー
if()
do{}while(0);
else{};
だと二行目は
if() 文;
else 文;
の形式として解釈されて問題なし
ということですかね
class cBase { virtual void Init(); }; class cData : public cBase { void Init(){ /*初期化処理*/ }; }; main() { static char *works=(char*)malloc(1000); cData *data; data=(cData*)&(works[50]); data->Init(); } こういった感じで別途確保した領域をクラスとして使いたいのですが、->Init()実行時にエラーが出てしまいます。 コンストラクタが実行されていない為に仮想関数のテーブルが作成されていない、と予想しているのですが、 この予想で正しいでしょうか。また、解決法はありますでしょうか。 知恵を貸してください。
>>213 アラインメントの問題がなければ、<new>をインクルードして、
data = new(&works[50]) cData;などとする。
それで&works[50]にコンストラクタが呼ばれcDataのオブジェクトが作られる。
逆は、data->~cData();のように自分でデストラクタを呼んでからfree()すればよい。
operator new, operator deleteをオーバーロードすればいいじゃん
>>213 cData *data = new cData();
何か壮大な勘違いをしている予感。
218 :
216 :2006/07/16(日) 22:15:31
「別途確保した領域を〜」を読み飛ばして意味不明な書き込みをしてしまった。ごめんよ。 +50 はアライメントの問題が発生しそうだな。
>>214 ご教示いただけた手法で解決いたしました。
new の使い方や、ヘッダの存在自体しらなかったりと勉強不足を思い知らされました。
ありがとうございました。
data->cData();
これでコンストラクタが呼べても良いと思うんですけどねぇ・・
>>215 ,218
+50は例としてあげるのは不味かったですね・・
実際はローカルなメモリ管理クラスが返す領域で、16byteにアラインが調整されています。
大人の事情というか、管理上の都合なんですがオーバーロードすると特定の領域からの
割り当てしか出来なくなってしまいそうなので今回は別の手段を、と考えました。
ありがとうございました。
221 :
デフォルトの名無しさん :2006/07/16(日) 22:37:40
基本的なこととは思いますが、質問させてください。 printf, puts, putcharやscanf, getcharの使い分けがよくわかりません。 1文字ならputchar, getcharが良いとか、 エスケープシーケンスを使うならprintf、使わないならputsが良いということでしょうか? 今まではprintfとscanfしか使っていなかったのですが、使い分けるべきでしょうか? 実行効率や、エラー時に違いがあるのでしょうか? ご教授お願いします。
好きにしたらいい。 効率は実装依存。 エラー時の違いはヘルプ読め。
>>221 やっぱりprintfは書式文字の解釈をする分、
単純に文字列を書くだけなら余計な手間がかかることになる。
だから、どちらかというとputs/putcharで済むならそっちを使うと言う傾向にあることはある。
世の中、printfをputsやputcharに置き換えられるときには
置き換えるという最適化をする変わり者のコンパイラもあるけどね。
入力の方も事情は大体同じ。
ただしscanfはまともに使うのが恐ろしく面倒で、getsはまず間違いなく安全に使えない。
そこで、たとえばfgetsとsscanfを使う。
(getcharはOK)
>>223 標準ライブラリ関数の最適化による挿げ替えをするのは変わり者なのですか?
それじゃ、最適化による関数のインライン展開は?
標準ライブラリ関数より高速な関数への挿げ替えは?
gccは変わり者だといいたいらしいな。
いやだってそんな最適化をするのはgcc以外聞いたことがない。 よい意味で変わり者だと思う。
プリプロセッサについて質問があるんだけど、 #define PUTWS(wtes) (wprintf(L"%s\n", #wtes) ってしようとすると、ポインタの型が合いませんって コンパイラさんが怒ってます。 何かいい回避方法はないでしょうか?
230 :
228 :2006/07/17(月) 01:41:41
すんなり解決しました。 229さんありがとうございます。 #xxx って、"xxx"に展開されるだけだったんですね。 勉強になりました。
231 :
228 :2006/07/17(月) 01:56:38
VCだと229さんの方法でうまくいったけど、gccだとコンパイルエラーが出た。 んで、 #define PUTWS(wtes); wprintf(L"%s\n", L ## #wtes); としたら両方で解決しました。 んでは。
232 :
229 :2006/07/17(月) 02:14:55
あー、くっついてないと駄目か。ありがとう、俺も覚えとく。
>>227 iccもやるよ。MSもmemcpy()をインライン展開するくらいしたと思ったが。
>>233 printfに渡されている文字列定数の中身までみるようなコンパイラはないだろ。
>>234 VCもgccも文字列定数を見て型の不一致の警告を出したりしたと思ったが
>>235 VC8だと出すんだな。
printfのようなものなんて久しく使ってないから気づかなかった。
>>234 printf("%s\n", foo);をputs(foo);に置き換えるくらいは平気でやる。
printf("%c", '\n');がputchar('\n');に置き換えるくらいもやったと思った。
#include<stdio.h> int main(){ FILE *fp; fp=fopen("test.txt","a+"); return 0; } このプログラムを実行してもtest.txtというファイルが作成されません。 何か勘違いがあるのでしょうか?
>>238 戻り値調べて、ヌルが返ってきてたら perror() してみろ。
if文等で試行錯誤してみましたが、どうやらNULLは返ってきてはいないようです。
exeをコマンドプロンプトから実行していたものを、ファイルをダブルクリックすることで実行するようにしたらファイルが作成されました。 理由はよくわかりませんがアドバイスをくださった皆さん、どうもありがとうございました。
なんで実行形式の違いで結果が違うんだ? 質問に便乗する形になってすまんが、誰か詳しく教えてくれんか?
>>241 、243
カレンディレクトリについて勉強して出直してこい。
ゴミをばら撒いてる悪寒
248 :
デフォルトの名無しさん :2006/07/17(月) 21:34:33
Cの関数で、戻り値がTRUEかFALSEの場合、 戻り値の型はintよりBOOLの方が真偽であると分かりいいと思うが、 <windows.h>をBOOL以外に使う必要が無い場合、 インクルードしたくない。boolはc++でしか使えない。 他にいい方法がありましたら教えてください。
typedef int BOOL;
C言語に関しての質問です。 ある関数と、その関数から呼ばれた関数と、さらにその呼ばれた関数から呼ばれた関数と・・・ という関数群でのみ通用する、ローカル変数とグローバル変数の中間の変数みたいなものってありませんか? 何も考えずにグローバルに詰め込んでたら何がなんだかわからなくなってしまって・・・
static
>>251 そういう変数をまとめた構造体へのポインタを引数にしろ。
それが C++ でのクラスに相当するコードになる。
255 :
248 :2006/07/17(月) 22:01:40
みなさまありがとうございます。 使ってみます。
BOOLとboolが混在してくるとイライラするよな
大きい配列はどうやったら確保できますか?下のコードを走らせると 「セグメンテーション違反です」と怒られます。環境は Linux です。 #include <stdio.h> int main(void) { double aa[100000][11] = {0.0}; return 0; }
newやmalloc等で動的に確保するか、オプションでスタックサイズを大きくする。
>>258 ありがとうございます。
よくわかってませんが、スタックサイズを大きくする方は ulimit でよいですか?
260 :
257 :2006/07/18(火) 00:18:35
自己。よくわかってませんが、 ulimit -Ss 大きな値 で上手くいくようです。257 だと大きな値 = 8600 がギリギリ可能な値でした。 なんで 8600 になるのかわからないですが…
>>257 static double aa[100000][11] = {0.0};
とする手もある
ただし257は再現する最低限のコードってことだろうから
文脈によってはこの手は使えない
>>260 double aa[100000][11] ってことは
doubleが8byteなら8,800,000byteをスタックに要求しているのでしょう?
Linuxは使ったことないし、ulimitのことも知らないけれど、
スタックサイズに8600を指定して上手く行くと言うのは
(8600 * 1024) == 8,806,400byteを確保しているからだと思いますよ。
だれか、クイックソートってポインタと配列使わないで書けるかな? マジ課題がピンチなんだ。
何をソートするんだよ。 配列は使わないんだよな?
配列もポインタもなしで、一体何をソートするんだ?
int value_1, value_2, value_3, value_4, value_5; をソートしたいとか。
>>266 のだと
template 記述の再帰型 qsort モドキになるのか?
>>266 配列に代入し直してからソートして戻すか、
ポインタの配列を作ってからソートするか、か?
あるいは、泥臭く分岐するか?
どれにしろ、その程度の個数ならクイックソートは
かなり無駄っぽいが。
>>269 がボケすぎて笑える
5個かどうかも分からないのに
value_1, value2, value_3, ... なんてのが何十個もあるわけが・・・ いや、初心者ならありうるか。
ポインタも封じられるとなると値の交換に難儀するな
C++ の参照渡しもNGなんだろうねぇ…
多少工夫するにしても マクロでやれ っつーことか?
#
>>269 の素で分岐するのが最終解だと思うけどね
MASM の REPT〜ENDM 相当のやつがプリプロセッサにないからお手上げだな
275 :
デフォルトの名無しさん :2006/07/18(火) 16:40:19
ど素人の質問なんですが、 コンパイル済みのアプリを 他のプログラムから(出来ればVB)操作することは出来るんでしょうか。 ボタンにフォーカスを持っていって押す、とか。
Q. 〜は出来るんでしょうか A. 技術的に出来るがお前には無理
すみません、STLってJavaみたいなもんすか?
>>277 たぶん227が考えているものとはだいぶ違うような気がする。
STLはジェネリックなコンテナ(コレクション)と、その要素を舐めるためのイテレータと、
それに対して操作を施すアルゴリズム(関数)のあつまり。
今、両方(どっちかというとJavaの方がわかります)勉強してるんですが、 C++のSTLはJavaにすごく似てると思うんです。 コレクションもイテレータもあるし。
java の主要な機能がコンテナじゃない言語処理系だろ? 言語処理系 と コンテナ概念(およびその実装) を等価に評価するなんてナンセンスだぜ
>>279 その言い方だと、四則演算なんかもっとそっくりだぞ。
例えばFortranとBasicともそっくりだ。
Javaだってコレクションとイテレータ以外にもライブラリはてんこ盛りのはずだろというつもりだった。 それはともかく、どんなプログラミング言語でも結局そういうコレクションにはお世話になるんだし、 その実装も大したことはないから結局どんな言語でも似たようなものになるのは当然だと思う。
Cだと低水準のインラインアセンブラとかいろいろ出来ると思うんですが、 STLだとなんかビジネスロジックみたく(VBやACESSのスクリプト)みたいに システムを楽に量産するような感じなんでしょうか。 日本語変ですいません。
STL、というよりデータ構造(コンテナ・コレクション)はそんな具象的でなく、もっと抽象的な存在。 うまく生かしてやるように使うのが大事。
たぶん頭の中でアプリケーションのレイヤーの高低の切り方が斜めっているんだと思う
次は、JavaとglibとWindowsと2chって似てますね。スレッドとかあるし。 とか言いかねないな。
俯瞰してみれば、どれも同じだと言って差し支えない。
288 :
デフォルトの名無しさん :2006/07/20(木) 02:00:50
char* concatenate(char* str1, char* str2) { char *str; sprintf(str, "%s%s", str1, str2); return str; } str1とstr2を連結した文字列strのポインタを返す関数を作りました。 このコードでもうまく動くのですが、strは初期化されていないのに なぜ、正常に動くのでしょうか?
たまたま
290 :
デフォルトの名無しさん :2006/07/20(木) 02:10:43
>289 そうなんですか? 正しくは char* concatenate(char* str1, char* str2) { char *str; str = (char*)malloc(strlen(str1) + strlen(str2) - 1); sprintf(str, "%s%s", str1, str2); return str; } こうするべきですか?
うん(細かいことは抜きにして)
-1じゃなくて、+1じゃね?
両方に\0があるから-1なんでしょ。 それより、freeしなくていいの?
とおもったが\0ってstrlenじゃ計算されないんだったスマソ +1じゃないといけんね。
>>293 本人ですか?
関数内でfreeしちゃったらそもそも・・・
本家の strcat は呼び出し側の方で malloc して
strcat(dst, src1, src2) してるね
strcatは2引数
297 :
デフォルトの名無しさん :2006/07/20(木) 15:34:25
お初です 今日からCをはじめよめた者です 猫でもわかる〜と言う本を買ってそれで学ぼうと思ったのですが・・・。 いきなり大きな障害が C++Builder 5を使おうと思っているのですか うまく動いてくれないんです メモ帳で #include <stdio.h> int main() { printf("Hello World\n"); return 0; } これを.cで保存してコマンドプロントで実行したら HelloWorld と出るはずなのですが Borlanb C++ 5.5.1 for win32 Copyright (c) 1933,2000 Borland HelloWorld.c; Turbo Incremental Link 5.00 Copyright (c) 1997,2000 Borland C:\work> と出るのです これは何が悪いのでしょうか? 助言よろしくお願いします
>>297 ソースの名前が hello.c としたら hello.exe というファイルが出来てない?
それを実行すると Hello World とでる。
>297 そりゃ単にソースコードをコンパイルして実行ファイルを作っただけだ。 実行したいなら、C:\work内にHelloWorld.exeが生成されてるだろうからそれをそのまま(コマンドプロンプトから)実行。 あと、メッセージはちゃんとコピー&ペーストしようね(プロンプトからならドラッグして範囲選択後、左クリック)
初心者宣言するやつはろくなやつは居ない。
302 :
デフォルトの名無しさん :2006/07/20(木) 17:05:53
C:\work>bcc32 HelloWorld.exe Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland HelloWorld.exe: エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x2) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x4) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0xf) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '�' (0xff) エラー E2206 HelloWorld.exe 1: 不正な文字 '�' (0xff) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 'ク' (0xb8) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2206 HelloWorld.exe 1: 不正な文字 '@' (0x40) エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0) エラー E2141 HelloWorld.exe 1: 宣言の構文エラー *** 24 errors in Compile ***
exeファイルをコンパイルするなよ。
Javaのコマンドインタプリタに毒されてる?
305 :
デフォルトの名無しさん :2006/07/20(木) 17:10:49
>298-299 出来ました アレがコピペできるなんて思いませんでした やってみると出来ました 色々情報サンクスです 何かあったらまたきますのでそのときよろしくお願いします
306 :
299 :2006/07/20(木) 17:19:47
なんか今更ですまんが左クリックじゃなくて右クリックだった。
>>301 上級者宣言する奴には、もっとろくな奴がいない。
じゃあ、中級者宣言します!
>>299 =
>>306 漏れはうっかり右クリックを2回(コピーしてペーストも)してしまうことがあるので
コピーのときは「範囲選択+Enter」でペーストのときだけ右クリックするようにしてる
311 :
デフォルトの名無しさん :2006/07/20(木) 19:06:39
動きました 皆様助言アリガトウございます
312 :
290 :2006/07/21(金) 02:32:58
>291->296 本人です。 どうもありがとうございました。 これからもよろしくお願いします。
教えて下さい。猫でもわかる〜と言う本を見て勉強しています。 Borland C++ compiler 5.5を使っています。 本の中で次のような練習問題があるのですが、 #include <stdio.h> int main() { int a = 10; size_t s; s = sizeof ++a; printf("a = %d\n", a); return 0; } これをコンパイルしようとすると、 Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 0409.c:警告 W8004 0409.c 14: 's' に代入した値は使われていない(関数 main ) と警告が出てコンパイル出来ません。 この本には上記のようなサンプルコードと、それをコンパイルした 実行ファイルが付いていて、ファイルを実行する事は出来ます。実行すると、 a = 10 となります。なぜ上記のコードがコンパイル出来るのでしょうか? 他にも本と同じように組んでもコンパイル出来ない事が何度かありました。 これは私の環境が良くないのでしょうか?助言宜しくお願いします。
警告とエラーの見分けもつかねーのかよカス
>s = sizeof ++a; これは何を意図しているんだ?
本には警告について載っていなかったのでわかりませんでした。 フォルダの中を確認したら実行ファイルがありました。 警告文とエラーメッセージが出たらコンパイル出来ていないと 思い込んでいました。カスです。ごめんなさい。
s = sizeof ++a; は変数 a がインクリメントで11になるはず! しかし、sizeof 式;としても式は評価されないから 変数 a の値は10のまま。という練習問題みたいです。
>>315 sizeof 式
sizeofで式が評価されないことの実証だと思う。評価されるとすると a = 11になるよな。
どこかに警告レベルを調整する設定があるはずだから、そのレベルを落とせば出なくなると思う。
ありがとうございます。調べてみます。 他の問題も全て出来ました。御助力ありがとうございました。
321 :
デフォルトの名無しさん :2006/07/21(金) 08:55:14
HPを読み込んで内容を検索しようと思ったのですが、InternetOpen、InternetOpenUrl、InternetReadFileの順序でコードを書いたのですが、InternetReadFileを何回呼び出しても、最初の部分しか取得できない状態です。 どのサンプルをみてもInternetReadFileを数回読み込むだけで全部取得できているのですが、どこが悪いのかわかりません。
マルチか…
はわわ〜
C#が不安になってきてC++勉強しだしたんですが C++はnewで初期化とかしなくていいんですか?
しなくて済むんだったらしないほうが楽。 必要なところではしましょ。
>>325 C++はC#と違ってコンストラクタが勝手に呼ばれるということでいいんでしょうか?
>>326 int x = 5;のようなことはC++でもC#でも書けるでしょ。
その考えをクラスにも拡張したと捉えてみてはどうでしょう。
>>327 大体こんな感じっていうのはわかりました。
ありがとうございました。
C++では全てが原則値型相当だと書こうと思ったら、 C#って構造体でもコンストラクタ呼ぶにはnew使うのか、説明には面倒な仕組みだ。
WMP10のSDKについてるサンプル (\WMSDK\WMPSDK10\samples\cpp\WMPHost) をいじってたんですが CWMPEventDispatch.cpp の各メソッド ( OpenStateChange 〜)からWMPのコントロールを持っている ウィンドウのハンドルを取得したいんですがどうやったらいいでしょう?
MFCを使わずにC++で窓プログラミングする場合、 クラスのインスタンスはどこで作るべきでしょーか? グローバルに作るとまだゲットしてないウィンドウハンドルが受け取れないので 初期化処理ができないしWinMainとかプロシージャ内で作るのも・・・? もしかしてとんでもない考え間違いですかねぇ・・・
>>332 クラスの詳細でしょうか?
メインウィンドウに張り付いて描画されたビットマップを表示する
カスタムコントロールのクラスです
MFCでいうCWndクラスのようなものは継承してませんし作れませんので
どうしたもんかと思いまして・・・
>>333 グローバルなポインタを置いてウィンドウ作成時に new すればいいんじゃね?
>>334 な、なるほど!
ウインドウ作成時とはコントロールの張り付け先のメインウィンドウ作成時
ということでよろしいでしょうか?
>>335 他に何のウィンドウがあるか、こっちはシラネーんだ。好きにしろ。
>>336 すみません確かにそうですね!
なにはともあれ、ありがとうございます!
変数の初期化で質問なんだけど、宣言時なら POINT ptHoge = { 640, 480 }; みたいに初期化できるんだけど、初期化したいのがクラス変数の場合は どうすればいい? コンストラクタ内で、ptHoge.x = 640; ptHoge.y = 480; ってやるしかない?
>>338 単にメンバの初期化なら初期化リストを使うのがいいかも。
こんなカンジで定義しておいて、
class POINT {
private:
int x, y;
public:
POINT(int x, int y) : x(x), y(y) {}
};
こんなカンジで初期化。
POINT ptHoge(640, 480);
>>340 いや、たぶん class T { POINT ptHoge; T(); }; の T::T() の話だろ。
class T { POINT ptHoge; T() : ptHoge(640, 480) { hogehoge; } };
>>342 こういうアホほど答えたがるのはどうにかならんものか
なんか問題ある?
単に頓珍漢なだけだろ。
あまりにあっさり答えられてしまったのが悔しかったのかな
348 :
デフォルトの名無しさん :2006/07/24(月) 01:03:53
整数型から符号情報を取り出す関数 int sign(int n) { if (n>0) return 1; if (n<0) return -1; return 0; } をifも三項演算子も使わないで実装する方法があったと思うのですが どなたか知りませんか?
>>348 ((n > 0) - (n < 0))
こんなの?お勧めはしない。
あとMSBで見るとか 移植性消えるけど
352 :
デフォルトの名無しさん :2006/07/24(月) 02:40:50
>>348 どうもです試してみます。boolからintの部分もビット演算か何かで確実にできると嬉しいのですが。
>>350 if文と同じだと聞いたもので...秒間1000万回近く呼ばれるので条件分岐を無くせば高速化できるかなと期待しているのです。
>>351 同じような事を考えたのですが0と正を算出する方法が思い付きませんで。intel以外で使う予定はないので移植性には目をつむります...
353 :
デフォルトの名無しさん :2006/07/24(月) 02:53:25
>>348 考えてみたらこの式で十分な気がしてきました.ありがとうございます
むしろ遅くなる気がするが…。
intel だけで使うならインラインアセンブラ使え
取り出した符号を後でどう使うのか知りたい気がする。
348と349で、g++ -O3 -Sとして吐かれるアセンブラのコードを見てみたが、 349のほうは条件分岐がなくなって速そうに見えた。 あと、どちらもシフト命令でMSBを見てるようだ。 ちょっと意外。
実測もせずコレじゃ効率悪いよなぁと悩んでプログラム作成が進まないのは罠
何も考えなくても、実測してみりゃいいのにな。 コンパイラの最適化でどうなるかなんて どうせ考えたって埒があかないんだから。
実測しないでアセンブリ出力を較べてみた。 static int sign0(int n) {if (n > 0) return 1;if (n < 0) return -1;return 0;} static int sign1(int n) {if (n < 0) return -1;if (n > 0) return 1;return 0;} static int sign2(int n) {return ((n > 0) - (n < 0));} static int sign3(int n) {return n < 0 ? -1 : n > 0;} ・gcc3.4.4@cygwin sign1とsign3で全く同じコードを吐く。それらは条件ジャンプ1回と条件セットでシフトはなし。 sign2はシフトと条件セットを駆使している。sign0は無駄なジャンプあり。 ・gcc3.2.3@linux cygwin版とほぼ同じ。こちらの方が積極的にインライン展開しようとする。一部無駄なジャンプあり。 sign0とsign2でシフトを使う。 ・icc(32)9.0@linux sign2以外はジャンプし捲くりのほぼ同じコード。 プロファイリングでジャンプしない条件を探すことが前提か。 ・icc(64)9.0@linux sign2以外ではシフトは使わない。ジャンプはするが、32ビット版ほどではない。 sign2以外は同じロジックになり、条件ジャンプ1回無条件ジャンプ1回、条件つきコピー1回。 ・総括 インライン展開しないとどっち道関数呼び出しが遅いと思われ。 インライン展開するならロジックによる速度差が出るだろうけれど、 iccの場合はジャンプの可能性をプロファイリングで正しく見積もるべきだろう。 #詳細は割愛。
357ですが、-Oオプション使いました? sign0とsign2しかやってないけど、 sign0の-Oなしでジャンプ2個、-O3でジャンプ1個だったけども。 うちもgcc (GCC) 3.4.4 (cygming special)
>>361 returnを数えてないとか? インライン展開しちゃうと判断難しそうだが。
>>356 俺も知りたい。結局、if 文で判定していたら大笑い。
>>348 です.
>>360 詳細な分析ありがとうございます.inlineでやってます.プロファイリングの方法が今ひとつ分かってないので今後の課題です.
>>356 >>363 実はオセロの勝敗累積?に使ってます.うまいこと書けませんが
sum = 0;
for(i=0; i<10000; i++) sum += sim();
でsimが何度か再帰するのですが最後に石の数の差から勝敗をsignで取り出して加算してゆく感じです.アルゴリズムがうまくいってないのでよわよわですが
質問と関係ないけどアドバイスしとく オセロの勝敗は石の数の差だけど 途中の有利不利は石の数の差じゃないから よあよあになるのは当たり前
ついでに言うと 自分の着手出来る場所の数 - 相手の着手出来る場所の数 が大きくなるようにするのがミソ
>>366 確かにそうなんですがsimは64マス全て埋め尽くしてみてその勝敗を返す関数なので
最後にsignを使っているところは問題なさそうです.
最近囲碁で流行っている手法だそうなので試してみてますがあんまりうまくいってません...
VC++6.0を使っているものです、質問させてください。
ttp://www.vector.co.jp/soft/win95/prog/se251850.html 上のアドレスから落とせる、
amediousという、3層ニューラルネットワークを作成するプログラムを使って
入力層2中間層4出力層3のネットワークをBPで学習させて使いたいのですが
amediousに付いてくるhtmの説明を見てもよく分かりませんでした。
結局これは、自分でこの説明を参考にしてプログラムを組め、
ということなのでしょうか・・・?
上でVC++6.0を使っています、と書きましたが、
持っているというだけで、プログラムの知識がまったくないので、困っています。
良かったら、どなたかアドバイスをお願いします・・・。
>>369 それは、クラスライブラリだから、自分でプログラムするんだよ。
プログラムの知識がまったくないなら無理。
デバッグ中、クラスメソッド内でメンバ変数のポインタがNULLってありえない class CLASS { private: char m_string[1024]; public: void method() { strcpy( m_string, "TEST" ); // ここでNULL } }; どう思いますか
これが偶然動くことは多いよ。 CLASS *p = 0; p->method(); ところでC++ではメソッドという言葉を使わない。
メンバ関数内でメンバ変数に触れないなら大丈夫かと
そういうのって素人考えでは設計が間違ってるんじゃないかって 思ったりするんですが、実際のところはどうなんでしょうか? 静的でないメンバ変数に触れないなら その関数は静的にした方がいいと思うのですが。
>>375 分っちゃいるが便利なんでやっちまうことも多い。
特にすでに書いちゃったメンバ関数の特殊な状況で
this無しで呼びたいってのは、後から出てくるもんだ。
もちろんタコなのは言うまでも無いが。
thisがヌルだなんて状況は絶対に有り得ないとするのは当然。 376のようなことはちっとも一般的でないから勘違いしないように、一応ね。 いくら秘密兵器だとしても程がある。
ぬるぽに -> 使った時点で未定義動作。
∧_∧
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←
>>378 (_フ彡
C++のSTLとその例外についてです。 C++の大抵の本では「vectorやstringを使えばメモリ関連の苦労ともオサラバです」とありますが、 (1) その理由は「生ポインタと違い、意図せぬメモリ領域にアクセスすることがない(その前に 例外が飛んでくる)から」という理解でいいのでしょうか? (2) stringなどで、不正?アクセスは防げても、メモリ不足による各種操作の失敗の可能性は依然残ります。 そんな時は例外が飛んでくるのでしょうが、これの対処としてはどんなのが正統派なのでしょう? サンプルコードなんかは何もしてないものが多かったのですが、こういうもんなんでしょうか? それとも念のため、string使う所は常にcatch(...){ /*エラーメッセージ*/ } とかしておく方が 良いスタイルだったりするのでしょうか?
>>380 basic_stringの場合
§21.3.4
4 The functions described in this clause can report two kinds of errors, each associated with a distinct exception:
? a length error is associated with exceptions of type length_error (19.1.4);
? an out-of-range error is associated with exceptions of type out_of_range (19.1.5).
4a For any string operation, if as a result of the operation, size() would exceed max_size() then the
operation throws length_error.
>>380 (1)
どういう文脈で「メモリ関連の苦労ともオサラバです」なのか
よくわかんないけどサイズが自動的に拡張されるから、
cの文字列操作関数につきもののバッファオーバーランを防げる...
とかでは?
(2)
全くケースバイケース。
例えばCGIだったら、500 Server Internal Errorでも返すべきかもしれないし、
そんなに重要じゃないアプリケーションなら
キャッチもせずにそのままアプリケーションを落としてもいいだろうし。
あなたがサムソンの社員だったら、メモリモジュールの通販サイトへ
ユーザを案内してもよいでしょう。
(1) 確かに領域のサイズをあまり気にしなくて良いという点もあるが もっと大きいのは、リーク(解放しわすれ)を気にしなくてすむことだろう。 誰が確保して、どの段階で誰が責任を持って解放するのか、考えることが無くなる。 (2) 必要ならば使う前後でtryを使うこともあるだろうが 「メモリ不足」は極めて深刻な、回復不能のエラーなため アプリケーション全体でcatchして、そのまま終了するケースも多い。 もちろん、サービス等の終了してはいけないものは丁寧に管理する必要があるし データの保存を必要とする場合もあるが。 それでも、普通は「常に前後でtry&catch」という形は採らない。
(1)の最大の理由はいちいちfreeすることを考えなくてよいということだと思う。 途中でreturnするような関数で、returnの数だけfreeが書いてあるような醜いコードも結構見かける。 vectorやstringでは、デストラクタでメモリを解放してくれるから、そういうようなコードは起こり得ないということ。 スマートポインタと同じ発想だな。
385 :
デフォルトの名無しさん :2006/07/27(木) 23:31:00
このプログラムでtest1とtest2の違いは何ですか? test1だとt[500]の配列が新たにスタックに作られるという 違いだけですか? #include<stdio.h> #include<stdlib.h> void test1(int t[500]){ printf("%d ",t[500-1]+1); } void test2(int *t){ printf("%d ",t[500-1]+1); } void main(){ int *t,i; t=(int *)malloc(sizeof(int)*500); for(i=0;i<500;i++)t[i]=i; test1(t); test2(t); free(t); }
>>385 違いはない。同じ。
関数の仮引数の大きさは無視される。
void test3(int t[]){ printf("%d ",t[500-1]+1); }
#include<stdio.h> #include<stdlib.h> void test4(int (*t)[500]){ printf("%d ",(*t)[500-1]+1); } void test5(int **t){ printf("%d ",(*t)[500-1]+1); } void test6(int *t[]){ printf("%d ",(*t)[500-1]+1); } void main(){ int *t,i; t=(int *)malloc(sizeof(int)*500); for(i=0;i<500;i++)t[i]=i; test4(&t); test5(&t); test6(&t); free(t); }
#include<stdio.h> #include<stdlib.h> void test7(int (*t)[500]){ printf("%d ",t[0][500-1]+1); } void test8(int **t){ printf("%d ",t[0][500-1]+1); } void test9(int *t[]){ printf("%d ",t[0][500-1]+1); } void main(){ int *t,i; t=(int *)malloc(sizeof(int)*500); for(i=0;i<500;i++)t[i]=i; test7(&t); test8(&t); test9(&t); free(t); }
#include<stdio.h> #include<stdlib.h> void testA(int (*t)[500]){ printf("%d ",(*(t+1))[500-1]+1); } void testB(int **t){ printf("%d ",(*(t+1))[500-1]+1); } void testC(int *t[]){ printf("%d ",(*(t+1))[500-1]+1); } void main(){ int (*t)[500],i; t=(int (*)[500])malloc(sizeof(int [500])*2); for(i=0;i<500;i++){t[0][i]=i;t[1][i]=i+500;} testA(t); testB(t); testC(t); free(t); }
392 :
デフォルトの名無しさん :2006/07/28(金) 02:45:43
393 :
380 :2006/07/28(金) 03:01:24
皆様、お返事ありがとうございました。
>>381 これはISOの文書でしょうか?非常に参考になります。
大きめの書店なんかで入手できるもんでしょうか?
>>382 オサラバ云々は、イントロで述べられているようなものです。
で、「オーバーフロー関連のことは忘れられても、メモリ不足の状況なんかは依然
考える必要が残ってそうだから、完全にオサラバつうわけじゃないじゃん」と思ったわけです。
(2)で、そのまま落とすとの御意見も大変参考になりました。
>>383 (2)について、例えばアプリケーション全体をcatchするこんなのもアリということでしょうか。
int main(void){
try{ MakeMainWindow(); }
catch (...){ /*エラーメッセージ、ギブアップ宣言、最低限の後始末*/ }
}
>>383 >>384 (1)について納得しました。確かに解放さえきちんとやれれば、被害(リーク)なんてありませんもんね。
void foo() { std::vector<std::string*> v; v.push_back( new std::string() ); call_exceptional_function(); } とか書いて、 fooを抜けるときに new string() で作ったオブジェクトが解放されなくて苦しめ
バカ降臨
397 :
デフォルトの名無しさん :2006/07/28(金) 10:18:43
C言語をはじめようと思うんですが、何を使えばいいんですか? VisualBasic2005でできますか?
398 :
デフォルトの名無しさん :2006/07/28(金) 10:30:30
mallocで取得したメモリをfreeで解放しようとした時、解放できたかを 確認することはできますか?
399 :
デフォルトの名無しさん :2006/07/28(金) 10:40:17
できない。
hint: return value
401 :
デフォルトの名無しさん :2006/07/28(金) 10:42:23
おっと!環境依存可スレか。 環境によっては可能かも。
VC2005ならerrno
>>400 void free(void *memblock);
実際に解放されるタイミングは 関数呼び出し時かもしれないし しばらくあとかもしれないし OSによってはあえて解放しないかもしれない 解放後どうなるかを確認することには意味が無い 確保するときに成功したか失敗したかを知ることの方が重要
406 :
デフォルトの名無しさん :2006/07/28(金) 11:41:19
いまさらですがどこかでVC++6.0を買えませんか? VB6.0を持っていて、VisualStudioのヘルプが充実しているので VCもそれでいまさら勉強したいのですが
Visual C++ 2005 Expressの使用方法になるのですが、
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_00.htm を実行する場合、どのテンプレートを使用したらよいのでしょうか?
空のテンプレートで作成すると、windows.hへのパスが通ってないらしく
そこでエラーになります。
パスを通そうとして、includeフォルダの位置を探したのですが、
そのフォルダの中にwindows.,hがありませんでした。
(C:\Program Files\Microsoft Visual Studio 8\VC\include)
そのままじゃコンパイルできないということなのでしょうか?
408 :
407 :2006/07/28(金) 11:45:49
補足 因みにSDKについてはマイクロソフトのHP通りにインストールしています。 連投すいません。
大佐、ディスクリプタをiostreamで扱いたいんだが どうすればいい?
411 :
393 :2006/07/28(金) 12:11:25
>>394 どうもありがとうございます。ドラフト見れました
環境依存OK
環境を書け、って意味かと。
415 :
409 :2006/07/28(金) 14:27:33
環境依存なのか・・・ 環境依存なソースはあんまり書きたくないので C風な書き方で妥協しとくことにします・・・。 俺は負け犬だぁぁぁぁ
416 :
デフォルトの名無しさん :2006/07/28(金) 17:11:37
すいません、質問なんですが、ANSI g++でメンバ関数内でオブジェクト自身のアドレス を扱う方法を教えていただきたいのですが、どなたかわかる方いらっしゃいますか?
this?
418 :
デフォルトの名無しさん :2006/07/28(金) 17:18:04
>>416 thisに&をつけてみたのですが、non-value unary '&'というエラーが出ました。
thisがポインタだもん &いらないよ
420 :
デフォルトの名無しさん :2006/07/28(金) 17:29:39
>>419 仰るとおりにやったら動きました。
すいません、こんな基本的なことを知らなくて。
本当に助かりました。
ありがとうございました。
421 :
デフォルトの名無しさん :2006/07/28(金) 18:00:37
ファイル名に使える文字数の長さが定義されているマクロとかありますか?
#include <dir.h> MAXPATH
#include <stdlib.h> MAX_PATH
WindowsでNT系+NTFSなら W系APIを使えば、MAX_PATHよりずっと長いファイル名が作れたりする。 一応、予備知識として。
>>406 Visual Studio Professional Edition with MSDN Professional Subscription
を手に入れれば、VC++6.0もついてくるよ
>>423 stdlib.hのは _MAX_PATH だよ。
MAX_PATH はSDK。
427 :
デフォルトの名無しさん :2006/07/28(金) 23:03:02
MSに直接訊けばいいじゃん
static const int N = 100; みたいなコンパイル時定数があるとして、これをコンパイル時に文字列定数化する方法ってありますか? マクロでも何でもいいです。いろいろ考えたけど、どうも思いつかない。 イメージとしてはこんな感じで static const char str[] = "N = " TO_STRING(N); この時の「定数」っていうのは、const 定数や enum 値であって、 以下のようなものは不可とします。 #define N 100
>>430 template meta programing を駆使すればなんとかなるかもしれない。
こんな感じ?
template<int N> struct formated_int { static char const value[]; };
もしかしたら boost に混ざってるかもしれない。
どなたかお知恵をお貸し下さい。 VB6にて作成したActiveX DLLをVC++2003で参照したいのですが、 スマートポインタを使用する方法(#importする方法)ではなく、 win32APIの"LordLibrary"のように明示的にリンクさせる方法を ご存知ないでしょうか? 質問をする背景を簡単に書きますと以下のようになります。 ・複数のActiveX DLLを呼び出し側(VC)のプログラム実行中にロードしなければならない ・DLLの名称、数ともに不定であり、#importでは対応できない ・DLLのPATH、ロードトリガは別モジュールから共有メモリを介して呼び出し側(VC)へ通知する ・全DLL内には公開されている同一名称のクラスとメソッドが存在している 以上、よろしくお願い致します。
>>430 逆にすれば、boost::lexical_castが使えるんでないかい
434 :
デフォルトの名無しさん :2006/07/29(土) 08:49:37
HeapAlloc GlobalAlloc malloc new メモリ確保がいろいろあるんですけど、どれが一番いいのでしょうか? ↓調べてみた。 すべて最終的にはHeapAllocで確保する newでは一回使うとフリーメモリリストに登録され二度目では高速に確保できる、しかし、断片化しやすい。 速度ではHeapAllocが爆速。 小さい奴はnewででかい奴はHeapAllocで。 mallocはクラスに向かない、ごみ。
つか、クラスの場合はnewしかないだろ
newだなあ。 いざとなったらoperator newをオーバーロードすればいいんだし。
なるほどね。 newでおkってことですか。 今使ってる サンプルがHeapAlloc とか使っていて気になったけど newに直しとくか。
438 :
デフォルトの名無しさん :2006/07/29(土) 10:18:20
ちんちーん
全部使うよ
CopyMemory 後ろからコピーしたいのですが、一個一個後ろからしていくのしか方法はないのでしょうか!?
後ろからしたい理由はなんだ?
データを逆に&コピーしたいだけですよ。
std::reverse_copy
rbegin()、rend()
445 :
M :2006/07/29(土) 15:02:33
1.duble型変数へのポインタ変数dPtrを宣言する。 2.float型ポイント変数aにfloat型変数numberのアドレスを代入する。 3.ポインタ変数aが指すオブジェクトの値を1インクリメントする。 4.文字型配列aに格納されてる文字列をプリントする。 C言語でどうやってプログラムするんですか?(><)
1. double *dPtr; 2. flat *a = &number; 3. a++; 4. printf("%s", a);
2. ×flat *a ○float *a 3. ×a++; ○(*a)++;
>>445 1. double *dPtr;
2. a = &number;
3. (*a)++;
4. printf("%s", a);
あとポイントじゃなくてポインタな
そいつマルチだよ
float型で++はだめ?
duble *a か!それは気づかなかった。 いやーこれはどういう働きをするんだろうね?
初めて見る型だドゥーブル せっかくだからお茶にするドゥーブル
457 :
デフォルトの名無しさん :2006/07/29(土) 17:51:22
template<typename T> と template<class T> って、どのように違うのでしょうか。
どのようにも違わない。
typenameの方を使わないとコンパイルできない時がある
>>459 例えばどんな場合ですか?
<>内にtypenameを使う場合に限る。
テンプレートパラメータにネストした型をとる時とか? そもそもそんな事できたっけ
テンプレート使用時のときと勘違いしてた、すまん
関数ポインタのポインタを戻り値にする関数はどのように宣言するのがいいのでしょうか たとえば、関数ポインタを登録する関数 long EntryCallBack(voiid (_stdcall *pCallBackFunc) (char* pSolidRefer)); は正しいのに,、登録した関数ポインタを取得する関数は voiid (_stdcall *) (char* pSolidRefer)) Function(); エラーになってしまいます。
困った時はtypedef
voiid が気になるw void (_stdcall *Function())(char* pSolidRefer); だけど、素直に typedef した方がいい。
467 :
464 :2006/07/29(土) 22:37:06
typedefにしたらうまく行ったよ、サンキュ
468 :
デフォルトの名無しさん :2006/07/30(日) 15:18:55
ABC.h で template<class T> class ABC { 宣言 }; typedef ABC<long> ABC32; としていて、 DEF.h で ABC32 のポインタだけを使用しているので、 ABC.h をインクルードせず、前方宣言だけで、 class ABC32; void Func1(ABC32* abc); とした。 次に、Func1 の実装をするために DEF.cpp で #include "DEF.h" #include "ABC.h" void Func1(ABC32* abc) { 実装 } としてコンパイルしたところ、コンパイラ (VC2003) が、 ABC32 を再定義した、というエラーを吐いた。 どうしたら意図どおりのことをできるでしょうか。
ABC.hで //typedef ABC<long> ABC32; class ABC32 : public ABC<long> { };
470 :
デフォルトの名無しさん :2006/07/30(日) 15:59:06
>469 これだと、コンストラクタや代入演算子を再定義しないといけないのでは。
>>468 class ABC32;
という前方宣言がおかしい。
ABC32はクラスじゃない。
template<typename T> class ABC; //ABCの前方宣言
typedef ABC<long> ABC32; //ABC32の別名定義
>>470 ABC32をクラスとしたいなら
>>469 ABC<long>の別名としたいならDEF.hで
//class ABC32;
template <class T> class ABC;
typedef ABC<int> ABC32;
void Func1(ABC32* abc);
473 :
468 :2006/07/30(日) 16:24:21
>>471 ,472
ありがとうございます。できました! m(_ _)m
474 :
デフォルトの名無しさん :2006/07/30(日) 17:00:37
475 :
デフォルトの名無しさん :2006/07/30(日) 18:36:23
C++ で例外使うと遅くなるってほんと? 例外が発生したときの処理が遅いだけで、 例外が滅多にスローされなければ、遅くならないよね?
try 節に入る部分と出る部分に処理が入る筈。 どこまで遅くなるかは実測してみれ。
>>478 君は人のレスを読んでいるのだろうか・・・
シュレディンガーの例外処理。
484 :
デフォルトの名無しさん :2006/07/30(日) 22:04:02
Cを学ばないでC++を学んでも大丈夫ですよね?
486 :
デフォルトの名無しさん :2006/07/30(日) 22:06:51
ありがとうございます!
あれ、ここ何のスレだっけ?
ほう、gccは例外を投げても遅くならないと言うのか。
>>490 投げなくても遅くなるのかどうか、が問題になっている。
そりゃどんな実装でも”少しは”遅くなるだろ。CMP命令が一つ入るとか。 割り込みでも使わない限り、ソフトウェア的にオーバーヘッドゼロというのは 絶対に無理だ。
何も命令が入らなければゼロだよw
まあそうだけど。
そういうわけで、何も命令が入らない実装があるかないかという話になるわけだ。 まあ、ないだろうけども。
関数中にthrow文が一つもなければ、最適化によって、 スタックの巻き戻しをカットしてしまう事はあるかもしれん。 関数の入り口にスタッククリーンアップの準備を置くのも、 throw文の有無によってカットできるかもしれんし。
throw がなかったら try-catch 書く意味が無いから、 条件によって例外が投げられうる状況を 仮定したので構わないと思う。 ただ、実測してみようとテストしてみるときには そのあたりを注意する必要はありそうだ。
指定したプロセスIDが存在するかどうか確認できるAPIってありますか? 自分で実行中のプロセスと比較しないといけないのかな。
EnumProcesses()
誰もWindowsとは書いていないわけだが。
>>499-501 >>499-501 >>499-501 >>499-501 >>499-501 >501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
池沼はプログラミングなどしないほうが良い
>>500 ありがとうございます。まさにピンポイントで欲しいAPIでした。
>>501 すいません、Windowsの事です。
>>502 えと、なんというかすいません。501さんは499に書き込みした私ではないです。
>>502 もしあんたが>500なら、それこそレスなどしない方がいいぞ。
505 :
デフォルトの名無しさん :2006/07/31(月) 11:24:17
callocってなんの略でしたっけ?ド忘れした(´・ω・`)
clear-allocation ?
>>509 Linuxだけど、Windowsかどうかなんて関係あんのか?
今Cを独学で勉強しています。 #include <stdio.h> int main(void) { int *p, q; q=199; p=&q; printf("%d\n", *p); return 0; } 上記のプログラムで、 ポインタの説明をしているところを勉強中なのですが、 なぜ、int pと定義せずに、int *pと定義するのかが分かりません。 *が演算子なら、int pで宣言し、プログラム中で*pという 演算をすれば良いのでは?と思うのですが。 また、なぜ、int *p で定義すれば、プログラム中で、 pが変数宣言も無しで使用可能なのでしょうか?
ポインタだから
int* p; こう書けばわかりやすいか でも int* p, q; とか書くと勘違いするよな
>>513 早速のお返事ありがとうございます。
>int* p;
>こう書けばわかりやすいか
しかし、正直分かるようで、分かりません。
演算子が変数宣言のところに登場するのが、納得できないのです。
加算演算子とポインタ演算子が、
性質が異なっているのを分かった上で
誤解を恐れずに書くと、
int -p や、int /p みたいなことをやっているのはどうしてだろうと考えてしまうのです。
とにかく、今はこういうもんだという風な覚え方をしておきます。
Cの全体を把握した上で、再度考えますね。
>>514 ポインタ演算子というか、関節演算子は、四則演算子とは質がまるっきり
違うとだけ書いておくね。
×関節 ○間接 馬鹿な変換してしもた・・・
#include <stdio.h> typedef int *int_ptr; int main(void){ int_ptr p; int q; q = 199; p = &q; printf("%d\n", *p); return 0; }
>>517 おおっ、よく分かりました。
ありがとうございます。
まじかよ
typedefってすげぇなぁ
飢餓で苦しんでる子供をtypedefで救えるんじゃなかろうか
テポドン何発飛んで来ても怖くないな
巨大隕石が落ちてきてもtypedefでなんとかなるな
typedefで僕にも彼女ができました
typedef 教に入信しました。
タイプデス
唯一神 typedef 様を崇め奉るが良い
typedefでガンが治りました
529 :
デフォルトの名無しさん :2006/07/31(月) 22:58:52
3次元ベクトルを表すクラスまたは構造体の名前として何がいいか悩んでいます。 STL に vector があるので、これは使いたくありません。 class XYZ とか class Coord3 とかどうかなと思っていますが、 何かいい名前はありませんか?
> 530 ありがとう。そっちに移動するよ。
>>511 int *p; の * は、演算子じゃない。
p が「int オブジェクトを指すポインタ型」である事を表す記号だ。
大抵の環境で遅くなる以上、「tryを書くと遅くなる」と考えてほぼ間違いないというこで。
「大抵の環境」の定義は個人の考え、経験等に依存しますが何か?
>>535 バカの一つ覚えかよ
>>536 はいはい。具体的な環境挙げられるようになってから言ってね。
>>536 客観的に定義できると思うけど、思わないのなら別にいい。
すいません、c++って言うよりldの問題なんですけど、 環境はAIX 5.2 gccは Using built-in specs. Target: powerpc-ibm-aix5.2.0.0 Configured with: ../configure --with-as=/usr/bin/as --with-ld=/usr/bin/ld --disable-nls --enable-languages=c,c++ --prefix=/opt/freeware --enable-threads --enable-version-specific-runtime-libs --host=powerpc-ibm-aix5.2.0.0 Thread model: aix gcc version 4.0.0 でbochsをコンパイルしています。 aix標準の/usr/ccs/binのldでコンパイルすると g++ -o bochs -g -O2 -D_LARGE_FILES -DBX_SHARE_PATH=\"/usr/local/share/bochs\" logio.o main.o config.o load32bitOShack.o pc_system.o osdep.o plugin.o crc.o iodev/libiodev.a cpu/libcpu.a memory/libmemory.a gui/libgui.a disasm/libdisasm.a fpu/libfpu.a -lSM -lICE -lX11 -lXpm -lm ld: 0711-317 ERROR: Undefined symbol: vtable for __cxxabiv1::__si_class_type_info ld: 0711-317 ERROR: Undefined symbol: vtable for __cxxabiv1::__vmi_class_type_info ld: 0711-317 ERROR: Undefined symbol: vtable for __cxxabiv1::__class_type_info ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information. collect2: ld returned 8 exit status gmake: *** [bochs] Error 1 と出てエラーになります。
そこでgnuのldを使おうとおもって コンパイルしたのですが、今度も /bin/sh ./libtool --mode=link g++ -o bochs -g -O2 -D_LARGE_FILES -DBX_SHARE_PATH='"/usr/local/share/bochs"' -export-dynamic logio.o main.o config.o load32bitOShack.o pc_system.o osdep.o plugin.o crc.o iodev/libiodev.a cpu/libcpu.a memory/libmemory.a gui/libgui.a disasm/libdisasm.a fpu/libfpu.a -lSM -lICE -lX11 -lXpm -lm g++ -o bochs -g -O2 -D_LARGE_FILES -DBX_SHARE_PATH=\"/usr/local/share/bochs\" logio.o main.o config.o load32bitOShack.o pc_system.o osdep.o plugin.o crc.o -Wl,--export-dynamic iodev/libiodev.a cpu/libcpu.a memory/libmemory.a gui/libgui.a disasm/libdisasm.a fpu/libfpu.a -lSM -lICE -lX11 -lXpm -lm /usr/bin/ld: config.o: reloc .data:0 not in csect config.o: could not read symbols: Bad value collect2: ld returned 1 exit status make: The error code from the last command is 1. と出ます。 これはどんなエラーで、ソースちょっとソースをいじればコンパイルできるようなものなんでしょうか?
>>532 JIS X 3012:2003 8. 宣言子 第2パラグラフ
> 宣言子は,*(へのポインタ)及び()(を返す関数)などの演算子を含めることで
> 指定子の型を変更することができる。
つまり、宣言中に現れる演算子は指定子の型を変更するために使われる。 と言うことで宜しいか。
ポインタの加算で質問です。 #include <stdio.h>; int main(void) { char *cp, ch; int *ip, i; float *fp, f; double *dp, d; cp=&ch; ip=&i; fp=&f; dp=&d; printf("%p %p %p %p\n", cp, ip, fp, dp); cp++; ip++; fp++; dp++; printf("%p %p %p %p\n", cp, ip, fp, dp); return 0; } を実行すると、 0013FF57 0013FF3C 0013FF24 0013FF08 0013FF58 0013FF40 0013FF28 0013FF10 続行するには何かキーを押してください . . . となるんですが、doubleの値がおかしいのは何故でしょうか? いくらプログラムを見直してもミスが見つけられません。
どうしておかしいと思ったのか教えてくれ
何をもっておかしい と結論に至ったのかを説明汁 sizeof(type) と (int)((char *)((type*)1) - (char *)((type *)0)) が食い違うのか?
>>545 そう言うことです。
本には加算すると型のバイト数が加算されるとあったので、
0013FF08からdp++すると、0013FF12にならなければいけないんじゃないかと思いました。
すいません 543,546の質問は忘れて下さい。 16進数だということを忘れてましたorz
>>546 sizeof(double) を見てから考えなさい。
>>547 なんか、癒されるなぁ…。 こういうミスは、ほのぼのしてていいw
ファイルの入出力って何がいいのでしょうか、大容量ファイル読み込む時
メモリマップトファイル
RubyのイテレータみたいなことをC++のイテレータ使って 実現したいんだけどどうすればいいでしょう。 たとえば、aryを適当な配列だとして、その順列すべてを表示するのを for(it = ary.permutaion_start(); it != ary.permutaion_end(); it++) { cout << *it << endl; } のように書きたいんです。 it++ の実装をどう言うふうにしたらいいかがさっぱり。 参考になるサイトがあったら教えてください。
>>552 で、その「配列」とやらはどういう実装になってんだね?
それがわからんと何とも言えん
シェル : tcsh コンパイラ : gcc-4.0.1 上の環境で、Cでプログラム作っているのですが、 シェルの外部コマンドを exec 等で実行する様に 組み込みコマンドもプログラム中で実行したいのですが、 調べてみても求める物を見つけられませんでした。 よければどなたか教えていただけないでしょうか?
>>555 #include <stdlib.h>
int system(const char *string);
で何とかならないかな?
557 :
555 :2006/08/01(火) 21:43:15
>>556 system も試してみましたが、
結局 exec("sh", 〜〜〜〜)と同じ結果で
無理でした…
bashならbash -c internal_command
template<typename Containee> class myArray{ public: typedef Containee *iterator; // ... };
>>559 C++でジェネレータを書く簡単な方法はないと思う。
問題に特化した書き方を工夫するか(たとえば順列はstd::next_permutationで列挙できる)、
「次に何をするか」を示す関数オブジェクトをイテレータ内部に保存するとかの方法が一応ある。
>>559 >のPythonのところにある、「ジェネレータ関数によって内部イテレータを作成」というのと
>似たようなことです。
リンク先を読んでみたけど552の例は全然似てなくないかい?
>>562 例えば
for(...) for(..) std::cout << p << "\n";
というような順列を列挙するアルゴリズムがあったとして、yield文があればこれをそのまま
for(...) for(...) yield p;
と書き換えることで順列を列挙するイテレータが出来上がるって事だろ。
Cを学び始めたばかりのものなのですが、 シェーカーソート法というのを本で読んでやろうとして 以下のように書いたところコンパイルしたけど上手く動きません。 ダメな所をどなたか教えてください。 ちなみに要素数6の配列を受け取る関数です。 void sort(int x[]) { int i,tmp; int lp,rp; lp=0;rp=5; do{ for(i=lp;i<rp;i++) if(x[i]>x[i+1]){tmp=x[i];x[i]=x[i+1];x[i+1]=tmp;} rp=i; for(i=rp;i>lp;i--) if(x[j-1]>x[j]){tmp=x[j-1];x[j-1]=x[j];x[j]=tmp;} lp=i; }while(lp<rp); }
書き間違えました><
>>564 を訂正です。
void sort(int x[])
{
int i,tmp;
int lp,rp;
lp=0;rp=5;
do{
for(i=lp;i<rp;i++)
if(x[i]>x[i+1]){tmp=x[i];x[i]=x[i+1];x[i+1]=tmp;}
rp=i;
for(i=rp;i>lp;i--)
if(x[i-1]>x[i]){tmp=x[i-1];x[i-1]=x[i];x[i]=tmp;}
lp=i;
}while(lp<rp);
}
566 :
552 :2006/08/01(火) 23:47:56
>>561 なるほど。一般的な方法となると難しいようですね。
std::next_permutaionは読んでみます。
>>562 説明下手で、本意が伝わらなくてすみません。
>>563 が説明されているようなのが、まさに私が欲しているものです。
皆さん、レスありがとうございました。
>>564 デバッガ使ったりprintfを埋め込んでコードを追いかけろ。
デバッグはプログラマにとってコードを書くのと同じかそれ以上に重要な仕事だ。
あと「上手く動きません」じゃなくて、具体的にどうなったのか書け。
現象は原因を探る重要な手掛かりだ。
>>567 mainも含めて書くと
void sort(int x[])
{
int i,tmp;
int lp,rp;
lp=0;rp=5;
do{
for(i=lp;i<rp;i++)if(x[i]>x[i+1]){tmp=x[i];x[i]=x[i+1];x[i+1]=tmp;}
rp=i;
for(i=rp;i>lp;i--)if(x[i-1]>x[i]){tmp=x[i-1];x[i-1]=x[i];x[i]=tmp;}
lp=i;
}while(lp<rp);
}
int main()
{
int i;
int a[6]={12,53,22,64,11,9};
printf("並び替えを行います。");
sort(a);
printf("並び替えました\n");
for(i=0;i<6;i++)
printf("%d番目に小さい数は%d\n",i+1,a[i]);
return 0;
}
こうなのですが、実行すると「並び替えを行います」で止まります。エラーで終了とかでなく、sort関数が終わらないのかな?って感じでその後は表示されません。
あとホントに学び初めなのでデバッグとかはよく分からないです;
>>568 rp=i と lp=i に意味が無い。
>>569 直りましたっ!
i++とi--の働くタイミングを勘違いしていました><;
ホントにありがとうございます!!
>>568 要所要所でprintfで変数の値を表示させるなりして
意図通り動いているか・どこでおかしくなっているのか確認する。
int i[20]; こうすると i[0]〜i[19] まで確保されるんですよね? i[20]で動かしても正常・・・なんでやろ
>>572 C言語ではそういうのを「未定義動作」としていて、
何が起こっても文句は言えないプログラムとしている。
チェックしてエラーを発生させたりしてくれない。
自分の身は自分で守れということ。
一般的なCPUに配列の添え字チェックの命令なんてないからねぇ。 ゆえにC言語でもそんなことしない。
>>574 x86ならbound命令がある。使われた試しはないようだが。
>>574 一般的なCPUにローテート命令なんてのがあるわけですが、
C言語にないのはなぜですか?
一般的なCPUに参考演算子相当の命令なんてないのに
C言語にあるのはなぜですか?
>>576 言語仕様を定めた人間達がそれを含めないと決めたからです。
そんなことも知らないのですか?
ローテートどころかキャリーフラグすらないぞ
ヤバいw初心者系のスレかと思って覗いたら何の話してるんだかサッパリ分からない。 とりあえずこのスレの人を何故か尊敬したw
つまり
>>574 はCPUの仕様制限がCの仕様を決めたとおっしゃりたいのですね
普段話す相手がいないから ここ2ちゃんで自分の知識を語りたいんだね でも知識を人と比較する機会が無いから内容は 頓珍漢なんだね。 君の知識はすばらしいからあまり公開せず大事に自分の中に しまっておくのがいいよ。
機械語でコンピュータと会話するんだ!
>>581 そんなムキにならなくても。君だっていつかは物知りになれるさ。たぶん。あるいは。もしかしたら。
やばい、参考演算子って何だ?わからない。 ググッてみよう。 トップで表示されるのは… JavaA2Z【三項演算子とは】 違うんだよ、参考演算子を知りたいんだよ! んっ?待てよ…。 三項演算子かい!!
興奮状態のお子ちゃまを下手にいじると 休みが終わるまでの間ずっと馬鹿丸出しの屁理屈で粘着されるから そういうのはやめたほうがいいよ。
C++にオペレーターオーバーライドってあるじゃないですか あれでポインタ演算子*の置き換えって出来るんでしょうか
できる
むしろ多重定義できない演算子のほうが例外的な存在。
前田に放課後体育館裏に来いと言われた。 「佳代とうとう運命の時が来たね☆」 「なにが運命の時よ。」 友人のめぐみの前では素っ気ないそぶりをしてたけど私の胸の鼓動は高まっていた。 前田は小さいころからの幼なじみ。 ぼーっとしてて私がいつも面倒を見ていた。 でもやっぱし私は前田が好きなんだ・・・。 放課後がやってきた。 「なによ?こんなところに呼んで?何の用?」 「おっ・・お前をバブルソート!」 「きゃっ!」
ごめん オチがわからん
>>590 一般的なレスにオチをつけろ命令なんてないからねぇ。
ゆえに
>>589 のレスでもそんなことしない。
このネタは"as is"で提供されます。
むしろオチのあるレスのほうが例外的な存在。
>586 そもそもオペレーターオーバーライドなどというモノはC++には存在しない。
バブルマンの間違いじゃ…
暗黙の型変換、例えば int a=3; double b=0.1415; double sum= a+ b; ってのがあったとき、 doubole sum= (double)a+ b; みたいに型キャストを明示した方がよいのでしょうか? こんな簡単なプログラムではどっちでもいいような気がしますが、 明示した方が煩雑なプログラムを組むのにはメリットがあるというのであれば、 今のうちから癖をつけときたいのです。 まだ、煩雑なプログラムを書けないので 暗黙で変換したときのメリットデメリット、 明示的に変換したときのメリットデメリットが分からないので、 変な質問をさせて頂きました。 よろしくお願いします。
>>598 その例だとメリットもデメリットもない。
intはdoubleに変換せざるを得ないしその変換自体は安全に行なわれるから。
仮にsumがfloatだったらfloat sum = (float)(a + b);のように明示したほうがいい。
#敢えて書かずにコンパイラに警告を出させると言う選択もある。
600 :
598 :2006/08/04(金) 14:33:22
回答ありがとうございます。 確かに、この例ではメリット、デメリットもないですね。 ただ、今後大きなプログラムを書く場合、 どうなのかなと思ったのですが。 メリットデメリットを見極めるためにも、面倒ではありますが、 当分明示して様子みます。
省略に慣れてしまうとそのうち int a = 2; double b = 3.5; double c = 1 / a + b; みたいなことを平気でするようになるから 明示する癖つけといた方がいいよ。
また、微妙な式を書くなw
これは明らかにアウトだろ
void hoge(int *values, int n) { int sum = 0; int i; for(i = 0; i < n; ++i) { sum += values[i]; } printf("合計: %d, 平均: %f", sum, sum / n); } とか。
>>601 おっちょこちょいな俺でも、さすがにそれは無い。
606 :
デフォルトの名無しさん :2006/08/04(金) 19:04:56
int kahenko(int kazu, ...) { set_kahenko(kazu, ...); } 可変個仮引数の...を可変個実引数に使いたいのですが、 当然エラーになります。 なので、今はいろんな関数で使いたい、 可変個引数の加工の処理をマクロで行っていますが、 通常の関数でやる方法がありましたら教えてください。
>606 stdarg.hでぐぐれ
608 :
606 :2006/08/04(金) 19:13:35
>>607 ありがとうございます。ぐぐってみます。
609 :
606 :2006/08/04(金) 19:40:49
ありがとうございました。できました。 va_start化したmarkerを渡せばいいわけですね。
ファイル位置指示子について質問です。あるwhileループの中で fseek(before, 2L, SEEK_CUR); fgetpos(before, pos); while( (c=fgetc(before)) != '<' ) count++; fsetpos(before, pos); fread(score, 1, count, before); printf("%s\n", score); としたところファイル位置指示子が戻ってこず、'<'の後の内容が出力されます。 何がいけないのでしょうか?
611 :
デフォルトの名無しさん :2006/08/04(金) 21:14:15
exeファイルに画像(データ)をいけたいのですがどうすればいいでしょうか??
>>611 WindowsのEXEならリソースとしてくっつけろ。
614 :
610 :2006/08/04(金) 21:34:14
すいません。613さんの指摘で解決しました。 定義でポインタとして宣言していたためにうまく働かなかったようです。
615 :
あばよ :2006/08/04(金) 22:34:57
どう書けばいいのかわからないプログラムあるんだけど 修正求めていいですか?
616 :
デフォルトの名無しさん :2006/08/04(金) 22:37:04
NET、C,C++、C#とかあるのですがどれが一番いいでしょうか C#>C++>C なんですかね? NETが分からん、、、新しい言語ってことでしょうか?
617 :
デフォルトの名無しさん :2006/08/04(金) 22:40:36
VCでExcelのファイルを読み書きするプログラムを作りたいけど、 ActiveXというのを使えばいいのですか? 何かお薦めの書籍やサイトあります?
コマンドプロンプトで、 ・・・>実行ファイル名 コマンドライン引数(処理するビットマップファイル) というふうに実行するプログラムを作ったのですが、あるパソコンでは、 処理するビットマップを実行ファイルのアイコンにドラッグ&ドロップして実行することができます。 しかし、同じことをしても無反応のパソコンもあります。 一体何が違うのでしょうか? ドラッグ&ドロップのほうが快適なので、できるようにしたいです。
619 :
618 :2006/08/04(金) 22:45:16
できるパソコンはXPのプロフィッショナルで できないパソコンはXPのホームエディションです。 この違いでしょうか??
んなわけねーだろ。
>>618 ショートカットかそうでないか、渡すファイルの個数 などを見てみよう。
>>616 お前の言うNETとは.NET Frameworkのことだろうが、
.NET FrameworkはMSが提唱したプログラムを動かす基盤的な環境のこと。
ランタイムやクラスライブラリの巨大な集合体と言ったところか。
C#で書いたプログラムや、.NET Frameworkの機能を使って書いたC++のプログラムは
ユーザが.NET Frameworkをインストールしてあるコンピュータでしか実行できない。
(逆に.NET FrameworkさえあればOSがWindowsでなくとも実行できると言うのが建前)
C#>C++>Cは正しくない。
それぞれ得意・不得意なことがあるから、どれが良いかは一概に決められない。
ただし俺に言わせれば、その3つの中では良くも悪くもC++が一番万能だ。
言語比較の質問にまじめに答えてるやつって何なの?
C言語の標準関数って誰が作ったんですか? scanfとかstrtokとか、クソ仕様なのが多杉なんですけど。
reallocとかもな でもどんな言語にも糞仕様は存在するもんさ
scanfとかstrtokはそーでもないと思うが・・・。 とりあえずcreat,gets,sprintfとかあげとく。
セキュリティホールになるやら 割り込みやマルチスレッドと相性悪いやらってことだろ >scanf, strtok
時代に合ってない、つーか今どきんなもん使ってる奴が馬鹿ってことだろ
( ・д・) ?
Cプログラマーが存在しないスレはここですか
>>625 お前より頭いいやつが作った。これはガチ
なんか、指を怪我したのは包丁の仕様がクソだからで、 いまどき包丁を使ってる奴は馬鹿って事みたいな・・・
まぁ確かに、料理用の鋏も随分よくなったから鋏で済ませることも多いがな。
ostream.h ddraw.hがインクルードできません、というエラーが出るんですが これを直すにはどうすればいいのでしょうか? すいませんがよろしくお願いします。
>>635 <ostream.h>は現在のC++には存在しない。今は<ostream>だ。
<ddraw.h>はDirectX SDKをインストールしろ。
637 :
618 :2006/08/05(土) 12:54:10
strtokってマルチスレッドと相性悪いのか?
>strtok() 関数は文字列の解析に静的バッファを用いるので、スレッドセーフでない。 >これが問題になる場合は strtok_r() を用いること。
ああそうか、二つめ以降のトークンはバッファ指定せずに取り出してるな。
strtokは入力文字列を破壊するわ、内部で外部変数使ってるわで、 使い方間違えると危ない。 ま、それなりに便利だと思うけどね。
>>624 現実世界でも居るだろ、「この壷は〜」とか「xxx様のいう事は正しい」とか「絵を買いませんか?」とか
本人の脳内でしか繋がってない、摩訶不思議な例を持ち出す奴とかな。
strtokはシングルスレッドだったら普通に使えるし、マルチスレッドがない時代もあったし、 代用関数だって簡単に作れるけど、 sprintfは危険性高いし、sprintfからsnprintfを作れないし、自分で作ると複雑だし、 sprintfの仕様って欠陥じゃね?
%s 使わなきゃ最大サイズは決まるけど、まあ欠陥関数っちゃー欠陥関数だ。 だから、大抵の環境ではサイズ指定できるものとか、 サイズを取得するだけの関数とか、そういうのが用意されている。
%.*s
アホすwww
うぁはは、やってくれるよ
C言語の教科書って古い奴でも大丈夫? 90年代の。 今Java少し学んでて次にC→C++と学びたいんだ。 古い物でも仕様の変更とかはありませんか?
>>653 今書籍スレ覗いてるところ。
ブックオフで250円とかで投売りだったから
使えそうなら買おうと思ってたんだよね。
現時点では基礎くらいわかるようになればいいので。
使うかもわからないし仕事はじめて必要になったら
楽に身に付けれるように基礎を押さえるだけでいいかなって。
質問です。 あんまり言語関係ないですけれど。 例えばWindowsのアプリケーションがMacで動かないのは 極論すればAPIが違うからと理解して良いですか? そして、JAVAがプラットフォームに依存しないのは、 全てのOSで共通したAPIを提供しているからですか?
CPUが違う JavaはVMで動作している
Sample* pSample = new Sample(); と Sample* pSample = new Sample; の違いって何?
>>658 Sample が POD 型であるとき、前者は一通り値が初期化される。
後者は初期化されない。 Sample が POD でなければ同じ。
660 :
659 :2006/08/06(日) 20:02:41
> Sample が POD でなければ同じ。 ごめん。これ嘘。 Sample が POD 型じゃなくても、明示的に宣言したコンストラクタが 無い場合は前者は一通り値が初期化される。後者は暗黙に定義される コンストラクタが実行される。後者の場合、メンバに POD と非 POD が 混ざってると POD は初期化されない。 ややこしいんで、いちおう規格の関連箇所は 5.3.4.15 と 8.5.5 ね。
規格厨は説明が下手だなぁ
説明せずに規格の原文そのまま貼れよ。痛すぎる。
規格を解釈する能力がない香具師が適当な説明を書くなよ
664 :
659 :2006/08/06(日) 20:41:19
>>661-663 ごめんよ。最初は
>>659 ぐらいで終わるかと思ったんだ。
でも、
>>660 の内容まで続けて書いたら、自分でもうまく書けた気がしなかったんで
関連箇所を上げたんだ。怪しいと思ったらそっちを見てくれ。原文コピペは意味無いよね?
まとめればこういうことだろ。 Sampleにコンストラクタがあれば、どちらも省略時コンストラクタ(引数無しで呼べるコンストラクタ)を呼ぶ。(無ければエラー) Sampleが組み込み型の場合、前者はゼロ初期化され、後者は不定(初期化されない)。 Sampleにコンストラクタが無い場合または配列型の場合、上記の規則を基底クラスとメンバまたは各要素に対して再帰的に適用する。
惜しい。
667 :
デフォルトの名無しさん :2006/08/06(日) 23:26:12
C++にJavaのObjectにあたるものってありますか?
>>668 全部メッセージに出てる。嫁。
あと、次からは画像じゃなくてテキストのコピペを使え。
>>667 ない。
C++に標準で用意されているクラスはstring関係と、stream関係と、STL関係だけ。
>>670 exception とか type_info とか locale とか全部無視か?
673 :
668 :2006/08/06(日) 23:39:20
>>669 すいませんでした
strcpy_sを使えってことですかね?
strcpyって一般的に今でも使われていると思ったんですが。
・・・。
>>673 使われてる。むしろ可搬性の低い_sなぞ窓から捨てろといいたいところだが
実際注意しないと安全じゃないのも確かなんだよなぁ。まあプログラマの技量しだいか。
Cの文字列系の関数はアレなのでmicrosoftが独自拡張してます
678 :
668 :2006/08/06(日) 23:43:55
独自拡張も結構ですけど、 strcpyを普通に使いたいなと思っただけです。
679 :
668 :2006/08/06(日) 23:46:07
680 :
668 :2006/08/07(月) 00:11:16
すいません もう一点質問させてください コンストラクタがないと言われるのですが コンストラクタは定義されているんです。 なぜ無いと言われるのでしょうか? error C2512: 'std::basic_ostream<_Elem,_Traits>' : クラス、構造体、共用体に既定のコンストラクタがありません。 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] class debuglog : public ostream { public: debuglog() { #ifdef DEBUG_MONO mono.clear(); #endif #ifdef DEBUG_FILE if(!open_debug_file()) throw "error opening debug log"; #endif }
std::basic_ostreamにデフォルトコンストラクタが無いから
>>680 何度も言うが、エラーメッセージをよく読め。
エラーの対象となっているクラスは std::basic_ostream<_Elem,_Traits> だ。
そして、そこで言う「既定のコンストラクタ」とはデフォルトコンストラクタの糞訳だ。
つまり
>>681 あとは継承した場合のコンストラクタの呼ばれ方を調べろ。
それにしても、そのdebuglogは一体どんな使い方をするのだろうか気になる……。
684 :
668 :2006/08/07(月) 01:06:13
debuglogの対処法がわからいのでプロジェクトから削除しました
fp=fopen("test.txt","rt"); で読み込むと文字化けします。 どうやらtest.txtがUTF-8な様子。 これをちゃんとUTF-8として読み込むにはどうしたら良いでしょうか?
charに読み込まないでwchar_tに読み込めばOK。 fopen()/fclose()には関係なし。
wchar_tだとunicode LEにならんかな?
>>687 windows前提で答えてしまった。環境は書いてないね。
ていうか、普通にfreadでUTF-8として読み込めるだろ。
質問させて下さい。 VC++6.0で動作する、全く別物のプログラムA,Bがあるとします。 そのA,Bを合体させたい(A上でボタンを押すことでBを呼び出して実行させたい)のですが、 何か方法は無いでしょうか。 環境はVC++6.0で、プログラムは初心者です。 よろしくお願いします。
スレ違いだったとはいえ何もいわずにマルチかよ。いい根性してんな。
fp=fopen("test.txt","rb");
695 :
デフォルトの名無しさん :2006/08/08(火) 14:20:32
お願いします。 int a[5] = {20, 33, 41, 3, 80}; のような配列があって、 int order[5]; にaの要素が大きい順の添字を入れたいのです。 どうすればよいでしょうか。 この例だと order[5] = {5, 3, 2, 1, 4}; のようになります。
ソートすればいいんじゃない? てか添字は0から
697 :
695 :2006/08/08(火) 14:32:23
>>695 ですが、一応。
order[5] = {4, 2, 1, 0, 3};
こうでした。
どうすればいいのでしょうか。
698 :
695 :2006/08/08(火) 14:37:50
>>696 a[]をソートしてしまうと、その例えば一番大きい値が何番目にあったのかが
わからなくなってしまうような気がするのですが。
order[ ]をa[ ]の値を使ってソートすればいい。
700 :
695 :2006/08/08(火) 15:29:04
>>699 な、なんとかできました。
order[5] = {0, 1, 2, 3, 4};
と初期化をして、
a[]の値をソートしながら、一緒にorder[]もソートすることでできました。
ありがとうございます。
おめでとう。 でもaはソートしなくてもいいんだよ〜
702 :
デフォルトの名無しさん :2006/08/09(水) 00:40:50
Cの勉強始めようと思うんだけど環境って何がいいんですか? 今はEclipseでJavaをかじってる程度。 コンパイラとか総合開発環境?でお勧めってあったら是非教えてください。 お願いします。
705 :
702 :2006/08/09(水) 00:50:13
>>703 Cygwinはコンパイラって入ってるの?
前使ってたけど使い難かった。
>>704 Vine3.2はVMwareで入ってる。
でも重い。
インスコディスク消えたからインスコできない。
確かにLinuxが環境としてはやりやすい。
Cygwinにはgccが標準で入っている。
>>706 CはわからないんだけどgccはCのコンパイラ?
CygwinはEmacsとかViは使えないでしょ?
MeadowとCygwinでいいの?
>>707 gccはCコンパイラ。(他言語のコンパイラでもあるが)
emacsもviも使える。
ちなみにgccは標準では入ってない。
>>707 大抵のものはCygwinに揃っている。
標準でインストールされるかどうかはともかく、EmacsもViもきっとあるはず。
710 :
707 :2006/08/09(水) 00:59:29
>>708 ,709
コマンドプロンプトよりは確実に使いやすいはずだよね。
とりあえず入れてみるありがとう!
cygwinのエディタは日本語使えるようにするのが大変だから、 xyaayxなり、meadowなりをつかった方がいいよ。
gccもemacsもvi(vim)も、cygwinのセットアップツールで一括インストールできるね。
>>711 xyzzy?
713 :
707 :2006/08/09(水) 01:10:34
>>711 meadowってemacsに近いけど少し違うよね?
Java作ってる時にTab押した時のインデントが気に食わなかった。
設定できるのかな?
>>712 とりあえずHP見てAll Installにしたから入ったと思う。
まだインスコ中だけど。
All Installとは、また剛毅な。 想像を超える数のファイルがインストールされるから覚悟しておくようにw
715 :
707 :2006/08/09(水) 01:20:24
>>714 10分経っても3%だったからやり直したwwwwwwww
gccとemacs、vimだけ入れてみた。
がんばるぞっと!
Cygwin入れたんだけど何もできない。 パス通したし作業フォルダもC:\Cにした。 lsもdirでも使えないぞ? 再起動してないからな? それとも入れないといけないものでもあったのかな…。
c:\cygwin\bin
すみません、質問させてください。
http://xxxxx.dyndns.tv/~nadesiko/up/upload.php ここにアップしたVC++6.0で作成してあるプログラムを、
どうしてもコマンドプロンプトで実行したいのですが
よくわからないエラーが出て実行出来ません。
このプログラムは、引数としてdata1、data2というファイルが必要なのですが
それが関係しているのでしょうか・・・。
少しスレ違いかもしれませんが、
宜しければどなたかアドバイスを下さらないでしょうか。
720 :
719 :2006/08/09(水) 02:46:00
すみません、どのファイルなのかを書き忘れました。 上のアドレスのupupup5164.zipです。 コメントにも分かり易く書いておきました。 重ね重ね、宜しくお願いします。
>>702 せっかくEclipse持っているのになぜそれを使わないんだ。
C/C++プラグインあるぞ。
int main(int argc ,char *argv[]); ~~~~~~~ ←この部分に関する質問です argv[1]に文字列を追加した場合、領域破壊が発生しますか?
します
ありがとうございます
なんらかのプロセスが新しく作成された瞬間を捕らえるAPI関数または手法はありますか? あれば教えてください。
726 :
デフォルトの名無しさん :2006/08/09(水) 15:51:00
BCCで作っておりますが、 <windows.h>をインクルードせずに、 コマンドラインオンリーのプログラムで、 新しいフォルダ若しくはディレクトリを 作るのは無理なのですか? 出力ファイルが大量に出来るプログラムを作っておりますが 出力ファイルを一定数ごとに新たなフォルダに分けて出力したいと思い 質問した次第です ファイル名をディレクトリ名のようにしてみましたが、上手く動きませんでした
>>726 system("command /c hoge");
hogeには当然作りたいディレクトリの名前かパス。
間違えた、こうだ。 system("command /c md hoge");
>>729 それ非標準だから先頭にアンダーバーが付いてないかい
Windows限定のようだし、非標準だろうがどうでもいいことだな
有難うございます それを手がかりにやってみます
>>730 ANSI C標準じゃないけどWindows環境やPOSIX環境だとライブラリに含まれてる。POSIXだとモード指定の引数が追加されてるけど。
神経衰弱つくってるんですけど、画像処理のやり方詳しく乗ってるホームページって何処かありませんか?
>>734 可愛そうに。DelphiかBCBでも使うべきだな。C#でもイイ
HSPにしておけ。
いや、それならActiveBasicの方が(ry
猫でもわかる(tbsでも一から熟読すればいいだろ。
ここはいっそDirectXで。
初心者質問で失礼します。 visualc++2005 Expressを落としてform系のサンプル見てみたんですけど リテラルって L"label1"とか書かないといけないんでしょうか。。。
>>740 Unicodeなら、プレフィクスのLをつける。
>>741 おお、素早いレスありがとうございます
ということは、無理に付けなくても大丈夫な感じでしょうか。
なんか謎です。
>>742 つけない場合は、マルチバイト文字になる(シフトJISもこれ)
NTはネイティブでUnicodeなので(マルチバイト文字は、Unicodeに変換されてAPIに渡される)
もうそろそろいい加減にUnicodeにしろや、というMSの意向かな。
VS2005のIDEでは、デフォルトでUnicodeだし。
Win32 APIを学ばないと、この辺はあまり実感できないと思うけど。
Cでいえば、たとえばprintf()に文字列リテラルを渡す場合は、Lをつけてはいけない。
printf()はchar const *型を引数に取るから。
Lをつけた文字列(Unicode)を渡したい場合は、wprintf()を使う。
tchar.h と _T() マクロ と対応する関数群 (_tprintf とかね) で一貫してれば…
>>740 もしかしてC++/CLI (CLRアプリケーションなど)使っている?
System::Stringは文字列をUnicodeとして保持しているから、それに対してはL付ける派が多い。
しかし文字列リテラルの場合は、コンパイラが面倒を見てSystem::String型のリテラルにするので、
Lの有無はどちらでも良くなっている。
managed C++の時には System::Stringには専用のS"...."という書き方があったね。 C++/CLIで使おうとしたらレガシーだって怒られた。
747 :
デフォルトの名無しさん :2006/08/10(木) 23:18:20
Boehm GC と smartPtr 使うならどっちがいいですか?
749 :
デフォルトの名無しさん :2006/08/11(金) 07:36:26
複数ウインドウを開くツールを作っていたら、WindowsXPのタスクバーにグループ化されて、 exe名がタスクバーのボタン名になってしまいました。 Officeとかは、Microsoft Office Excelとか表示されているから なにか方法があるとおもうんですが、やり方のヒントもらえませんか。 「hoge.exe」から、「美しいウインドウ1」、「美しいウインドウ2」、「美しいウインドウ3」、 と開いていくと、「美しいウインドウ4」、をあけたときにグループ化されて「hoge」になってしまうっす。
>>743-746 レス遅れてすいませんでした。いろいろな場合があるんですね。
勉強になります。ありがとうございました。
751 :
デフォルトの名無しさん :2006/08/11(金) 17:30:32
VC2003 のデバッガで、関数から戻る直前の位置で停止しているとき、 関数の戻り値を表示させるには、どうしたらよいですか?
cout
753 :
デフォルトの名無しさん :2006/08/11(金) 19:20:42
ソースはいじらないで、デバッガ上で表示したいんです。
retrunの後ろにマウスカーソルを移動
初心者の者なのですが、 本を読みながら勉強してたら if ((s->stk = calloc(max, sizeof(int))) == NULL) 本に書かれていた通り↑のように書いたところ >'void *' 型は 'int *' 型に変換できない という警告が出ました。 if ((s->stk = (int*)calloc(max, sizeof(int))) == NULL) で、このように書いたら正常にコンパイルできたのですが、 これは本のミスなのでしょうか?
757 :
デフォルトの名無しさん :2006/08/11(金) 19:37:40
自分のEXEを消す スーパーハッカーの方法を教えて九台!
759 :
デフォルトの名無しさん :2006/08/11(金) 19:44:57
標準C++ライブラリ <string> ちょー簡単ならいぶらりあったんじゃねーかl−−ああpさ なんで教えてくれなかったんだよ!! 初心者C++講座;あ;あ;あ;あ;;あ;あ;あ;!!
>>755 横からだけど
void*型とint* 型が暗黙的にキャストされるのは危ないから普通はエラーになるよ。
>>755 Cではvoid*から他のポインタに暗黙キャストが言語仕様としてあるから、本のミスではない。
C++としてコンパイルしたアナタのミス
762 :
デフォルトの名無しさん :2006/08/11(金) 20:10:46
クラスについて躓いているので、質問させてください。 現在CTaskというクラス、またはそれを継承したクラスでリスト構造を作りたく、 クラスのメンバ変数に static std::list<CTask*> LTask と static std::list<CTask*>::iterator itr を宣言しています。 これを初期化しないといけないので std::list<CTask*>::iterator CTask::itr = LTask.begin(); としてもリンク時にエラーが出てしまいます。 書き方が間違っテいるのでしょうか。 エラーは、 CTask.obj : error LNK2001: 外部シンボル ""public: static class std::list<class CTask *,class std::allocator<class CTask *> > CTask::LTask" (?LTask@CTask@@2V?$list@PAVCTask@@V?$allocator@PAVCTask@@@std@@@std@@A)" は未解決です。 libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。 Debug/007_Direct3D最小コード.exe : fatal error LNK1120: 外部参照 2 が未解決です。 と出ています。 VC++ 2005EEを使っています。 どうかご教授いただけると嬉しいです。
>>760-761 なるほど、やっと悪いところが把握できました><
HC_Editorというエディタで作成したらダメで、
winのメモ帳で作成したらOKだったので何がいけないんだろうと思ったら、HC_Editorで新規作成すると自動的にcppでファイルが作られてたのがいけなかったのか。
c++はcでできること全部できると思ってたからそのまま気にしないでやってましたorz
本当にありがとうございました><
>>762 ヘッダファイルでは
static std::list<CTask*>::iterator itr;
と宣言するだけにし、実装ファイルで
std::list<CTask*>::iterator CTask::itr = LTask.begin();
と書く
まさかとはおもうが、LTaskの実装は書いてるよね
>>764 さん
CTask.h-------------------------------------
static std::list<CTask*> LTask;
static std::list<CTask*>::iterator itr;
以下メソッドなど。
--------------------------------------------
CTask.cpp-----------------------------------
#include <list>
#include "CTask.h"
std::list<CTask*> CTask::LTask.clear();
std::list<CTask*>::iterator CTask::itr = LTask.begin();
以下メソッドなど。
--------------------------------------------
こんな感じになっています。
>>765 さんの言うとおり、ヘッダとソースはそのようにしているのですが・・・
>>766 さん
LTaskの初期化も必要なのですか。
初期化の仕方(書き方?)が分からないのでCTask.cppに
std::list<CTask*> CTask::LTask.clear();
とは書いているのですが、間違っているようです・・・
LTaskはCTask*型のリストなのですが、実装とは何なのでしょうか。
>>759 結構な人が知らずに車輪の再発明みたいなことしてると思うw
これ以上後悔しない為にも
STLとついでにBoostについてググっておくのを薦める。
学習目的ならstringを実装してみるのは非常に勉強になると思うけどね
>>767 リンクエラーどころかそのコードではコンパイルは通らない
CTask.hの内容が
class CTask
{
static std::list<CTask*> LTask;
static std::list<CTask*>::iterator itr;
};
であると予想してCTask.cppを
-std::list<CTask*> CTask::LTask.clear();
+std::list<CTask*> CTask::LTask;
と変更
これが766が書いているLTaskの実装ね
771 :
767 :2006/08/11(金) 23:51:56
>>770 さん、ありがとうございます!
どうにかリンカまで通ることが出来ました。
LTaskの実装だけでイテレータの初期化が入らなかったとは orz
本当にありがとうございました。
もっと勉強してきます。
772 :
767 :2006/08/12(土) 00:10:39
早とちりでした。
>>765 さんはstd::list<CTask*>::iterator CTask::itr = LTask.begin(); と書く
とおっしゃっていますので、イテレータの初期化もちゃんと書くと、やはりリンカでエラーが出るようになりました。
libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。
Debug/007_Direct3D最小コード.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と、このような風にです。
イテレータの初期化を書かなければコンパイルもリンクもきちんと出来ているようですが、
やはりイテレータが使えないと意味がないですよね。
一歩進んで半歩下がった感じでしょうか・・・
>>770-771 これは「 LTask の定義」と言うのが正しい。
実装ってのは関数の場合に定義の中の {} の部分を指して使うもんだと思う。
775 :
デフォルトの名無しさん :2006/08/12(土) 18:55:50
778 :
デフォルトの名無しさん :2006/08/13(日) 00:55:34
C言語を勉強するのにお勧めの本ってありますか? 全くの初心者〜ってのと、それなりに勉強した奴が使うようなもの2冊ほど。
>>778 まったくの初心者用
何冊も読んでみるといい。自分が知る限り、これ一冊でOKという万能本はない。
それなりに勉強した奴用
K&R
というかスレ違い
関数ポインタの中身って、何が入ってるんですか? %pで表示させてみた限り、int形などのポインタと大差ないように見えますが?
781 :
デフォルトの名無しさん :2006/08/13(日) 04:52:02
ポインタの中身はメモリ上のアドレス情報だから int型変数の格納されたアドレスだろうが 関数の格納されたアドレスだろうが 見た目には見分けつきませんよ 複数のワードを占有するデータの場合、その先頭のワードのアドレスを指すだけでしょうから
>>780 そりゃぁ、%pはポインタの持つ「アドレス」という属性を表示しているだけだからね。
ポインタの持つ「型」という属性はC++でtypeidでも使えば見ることができるよ。
783 :
772 :2006/08/14(月) 00:36:55
LTaskの定義を済ませてデバッグモードでビルドしたところ、リンカも通りました。 イテレータの初期化はいらないとどこかで見て(失念)、コメントアウトしています。 ここまではいいのですが、関数の中で、 void CTask::MoveTasks() { std::list<CTask*>::iterator itr = LTask.begin(); while(itr != LTask.end()) { (*itr)->Move(); ++itr; } } とすると、 CTask.obj : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "public: class CTask * const & __thiscall std::list<class CTask *,class std::allocator<class CTask *> >::_Const_iterator<1>::operator*(void)const " (??D?$_Const_iterator@$00@?$list@PAVCTask@@V?$allocator@PAVCTask@@@std@@@std@@QBEABQAVCTask@@XZ) で参照されました。 libcpmtd.lib(stdthrow.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。 Debug/007_Direct3D最小コード.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出て困っています。 ちなみにリリースモードではこのエラーは出ません。 少し調べた結果 "__CrtDbgReport" というのが "libcmtd.lib" のリンクに失敗しているのではと考え、 #ifdef _DEBUG #pragma comment(lib, "libcmtd.lib") #endif という風に一時しのぎをしているのですが、これでは根本的な解決になってない気がして気持ち悪いです。 どのようにしたらこのエラーは出なくなるのでしょうか? 何度も質問申し訳ないです orz
784 :
デフォルトの名無しさん :2006/08/14(月) 00:40:06
VC++でBasicのChrみたいにアスキーコードから文字取得するのってどうするんですか?
787 :
デフォルトの名無しさん :2006/08/14(月) 09:58:51
>>749 Win32API質問箱できいてみます。読んでくれた人、ありがとう。
VC8でstrtokに変わる関数はありますか?
_mbstok_sとか?
>>789 ごめんなさい、strtok自体C++でも使えるんですよね?
VS2005のHELPを検索したら出てこなかったので、てっきりCだけの関数かと
思い込んでました。
791 :
デフォルトの名無しさん :2006/08/14(月) 16:00:31
(Point.h) #ifndef POINT_H #define POINT_H class Point { ... }; #endif (TwoPoint.h) #ifndef TWOPOINT_H #define TWOPOINT_H #include"Point.h" class TwoPoint : Public Point { ... }; #endif というように、TwoPointのスーパークラスを別のファイルに書こうとしたんですが、 エラーがでます。(エラー文:定義されていない基本クラスが宣言されています。) PointクラスとTwoPointクラスを一つのファイルにまとめて書けば問題は無いんですが、 別のファイルに分けて書く方法、もしくは上のソースで間違ってるところありませんか?
> Public
>>792 すいません、大文字になってましたね。
でも、小文字にしても今のところ同じようにエラーが出ます。
エラー文を略しちゃ分からんがな
小文字にしたけど保存してませんでしたオチは・・・・・・まあさすがにないか
797 :
791 :2006/08/14(月) 17:02:57
>>794 error C2504:'Point' 定義されていない基本クラスが宣言されています
>>795 ビルドしましたがダメでした。
#include"Point.h"の前にPOINT_Hが定義されてるくらいしか思いつかない。
799 :
デフォルトの名無しさん :2006/08/14(月) 17:46:46
>>798 なら
#include"Point.h"
の直前で
#undef POINT_H
で通るはず。あとはがんばって探す。
>>796 サンクス、あれ?
MSDNにstrtokの解説っでてますね??
VS2005のVC8でコード書きながら、F1押してstrtok入力したら出てこなかったのに・・・・
途中、色々調べていたら、.NETではSplitなる関数も準備されていることも分かりました
いろんな方法でコーディングしてみます。
801 :
791 :2006/08/14(月) 18:11:53
>>799 error C2011:'Point': 'class'型の再定義になってしまいました・・・。
802 :
783 :2006/08/14(月) 18:17:52
すみません、自己解決しました。 プロジェクトのコード生成を、マルチスレッド(/MT)からマルチスレッドデバッグ(/MTd)に変更するだけだったんですね。 次の質問です、 staticなメンバ変数list LTaskを持っているクラスCTaskのnew演算子をオーバーロードしようと思うのですが、 他の例えばWinMain関数で new CTask; とすると、CTaskが自身で自身ををlist LTaskにpush_buck()する方法はありませんか?
さあ、次ぎの質問ですよッw
禿は今何歳なんですか?
56歳
禿はいつから禿てるんですか?
>>801 class Pointは読んでるぽいね
class TwoPoint : public Point
の前で
Point HagePoint;
してみると?
>>802 コンストラクタでpush_backしろ。
>>801 (Point.h)
#ifndef POINT_H
#define POINT_H
class Point {
};
#endif
(TwoPint.h)
#ifndef TWOPOINT_H
#define TWOPOINT_H
#include "Point.h"
class TwoPoint : public Point {
};
#endif
(main.cpp)
#include "TwoPoint.h"
int main(int argc, char *argv[]) {
TwoPoint tp;
return 0;
}
で何のエラーもでないぞ、ほかに別のヘッダインクルードしてるとかじゃね?
810 :
802 :2006/08/14(月) 18:57:58
>>808 さんレスありがとうございます。
コンストラクタで
LTask.push_back(this);
としてみました。
間違いありませんか?
時に、自分はまだ禿げてませんが、母方の父が禿げているので
20代後半からは頭皮の環境に気をつけたいと思います。
.NETで構造体のデータを扱う場合、 structで定義した、こてこてのANSI Cを使うのは邪道ですか? やはり、ref classで定義した書き方をするのが正道なのでしょうか ケースバイケースなのでしょうが、漏れにはどっちも同じ様に感じてしまいます 概念的な質問になってしまいましたが、根本的な違いがよく分かりません。 教えてくださいエロイヒト
>>811 そこをどっちでも好きなほうを選べるのが長所。
どっちにするか決めかねるのが短所。
コードが書きやすくなる方を使えばいいと思うよ。
あと、value structという手もあるよ。
#endif忘れるとか、#ifndefが#ifdefになってた、とかしょーもないミスをする俺のような
人間もいるので、
>>801 のソースに書き加えて、だんだんもとのソースに戻していくと
わかるかも。
#pragma onceのようなのを言語規格に入れるべきなんじゃないの?
>>812 さんどうもです
最近「改定 新 C言語入門 シニア編」を読終え、今まで曖昧だった構造体や
ポインタの使用方法が大体理解できました。また、日経BP出版の
「ひと目でわかる Microsoft Visual C++2005 アプリケーション開発入門」の
データとクラスを読み、それまで漠然としかイメージできなかったオブジェクト指向の
概念がリアルに理解できてきました、と同時に先程の
>>811 疑問が沸いてきた次第です
>>812 さんの意見を踏まえ、使いまわしを考えれば、クラスを外部で定義した方に
一石の長があるような気がします。
>>815 いれるべきだよなぁ。ifndef使うのは常識だけど、よく考えるとバッドノウハウ?
そもそも、#includeの代わりになるものを、 言語仕様として入れるべきだと思う。 というか禿の言うとおり、プリプロセッサ嫌い。
どうせ変更するならインターフェースと実装を 完全に分離して書ける様にしてほしいもんだ
820 :
デフォルトの名無しさん :2006/08/14(月) 21:45:09
私はVineLinux3.2を使ってるんですが、コマンドラインで gcc -o sample sample.c と打ってコンパイルして、sampleというファイルをつくったんですが コマンドライン上で sample と打っても sample:コマンドが見つかりません. と出て実行できません。 どこが悪いのかご教授お願いします。
./sample とかで動いたとかいったら、ぬっ殺す。
./sample とかで動きました^^; ありがとうございました。そして殺さないでください><
>>822 ↓の行を実行しておけばsampleだけで動くよ。
export PATH=.
>>823 その方法は色々問題があるから初心者にはおすすめしないけどね
vectorのassign()の使い方についての質問です。 2次元配列array2dに要素nx、nyを割り当てるとき array2d.assign(nx, vector<double>(ny)); 3次元配列array3dに要素nx、ny、nzを割り当てるとき array3d.assign(nx, vector< vector<double> >(ny, nz); というところまでは出来たのですが‥ 4次元配列で同じことをやるにはどうしたら良いでしょうか? array4d.assign(nx, vector< vector< vector<double> > >(ny,(nz,t))); としても要素が割り当てられませんでした。 どうかご教授をお願いします。
>>825 間違ってるじゃん。
3次元は
array3d.assign(nx, vector<vector<double> >(ny, vector<double>(nz)))
4次元は
array4d.assign(nx, vector<vector<vector<double> > >(ny, vector<vector<double> >(nz, vector<double>(t))))
827 :
825 :2006/08/15(火) 10:21:53
>>826 すみません、間違ってました。そして解決しました。
ありがとうございました!
>>824 そもそも>823ではmakeさえ通らなくなるからただのネタだろ。
#lsできなくなると書こうとして、補完があるから必要ないと突っ込まれそうな気がしてやめた。
829 :
デフォルトの名無しさん :2006/08/15(火) 13:11:21
830 :
デフォルトの名無しさん :2006/08/15(火) 13:12:26
コンソールアプリケーションで 特定のフォルダにファイルを出力する場合 どんな関数を使い、パスはどう書くべきなのですか? fprintfではダメなので、あれこれ悩んでおりました プログラムがあるのと同じフォルダ内に出力するのではなく、 フォルダ内に作った子フォルダに出力するのが 上手く行かずに困っております
>>830 標準にディレクトリやフォルダの概念は無いので、どんな関数を使うかは環境依存。
fprintfではダメな理由とは?
どう上手くいかないのか書かないと何も分からない。
833 :
デフォルトの名無しさん :2006/08/15(火) 13:27:12
>>831 何回もやってみたのですが・・。
コンパイルはできるけど、
データがおかしくって。
>>833 本当かよ
ステップ実行してnの値をみてみろ
>>830 もしや、fopen("directory\file.dat", "w")なんて落ちか?
・fopen()はファイルを作るがディレクトリは作らない。
・バックスラッシュはエスケープしないとリテラルに使えない。
836 :
791 :2006/08/15(火) 15:27:41
先日はたくさんのご意見ありがとうございました。
どうやら、(Point.h)で、#include "TwoPoint.h"をしていたのが誤りだったようです。
(ここに書き込んだソースではしていませんでしたが)
>>809 さんの「ほかに別のヘッダインクルードしてるとかじゃね?」が正しかったみたいです。
#includeは「とりあえず関係ありそうなものはなんでもしとけばいいや」みたいに思ってたので、
それが原因だったみたいです。
しょうもない理由で混乱させて申し訳ありませんでした。
でも、おかげ様ですごく助かりましたm(_ _)m
PointはTwoPointを知る必要がないのだからインクルードは不要。 インクルードはただのおまじないではないので、 それを書くことで、または、書かないことで、どういうことになるのか 考えながらコーディングする必要がある。
>>835 ありがとうございます。
その方針で試して見ます
839 :
デフォルトの名無しさん :2006/08/15(火) 19:24:03
>>835 ステップ実行
調べてやってみましたが、step入れたらコンパイル
それ自体がうまく行きません。
>>839 > step入れたら
どこで調べたらこうなるんだ?
841 :
デフォルトの名無しさん :2006/08/15(火) 23:23:50
spawnlp(P_NOWAIT,"ファイル名","",NULL); で実行したプロセスから、spawnlpを実行したプロセスに 何かメッセージを送って、それを受信したいのですが、 どんな方法がありますか?
自分でクラス定義して実装してみたいのですが、よいテーマが浮かびません 皆さんが最初に自分で作ったクラスはどんなものだったでしょうか? もしくは、実用的で入門向けのテーマを与えて頂けないでしょうか、 因みに会社ではVC8またはBCCで簡単なファイル処理のプログラムを書いています。
void func1(void); この最初のvoidと()内のvoidがワケワカメなんだが、 誰か解説してくれない?
>>842 FILE* を private メンバに持ったファイルクラスでも作るといいんじゃない?
>>843 最初の void は関数の戻り値の型。
括弧の中の void は引数を受け取らない関数として宣言するために必要。
>>845 サンクスです、ファイル入出力のクラス化というイメージでしょうか?
もしそうならば、やってみます。
>>847 ファイルのクラス化と考えるほうが自然だと思う。おぶじぇくとしこうってこういうこと?
>>848 すみませんが、もう少し具体的にファイルのクラス化とは何か説明して
頂けないでしょうか、与えられた仕事はこなせるのですが、
想像力に乏しいものでして・・・申し訳ござません_(--)_
>>850 クラスになるのは「ファイル」。 class file; となって file input("path/to/file"); なんて使う。
そのクラスのメンバ関数になるのが「ファイル出入力」。 read() とか write() とかあって
input.read() とかして使う。そんなイメージ。
「ファイル出入力をクラス化」すると class file_read; class file_write; となるんだろうけど
不自然だと思うし、実際使いにくそう。
ファイルを1つのオブジェクトとして考える。 コンストラクタでファイル名を引数に取り、そのファイルをfopen()して、*FILE型のメンバに代入する。 メンバ関数として、1文字読んで返す、1行読んで返す、改行文字の数を返すとか、オブジェクトに対して操作する関数を自由に作る。 デストラクタでfcloseする。 できあがり。 まあC++のifstreamのFileの車輪の再発明だが。
>>851 ありがとう
なるほど、イメージが沸いてきました出来そうなものから作っていきます。
>>「ファイル出入力をクラス化」すると class file_read; class file_write; となるん
>>だろうけど
>>不自然だと思うし、実際使いにくそう。
確かにそうですね、入出力の関数がすでに用意されているのに、それを呼び出す関数を
作るのも確かにおかしいですね。
>853 >入出力の関数がすでに用意されているのに、それを呼び出す関数を >作るのも確かにおかしいですね。 つ「ラッパークラス」 まあ、万人が使いそうなのは標準にもあったりするけども。
>851 設計の問題だが、個人的には入力と出力は別クラスにするべき。 (ファイル)入出力というインターフェイスをクラス化するイメージ。
>>855 まぁその場合でもクラス化するのはファイルで出入力をメンバ関数にするのが自然だろ。
class readable_file; class writable_file; ってな。
>856 rとwをクラス名に使うのなら file_reader file_writerとかかな。
YAGNI
で、読み書き両方に対応するクラスも作ろうとして、悪夢のダイヤモンド継承が発生と。
860 :
791 :2006/08/16(水) 07:30:20
連投でスイマセン。(長くなるので#include、#ifndef等は省略) (Point.h) class Point { private: Point() { x = 100; } public: int GetX(); //xの値を返す }; (TwoPoint.h) class TwoPoint : public Point { ...}; (TwoPoint.cpp) x = Point::GetX(); (Main.cpp) int main(int argc, char *argv[]) { Point p; TwoPoint tp; p.時間経過でxが移動、pとtpを描画(); //ループ return 0; } こんなコードで、Pointクラスのxが時間経過などで移動したとき、 TwoPointクラスのPoint::GetX():で、xの値がなぜか100(コンストラクタの時の値)になってしまいます。 最新のxの値をTwoPointクラスが受け取るにはどうすればいいんでしょう?
そもそもその「移動」のコードがないからよく判らんが、 まさか別のインスタンスを見ていると言うことはないだろうな。
>>860 >(TwoPoint.cpp)
>x = Point::GetX();
なにこれ?
コンパイル可能な最低限のコードを貼れよ
省略過程で大体の場合は自ずと原因が分かるんだからさ
>>860 クラスとインスタンス、及び継承について勉強しなおした方がいい。
そもそもPointとTwoPointをクラスにする必要があるのかとか、
x座標の情報のみで描画する関数をTwoPoint内に作ってしまえば
Pointはいらないんじゃないか(こうすれば問題も解決)とか、色々疑問が沸いてくる。
>>842 今更だけど、初めてクラスを作るなら
動的配列やスタック、キューなんてどうかな?
STLで既にあるけど割と簡単に作れると思うよ。
865 :
デフォルトの名無しさん :2006/08/16(水) 11:06:10
リナックスのシスログに出力したいのですがうまくいきません。 syslog.confに test.* /var/log/test.log って追加して再起動して、 openlog("test" , LOG_PID , LOG_NOTICE); syslog(LOG_INFO , "test write"); ってしているのですが書き込まれません。 何か間違っているのでしょうか? ご指摘お願いいたします。
>>865 openlog()の第三引き数はそれで宜しいか? facilityの指定だったと思うのだが。
867 :
デフォルトの名無しさん :2006/08/16(水) 12:02:43
void test(char *hoge) { char c[] = "piyo"; hoge = malloc(sizeof(char) * 5); strcpy(hoge, c); printf("%s\n", hoge); } int main(void) { char *c; test(c); printf("%s\n", c); return 0; } ↑で、関数testのprintfでは、ちゃんとpiyoが表示されるのに mainのprintfでは表示されないのですが、どうしてでしょうか?
void test(int i) { i = 5; } int main(void) { int i; test(i); printf("%d\n", i); return 0; } これと同じ事
869 :
デフォルトの名無しさん :2006/08/16(水) 12:22:40
868さん、早速の回答ありがとうございます。 868さんが示してくれたのは良くわかっているつもりなのですが、 じゃあ何故↓は普通に表示されるのかが良くわからないのです。 void test(char **hoge) { int i; for (i = 0; i < 3; i++) hoge[i] = malloc(sizeof(char) * 5); strcpy(hoge[0], "piyo"); strcpy(hoge[1], "hoge"); strcpy(hoge[2], "foo"); } int main(void) { int i; char *c[3]; test(c); for (i = 0; i < 3; i++) printf("%s\n", c[i]); return 0; }
>>867 ヒント:mainのポインタを配列にしてみる
871 :
865 :2006/08/16(水) 12:32:01
>>866 てことは追加したtestのfacilityを指定しなきゃいけないってことですか?
型がintなのでどこかにtestのfacilityを定義しなきゃいけないってことですか?
>>869 typedef char* CharPtr;
とすれば分かりやすくなるかな?
void test(CharPtr *hoge)
{
int i;
for (i = 0; i < 3; i++)
hoge[i] = malloc(sizeof(char) * 5);
strcpy(hoge[0], "piyo");
strcpy(hoge[1], "hoge");
strcpy(hoge[2], "foo");
}
int main(void)
{
int i;
CharPtr c[3];
test(c);
for (i = 0; i < 3; i++)
printf("%s\n", c[i]);
return 0;
}
873 :
867 :2006/08/16(水) 13:00:51
皆様いろいろとレスありがとうございます。 いまいち納得できないので、 皆様のレスを手掛りに自分でいろいろとやってみます。 ありがとうございました。
875 :
865 :2006/08/16(水) 14:46:39
>>874 manは読んだのですがよくわかりませんでした。
どうか教えてください。よろしくお願いします。
>>875 マニュアルページ(
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/openlog.3.html )によると、
>facility 引き数は、後で syslog() を呼び出す際に facility が指定されなかった場合に使用されるデフォルト値を決定する。
とある。更にその先に、
>facility
>facility 引き数はメッセージに記録されるプログラムのタイプを指定するために使われる。これによって異なるタイプの
>プログラムからのメッセージは異なる扱いをするように設定ファイル( syslog.conf(5) )に定義できる。
とあるな。そして更に、
>LOG_USER (デフォルト)
>一般的なユーザレベルメッセージ
とあるわけだ。
どこからLOG_NOTICEが出て来たのかと思えばその先のlevelの項じゃないか。
この程度の日本語が判らないのなら、小学生位から遣り直した方がいいぞ。
>>867 main関数中のtest(c)による呼び出しでvoid test(char *hoge)のhogeにcの値がコピーされる。
test関数の中でhogeの値が変更される。
main関数中のcの値が変更されるわけではない。
test関数から戻ってもcの値は変更されていない。
>>869 main関数中のtest(c)による呼び出しでvoid test(char **hoge)のhogeにcの値がコピーされる。
test関数の中でhoge[0]からhoge[2]の値が変更される。
main関数中のcの値が変更されるわけではないが、main関数中のc[0]からc[2]の値は変更される。
なぜなら、test関数の中hogeとmain関数中のcは同じ値なので、
hoge[0]を変更することはc[0]を変更することに等しい。インデックス1,2も同様。
test関数から戻ってもcの値は変更されていない。
しかし、c[0]からc[2]の値は変更されているので、test関数の中での操作が反映される。
ポインタが何を指しているのか、1つ1つprintfすれば分かるはず。特にmalloc前後。
879 :
865 :2006/08/16(水) 16:13:47
>>876 うーん、ちょっとわからないんですが、
syslog.confに
test.* /var/log/test.log
って追加して、アプリからtest.logにログが出力されるようにするにはどうすればいいんでしょうか?
>>877 867じゃないが便乗して質問
>main関数中のtest(c)
この部分で、関数にポインタを渡してるんじゃないの?
引数で渡したポインタ変数 c と、 mallocで取得して値を代入したポインタ変数 hoge は別物 後者はコピーされたヤツ これでおk?
申し訳ないがおkじゃない >後者はコピーされたヤツ これがよくわからない。 hogeとcのアドレスは同じ で、同じアドレスを指す変数のうちの片方の値を変更したら、もう片方も変更されてる(ように見える) 従って、hogeの値を変更したらcの値も変化する どこが間違ってるの?
test中のhogeとmain中のcのアドレスは違う。 test(c)でtestに制御が渡った時点で、 cの内容がhogeにコピーされてhogeの内容とcの内容が同じになるだけ。 だから、test中でhogeの内容を変更してもcの内容とは無関係になる。
hogeとcは同じアドレスを指す変数ではあるが、違うところに格納された変数 片方の変数の値を変えてももう一方の値が変わるわけではない ポインタ変数の値とポインタ変数そのもののアドレスとを混同しないように
hogeのアドレスは関数に入った時点ではcと=だが、mallocで確保したメモリを指すアドレスを代入した時点で≠になる
>>884 自身の読解力のなさが情けない・・・
int *ptr; と宣言したとき、 &ptr が違う場合は ptr が同じであっても *ptr が違う可能性がある
ということですか?
困ったときのtypedef
>>886 同じとか違うとかいうときは「何と何が」って言わないと駄目だろ。
日本語しっかりな。
int *ptr1,*ptr2; と宣言したとき &ptr1!=&ptr2 であれば ptr1==ptr2 であっても *ptr1!=*ptr2 となる可能性がある、ということですか? ・・・すみません、C言語の前に日本語から勉強してきます λ...
住所(アドレス)を書いたメモ(ポインタ変数)をコピーして渡して(関数引数) コピーしたメモを書き換えても元のメモの内容は変わらない。
ここまでの流れでひとつ気になってることがあるんだが、867は値渡しじゃなくて参照渡しだよな? 868とか877とか読むと値渡しの様に書かれているから ? と思っている次第。
>>891 値渡しだよ。参照渡しなら
void test(char *&hoge)
となる。
main関数でtest(c);を呼び出したときにcのアドレス(例えば100とする)が void test(char *hoge)のhogeにコピーされる つまりこの時点でcとhogeのアドレスは同じ100となっているが指しているアドレスが同じなだけで実際には全く別の変数 だからtest関数でhoge=malloc(sizeof(char) * 5);(mallocで確保したメモリのアドレスを400とする)を実行すると cの指しているアドレスは100のままだが hogeはmallocで確保された400というメモリのアドレスが代入されるのでcとhogeの指すアドレスが変わる だからこの状態でhogeの指す400番地の中身を変更してもcの指す100番地の値は変更されない 不自由な日本語で書いてみたけど 書いた後にこんなの理解できるわけがないということに気づいた
[hoge] ↓ [c]→5 ここで、*hoge = 3 とすると・・・ [hoge] ↓ [c]→3 ------------------------------- 上の図のように、*hoge を書き換えると、*c の値も変わる。 が、今回は、*hoge ではなく hoge の値を変更している。 ------------------------------- hoge = malloc (略 とすると・・・ [hoge]→□ [c]→5 *hoge = 3 とすると・・・ [hoge]→3 [c]→5 ------------------------------- *c の値は変わっていない。
一度アセンブラやってみるといいかもネ
897 :
デフォルトの名無しさん :2006/08/16(水) 22:37:12
while(1){ Sleep(500); if(stat("a.txt", &st)==0)break; } こういうa.txtがあるかどうかをチェックし続けるプログラムは HDDに負荷がかなりあるものなんですか?
>>897 人手によるポーリングや OS からのイベントなどを使うのに比べたら
負荷が高いだろうね。
900 :
デフォルトの名無しさん :2006/08/17(木) 00:05:07
stdinから入力を受け取ってメモリ上に保持する方法で悩んでいます。 メールデーモンからstdin経由で次のようなメッセージがわたってくるのですが、これをなんとかメモリ上に格納して 加工したいというのが趣旨です。一行の文字数がよくわからないので 行・列ともに動的にメモリを確保したいのですが、なかなかうまくいきません 入力値はこんな感じです。 可変の文字数(横)x 可変の行数(縦) 最初は一行の横の長さをfgetcで改行文字までの文字数をカウントして 同じ行を、その長さ分mallocしたポインタに格納してfgetsすればいいだろう・・と思ってたのですが、 fgetcする時点でstdinの現在位置が変わってしまうようで、続けてfgetsすると次の行をgetしてきてしまいます。 rewindとかfseekしてstdinの位置がファイルのように戻るかなと思ったのですがだめでした。 こういう場合は、リストで横と縦を作ったほうがいいのでしょうか? #include <stdio.h> #include <stdlib.h> int main(){ int i = 0; char ch; char *line_p; /* 一行の長さを数える */ while(ch = fgetc(stdin)){ i++; if(ch == '\n'){ break; } printf("%c",ch); } printf("%i",i); /* 一行の文字数をmallocで確保してその行をポインタの先に格納する。*/ line_p = malloc(i+1); fgets(line_p,i+1,stdin); printf("%s",line_p); return (0); }
>>900 最初に malloc() したのより長くなったら realloc() などを使って
バッファを取り直せばいい。
902 :
デフォルトの名無しさん :2006/08/17(木) 00:20:34
まったくの初心者で申し訳ないですが 10 20 30 40 50 のようになっているファイルがあるとして 3行目の30を60に書き換えるにはどんな方法でやればいいんでしょうか? 書き込むことは出来たんですけど、5行全てが消えて60になってしまったりして うまく出来ません
>>902 簡単な方法
ファイルを1行ずつ読んで行って、30なら60を他のファイルに
一行書く。その他ならそのまま一行書く。
読んだファイルを削除して、書いた方のファイル名を変える。
904 :
デフォルトの名無しさん :2006/08/17(木) 01:04:52
>>903 fgetsとfputsでやってみましたがうまく出来ません。
上の二つで問題ないでしょうか?
まぁ、コードを晒せ。
906 :
デフォルトの名無しさん :2006/08/17(木) 01:15:00
FILE *f1; FILE *f2; if((fold = fopen("a.txt","w"))==NULL)return 0; if((fnew = fopen("b.txt","w"))==NULL)return 0; for(int i=0;i<4;i++) { fgets(buf,256,f1); fputs(buf,f2); } fclose(f1); fclose(f2); こんな感じなんですけど、どうでしょうか
>>906 で、なにがうまく出来なかったの?
一見しておかしいのは buf の宣言が見えないことと
fold のモードが "r" じゃないことぐらいかな。
908 :
デフォルトの名無しさん :2006/08/17(木) 01:20:46
>>907 出来たファイルが・・・・・・・・
になってました。一応bufは前で宣言してあります
>>906 fgets() と fputs() にもエラーチェック入れろよ。
fclose() は、微妙だけどうまく動かないんなら入れてみるのがいいだろう。
んでエラーが発生したら perror() とかするといいよ。
910 :
デフォルトの名無しさん :2006/08/17(木) 01:22:36
>>909 読み込みのfclose()は事実上不要、書き出しのfclose()はfputs()と同様に。
#前者は安全にクローズするだけ、後者はバッファのフラッシュ(=実際の書き出し)が行なわれる。
912 :
デフォルトの名無しさん :2006/08/17(木) 01:45:29
出来ました。他の変数がbufのところまで使ってたみたいです。 教えていただいてありがとうございました
class Testclass{ private : int x; public : void show(); void change(Testclass *target); Testclass(int a); }; Testclass::Testclass(int a){ x = a; } void Testclass::change(Testclass *target){ target->x = 3; } int main(){ Testclass t1(1); Testclass t2(2); t1.change(&t2); } 上記のコードがコンパイルできてt2.xが3になるんですが、 privateメンバーのt2.xがt1.change()から書き換えられる理由がわかりません。 クラスに属さない関数や他クラスのメンバ関数で同じ事するとコンパイルエラーだったんですが。
>>913 クラスに属した関数で、同クラスのメンバ関数だから。
同じクラスのメンバなら、別のインスタンスであってもprivateにアクセスできるってことだな。 ……こう書くとなんだかアレな内容に聞こえる。
多重継承のサンプルソースです、メインプログラムの部分の b o; この記述は何を意味するのでしょうか? class a1 { public: void foo() { System::Console::WriteLine("a1.foo"); } }; class a2 { public: void bar() { System::Console::WriteLine("a2.bar"); } }; class b : public a1, public a2 { }; int main(array<System::String ^> ^args) { b o; o.foo(); o.bar(); return 0; }
917 :
913 :2006/08/17(木) 23:23:49
どうも納得行かなかったんで質問してしまったんですが、 「そういう仕様だから」で済むような話だったんですね。すいませんでした。
>>916 class b 型の変数 o の定義。
>>918 サンクス
oはclass b 型のインスタンス(実態)と解釈してもいいですよね?
>>919 実体だよな?
という突っ込みは置いといて、インスタンスはふつーインスタンスと言うからな。
>>916 > int main(array<System::String ^> ^args)
これ、ほんとにC/C++か?
C++/CLI臭いな
しかし肝心の質問はC++の範囲だな。
ref class だと多重継承は出来んからね。 強制はしないけど、C++とC#(かVB)を理解してからC++/CLIに手を出したほうがいいと思うよ。
C++/CLI C/C++プログラマ向け C# Javaプログラマ、初心者向け VB.NET VBプログラマ向け J#、J++ うんこ
もしかしたら、916はC++の勉強をするつもりでVC++を使っているが、 VC++のプロジェクトを作るときに、Win32コンソールプロジェクトを選ばなかった(知らなかった)だけ ということかもしれないと思う。
その勢いでC++/CLIの勉強を進めてった方が高収入に繋がるのかもしれんなー。 いや、わかんないけど。
紹介されて着ました C言語で float a; a=5.0/4.0; と float a; a=5/4; に差があると聞いたのですが、理由が分かりません どなたか教えてください
>>929 5.0 や 4.0 の型は double 。 double/double の型は double 。なので
5.0/4.0 は小数点以下も double の精度で結果が得られる。
つまり a = (float)1.25 になる。
5 や 4 の型は int 。 int/int の型は int 。なので
5/4 は結果の小数点以下が切り捨てられて 1 になる。
つまり a = (float)1 になる。
931 :
929 :2006/08/19(土) 20:48:22
>>930 返答有難う御座いました
intが整数型なのは分かるのですが、doubleとfloatの違いが分かりません
そこも教えていただけますでしょうか?
933 :
916 :2006/08/20(日) 07:09:25
すみませんでした、白状しちゃいます 実は只今、Native C++も正確に理解できてないのにC++/CLIの勉強を始めてしまいました 今読んでいる本が、C++、C++マネージ拡張、C++/CLIのソースを対比させながら、 書いてあるのでこんなサンプルが載っていました、 >925の指摘通り 変更前 o.foo(); o.bar(); 変更後 ((a1*)&o)->foo(); ((a2*)&o)->foo(); このように、a2クラスのbarメソッドをfooメソッドに名前を変更したとたんバッティングが 生じることも確認しました。やはり、C++をしっかり習得してから向かった方が身に付くし C++/CLIも結果早く習得できるんでしょうね、C++お勧めの本がありましたら教えてください。
実に稚拙な質問でスマソ C/C++の文献等で、キャストという言葉がよく使われますが 「変換」と理解したらいいでしょうか?
>>934 変換だけだと、ちょっと意味が会わない。
プログラマが(自らの責任で)明示的に指定する変換と覚えておくといい。
日本では、型変換全般をキャストって言うね。「暗黙のキャスト」なんていう使われ方もする。 英語では、implicit type conversionのことは、普通coercionと言う。(implicit castという人もいる)
>>934 >>935 サンクス、
だからcastを直訳してもそれらしき意味ではなかったんだ、納得シマスタ。
cast を「(計算して、狙って)投げる」っつー意味で、 ある型から狙って別の型に変換するという感じ。
typo った。 ×cast を ○cast は
>>938 そりゃ無茶だ。元は「鋳造」の意味からきてるんだろう。
鋳造も結局は狙って作るっつーことだと思うが。
「狙って投げる」と言うよりは「型に嵌める」ってこった。
>>938 どうみても簡易辞書を引いて出てきた訳をこじつけただけだろ。
覚え方として使えんわけではないが、人に教えるのは恥ずかしいことだ。
cast 1.a <物>を投げる、ほうる(throw) つまり、キャストとスローは同じ意味だ!!!
>>943 ある単語の意味ってのは連想で広がって行くもので、
複数意味があるように見えても、根っこは同じなのが普通だ。
全く関連性のない意味が1つの単語に押し込められてるっつー事態の方が
異常な事だとは思わないか?
castってtypecastから来てるんですけど
>>945 cast も根っこは同じなんだろう。なんにせよ
>>938 を正当化することにはならん。
だから、「型に嵌める」だろ。
cast new NullPointerException(); 投げてないから桶だよな?
細かいことを考えたらきりがないだろうけど、俺はcastを型変換と言っている。 それが通じる限り基本的に言葉は日本語訳されたものを使いたいので。
>>950 しかし文脈によっては暗黙の型変換と紛らわしいからなぁ。型適用とでも言うか?
自分はC++者なんで最初からスタティックキャスト、コンストキャストと言うけど。
952 :
デフォルトの名無しさん :2006/08/20(日) 21:20:47
cin.getline(buf,200)は、fgets(buf, 200, stdin) と同じような感じだと思いますが、 cin.getlineの戻り値でどういう時がエラー とかありましたら教えてください。
すみません。今、CUIオセロのゲーム作っているんですが躓いてしまいました。 一応交互にゲームは出来るんですが、すでに石を置いてあるところにも置けてしまうし、 ひっくり返せないところに置くこともできてしまいます。 上のような場合はwhileかdoで繰り返したら出来るかなと思ってやってるんですがなかなかうまく出来ません。 もしここに汚いソースですが載せたらご教示いただけますか?
>>947 cast の最も基本的な意味は計算して投げるって意味なんだから、
他の意味はそこからの派生と考えるのが自然だろ。
そこまで違うと言うからには、何か根拠でもあるのか?
英単語の基本的な意味なんかどうでもいい。
>>953 難しいだろうね。一通りうごくんならソースもそれなりの量だろうし。見るのは面倒。
スレにだらだらソース貼るのは超迷惑。
ソースをアップローダに置いて、リンク貼るだけならあんまり迷惑じゃないし、
やってみてもいいんじゃないかな。ただし、返答が無くてもあたりまえなんだから、
文句は言わないこと。あと、汚いと自覚してるんだったら、礼儀として
すぐ出来る整形ぐらいはしとくことだ。多少は見てもらえる可能性が上がるだろう。
>>952 iostream のエラーはストリームオブジェクトの中に記録されている。
で、 good() とか fail() とか、いろいろテスト方法がある。
cin.getline() の戻り値は istream& だから。そいつらを使う。
959 :
953 :2006/08/20(日) 22:32:23
>>957 分かりました。ありがとうございました。
>>953 入力を受け付ける前に、全64マスの評価(石を置いた場合、いくつ取れるかを計算)して、評価値が0のマスが指定されたら再入力
…とかかな。
で、その評価値は後でCPU思考につかう。
というか、コードそのものよりアルゴリズムが汚い。
ぱっとみなのでまちがってるかもしれんが。 hantei() という関数が画面出力を受け持ってるのは信じがたい。 hantei2() は書き直し。 struct vec { int x, y } vectors[8] = {-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},... てのをくるくるすれば8種類書かなくていいでしょ。 すでに石があるとこに置けるとか置けないとかはうpされたソースからはわからん。
>うpされたソースからはわからん。 と書いたが、これで全ソースなんだったら言い直す。hantei2()が読む気しないのでわからん。
hantei()がhentai()に見えて仕方がない
967 :
デフォルトの名無しさん :2006/08/20(日) 23:36:24
cout.putline(""); みたいな、 cin.getlineとは反対に1行出力できるのはないでしょうか。
puts
cout << "" << '\n';
970 :
953 :2006/08/20(日) 23:52:56
みなさん回答ありがとうございます。 hantei2は石を置いてその石(黒)から上下右・・右下、左下と順番に見て行ってもし 間にひっくり返せる石があったら色を白にするというものを黒石用と白石用で分けているだけです。 あとこれで全ソースです。
黒番と白番を別々に書くのもやめろ。who = !who で0,1を切り替えるんだ。 宿題とかでなく、自主的にオセロ作ってるのならおまえには見込みがある。 ソースはむちゃくちゃだがな。
デバッグも出来ない奴に見込みなんて無いよ
973 :
953 :2006/08/21(月) 00:04:36
>>971 昨日から作っているんですが、なかなかうまく行かないものなんですね・・・
まだまだ私の知らない表現方法がある見たいですし
>>961 さんが仰る方法で作れるような気もしますが、
もうちょっと汎用性に優れたのを作って見ます。
宿題ではないんでゆっくり頑張ります。
他にもご指摘ありましたら是非ご教示下さい。お願いします。
>>972 【初心者歓迎】 ソース見れば初心者は明らか。
初心者がなにかやろうと思ってとにもかくにもあそこまで書いたなら素質はじゅうぶんだと思うね。
975 :
967 :2006/08/21(月) 00:15:09
ありがとうございます。
>>968 コンパイラはbccですが、
putsはofstreamのメンバではないとでます。
>>969 << >>は使いたくなくて、それに変わるのを探していました。
976 :
デフォルトの名無しさん :2006/08/21(月) 00:15:57
GUIライブラリを作ってみたいのですが、どう作っていいのかわかりません。 何か参考になるものは無いでしょうか? 環境はVC2005EEです。
初心者は途中で投げ出す人が多いからね。
>>975 <<, >> の替わりは無いよ。使いたくないなら iostream 系自体を使わないほうがいいよ。
>975 <cstring>のputs()グローバル関数
981 :
975 :2006/08/21(月) 00:36:15
ありがとうございます。
.writeというのはあって、一応代用できそうです。
>>978 ホントそうかもしれません。Cの感覚が抜けなくて。
>>979 調べてみます。
>>953 masu[8][8] は外部変数にしてしまえ。関数に分けやすくなる。
ほんとは struct board { int masu[8][8]; }; みたいなの作ってこれを引数渡しに
するのがベストだけど今はどっちでもいいと思う。
途中で投げ出さないことはいいことだ。
だが、それを考慮しても
>>953 はオセロ投げて
勉強しなおした方がいい気がする。
文句のないソースだが953のやる気を激しく削ぎ落としたに違いないw
初心者歓迎と書かれたスレタイに安心してやってきた
>>953 が
ケチョンケチョンに言われて泣きながら去っていきました。
>>986 いやいや、俺たちなりの愛のある歓迎なんだぜ。
ソースへの批判というのは、その人の能力を引き上げる最大の要因と思うしな。
oseroって何だよw リア厨か?
riba-shiにすべきだよな
990 :
デフォルトの名無しさん :2006/08/21(月) 10:41:14
>>990 オセロ以上の汚いソースで見る気がしない。
992 :
953 :2006/08/21(月) 10:54:50
>>984 ありがとうございます。
こんなに短く作れるんですね。私もこういうの作れるように頑張りたいと思います。
>>990 汚いというより、設計がヘタすぎて見てらんない。
この程度だとやりたいこと聞いて、自分で書いたほうが早そうだ。
ポインタ変数同士の引き算は許されると習ったのですが、 float f,g,h,*x,*y,*z; x=&f; y=&g; でz=x-yが誤りなのが分かりません。どなたか教えてください
俺もわからん。
>>994 その場合ポインタ同士の引き算はポインタ間の距離になるので、ポインタ変数には代入できません。
詳細は改めて次スレででも聞き直してくれ。
>>994 ポインタ型同士の演算結果はポインタ型じゃないからだ
ポインタ型の演算結果がポインタ型になるのはポイント型に序数の加算か減算をした時だよ
ポインタ ± 要素数 → ポインタ ポインタ ± ポインタ → 要素数
>>998 おいこら、ポインタ同士の加算はねぇぞ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。