【初心者歓迎】C/C++室 Ver.41【環境依存OK】
2 :
987 :2007/08/06(月) 23:28:56
int errsv = errno; int i,j,k,t; int No1,No2; int Rs[3500][20],Hn[3500]={0}; double u,x,y; double Odds[3500][20],Poll[3500][20],Poll_S[3500][20],Poll_T[3500][20]; FILE *fpr,*fpw; printf("%d\n",errsv); でもとくにないです。 BCCDeveloperの問題の気がしてきました。 レスどうもでした。
>>1 乙!
何をしたら動かなくなったのかが知りたいな。
できればfopenとかの戻り値をチェックして欲しい。
ってか、ローカル変数でかいYO!って落ちじゃないよな?
>>987 Rs,Hn,Odds,Poll,Poll_S,Poll_T
を、まずmallocで確保しようぜ?
それでダメだったらまた来いよ。
>>前スレ986 > 従って、ヌルポインタはprintf()の引数として処理できない。 できるよ。 printf("%p\n", (void*)0);
printf("%p\n", NULL);
9 :
デフォルトの名無しさん :2007/08/07(火) 00:51:41
NULL で思い出したんだけども C++ って NULL よりも 0 を使う方がいいの?
>>9 C++ では NULL は 0 と定義されているとは限らない。処理系定義。
だから、NULL と書いておけば、処理系によっては
int n = NULL;
と書いた時にエラーか警告を出してくれるかもしれない。
>>14 C は 0 か ((void*)0) だっしょ。
C++ は完全に処理系定義だったはず。
C99 で変わってたら知らんが。
あんまり仕様の隙間を縫うような考え方はしない方がいいよ
まーたNULLの話題かw
ポインタのみに適合するNULLをテンプレートで実装してみたけどどうよ、 って話を何年か前に見た記憶があるんだけど、どこで見たんだか思い出せない
ポインタのみに適合するNULLをテンプレートで実装してみたけどどうよ、 って話を何日か前に見た記憶があるんだけど、どこで見たんだか思い出せる
教えていただきたいことがあるのですが BCC32にて、ユニットテストを行うコンソールアプリを製作してるのですが 下記のように関数[AssertEqueal]が呼ばれてた場合、 [AssertEqueal]内でソースファイル内での行数を取得することは可能なのでしょうか? 可能ならばその方法を教えていただきたいのですが void main() { AssertEqueal( a , b ); }
__LINE__を使うとか
つ __LINE__ AssertEquealはマクロ関数で実装して。
>>22 ,23
ありがとうございます、無事実装できましたー
この調子だと __FILE__ も使ってなかったりしないよな。
なんすかそれ
__FILE__ と __LINE__ はセットだろー ついでに文字列化演算子 # もな
そんなんあるんですか
つか、この分だと普通にassert()を知らないんじゃないか
assert知ってるけど使ってない 便利なもん?
それは知ってるって言わない
assert知らないけど使ってる 何するもん?
ちょっと自信ないから調べてきた つまりは assert( 条件 ) って風に書いて、この条件がfalseになったらそこで止めてくれるってことでよろしい? でもリリースにするとどうなるの?勝手に何かに置き換わってくれる?
そんなん#ifdef _DEBUGとかでくるめばよかろう
assert は NDEBUG が #define されてるかどうかで中身が変わる。 NDEBUG が #define されていると assert は何もしない。 NDEBUG が #define されてなければ、条件が false だったら abort する。
横からサンクス
みんな、マニュアル読もうな
お前が一番読め
abort()ってUnixとかだとコアダンプを吐いて終了するのが普通だけど Win+IDEとかで開発してるとデバッガが起動してくれたほうが何かと便利なので、 abort()ってあんま便利じゃない希ガス my_abort() { char **nullpo = 0; *nullpo = "ガッ"; } みたいなの作って、強引にSEGV起こしてデバッガ起動させたほうが便利かも 例外も、スローされた場所が分からないという意味では、微妙に役に立たない 面があるよね、C++だと
>40 マクロで__FILE__と__LINE__を引数に取る例外クラスを作ればいいかと思う。 前に適当に作ったんだけど実際に使ったことがないので使い勝手はなんともいえん JavaのprintStackTraceみたいのがあればいいけどね
>>40 Visual Studioだと、assertも引っかかったときや
例外が投げられた時点でデバッガに移れるぞ。
スタックの状態はassertやthrow式の時点のものが見れる。
>>41 スタックトレース見れるとそうでないとでは随分違うよね。
>>42 ああ、そうだっけか。なら、同じかな。
SEGVだとデバッガがインストールされていない場合でもDr.ワトソン経由で
コアダンプが吐かれるのがいいかなとも思うけど。
>>41 struct pos_info {
const char* file;
int line;
pos_info(const char* file, int line) : file(file), line(line) { }
};
#define POS_INFO pos_info(__FILE__, __LINE__)
こいつを引数にとるとか。
すれ違いかもしれませんが、行数の多いものをコンパイルすると一定以上の上部行数が 表示されないんですが、表示させる設定はあるのでしょうか?
意味がわからないが、moreをパイプとか
一定以上の上部行数って何のよ。エラーメッセージ? 環境は?
環境はwindowsXPでCPadとLSI C-86を使っています。 各ソートの詳細な動きを見たいんですが、エラーではないと思いますが 下のソースを実行すると0123485679から上が表示されないんです。 説明が下手ですいません。
printf("%d",rand())
そのぺーじは参考にしてはいけません。
つーか今時LSI C-86か VS2005 Expressとかがタダで使える時代に
原始人なんですいません
そこのソース酷いなww 何言ってるのか分からんが、ShowDataのところを以下に書き換えたらどうだ void ShowData(int x[ ], int n) { int i; for (i = 0; i < n ; i++) printf("%d ", x[i]); putchar('\n'); }
携帯から失礼します。 C言語の話なのですが同じ型の 二つの構造体をビット演算子で 比較することは不可能なのでしょうか。 職場でさっきやってみたら コンパイルエラー。。。
ビット演算子で比較って何よ。 ビット演算子は比較するためのものではありません
なんだか、intならビット演算で比較ができるとでもいいたそうな56だなー #そりゃ、算術演算も究極的にはビット演算だけどさ
アセンブリ言語的には TEST 命令があるから ビット演算で比較というのもナシではないけどね。
>>46 LSI C-86は使ったことも無くESPしてみるけど、DOSコンパイルなの?
表示行が多くて、始めに出力した内容がDOS窓を上にスクロールしてもみえません。とか?
62 :
56 :2007/08/07(火) 23:29:26
家についた
>>56 です。
少しスレを荒れさせてしまったようで申し訳ありません。
struct point {
int a;
int b;
・
・
・
int z;
};
思想としては上記のような型の2つの変数があった場合
メンバa同士で論理積(AND)演算を行う
メンバb同士を論理積(AND)演算を行う
・
・
・
メンバz同士を論理積(AND)演算を行う
という処理が冗長な感じがして
全く同じ構造体の型=全く同じビットパターンでは無いか?
ならば丸ごと論理積(AND)演算は実行できないだろうか?
と思った次第でございます。
地道に1個ずつやるしかない。
>>62 もしint aとかが1ビットしか使っていなければビットフィールドを使う手もある。
とはいっても、量によっては結局何行か必要になるわけだが・・・
void memand(void *a, const void *b, size_t n) { char *pa = a; const char *pb = b; size_t i; for (i = 0; i < n; i++) { *pa++ &= *pb++; } } みたいなのを作って使うとか。
それでいいならmemcmpでいいだろ。 でも構造体にはパディングが入る可能性があるので 規格上は動作が保証されない。 やっぱメンバごとに比較するのがよいと思われ。
論理積? &&の方?、 left.a && left.aと left.b && left.bと ... それぞれの関係がわからない・・・ a-zまでをさらにまた&&で結合させるの?
68 :
56 :2007/08/08(水) 00:15:37
56です。
>>67 さん
論理積と書いてしまって混乱させてしまったようですが
ビットAND演算子(&)を想定しています。
構造体Aのメンバa-zは
フラグ(0x01 or 0x00)として意味を持ち
それに大して構造体Bで用意したメンバa-z(0x01 or 0x00)
を各メンバ同士ビットAND演算子(&)で演算を行って
フラグを残したり、落としたりという処理をしたかったりしてました。
一つの変数に複数のフラグを持たせるか、そういう関数作るが一番いいと思う。
70 :
56 :2007/08/08(水) 00:20:19
56です。 思えば同じ型の構造体でも丸ごと代入は許されていない ことを考えれば丸ごとビット演算もちょっと無理な話であることは 少々考えればわかることでした。。。 アドバイスくださった皆様どうもありがとうございました /平伏
bitset.hのような話?
>>70 >思えば同じ型の構造体でも丸ごと代入は許されていない
普通にできるけど。
--
struct {int a; int b;} a = {1, 2}, b;
b = a;
>>70 構造体丸ごとの代入は許されてるよん。
代入しか許されてないけど。
74 :
56 :2007/08/08(水) 00:44:30
構造体丸ごとの代入 →ググッたら普通に出てきた。。。 無知で申し訳ないです
75 :
デフォルトの名無しさん :2007/08/08(水) 05:24:03
while (str != null) { hoge ) みたいな関数についてなんですが、 なんでstr != nullで動くんですか? 文字列の終わりはnullじゃなくて、¥0じゃないんですか? nullは無効なメモリアドレスで、 ¥0とは違う意味じゃないんですか?
違う意味だね。 だから、文字列の終わりを判定するコードじゃないんだろう。
>>75 strは文字配列へのポインタで、
まさにstrが無効なメモリアドレスでない間ループを回すコードじゃないのか?
strの型を確認してみるんだ。
もし #define null '\0' であれば、件のコードは while (*str != null) {...} のはずなので、ほぼ間違いなく「正しいコード」だろう。 ただ、nullではなくNULLだろうな。
79 :
デフォルトの名無しさん :2007/08/08(水) 08:34:24
36歳独身男性でも応募できますか?
86歳♀ですが応募できますか?
21歳独身男性結婚する気なしでも応募できますか?
>>81 見た目と声がレディなら、アソコはどうなっていても構いません。
>>82 86歳はルックスの面で少し厳しいと思いますが、
熟女の魅力と魅力的な声があれば大丈夫かと思います。
>>83 年は関係ありませんし、結婚願望はない方が好ましいですね。
ただし、見た目と声は(´∀`*)でないとダメです。
3チャイです。キリンさんが好きです、でもゾウさんの方がもぉっと好きで〜す♪
86 :
DEFORTの名無し :2007/08/08(水) 20:27:50
ちょっと質問したいんだがどこかのサイトに無料のCのコンパイラないかな 知っている人がいたら教えて♪
87 :
DEFORTの名無し :2007/08/08(水) 20:30:16
これはスレちがい?
MinGWとかVisualC++2005ExpressEditionとか
gcc
OSくらい書こうや WindowsXP?
DEFORT じゃなくて DEFAULT だよな
W
94 :
デフォルトの名無しさん :2007/08/08(水) 23:24:39
いくつかのC言語の初心者向けの書籍をいくつか読んで気になった事があるのですが、 %d や %s などの呼び方が書籍によって「変換指定子」や「変換仕様」と違い、 どんな条件で変わっているのか調べても判らず困っています。 これはどちらか間違っているのでしょうか?
「変換指定子」は d とか s とか変換方式を表す文字のみを指す。 「変換仕様」や「変換指定」は % で始まり「変換指定子」で終わる全体を表す。
OS:RHEL4 言語:C やりたいこと: #include <openssl/sha.h> unsigned char *SHA1(const unsigned char *d, unsigned long n, unsigned char *md); こいつを使いたい。 これって、.soに定義されてないの?/usr/lib/libssl.aにしかない? EVP_xxxを使うべきなのか。。。
98 :
94 :2007/08/08(水) 23:41:28
>>99 情報アリガト。
でも、これってRFCで示されたSHA1の実装例ですよね?
RHEL4の標準ライブラリで実現できないかなーと思っているのです。
opensslコマンドや、sha1sumコマンドで実現できるのは分かっているのですが、
自プロセス内で、標準(?)関数を使ってSHA1のハッシュ値を得たいのです。
ワガママですみません。
101 :
97 :2007/08/08(水) 23:57:40
追記。 libssl.aをリンクすれば良いのですが、 libgnutils-openssl.soとかあるので、共有ライブラリで何とかならんのかなーと。
わざわざ面倒なことしてライブラリ使わんでも、それコピって使えばいいと思うが・・・ こだわる理由がわからん。
ソースがでかくなるのやじゃないですか?
104 :
デフォルトの名無しさん :2007/08/09(木) 00:06:30
>>103 1個のファイルに全プログラムを書いてるとか?
>>106 いえいえ。
もし既に標準ライブラリとしてRHEL4で提供しているのであれば、それを使った方が良いと思ってるのです。
javaでもメッセージダイジェストのクラスjava.security.MessageDigestがありますし。
できれば標準で提供されているものに乗っかりたいかなと。
Cとjavaではそもそも思想が違うと言われたらそうかも知れませんが。。。
変態!変態!変態!!
すみません、どなたか教えて頂けないでしょうか。 C言語で、以下のものを作成したのですが、 int *name[] = { "satou", "takahashi", "suzuki", }; この時に*name[]に入った配列の数を知るにはどうしたら良いでしょうか。 (上記の場合、自分では「それぞれの文字列の先頭のポインタが3つ入っている」という認識です)
sizeof name / sizeof name[0]
>>111 配列の数を知る事が出来ました。
ありがとうございます。
えっと、なぜint *? char * name[] = { "hoge", "hogehoge", "hogehogehoge" }; sizeof ( name ) / sizeof ( char * )で3が得られる。
int *の配列なのが気になるが・・・ char *じゃ無くて? [mona@fedora7 tmp]$ cat test.c #include <stdio.h> int main(int argc, char **argv){ int *name[] = { "satou", "takahashi", "suzuki", }; printf("%d\n", sizeof(name) / sizeof(int *)); return 0; } [mona@fedora7 tmp]$ gcc test.c [mona@fedora7 tmp]$ ./a.out 3
みんな、簡単な問題だと思って、レスが早いよ!!
別スレに来たのかとおもた
自分の認識ではname[]へは、 [satouへのポインタ] [takahashiへのポインタ] [suzukiへのポインタ] … でしたので、数が増えた場合の事を考えて、 int型で宣言した方が良いと思い、 int型で宣言しました。 この辺りが曖昧でして。申し訳ありません。
皆様突っ込みどうぞ
>>117 数がいくら増えようが、char *もint *も必要とするメモリは変わりない。
ってか、name[]に256を超えるポインタを格納することを考えてintにしたのか?
だとしたら激しく勘違いしているぞ。
すみません、ソース見てみたらchar型で宣言してました。 int型に変更してコンパイルしてみたところ 大量のwarningが出ました。 (エラー内容:warning initialization incompatible pointer type) お騒がせして申し訳ありません。
>>117 ポインタが指し示す値の型がintならint*を使うしcharならchar*を使う
指し示した先の型が表せる値の範囲は違ってもポインタ自体のサイズはint*でもchar*でも同じ
↑すみません
>>120 =
>>110 です。
char型の配列を、
name[] ={...}内に入っている分を確保するという事で良いでしょうか。
"satoru" は、文字列リテラルと呼ばれるものです。環境にもよりますが、 書き込み不可のメモリ領域に確保されます。 で、これはchar型の配列、末尾が'\0'として表現されています。 なので、 char *name[] = {"satoru", "takahashi"."suzuki"}; の意味は、 1.書き込み不可領域に確保されている"satoru"、"takahashi"、"suzuki"の3つの文字列リテラルがある。 2.要素数3、でchar型へのポインタの配列(name)がスタック(?)に確保され、各ポインタは、 1.の"satoru"、"takahashi"、"suzuki"それぞれの先頭の一文字のアドレスを指すように初期化される です。 117はCにおける文字列の表現方法について基本が分かっていません。がんばってちょ。 基本を理解するのは意外と難しいです。
違う。char *を{...}の中にある要素数だけ配列として確保する。 だから、下の二つはnameで確保するメモリは同じ。 char * name[] = { "a", "b" }; char * name[] = { "aaaaaaaaaa", "bbbbbbbbbb" };
皆様へ 丁寧なご説明ありがとうございます。 ずっとこの部分でエラーを吐いていて、 うまく動かず悩んでいたのですが、やっと動きました。 どうしてエラーが出ていたのかも理解できました(と思います…)。 ありがとうございました。
126 :
46 :2007/08/09(木) 04:02:22
>>61 書き込みを遅くなりまして申し訳ありませんでした。
>>始めに出力した内容がDOS窓を上にスクロールしてもみえません。とか?
そのとおりです。何か対処法がありましたらぜひ教えてくださいよろしくお願いします。
どんだけ〜
>>126 所謂DOS窓を縦に引き伸ばしてみては如何でしょうか。
或いは、リダイレクトでファイルに落としてエディタで見るとか、
パイプラインでmoreに繋いで見るとか。
って、どう見ても言語ネタじゃないね。
>>97 うちのUbuntu系のLinuxには /usr/lib/libssl.so があるんだぜ。
>>126 ワロタwwプログラミング以前の問題だなw
左上のアイコン右クリック>規定値>レイアウト>画面バッファのサイズ>高さ を増やすとか
>>126 出力をテキストファイルにリダイレクトするとか
bcc32 -Etest.txt test.cpp > result.txt
ファイル入出力で質問です。 ファイル保存のダイアログを出して、適当なところに保存して また別にfopen("test.txt", "w"); で保存すると、保存ダイアログが出てたフォルダに保存されてしまうのですが これを、実行ファイルと同じフォルダに保存するようにしたいんですけど どうすればいいでしょうか?
カレントディレクトリを実行ファイルのあるディレクトリにすればいいんじゃないの?
>>133 つまりユーザはダイアログで保存ディレクトリも含めて保存先を指定したのに
それを*無視*して実行ファイルと同じディレクトリに*無理やり*保存したい
ってこと?
ユーザ権限について調べてみるといいと思うよ
Unixは言うに及ばず、WindowsであってもVistaでは厳しくなったようだから
136 :
135 :2007/08/09(木) 17:24:09
ああ、 > また別にfopen("test.txt", "w"); > で保存すると、 と書いてあるから、ユーザに指定させたのとは無関係に、プログラムが 勝手にこしらえるファイルの話か? だったら、自分で実行ファイルのディレクトリを取得して、 フルパスで指定汁。カレントがどこだか分からないのだから。 とは言え、パーミッションには注意。Unixならもともとそういう設計は論外な。
>>134 >>135 アドバイスありがとうございます。
ダイアログで保存するものと、fopenで保存するものは別のものなんです。
ただダイアログを出さないで保存したいなと思いまして。
ただ単に、fopenのみのプログラムだと実行ファイルのところに保存できたのですが
ダイアログ→fopen の順序で実行したらダイアログで保存したフォルダに一緒に保存されてしまったんです。
カレントディレクトリを実行ファイルのあるディレクトリにすればいいとは思ったんですけど
やり方がわかりませんでした。
GetModuleFileName()でexeのファイル名を取れ
int main(int argc, char *argv[]) ってやると、argv[0]に実行ファイル名が入るよ
>>140 この場合、そのことに何の意味が?
まさか、argv[0]に必ずフルパスが入っているなんて能天気なことを想像してたりしませんよね?
>>141 フルパスが入るようにコマンドラインを入力するんだよ
大丈夫か?
>>142 アプリの都合でアプリの存在するディレクトリにこしらえるファイルのために
何でユーザがアプリの起動方法を指図されなければならないのだろうか
144 :
133 :2007/08/09(木) 17:48:56
みなさんありがとうございます。
>>139 さん
のやり方で解決いたしました。
他にも色々な案を出してもらったので一つ一つ試していきたいと思います。
ありがとうございました!
argvやカレントディレクトリに仮定を置くのは糞デザイン
>>144 それじゃ、カレントがexeのディレクトリと同じじゃないと
意味無いよ。確実にexeが存在するのと同じ場所にファイルを作りたいなら
フルパス指定するしかない。
GetModuleFileName()でフルパスを得て _splitpath()で分解して sprintf()で結合とかどう?
ダメ
exeと同じフォルダに書き込もうとか思っていると、 VistaのUACではまるかも。 そこに至るまでの道のりは長いだろうけどね。
何をさも自分が苦労したからって
>>150 北極行くのに南極経由するような人なんだから触れてやるな
153 :
133 :2007/08/09(木) 19:02:17
すいません。だめでしたね。
>>147 の様な処理で分解してstrcatで結合して
それっぽい動きになりました。
ファイルダイアログで選択して別ファイルに保存、、、 C#のスレでまったく同じ質問があったな、しかも同じ日 どっかの課題かなにかなのだろうか
ただのマルチだろ
いや、だって言語違うぜ?
右も左も分からないんだろう
うーん、向うはC#のソース出してたし 解決の仕方も解決した時刻も違うから 同じ人とは思えないなあ 質問者に種あかししてほしいとこだが
ファイルダイアログなんてよくある質問じゃん。
全部同じ奴だろ
包茎を短時間で修正するプログラムの 開発って難しいですか?
包茎と短時間と修正の定義次第
いつから配列の定義の要素数に変数が使えるようになったん? 99年から? void func(int n){ int array[n]; : } とか。。。
C99 から
やぱり。即レスども。 個人的にはその仕様はうれしい。
longjmpするとリークする可能性があるから、気をつけたまへ
C99とC/C++は互換性無いから別スレに分けた方がいいと思う。
可変引数マクロは非C99処理系にも是非輸入して欲しい
素直にC99使えば
>>168 C と C++ 用にそれぞれ専用スレがあるだろ。問題があれば誘導すればいい。
stringstreamに、ファイル(ifstream)の中身を書くよい方法はありますか? とりあえず自分が考えた方法だと、 std::ifstream ifs(...); std::stringstream ss; while (!ifs.eof()) { char buf[1024]; ifs.read(buf, 1024); ss.write(buf, ifs.gcount()); } こんな感じです。こんなことをする理由は、 ifstreamからstd::getlineをして1行ずつ処理するプログラムなのですが、 stringstreamに全部入れた後、std::getlineをした方が、倍以上高速になることを発見したからです。 それとも、もっと効率の良い方法はありますか?
ifstream ifs("dir_name"); if ( ifs.fail() ) { return 0; } if ( ifs.isDirectory() ) { } みたいに標準ライブラリだけで ディレクトリか否かを判定することってでけますか? あと、ディレクトリ内にある全ファイルの名前取得みたいなことは 標準ライブラリだけででけますか?
>>172 pubsetbuf()でバッファでかく取っとくと、一般には速くなると期待されるんだが、
gccの少なくとも古いバージョンでは、open済みのstreambufに
pubsetbuf()を実行しても、何食わぬ顔をして元のバッファを使うようだ。
mmap()したポインタをstrstreamにそのまま突っ込むのが多分一番速いが、
移植性に欠ける上にstrstreamがdeprecatedなのがネックだな。
stringstreamのstrメンバを使うとせっかくmmap()したものを
わざわざコピーしてしまうし、
stringstreamのpubsetbuf()も有効とは限らないようだ。
(少なくともVC++では平然とシカトされる)
>>173 それ記述が簡単でいいんだが、少なくとも
VC++のostream実装とかだと、大して速く無さそうなんだよな。
sgetc()/snextc()と、sputc()使って1文字ずつコピーしてるし
微妙に無駄の多いコードになってるんで、
下手すりゃ手書き1文字コピー回したしたほうがまだ速いかもしれん。
>>174 どっちもだめ
ディレクトリのないファイルシステムもあるんで、CやC++の標準は
ディレクトリがらみを一切扱っていないはず
>>168 C99はCであって、
互換性がないのはCとC++
>>178 無論そんなことは知っているが、
>>174 は「標準ライブラリだけ」と
2度も強調しているんだし、非標準の方法があることぐらいは知ってて
聞いてるんだろ
180 :
175 :2007/08/10(金) 11:23:23
ごめんあほなこと書いた > stringstreamのpubsetbuf()も有効とは限らない そもそもpubsetbuf()を入力を食わせるのに使えるはずがないな
>>179 >178の名前欄。
つーか、>176はなんで「扱っていないはず」なんて曖昧なままにしておくのだろう。
調べれば直ぐに答が出ることなのに。
>>181 すまん、扱っていないことは知っている
理由のほうが推測だ
>>182 なるほど、それは失敬。そしてその推測は妥当だろう。
実際、CP/Mやtronにはディレクトリがない。
まぁ一方ではsignal()なんかが標準だし わけわからんところもあるよな
大丈夫、signal()は内容が規定されていないから存在しない環境では何もしなければいいから。
186 :
174 :2007/08/10(金) 11:53:44
>>176 レスありがとです。
標準ライブラリにディレクトリ絡みがまったくないのでおかしいなぁ
とは思ってたんですが、そんな理由があったとは。。
ソースを他環境に持ってたとき、すぐコンパイルできないとイヤだなと思って
できるだけ標準でやる方法を探してたんですが、
>>178 さんの仰るとおり、こりゃおとなしくboost使っといたほうがいいですね。
187 :
デフォルトの名無しさん :2007/08/10(金) 12:06:28
なんだboost厨の自演か
188 :
デフォルトの名無しさん :2007/08/10(金) 12:09:27
やっぱりブーストがいちばんですね^^
189 :
デフォルトの名無しさん :2007/08/10(金) 12:31:53
char *p = "hogehoge"; の時 *(p++) がさす値はoですか?
いいえ *(p++) の値は 'h' になります
いいえ *(p++) の値は 'g' にもなります
はい、トムはペンです
出力してみりゃ分かることだろうに。 2ch に書き込むより早く分かる。
194 :
デフォルトの名無しさん :2007/08/10(金) 12:44:01
*(++p) オヌヌメ
*next(p) ^^;;
>>189 は
p が指す値と
式 *(p++) の値を混同してないか?
有り難うございます。 ちなみに *pには何が代入されているんですか?
*pには何も代入されていないと思いますが。
199 :
デフォルトの名無しさん :2007/08/10(金) 13:02:37
夏・・・
最近は季節に関係なく年中馬鹿が湧く、と考えていたけど、 やっぱり長期休暇は頻度もスケールも一回り違うかな。
出力してみりゃわかることをうだうだと質問してからに・・・
202 :
デフォルトの名無しさん :2007/08/10(金) 15:01:04
ちょっとしつもんします ギャルゲーとかで「フラグをたてる」ていうんですが フラグというのはビットなんですか?
ビットなフラグはビットフラグ ビットじゃないフラグも当然ある
「立てる」っていう表現をするようなフラグなら、 「立てる」か「倒す」かだからビットだろうなぁという気はする。
死亡フラグは立てるのに倒れてしまう件
私生活では全くフラグが立たない件について
>>204 boolは大抵intかcharで実装されている罠。
>>206 立ち過ぎてて困るから
1ビット分けてあげるぞ
209 :
デフォルトの名無しさん :2007/08/10(金) 19:04:06
cygwinまたはlinuxの環境下でコンパイラに追加依存ファイルの検索パスを与えようとしています 仮に追加依存ファイルのパスを~/xxx/includeとすれば .bash_profileではexport CDPATH="$CDPATH":"~/xxx/include/"のようにして環境変数を設定し シェル上でcd includeと打てばカレントパスが意図通りに変化するところまでは設定しています ここから、このパス下にあるtest.hppを#include <test.hpp>のように指定しているファイル ~/main.cppを コンパイルする目的で~/下でg++ main -I includeと打ったのですが コンパイラからはtest.hppが見付からないというエラーが返ってきます 正しくはどのように指定するべきなのでしょうか?
CDPATH はその名前の通り cd コマンドにしか効かないんじゃない? -I~/xxx/include ってやれば?
CDPATHはcdに関係するだけでコンパイラには関係ないんじゃないか? 何がしたいのか良く分からないけど、普通に-I~/xxx/include/とか書くとか ていうか、そもそも-Iの後ろにスペースあるのはOKだっけ?
なるほどフルパスで指定しないと駄目なんですね、あと' 'が入ってても駄目と それら二点に気を付けて打てば通りました 助言ありがとうございました
>>212 相対パスでもいけるけど、「ソースがある場所からの」相対パスであることに注意
214 :
213 :2007/08/10(金) 19:47:00
あ、-Iオプションで指定する場合はそうじゃないか? すまん、俺自身あやふやになってきた。忘れてくれ
-Iオプションは相対パスでもいけるハズ。 たぶんコンパイラ実行時の作業ディレクトリかなんかからの相対パスになると思うけど・・・。 いつもmakefileコピペ改変でやっちまうから、俺も記憶があやふやだ・・・
相対パスでOK。 Makefileに-Ipathと書いておいて、ln -s どっかの/pathとかよくやる。
クラスの実際の型に応じた処理を簡単に書く方法はありますか? 例えば、基本クラス Hoge を継承するクラス Foo と Bar があるとして、 void func(const Hoge &hoge) { // hoge が Foo の時の処理 // hoge が Bar の時の処理 } というのを簡潔に書きたいのですが。普通にdynamic_castを使って(ダウンキャストの例外呼ばれたくないのでポインタで) { if ((const Foo *p = dynamic_cast<const Foo *>(&hoge)) != NULL) ...; else if ((const Bar *p = dynamic_cast<const Bar *>(&hoge)) != NULL) ...; } とやる方法と、try...catchの変な使い方で { try { throw hoge; } catch (const Foo &foo) { ...; } catch (const Bar &bar) { ...; } } っていうのも思いついたんですが、こんな書き方はしないですよね。実際はどういう書き方が普通でしょうか。 instanceofとかisとかC++にはないようなので。
そのクラスに virtual 関数を作ればいいんじゃないの? instanceof は dynamic_cast いちおう typeid もあるけど
>>217 funcをHogeの仮想関数にする(必要に応じて純粋仮想関数にする)。
そして、FooとBarがそれぞれオーバーライドする。
instanceofとかisとかがある言語でも、
そんな書き方よりこういう仮想関数でやる方法が普通だぞ。
>>217 void func(const Foo& foo);
void func(const Bar& bar);
...
Lisp じゃないから。
>>217 基底クラスが派生クラスの面倒までみるべきではないよ
>>222 funcはHogeのメンバ関数じゃ無い、とかそんな状況な気もする
func から Hoge の仮想関数呼べばいいだけだよ
あぁ、いや。 単に基底クラスに面倒見さそうとしてるわけじゃないんじゃない?というだけの話で。
その、try...catchの変な使い方、だが、結局投げてるのはHoge型だから 本当のクラスでは捕まえられない。 #include <stdio.h> struct B{virtual ~B(){}}; struct D1:B{}; struct D2:B{}; int main(){ B *b = new D1; try{ throw *b; } catch( D1 &){ puts("D1"); } catch( D2 &){ puts("D2"); } catch( B & ){ puts("B"); } }
ダブルディスパッチ使えばいいじゃん。
それなにぬねの
#include <stdio.h> struct B { virtual ~B(){} virtual void Throw() { throw this; } }; struct D1 : public B { virtual void Throw() { throw *this; } }; struct D2 : public B { virtual void Throw() { throw *this; } }; int main(){ B *b = new D1; try{ b->Throw(); } catch( D1 &){ puts("D1"); } catch( D2 &){ puts("D2"); } catch( B & ){ puts("B"); } }
#include <stdio.h> struct B { virtual ~B(){} virtual void Func() { puts("B"); } }; struct D1 : public B { virtual void Func() { puts("D1"); } }; struct D2 : public B { virtual void Func() { puts("D2"); } }; ダントツでこれが一番いいんだけどなぁ
そりゃそうだ。
基本に戻るような質問 VC8Express (cl v14.00.50727.762 for 80x86)で、 void main(void){main();} を、 cl /MD stackov.cpp でコンパイルして実行しても、黙って落ちるだけで、_invoke_watsonされない そういう例外って、なにかしらダイアログ出して落ちるものとばかり思っていたのに 昔からこんなでしたっけ、これってこういうもん?
スタックオーバーフローで落ちるだけじゃないの?
うん。まさに、スタックオーバーフローで落ち… …たときに、アプリケーションエラーって出ないのが デバッガから起動すれば、ちゃんと Stack overflow - code c00000fd (first chance) って捕捉されるんだけど…。
コンソールアプリだからじゃないのかな。
int ch = ' ' if (!isspace(ch) && !iscntrl(ch)) break; という文なのですが、 何故かbreakされてしまいます。 chがスペースでないときかつchが制御文字でないとき にbreakされるはずなのですが、条件式間違っているでしょうか?
gcc gdbではSIGSEGVでstack over flowにならんのだけど 検出する方法は別にあるんだろうな、あるんだろうね
>>236 動かない断片を提示されてもなんとも言えませんが。
症状を再現できる最低限のロジックを提示してみてください。
iscntrl()はロケールに依存するとされるし、 chか、iscntrl()の挙動が直感に反しているのでは printf("%x: %d, %d\n",ch,isspace(ch),iscntrl(ch)); をifの前に置いてみては。
>>232 気になって試した
どうもスタックのサイズによるみたい
void main(void){
char cc[4096];
main();
}
とすればダイアログはでる。
(アセンブラ見ると、__chkstk の呼び出しが追加されてる)
ただし、VCのオプション的にはスタックサイズが4Kより小さいときでも、
/Gs0 とか付ければいけそうに思えるし、実際アセンブラリストに
__chkstk の名前でてるんだけどダイアログはでない。謎。
>>238 ,239
失礼です。
IDEでソースコードを読んでるんですが、動きが気になったので
static int
skip_space(void)
{
int ch ;
for (;;){
if ((ch = getc(stdin)) < 0)
return -1; /* end-of-file */
if (!isspace(ch) && !iscntrl(ch))
break;
}
return ch;
}
chに'¥t'や' 'を代入して/*if ((ch = getc(stdin)) < 0) return -1; */
として、ステップオーバーしていったのですが、
> if (!isspace(ch) && !iscntrl(ch))
の段階で止まってしまって、ブレイクしたのかなと思って。
誰か、エスパー頼む
>>241 関数名から推測して
static int skip_space(void)
を呼び出す上位関数に問題があるんじゃないか?例えば
int main(void) {
int ch;
for(;;) {
if(-1 == (ch = skip_space())) break;
putc(ch,stdout);
}
return 0;
}
とか。
ははぁ、成る程! ちなみに (!isspace(ch) && !iscntrl(ch)) な文字コードってどんなのが当てはまりますかね?
>>244 空白文字でも制御文字でもない文字。
まぁ、大抵の可読文字が該当する罠。
すいませんわかりました。 自分馬鹿だorz ほんと皆さん電波な質問して申し訳有りません 二徹して疲れたので寝ます
eclipse with CDTが生成したmakefile用の依存リストで src/test.d src/test.o: ../src/test.cpp \ H:/root/usr/src/boost/boost/shared_ptr.hpp \ H:/root/usr/src/boost/boost/config.hpp \
248 :
247 :2007/08/13(月) 19:03:44
(ミスして送信しちまったorz 続き) の最初の行で multiple target pattern stop とmakeがエラーになるんですが、 これはどうすれば解決するんでしょうか? test.dと.oのルールを同じ行で定義しているのが問題かと思ってわけてみたり test.d(つまり自分自身)のルールを定義しているのが問題かた思ってtest.dを消してみましたが 解決しませんでした
インクルードパスにドライブ名が入ってるとだめらしい C: とか H: とか 代わりに /cygdrive/c/ や /cygdrive/h/ を使うと大丈夫とかいうことらしい
250 :
247 :2007/08/13(月) 20:15:55
>>249 そのようにしたらmakeのエラーは消えdebugができるようになりました
しかし今度は
Invalid project path: Include path not found (\cygdrive\\root\usr\src\boost)
のような警告がでてきましが、これなら実害ないので我慢します
助言ありがとうございました
char *parse( char *buff ) { int c; int at = 0; while( (c = getchar()) != EOF ) { if( isdigit( c ) ) { buff[at++] = c; } else if( isspace( c ) ) { if( at == 0 ) { continue; } else { buff[at] = '¥0'; return buff; } } } int main( void ) { char buff[256]; int i; for(i=0;i<256;i++) buff[i] = 0; char *s; while( (s = parse( buff )) != NULL ) { printf( "read %s¥n", s ); } } というプログラムなのですが、 これって¥0とNULLが同じってことですよね。 buffはただのchar型の配列のはずなのになぜ¥0がNULLになるんでしょうか? char *buff[256]ならNULLで判定出来るのは理解出来るのですが。
NULLはヌルポインタ、\0はヌル文字 当然、ヌル終端文字列は後者を末尾に持つ
parse内のgetcharがEOFだった時、何を返すんだ? 思いっきりバグ、もしくはコピペミスだろ。
どこの\0とどこのNULLだ? 12行目の'\0'と24行目のNULLなら別物だし、 比較も代入もしていないが
parseからNULL返って来ないな
お前ら朝から優しいな
あーそうか、parseが切れてるのか。 {}が対応してないな。
朝から結構人がいてワロタw
こんな感じで隠れてる (⌒─-⌒) EXILE!EXILE! 〃((´・ω・`)) ミ ○ ((´・ω・`)) O((´・ω・`)) Oヽ( )〃ノO ∪⌒∪ """ "" " """ "" " """ "" " ""
亀ですが
>>240 ありです、それかもな感じ 何かがひらめいた予感 ちょっと調べてみます
>>235 ちなみに、WinMainでやってみても、なんもいわれんかったのです;
>>251 コンパイルできるソースをもってきてください。
それから処理系によって'\0'とNULLは同じじゃない。
#define NULL ((void *)0)
と定義してあったら違う型。
#define NULL 0
と定義してあったら同じ型として扱える。
'\0'は、int型の整数だから後者の処理系なら比較できてしまう。
~~~~~
しかし、もともとNULLはヌルポインタ(どこも指していないポインタ)を意味しているので
'\0'(整数)とNULL(ポインタ)の比較をしているソースは窓から放り投げろ。
推測だが、char *parse(char *buff)
の最後の方は、こんなふうになってるんだろう。
buff[at] = '\0';
return buff;
}
}
}
return NULL;
}
それから、buff[256]はスタックオーバーしていて不定な値だ。
*buff[256]なんてどこを指しているかわかりゃしない。NULLじゃない。
このプログラムは、文字数を判定していないから、'\0'を入れて256文字以上になると
スタックオーバーで動作は不定になる。うまく動いてもそれは運がいいだけ。
262 :
251 :2007/08/14(火) 13:07:51
どうやってソースを窓から放り投げるんだ・・・?
ソースを窓から放り投げるを開始するには、まず窓を開けます。
バッファオーバーフローであってスタックオーバーフローとは(ry
なぜこれがコンパイルエラーになるのですか? class A { public: void hoge(int i) { MessageBox(NULL, _T("A"), _T("hoge(int)"), 0);} virtual void hoge() = 0; }; class B : public A { public: void hoge() { MessageBox(NULL, _T("B"), _T("hoge()"), 0); } }; int _tmain(int argc, TCHAR **argv) { B b; b.hoge(1); // コンパイルエラー C2660 }
なんでそんなこともわからないのですか?
>>266 まぁそう言わんと。
>>265 EffectiveC++を読むことをお勧めしておきます。
>>266 初心者だからです。例えば、以下のJavaのソースはコンパイルが通るので、C++でも同様のことが可能かを考えています。
public class Test1 {
public static void main(String[] args) {
B b = new B();
b.hoge(1);
}
}
abstract class A {
public void hoge(int i) {System.out.println("A : hoge(int)");}
public abstract void hoge();
}
class B extends A {
public void hoge() {System.out.println("B : hoge()");}
}
>>267 このあたりですか?
ttp://www002.upp.so-net.ne.jp/ys_oota/effec/chapter6.htm#36kou 265のclass Aのhoge(int)はhogeImplのようにするこで解決できました。ありがとうございます。
>>265 ,268
hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
で、見つかった hoge() は引数が一致しないのでエラー
C++ と Java が一緒だと思ってるのが間違い
>>269 >hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
なるほど。すっきりしました。ありがとうございます。
wavファイルの再生について質問があります。 PlaySoundを使う方法は簡単にできたのですが、wavファイルを実行ファイルに組み込むことはできるのでしょうか? できるなら、方法や資料を教えて頂けませんか? 宜しくお願いします。
とりあえずC/C++とは関係ない
実行ファイルの種類による
PlaySound リソース でぐぐれば?
275 :
271 :2007/08/14(火) 17:15:30
PlaySoundでできるとは思っていませんでした。 本当に助かりました。ありがとうございます。
関数テンプレートの特殊化ってできないんですか? もしできないのなら、いずれ出来るようになる見込はありますか? template <typename T, typename U> void func(T&) {} template <typename T> void func<T,int>(T& u) {} error : partial specialization `Func<T, int>' of function template
>>268 そんなサイトあったのか、本買っちゃったよ
>>276 テンプレートパラメータの制限は関数とクラスで微妙に違う。
ただ、パラメータを常に指定するなら↓で同じことができるはず。
template <typename T, typename U> class func_object {
explicit func_object(T&) { ... }
};:
template <typename T> class func<T, int> {
explicit func_object(T& u) { ... }
};
使い方
func_object<A,B>(x);
func_object<C,int>(y);
>>277 そのサイトはヒント程度だぞ。何やら勘違いに近い記述も見られるし、本は読むべき。
>>276 関数テンプレートの場合、完全な特殊化はできるが部分特殊化は出来ない。
代わりに関数オーバーロードが使える。
281 :
276 :2007/08/14(火) 21:48:52
やっぱ無理なんすか テンプレート引数を汎用関数のtraitsとして利用したかったのですが… 変数の型を態々書くくらいなら関数オブジェクトとして作る方が良さそうですね
282 :
261 :2007/08/14(火) 23:00:51
>>264 え?スタックオーバーフローなんて一言も言ってませんがなにか?
~~~~~~
>>282 コレは他人が装ってる釣りか?
ちょっと釣られて見ますよ
演算子の優先順位についての注意。インクリメント(++)/デクリメント(-- --)演算子と間接参照演算子(*) の優先順位は、間接参照の方が低い。だから、 while(1){ sub( *++p ); } というコードは頻出するが、単独の文 *++p; は間接参照の文が無意味である。(ポインタpをインクリメントした後で、ポインタが示す値を参照し、値を捨てる) って言う文があるのですが、 「単独の文 *++p; は間接参照の文が無意味である。」 ってどう意味なのでしょうか? 実例を挙げていただけないでしょうか。
>>284 間接参照演算子「*」
間接参照はポインタの先を「*」で参照すること。
int main(){
int a=10;
int *p=&a;
*p; /* <- この文意味ないべ? */
return 0;
}
ああ、そういう意味だったんですか。 分かりました。 自分、日本語読む力が無いなぁ。
>>284 これおかしいな。
ここで例としてあげるべきなのは *p++ であって *++p ではない。
そもそも * と 前置 ++/-- とは優先順位が同じだ。
別に書いていいだろう。 未定義動作でもあるまいし。 コーディングスタイルの話としても、 宗教戦争になる程度のこうじゃないといけないとは言えない内容だな。
>>290 その「sub()がマクロだったら」と考えてみてくれ。
いつ仕様変更でそのようなことになっても大丈夫なように副作用を発生させないのは常識だ。
それだったら*++pではない場合にもいえてしまうんじゃないの? マクロってなんなのかしらないけど
なんだ、ただのもの知らずか。たとえばこんなの。 #define sub(x) (x < 0 ? -x : x)
>>289 >こらこら、副作用があるコードを関数呼び出しで書いちゃ遺憾。
どいう意味?
そうだよ。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
>>297 そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
初心者歓迎とかスレタイにあるのに何やってるの
>>299 そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
恥ずかしいからってそんな連投しなくてもいいのに
あんああんあんああんあん
>>301 そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
304 :
292 :2007/08/15(水) 09:35:28
>>304 そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
306 :
292 :2007/08/15(水) 09:38:05
マクロも知らなかった初心者に指摘されたのが悔しかったの? プライドを傷つけてごめんね
マクロも知らない初心者の来る所じゃないんだ。 どれだけそいつに時間とレスを割く必要があるか分かるだろう? そんなレベルの低い奴が来ると釣りかと思う。
308 :
292 :2007/08/15(水) 09:45:23
>>307 マクロ知らないとは書き添えたけど質問したわけではありません
あなたの勇み足では?
>>306 の言ってる指摘ってひょっとするとコレ?
>それだったら*++pではない場合にもいえてしまうんじゃないの?
いくらなんでもマジとは思えん(だから
>>293 もスルーしたんだろう)。
>>308 みんな馬鹿で、お前だけが正しいことを言ってる。
誰もお前の頭の良さについていけなくて、悔しさのあまり暴れてるだけなんだよ。
だからママの所に行っておいで。
>>307 >どれだけそいつに時間とレスを割く必要があるか分かるだろう?
って
>そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
の事かwアホじゃね?
314 :
292 :2007/08/15(水) 09:55:13
>>314 その辺が低脳。全て293のレスだと思ってやがる。
318 :
307 :2007/08/15(水) 09:58:34
どうせ俺の事も
>>293 だと思って勇み足で回答したとでも言いたいんだろう?
マクロも知らない初心者の来る所じゃないんだと思っている奴が、
わざわざマクロも知らない初心者に答えるわけがないだろう。
319 :
292 :2007/08/15(水) 09:58:49
320 :
292 :2007/08/15(水) 10:00:03
>>318 マクロくらいわかるよw
フィーリングでね
どう見ても292の方が見苦しい言い訳。 バカなんだからバカにされたくらいでレス繰り返さなくてもいいのに
>>320 フィーリングで分かるなら空気くらい読めるだろ?
324 :
292 :2007/08/15(水) 10:03:36
>>318 初心者に答えるわけがない なんてレスの無駄だから偉そうに宣言しなくてもいいよw
答えないんじゃなくて答えられないんだろ
326 :
309 :2007/08/15(水) 10:16:16
結局
>>306 の言ってる指摘ってのはコレな訳?
>それだったら*++pではない場合にもいえてしまうんじゃないの?
>>326 かもしれないけど、なにしろ何がどう「いえてしまう」のか
まるでわからん文章だからなぁ。
328 :
309 :2007/08/15(水) 10:19:46
329 :
309 :2007/08/15(水) 10:23:07
>>326 多分、
>>289 から続く
>副作用があるコードを関数呼び出しで書いちゃ遺憾。
について言ってるんだと思う。
マクロに放り込むんだり引数の評価順に左右されるような場合はマズいけど 別にこのケースは何の問題も無いわな スタイルとして自分がそう心がけているというだけの話なら ご立派ですねで終わりだが 実にどうでもいい
332 :
292 :2007/08/15(水) 10:26:21
適切な日本語ではなかったけど、脳の衰え始めている先輩方には難しかったかな? むしろ適切であったとしてもまともにこたえる気はなさそうにおもえる
2chで煽るのだけが生き甲斐の厨房に 煽り返す厨房か
334 :
309 :2007/08/15(水) 10:44:58
>>331 今は問題無いからいいって考えはどうかと思うぞ。後々の仕様変更に耐えられるコードを書く方がいい。
もっとも今回は副作用で問題が出るマクロにするのが一番悪いが。
>>332 >まともにこたえる気はなさそうにおもえる
何でそう思ったか知らんが結局質問は「副作用があるコードを関数呼び出しで書いちゃ遺憾って言ってるけど、それって*++pではない場合にもいえなくない?」って事か?
>>331 話題がループするが、sub()がマクロなら問題だからするべきではないという話だろ。
件のサイトではsub()が何か提示されていないのだから、問題がないとは言えない。
336 :
292 :2007/08/15(水) 10:54:44
皆さんの話がかみ合ってないかもしれないので整理しましょう *++pってなんですか?
>>335 マクロにsub()なんて名前をつけてるのならそっちのが問題じゃね
マクロは大文字で目立たせるのが基本だし
subはサブルーチンのサブだろう
ま、標準ライブラリの一部の関数はマクロで実装することも許されているけどな
338 :
デフォルトの名無しさん :2007/08/15(水) 11:13:27
すみません、教えてください。 C++でコンテナからイテレータを取り出すときに、iterator とconst_iterator とを 区別するのはどうやっているんでしょうか? std::vector<>::iterator begin(); と std::vector<>::const_iterator begin() cons; のように、同じ関数でiterator を返したりconst_iterator を返したりしたいんですが、上手くいかない……
340 :
339 :2007/08/15(水) 11:40:56
ごめん、忘れてください。超間抜けなこと聞いた。 暑くて頭がボケてたみたい……
while(1) sub( *++p ); で意味をなす単項subってどんなマクロ(関数)なんだろ
>>337 <*grep*>:319:crt/src/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:333:crt/src/stdlib.h:166:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:340:crt/src/stdlib.h:472:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:342:crt/src/v2tov3.h:71:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:387:include/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:399:include/stdlib.h:146:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:406:include/stdlib.h:424:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:603:PlatformSDK/Include/WinDef.h:177:#define max(a,b) (((a) > (b)) ? (a) : (b))
なるほど、標準ライブラリにないmax()系がこんなにあるとはM$は問題だらけだね。
>>341 きっとこんなのだよ。
#define sub(x) putchar(x)
マクロは名前空間にもくるめないしなあ
>>342 実際、それが問題になることがあって、
min,maxを定義しないようにするための NOMINMAX というマクロが存在する
>>342 実際そのマクロの存在の為に、VC6の<algorithm>にはstd::max, std::minがない。
これはC++の移植性において、由々しき問題である。
まあVC6はそれ以前に色々ダメすぎだけどな 今となっては
>>342 Effective C++でも第1項でいきなり問題視してるじゃん。
Effective C++(笑)
351 :
デフォルトの名無しさん :2007/08/15(水) 12:50:00
質問です。 Windows Vista買ったら、Borland C++5.01のダイアログエデイタが正常に動作しません。 Xpマシンもありますがどうすればいいでしょうか? 1.プログラムはXpマシンで作成してコピーする。 2.ダイアログの部分だけXpマシンで作成してコピーする。 3.Vistaで動作する開発環境を買って移植する。
マルチ死ね
問題視しまくりじゃないか。
ここで言う「マクロと関数に名前の区別」というような点は問題視してない
確かに>337が指摘しているような「大文字ではない」ことについてはなんら言及されていないね。
なるほど。確かにそっちはそうだな。
今北産業。
>>284 > 「単独の文
> *++p;
> は間接参照の文が無意味である。」
> ってどう意味なのでしょうか?
> 実例を挙げていただけないでしょうか。
無意味でない例なら出せる。
volatile int* p;
とか宣言されていて、p が実はメモリマップド I/O
で読むだけでも意味がある場合がある。
>>293 > #define sub(x) (x < 0 ? -x : x)
sub(a+b) とかでおかしくなるから
>>342 みたいに () 使おう。
>>359 p が volatile int* であっても
*++p; と書いて、pがdereferenceされることは保証されてないだろ。
>>360 すまん、よくわからんのだが「p が deference されることは保証されない」のは、特に
*++p;
に言える、と言ってる?それとも、
*p;
でも同様だと言ってる?
更にいうと const volatile int x; x; でも処理系は x の読み出しを削除してはいけないし、 x の値を何かに使う場合複数回の読み出しで同じ値だと仮定してもいけない。 この場合の const は「書き込めません」っていう意味だ。
char *p; char *q; p = "hoge" + 1; q = "hoge"[1]; この場合pはoになることは正しいですよね。 pにはhのアドレスが代入される訳ですから。 んでqの場合は配列じゃないので、 char x[] = "hoge"; int r = x[1]; なら正しくrにはoが代入されますけれど、 q = "hoge"[1];とかいても警告は出ますし、 無意味な値が代入されるけれどもコンパイルはされてしまいます。 どうしてコンパイルエラーにならないんでしょうか?
"hoge" + 1 はポインタだが、 "hoge"[1] はポインタではない。
それは分かるんですけれども、 なんでコンパイル出来るのか? が疑問なんです。
>>364 char* p = 定数;
ならわかる?
>>366 >pにはhのアドレスが代入される訳ですから。
間違い。
>>364 C言語だと、整数からポインタへの代入は警告止まりになる。
C++ だとエラーになる。
>>367 ,369
char* p = 定数;
いや、もちろんポインタに数値をキャストしなくても
代入出来ることは知ってます。
q = "hoge"[1];
ってコンパイラはどういう風に解釈するんですか?
>>368 >pにはhのアドレスが代入される訳ですから。
え、じゃ文字列の先頭のアドレスで正しいですか?
>>370 "hoge"+1なんだから、当然'o'ヘのポインタだ。
>>370 hのアドレス=文字列の先頭のアドレス
代入は+1が行われたあとだろ?
だからすでにアドレスが変わってる
>>370 q = "hoge"[1];
と
static const char x[] = "hoge";
q = x[1];
は大体同じ。
>>372 すいません、勘違いしてました。
>>371 ,373
えっと自分が聞きたいのは、
char *q = "hoge"[1];
という文がなぜコンパイル出来るかってことなんです。
char q [] ="hoge";
char *p = "hoge";
はあきらかに違うのに
char *q = "hoge"[1];
がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
間違いの元になるんじゃないかって思ったんです。
んで、そういう事が出来るのはきっと何か理由があるに違いないと思ったんです。
特に理由はない。 文法上問題がないから警告止まりでコンパイルされるだけ。
> char q [] ="hoge"; > char *p = "hoge"; > はあきらかに違うのに > char *q = "hoge"[1]; > がコンパイル出来るとまるでこの二つが同じように錯覚してしまって > 間違いの元になるんじゃないかって思ったんです。 なぜ二つが同じように錯覚するの?
>>375 ほんとだ。
char *x = "hoge";
p = x[1];
がコンパイル出来る。
x 0x85fd8
p 0x6f
pのアドレスってどこから出てきたんだろう?
>>374 = の右辺に書かれた T 型の文字リテラルは T 型の static 配列と同じです
= の右辺に書かれた T 型の配列は T 型の配列の先頭要素を指す「Tのポインタ型」になります
理由としてはっつーか便利だし〜みたいな?
qはそれ自身が配列であり、右辺の"hoge"はコンパイラに対する 初期化内容としてのみ解釈される。定数"hoge"は実行時には存在しない。 pの場合、実行時に定数"hoge"をメモリ上に用意して、そのポインタを利用する。 なので同じように見えても右辺の意味がまったく違う。 もともとqは以下のように記述すべきものだったんだろうけど、 char q[] = {'h', o'', g'', 'e', '\0'}; 不便なので、利便性のために char q[] = "hoge"; という書き方も受け入れるようになっただけ。 結果的にpとqの右辺が似ているけど、たまたま。
383 :
デフォルトの名無しさん :2007/08/16(木) 10:07:36
*p = "hooge" p[] = "hooge" は同じだろ
>>383 どっちもセミコロンが無いからエラーになる→同じこと
ってオチは無しだぞw
型名もないしな
フフ
void foo() { auto char *p = "hoge"; auto char p[] = "hoge"; … } とした時の挙動からして違うことは判るだろ
char p1[] = "hoge"; char *p2 = "hoge"; p1[1] = 'a'; p2[1] = 'a'; // <=
Perlの無名配列みたいに {1000,100,10}[0] もいけたらいいのに
C99 #include <stdio.h> #include <string.h> int main() { printf("%d\n", (int[]){1,3,5,7,9}[1]); }
配列として認識されるのか…すげー
これでC99準拠のコンパイラがもっと増えてくれれば
398 :
768 :2007/08/16(木) 22:36:05
C99、便利だけどC言語としてみるとキモい・・・
C++と同期とって進化してくれれば歓迎なんだけどな。
C99準拠のコンパイラって少ないの? GCCしか使ってないから知らんのだけど。
前使ってた Borland C++ 5.5.1 は C99 非準拠だったな.
ICC
VC++ のやつが無視しやがってるから広まらないのかな。
C99はDと同じ運命をたどればいいんだよ
VC++はC++コンパイラだからC99対応しないよ、ってMSの 中の人が言ったんだっけか。
確かにVC++8.0で試すと凄い勢いでエラー出るな
まあ、C99 使うくらいなら C++ 使うってのは確かだが
数式を画面に表示させるためのライブラリって無いでしょうか? x^2みたいなのを、綺麗に表示するためのライブラリがほしいのです。 できれば、ソース公開している奴で、無ければソースは無くてもいいのですが とにかく、アプリに組み込んで開発できる奴がいいです。 ちなみに、開発環境はVC++2005、WinXPProを想定しています。 動作環境も同様にXPProです。 よろしくお願いします。
ビット演算がうまくなるコツってないですかね? 全く使いこなせてないので、 他人のソース読んでて、使いこなせていると凄く羨ましいんですけれど。
才能ないよ諦めた方がいい
コラー!
自虐し過ぎ
>>411 グラフィックまわりをいじって変な画面効果とか作るのが楽しいかも
上達が見てわかるし
>>411 エンディアンと変数型のバイト幅を意識すること。
算術シフトと論理シフトを意識すること。
コツっていうとこんぐらい?
フラグ的な使い方の話だったら、
必要になった時だけ使うのが良いんじゃないかなぁ。
>>411 論理演算、真理値表、2進数⇔16進数変換。
この辺のキーワードを調べ使いこなせるようになるとずっと違うと思うよ。
例えばこんなの。
a b c r
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 x
1 0 1 x
1 1 0 0
1 1 1 1
こいつからrを求める式を導き出せれば一歩前進。
皆さんアドバイス有り難うございます。
ビット演算は大事ですからね。
精進します。
>>417 グヌヌ。
難しいぞ。分かんないっす。
プッ ヘボすぎ
~(a^c)&b こうですか?
タンクローリーを運転する人に見えたのは俺だけでいい。
int foo; int bar; bar = (unsigned int)foo & 0x0fffffff; という事をしょっちゅうしているプログラムがあるんですけど、 どういう意図を持ってこの処理をしてるんでしょうか? 最初は、int型の変数をunsigned int型にキャストしてint型の変数に代入すると、 例えば-5が代入されてたら4294967291になるのかなぁと思ってたんですが、 そういう訳でもないみたいですし。
>>422 意図については、そのプログラムを書いた人に聞くのが一番!
あと、もう少し基礎を勉強したほうが良いよ
動的な配列を作る時は int* a=(int*)malloc(sizeof(int)*10); if(a==NULL) みたいにしてポインタが有効かチェクしますよね? 二次元の配列を作る目的で int** b=(int*)malloc(sizeof(int*)*10); とやったら、この時も if(b==NULL) で、bが有効なポインタかどうか判断していいんですか?
はい
>>424 #include<stdio.h>
#include<stdlib.h>
#define X_SIZE 15
#define Y_SIZE 10
int main(void){
int x, y;
int **b;
b=malloc(sizeof(int*)*Y_SIZE);
if(b==NULL) exit(1);
b[0]=malloc(sizeof(int)*X_SIZE*Y_SIZE);
if(b[0]==NULL) exit(1);
for(y=1;y<Y_SIZE;y++) b[y]=&b[0][y*X_SIZE];
for(y=0;y<Y_SIZE;y++)
for(x=0;x<X_SIZE;x++) b[y][x]=y*X_SIZE+x;
for(y=0;y<Y_SIZE;y++){
for(x=0;x<X_SIZE;x++) printf(" %3d", b[y][x]);
printf("\n");
}
free(b[0]);
free(b);
return 0;
}
>>426 キャストしたらダメだろ。
意味変わる。
>>420 それでもいいけど、(b&~c)^aの方がシンプルだろう。
a^b&~c ってなところか。
>>411 最低限の論理学の勉強をする。
ド・モルガンの法則とかは必須。
#define NULL (void*)0 だから ポインタへのポインタが"NULL"かどうかは (void**)0で調べないといけない
>#define NULL (void*)0 >だから いいえ。
世界中のC言語を使える人のコンピューターに対する理解度の高さの平均と、 世界中のJavaを使える人のコンピューターに対する理解度の高さの平均は、 どっちが高いですか?
マルチ死ね
436 :
DEFORTの名無し :2007/08/18(土) 13:41:52
ひさしぶりぶり MinGWつかってみたけど微妙
またお前か
>>422 0x0fffffff でマスクってことは、下位28ビットが欲しいってだけじゃね。
あと、unsigned int へのキャストは無駄だな。
脳内
新聞
442 :
デフォルトの名無しさん :2007/08/18(土) 20:10:13
ある特定のウィンドウがアクティブになった時に、そのウィンドウのメニュー内の 特定のコマンドを実行するようにしたいのですが、どのよう記述したら良いでしょうか? 具体的にはXSIとゆう3DCGソフトの「アニメーションエディタ/編集/オリジナルコマンド」 を自動実行させたいのですが、、、 宜しくお願いします。
C/C++じゃなくてスクリプトで書けば?
C/C++の勉強すれば分かるよ
WSHとかの領域になるんかな?あっちの詳細を全部知ってるわけではないけれども
new int[n]; ← このnのところは、何の型で渡すのか決められてますか? intとかlongとか(負数はあり得ないので、unsignedでしょうか) あと、Windowsの32ビット環境では、intとlongはまったく同じ型として扱っても問題ないですか?
>>442 ウィンドウメニュー内の特定のメニュー項目が選択されたときって、
たぶん、WM_COMMANDとかのウィンドウメッセージが飛ぶと思うんだけど、
その具体的なパラメタを調べて、アクティブとかのイベント関係なく
直接呼んじゃだめなの?
もし、アクティブになると同時って条件をつけたいなら、
1)ウィンドウをアクティブにする
2)ウィンドウメッセージを送信する
っていうだけの簡単なプログラムを作るとか。
>>446 特定の型には決まっていない。整数ならいい。
負の数になったら未定義動作。
int と long は違う型です。
わざわざ他板のを持ってこなくてもいいんだよ
>>451 operator new 関数の第1引数は VC に限らず size_t 。
でもそれと new 式の配列要素数を表す式の型とは別。
サイズが同じだろうがなんだろうが int と long は違う型。
まったく同じ型として扱うのには問題がある。
>>453 ごめん、1点分からないので、教えていただきたい。
とりあえず、
>>446 はVCの利用上(実装上)の制限が知りたいんじゃないの、
と思ったので、その観点だけで書いたのは自分の思い込みで、それで意見が
すれ違うのは仕方ないんだけど、
>特定の型には決まっていない。整数ならいい。
>でもそれと new 式の配列要素数を表す式の型とは別。
の箇所。
そうはいっても、ソースをコンパイルしてバイナリに落とす以上、コンパイラ定義かも
しれないけど、具体的な値の有効範囲ってかならずあるんじゃないの?
実際、MSDNの配列定義のサイズ指定の箇所では
0以上の整数型、ただしMicrosoft仕様では... としてsize_tに言及してるわけだし。
それにoperator new 関数の第1引数がsize_tに決まってるなら、size_t以上の値を
記述して受け入れてくれるコンパイラがありそうにないので、
その意味でも「整数ならいい」ってのはあいまいな感じがする。
なので、「整数ならいい」ってのは純粋に言語仕様の話として語っているのか、
それとも、コンパイラの実装やソース記述上の制限を語る場合でも同じ回答
になるのか、気になって眠れなくなりそうなんで、正確なところが知りたいんだけど。
________ / | /__ | / /. |-―‐. / \ / | / ./ | ノ ヽ__」 | .―┼‐フ |/ /|/ ̄ ̄ ̄\ //| | | | | (二X
ありがとう、これで寝られる。
仕様自身は結局釈然としない部分があるけど、
>>448 ,453の回答が正確で誠実な回答というのは理解できた。
リンク先は策定中の次期規格?
また、膨大な項目が...
現状でさえ、もうついていけないくらいややこしいのに。
458 :
デフォルトの名無しさん :2007/08/19(日) 12:35:03
#include "DxLib.h" int WINAPI Winmain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) } ChangeWindowMode(TRUE); if(DxLib_Init()==-1)return(-1); DrawBox(0, 0, 120, 65535, TRUE); WaitKey(); DxLib_End(); return(0); } というプログラム書くとエラー出るのはなぜでしょうか?ちなみに 14さいからはじめるリアルに動くゲーム物理プログラミング教室C言語編 という本に載ってます。
エラーの内容かけ。
460 :
458 :2007/08/19(日) 12:40:14
エラー E2141 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 宣言の構文エラー エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な } エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な } エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 型名が必要 エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 'ChangeWindowMode(int)' の再宣言で型が一致していない エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1017: 一つ前の 'ChangeWindowMode(int)' の定義位置 エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 不正な初期化 エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: ) が必要 エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 6: 宣言が正しく終了していない エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 型名が必要 エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 'DrawBox(int,int,int,int,int,int)' の再宣言で型が一致していない エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1519: 一つ前の 'DrawBox(int,int,int,int,int,int)' の定義位置 エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 不正な初期化 エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: ) が必要 エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 11: 宣言が正しく終了していない エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 12: 不要な } *** 16 errors in Compile *** ** error 1 ** deleting Debug\dxtest.obj です。 ちなみに今日勉強したばかりでさぱりとわかりません
勉強してないからエラーが出る
462 :
デフォルトの名無しさん :2007/08/19(日) 12:42:05
どんなエラーがでてるの?
最初に4行目にエラーが出ているだろう。 4行目を穴があくまでじっくり見ろ、その教科書とひたすら比較しろ。 それでわからなかったらもっかいおいで。
464 :
デフォルトの名無しさん :2007/08/19(日) 12:45:46
彼はエラーの見方がわからないと思う
#include "DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1)return(-1); DrawBox(0, 0, 0, 120, 65535, TRUE); WaitKey(); DxLib_End(); return(0); }
ChangeWindowMode(1); こっちのがいいかも分からんね
467 :
458 :2007/08/19(日) 13:11:31
>>465 のように書いてみましたが
まだ
Fatal: ファイル VORBISFILE_STATIC.LIB が開けません
と出ます。
>>464 まったくおっしゃるとおりです
468 :
デフォルトの名無しさん :2007/08/19(日) 13:59:36
>>467 エラーの通りvorbisfile_static.libってファイルが見つからないんだろ。
あとは環境が分からないと何も言えないと思う。
自分の開発環境を検索ワードに入れて、
(「vorbisfile_static.lib VC++」とか「vorbisfile_static.lib BCC」とか)
その辺でググって見たらどうよ?
というか似たような質問を、DxLibのサイトで何度も見た気がするんだ。
vorbisfile_static.libはDxLibのアーカイブに同梱されてるから それをソースと同じディレクトリにコピー というか「このフォルダのファイルを全てコピー」みたいなフォルダなかったか?
471 :
230 :2007/08/19(日) 23:24:29
GNU Compiler Collectionのg++コンパイラで -std=c++98というコンパイラオプションというのがあるらしいのですが ぐぐってもよく分かりませんでした。 誰か教えてください。
472 :
471 :2007/08/19(日) 23:25:32
230というのははミスです。すみません(汗
コンパイラマニュアルとかないの?
475 :
471 :2007/08/19(日) 23:49:45
どもです。探し見てみます。
もう見てないかな まるちか?2ちゃんではマルチポストは叩かれるですよ せめて、主とする、質問したスレを付記 機嫌が良ければ、そこにヒント書きますから
477 :
デフォルトの名無しさん :2007/08/19(日) 23:56:08
今更VC++6.0のMFCなんですけれど、 ツリーコントロールのアイテムの文字列が長いときに 横スクロールにせず、文字列を折り返すことってできますでしょうか?
478 :
デフォルトの名無しさん :2007/08/20(月) 01:12:13
curses(ncurses)のプログラミングを euc-jp 環境で行って来たのですが、 訳あって utf-8 環境で行うことになりました。 euc-jp 環境で作ったファイルを utf-8 環境に持ってきて、 iconvで文字コードを変更し、コンパイル、実行すると、出力(日本語)が文字化けてしまいます。 utf-8 環境に持ってきた euc-jp のファイルを、 文字コードをそのままにして、端末の表示文字コードを utf-8 から euc-jp に変更した上で、コンパイル、実行すると、正しく表示されます。 これななぜでしょうか? curses が utf-8に対応していないとかってありますか?
>>478 ソース文字セットと実行文字セットは別。
gcc のオプション -finput-charset と -fexec-charset を参照すべし。
>>478 curses 関係あるのか?
puts("あいうえお") とかで試せばわかると思うけど。
先ずは問題の切り分けだね。 >480の言うように標準出力に出力してみてその時点で文字化けしているならgccのオプションなどを調節。 その上でcurses使うと化けるのなら、cursesの設定か何か、その辺りの調査。
operator=で返す自分の参照は、constつけるべきですか?
寧ろつけてはいけません。
485 :
デフォルトの名無しさん :2007/08/20(月) 02:10:18
>>447 どうもです
XSIではコマンドを実行する際にエディタのIDのような物が必要で、
エディタウィンドウを複数開いている時には、コマンド実行前に
その時アクティブなウィンドウのIDを取得する必要があります。
WM_ACTIVATEとかを使えば良いのでしょうか?
486 :
デフォルトの名無しさん :2007/08/20(月) 02:24:33
動画とかをエンコードするデコーダって色々ありますよね。 あれ使えるソフト作るのって大変なんでしょうか? AVIutlみたいなソフトって個人では簡単に作れないんですかね? どの辺勉強したらいいんでしょうか?
487 :
デフォルトの名無しさん :2007/08/20(月) 02:27:35
>>478 です。
>>479 ,480,481
さんを参考にして少しいじってみました。
まず、480さんの言うように、単純に puts("あいうえお") を行うプログラムを書き実行してみました。
すると、”-finput-charset=utf-8 -fexec-charset=utf-8”が有る無しに関わらず、文字化けしませんでした。
次に、cursesのコンパイルを、”-finput-charset=utf-8 -fexec-charset=utf-8”を付けて実行してみたところ、やはり文字化けが発生しました。
単にcursesがutf-8に対応して無いんじゃないの? utf-8だと端末上での漢字の幅がバイト長と単純に一致しなくなるし naiveな実装だと色々問題起きそう
VC++2005で<cstdio>等をインクルードすると、 std::printf はもちろん、名前空間のない ::printf も使えてしまいます。 BCB2006だと逆に、<stdio.h>をインクルードすると ::printf を使えますが、 std::printf も使えます。 どちらが正しいのでしょうか。また、正しくない方を正しくする方法はありますか?
490 :
デフォルトの名無しさん :2007/08/20(月) 04:18:35
>>478 です。
http://www.hakodate-ct.ac.jp/~tokai/tokai/gtkmm/etc/p3.htm というサイトがあったので、
・-lncurses ではなくて -lncursesw をリンクする
・#include <locale.h>
・setlocale( LC_ALL, "" );
を取り入れたところとりあえず、euc-jp 環境のファイルを utf-8 環境に持ってきて、
このファイルの文字コードを utf-8 に変えてコンパイルし実行すると、
文字化けしない ・・・というのは達成できました。
しかし、私は UNIX(LINUX) にあるような SLコマンド のクマAA バージョンを作って遊んでいたのですが、
euc-jp環境とutf-8環境では少し動きが変わってしまいました。
その動きの変わってしまう場所が、euc-jp環境で苦労して改良したところなので、
かなりショックです。
まぁ、なんとか解決策があればいいのですが、
私の知識ではちょっとつらいかも知れません。
for(;;) ; こんなのあるのね びっくり
無限ループの常套手段
俺はwhile(1)派
自分も無限ループはwhile派かな カウンタが要るときはfor使うかもしらんけど
>>489 <cstdio> で std::printf が、 <stdio.h> で ::printf が使えるようになることになっている。
1つのヘッダで両方が使えるようになることは保証されない。
std::bad_allocを捕まえたりいろいろ例外処理を書いているのですが、 メモリ4GBもあるので、デバッグ中にbad_allocが投げられることは今まで一度もありません。 投げられた際の動作をデバッグしたいのですが、そういうときはどうすればいいでしょうか。 敢えてメモリを消費したりするんですか? ↑ではbad_allocのことですが、他にもWindowsのAPI関数が失敗したときとかも、 ちゃんと自分が書いた処理が動作するか確かめたいんですが。
throw std::bad_alloc();
>>496 適当にラップして失敗に相当する結果を返せばいいべ
起動時に malloc(100000000) とか適当にやっとけば足りなくなるんじゃない?
500 :
デフォルトの名無しさん :2007/08/20(月) 21:09:14
例えば、"a"とか"あ"の文字コードを出力する方法ってありますか?
printf( "%d", 'a' );
502 :
デフォルトの名無しさん :2007/08/20(月) 21:30:04
%Xでの表示をぐるぐるまわせばおわりだろうに。
>495
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456 によると、
> Including the header <cxxx> declares a C name in namespace std.
> Including the header <xxx.h> declares a C name in namespace std (effectively by including
> <cxxx>), then imports it into the global namespace with an individual using declaration.
ということで、xxx.h だと std とグローバル両方で宣言されるというのが規格の意図らしい。
なので、BCB2006 の挙動は(それだけ見ると)規格に合致している。
が、現実的には
> If you want to assuredly declare a C name in the global namespace, include <xxx.h>.
> You may or may not also get the declaration in namespace std.
> If you want to assuredly declare a C name in namespace std, include <cxxx>.
> You may or may not also get the declaration in the global namespace.
ということで、>495 が妥当な仮定。
規格もこの現状を追認する形での修正が提案されている。
>502
自分がやりたいと思っていることをもうちょい正確に表現して欲しい。
文字が表示されて欲しいのか、文字コードが表示されて欲しいのかどっち?
入力として考えているのはどんなデータ?外部から与えられる文字列か、文字列リテラルか。文字コードは?
505 :
504 :2007/08/20(月) 22:28:32
最初のアンカーは >489 につけるべきだった。
別人ですが
>>499 バグでそんな値(もっとでかい、0x40000000とか)を与えたことがあるけど、
無理に仮想記憶拡大して確保しようとして、システムが実質操作不能になるだけだった
Windowsって1プロセスが使用できるメモリ空間のサイズって指定出来ないの? Win2000の頃は2G制限とかあった記憶があるけど、今はどうなんだろ。
>>507 以下は単なる思いつき。
1. プログラムの改造が可能なら、自分用の一定量しか領域確保できないメモリマネージャを作る。
2. メモリ取得APIをフックして自力で制限する。
3. SetProcessWorkingSetSizeを指定して、同時にスワップを小さくする。
たった1000行のソースも完全に把握できねぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇ もうだめだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ
やっと気付いたか。 さっさと人生やり直せ。
10万行超えると見る気すら失せる
513 :
デフォルトの名無しさん :2007/08/21(火) 09:28:25
float hoge = new float[100]; foo->CopyArray(hoge); Cfoo:Cfoo() { float m_array = new float[100]; } void Cfoo:CopyArray( float arg[]) { arg = m_array; } 配列のコピーをしたいとき、 上のように配列の名前(=先頭のポインタ?) だけコピーするだけではダメなようなのですが、なぜですか? for(int i=0;i<100;i++) arg[i]=m_array[i]; } のように中身を一つずつきちんとコピーしないとダメなんでしょうか?
arg = m_arrayだとコピーじゃなくて同じ配列に別名を付けてるだけになる
::memcpy(arg, m_array, sizeof(float) * 100));
std::copy(&m_array[0], &m_array[100], &arg[0]);
>>513 >float hoge = new float[100];
コンパイルできるコードを提示しなさい。
>arg = m_array;
それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。
>>515 そんなコードを書く香具師は野垂れ死に値すると思います。
519 :
513 :2007/08/21(火) 11:55:54
皆さんいろいろありがとうございます。
>>517 >コンパイルできるコードを提示しなさい。
float* hoge = new float[100];
でした。
>それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。
というわけで、分かっておられると思いますが渡してるのはポインタでして
寿命は関係あるんですかね?
>>514 これもちょっと理屈が分かりません。
なぜ配列に別名をつけてることになるんですか?
配列の名前って先頭のポインタをさしてるんじゃなかったでしょうか?
>>518 一行で済むのでforで要素を一つずつコピーするよりは
>>515 >>516 はいいかなと思ったんですが、
どうして
>>515 はダメなんですか?
>>519 >寿命は関係あるんですかね?
その仮引き数の寿命は、その関数を抜けるまでです。
ポインタがポイントしている先のことは言及していませんね。
もう少し、ポインタ変数と言うものを理解しておいた方が良さそうです。
>なぜ配列に別名をつけてることになるんですか?
ポインタ変数にポインタ変数の値を代入するだけでは、
ポイント先の複写は行なわれません。
もう少し、ポインタ変数(ry
>どうして
>>515 はダメなんですか?
どうしてダメじゃないと思うんですか?
>>519 > どうして
>>515 はダメなんですか?
float配列ならば動くけど、一般のオブジェクトの配列なら破滅的。
たとえば、string配列をmemcpyしたらどうなると思う?
float で大丈夫ならダメとは言えないだろ。もっといい方法があるってだけで。
523 :
デフォルトの名無しさん :2007/08/21(火) 12:24:46
>>520 >ポインタ変数にポインタ変数の値を代入するだけでは、
>ポイント先の複写は行なわれません。
いま気づきました。狂ってました。すいません。
要するに考え方として
「呼ぶ側で作った配列を渡してm_arrayの中身をコピーして貰ってくる」んじゃなくて
「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
感じの書き方はできないんですかね?
呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば
中身にアクセスできそうに思うのですが。
例えば、クラスメンバで持っているprivateな普通のオブジェクトインスタンスのポインタなんかの場合は
わざわざ中身をコピーしないでアドレスだけGet〜とかで貰って使ったりするじゃないですか?
>どうしてダメじゃないと思うんですか?
試したらとりあえずうまくいったんで・・・
>>521 わかりません。floatでは一応動きましたが、なんでダメなんでしょうか。
サイズ指定した範囲をコピーすればうまく動くと思うのですが。
>>523 > 「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
> 感じの書き方はできないんですかね?
なんでできないと思うの?
525 :
デフォルトの名無しさん :2007/08/21(火) 12:31:36
>>524 書き方が分からないんで
そういう書き方が出来るなら教えてください、
ってことなんですが。
やっぱりポインタ変数とポイント先の関係がわかっていないような……
floatやint、char[]ならmemcpyしても問題ないが、下みたいなクラスだと問題が出てくる class hoge { char *str; int length; }; main() { hoge* v1, v2; v1 = new hoge; v1->str = new char[100]; memcpy(v2, v1, sizeof(hoge)); strcpy(v1->str, "v1"); strcpy(v2->str, "v2"); printf("v1.str is %s.\nv2.str is %s", v1->str, v2->str); }
528 :
デフォルトの名無しさん :2007/08/21(火) 12:41:40
>呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば >中身にアクセスできそうに思うのですが。 思いついて下のようにやったらうまくいったようなのですが、 これってなんか危険だったりしますか? float* hoge = new float[100]; hoge = foo->GetArray(); Cfoo:Cfoo() { float m_array = new float[100]; } float* Cfoo:GetArray(){return m_array;}
>>528 最初のnew float[100]で確保したメモリはどうやって解放するんだい?
>>528 配列のコピーをしたいんじゃなかったのか?
531 :
デフォルトの名無しさん :2007/08/21(火) 12:58:48
>>527 理解にしばらく時間を要します。
脳のクロックが著しく劣っているのですいません。
>>529 これでもうまくいったっぽいですが、これならOKですか?
float* hoge;
hoge = foo->GetArray();
Cfoo:Cfoo() {
m_array = new float[100];
}
float* Cfoo:GetArray(){return m_array;}
>>530 すいません、コピーというか、m_arrayの中身を
どうにかして呼ぶ側で使えれば何でも良かったのですが。
floatの計算速度ってdoubleよりも遅いんですか?
>>528 巧くいってない巧くいってない。
>>531 だから、なんでコードの断片載せるんだって。
で、なんでまたfooはポインタなんだ?
>>532 足し算などは同じ。超越関数などは速い可能性が高い。
しかし、他の方への変換が入ったりすると遅くなることもある。
結論:一概には言えない。
もうスマートポインタコンテナとかRange conceptとか使う方がいいよ
536 :
513 :2007/08/21(火) 13:14:09
つまりはどうしたらいいのでしょうか?もうわけ分かりません。 やりたいことはCfooのメンバとしてもってるfloatの配列m_arrayの中身を コピーするなりポインタを貰うなり、どういう方法があるのか分かりませんが 正しい方法で使いたいってことなんですが。 元の中身を書き換える必要はありません。知れればいいです。 で、とりあえず531で動いてますが、これは危険でしょうか。 要素数は別個貰うなりすれば分かるので その範囲内だけアクセスするなら大丈夫そうなんですが、ダメですか。
538 :
デフォルトの名無しさん :2007/08/21(火) 13:28:14
>>537 そうですか。ではひとまずこれでやっときます。
どうもお騒がせしました。
書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。 それ以前に、Cfooを何故ポインタにしているかを知りたいんだが。
floatならSSEで高速化しやすい
541 :
513 :2007/08/21(火) 13:53:03
>>539 >書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。
なるほど。
>Cfooを何故ポインタにしているかを知りたいんだが。
特に理由はないですが、
newしたCfooのポインタをメンバとして持ってるだけです。
ポインタで持ってるほうがいろいろ別のクラスに連れまわしたりするとき便利かなと。
むしろなぜそこが気になるのか知りたいんですが。
>>541 >むしろなぜそこが気になるのか知りたいんですが。
半ば個人的な興味だ。無条件にnewしたがるJava出身者が身近にいるもんでね。
# しかも、悪いことにdeleteする癖はついてないと来たもんだw
543 :
513 :2007/08/21(火) 14:06:22
W
OOっぽく書こうとするとそうなるんじゃないかな C++的にはスマートポインタを使え、ということになるんだが いずれにせよ常にownershipを意識している必要はあるね
ローカルなオブジェクトまでnewを使い始めたらもう、末期症状だ。 # オブジェクトは全てグローバルに管理されているとしたら、それはそれで難だけど。
>>545 VCL使ってると確かにnew癖つくなw
カウンタ付けて自動でdeleteするclassくらい自作しろ
何で既にあるもん作りなおさにゃならんのん・・・
boostの名前あげるとboost厨ウゼェとか言われるから
std::tr1::shared_ptrならいいのか?
俺はboost::intrusive_ptrが好きだが、めんどい人にはめんどいだろうな。
もうIUnknown/comdef.hでいいよw
int main (int argc, const char * argv[]) { char string[] ="Hello,World"; char copystring[13]; stringcopy (string,copystring); printf("%s¥n",copystring); return 0; } void stringcopy (char *buff,char *copy){ int i = 0; while(buff[i]){ copy[i] = buff[i]; i++; } copy[i] = '¥0'; } でwhile(buff[i]){…}を for(i=0;buff[i] == 0;i++) copy[i] = buff[i]; とすると動かないんですけれど、何故ですか?
for(i=0;buff[i] == 0;i++){ printf("loop %d\n",i); copy[i] = buff[i]; } ってやってみたら、なにか気づくかも
わかった! for(i=0;buff[i] != 0;i++) ってすると動くぞ!
559 :
デフォルトの名無しさん :2007/08/22(水) 12:49:13
Containerというクラス名をAAというクラス名にしたら、 Container.h:9: an anonymous union cannot have function members Container.h:26: abstract declarator `<無名 class>' used as declaration Container.h:26: anonumous 名前空間の集合体は static でなければなりません
560 :
デフォルトの名無しさん :2007/08/22(水) 12:50:45
>>559 すいません、間違えて「書き込む」ボタン押してしまいました。
Containerというクラス名をAAというクラス名にしたら、
AA.h:9: an anonymous union cannot have function members
AA.h:26: abstract declarator `<無名 class>' used as declaration
AA.h:26: anonumous 名前空間の集合体は static でなければなりません
というエラーが出てきたのですが、このエラーの意味が理解できません。
教えてください。
エスパー募集するんでもなければコード貼れよ。
>>560 最初のエラーだけとってみれば
無名共用体には関数メンバを持つことができない
というエラー。
だから名前だけじゃなくて何か意味または構造が変わるような修正をしてると
思うけど、情報が不足してるのでこれ以上のことは分からない。
563 :
デフォルトの名無しさん :2007/08/22(水) 13:42:53
>>559 です。
自己解決しました。
ContainerからAAに名前を変えたときに、
#ifndef CONTAINER
#define CONTAINER
#include "Container.h"
#endif
も
#ifndef AA
#define AA
#include "AA.h"
#endif
としていたためにエラーが出ていました。
情報の足りない質問で申し訳ありませんでした。m(_ _)m
>>563 まあ、解決したのはよかったけど、
そもそものソースの構造がおかしいんじゃないのか?
普通は Container.h の中で全体を
Container.h
-----------------
#ifndef CONTAINER
#define CONTAINER
〜
#endif
-----------------
としてくくるんであって、includeする側では、二重取り込み防止マクロなんて書かないだろ。
565 :
でいびす :2007/08/22(水) 16:08:55
VC++5.0でファイルリードをやってます。 その時、読込んだ値を文字として認識できるか 調べたいのですが、やり方を教えてもらえませんか? ループしながら、1文字づつ調べたいです。 ちなみに、文字列には半角の日本語と全角の日本語が混在しています。 お願いします。
文字として認識ってのがあいまいだけど _ismbbprint あたり使えるか調べて見れ
567 :
でいびす :2007/08/22(水) 16:51:43
>>566 _ismbbprintは使えませんでした。
ビルドが通らなかったです。
なんだってVC++5.0なんてもんを使ってるんだ
570 :
でいびす :2007/08/22(水) 17:04:29
>>569 古いプログラムをカスタマイズする事になったので使ってます。
>>570 古いプログラムをカスタマイズする事になっても使う必要ありません。
いやー、そうとも限らんぞー
VC++5.0ってSTLがはじめてバンドルされた版だよな 無理やり使ったが、今にして思えばひでえ出来だった
new が失敗した時に NULL を返すことを前提にプログラムしてたりするんだろうなあ。
new が失敗した時に NULL を返すことを前提にプログラムしてたりしてます。
new(nothrow)使えば問題なし
newハンドラ使えば問題なし
set_new_handler じゃなくて _set_new_handler で、 new ヘッダじゃなくて eh.h で宣言されてたんだっけ。 bad_alloc は VC5 で宣言されてたっけ?
UTF-8だったりEUC-JPだったりISO-2022-JPだったりする可能性は? というのは余計なお世話か。
文字コードについては
>>565 が勝手に判断するでしょ。
だいたいVC++5.0の時代のアプリにShift_JIS以外使ってるとも思えないけど。
VC9使うことにしますた
VC++はソースのエンコードすら指定できない糞コンパイラ
>>584 はVC++はソースのエンコードすら指定できないコンパイラと思っている糞
できるの? clにそれらしいオプションが見当たらないからできんのかと思ってた
589 :
デフォルトの名無しさん :2007/08/22(水) 22:40:08
std::vector<foo> hoge という変数があるとして、 これを関数の引数に渡すときはhogeのポインタを渡した方が hoge自体を値渡しするより動作は速いですか?
その通りだが、せっかくC++なのだからリファレンス渡しするか iteratorを渡せ
何すかそれ
void hogehoge(std::vector<foo>& rhoge);
>>591 void swap_ptr(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
void swap_ref(int &a, int &b) { int tmp = a; a = b; b = tmp; }
main() { int m = 1, n = 2; swap_ptr(&m, &n); swap_ref(m, n); }
swap_ref()がリファレンス渡し。
この場合は入出力引数だが、入力だけでいいんならconstつけろ。
ドトネトのMicrosoft.VisualC.CppCodeProviderってもしかしてclのかわりに C++コンパイルできんのか マネージドじゃないと無理かな
597 :
デフォルトの名無しさん :2007/08/22(水) 23:37:33
vector<CHoge>::iterator itr; このitrが指してる要素の中身のアドレスを取りたいときは どうやって書けばいいんですか? CHoge* p_hoge; p_hoge = &itr; とか書いたら怒られました。
p_hoge = &*itr;
CHoge* p_hoge = &*p_hoge; vectorなら鼻からbegin()/end()を使わず、 &v[0]と&v[0] + v.size()でポインタを得て、 それをイテレータとしても使うという手もある。
鼻から悪魔に見えた
>>584 エンコードの指定は出来ないが、
BOMが付いてればUnicode LE/BEやUTF-8はそれで判定する。
BOMがなければANSI文字コードとみなしている。
javacやunix系のコンパイラはUTF-8にBOMが付いてると処理してくれないものが多く、
双方で利用しようとすると結構めんどい。
悪魔から鼻に見えた
>>577 そんなことしてもコンストラクタから飛んでくる例外は止まらないぜ。
なんかかっこいい
>>602 それなりに移植性考えたらC++のソースにBOMつけるとかありえんわな
で、当然boostのソースにはそんなもんついてないし、一部のヘッダにLatin-1な
人名が入ってるから、VC++8.0でコンパイルすると色々苦情を言ってくんのな
C++でHTMLのタグのようなものを使用していたり、『::』のようなものなどを見かけます。 Cには無く、C++では使用出来るようなことを幅広く説明している書籍でお勧めのものはありますでしょうか。 発売年や価格、本自体の厚さなど数多くありすぎて、どういうものを購入すればいいのか分かりません。 近くに本屋さんはあるのですがプログラム関係は少ないですのでネット通販で買おうかと考えております。 それ故、内容が確認できず判断が・・orz
HTMLのタグ・・・確かにそう見えんことはないw
なんだそりゃ、templateのことか? あまりに斬新過ぎる見解でワロタ それはそうと、wxWidgetsのWindowProcって、ウィンドウクラスのインスタンス 見つけるのにわざわざグローバルなハッシュテーブル引いてんだな、なんだこりゃ せめてWin32ならGetWindowLongPtr()使ってくれよ なんかそうできない技術的理由があんのか ATLみたいなサンクに書き換えたら、そんだけで激高速化すんじゃね?
そんなに高速化するわけない。 いったい一秒に何回メッセージが来て、 グローバルハッシュを引くのに何ナノ秒 余分にかかるというんだ?
一秒に何回メッセージが来て、 グローバルハッシュを引くのに何ナノ秒 余分にかかる
俺も初めて見たときはタグかと思った。 includeファイルに.hが付いていないことや、標準入出力に<<、>>を使うこと、 「::」の存在など何もかもが新鮮だったあの頃・・・ いまだに初心者の域を抜けられぬ現状orz
::は斬新だった。こうゆう記号ってなんか意味を持って決められてるのかな?
意味的に : を使いたいけど、ラベルと被るから :: にしたんじゃね?
斬新といえばいえなくもないが、: (コロン)は、通常のラベルどころか ・caseのラベル(厳密にいえば通常のラベルと変わらない) ・クラス継承 ・コンストラクタの初期化子(?) ・条件演算子の一部 など、よくこれだけ機能を持たせられたと思うものだ。 さらに、ストリームにビットシフト演算子を使うなんて、どこのアホが考えたかと思う。 演算子オーバーロードを見せつけるための演出としか思われない。 さらに、マニピュレータだって?printf系の方がよっぽどうまく素早く整形できるわ。 あんなのC++委員会の遊びにすぎんよ。 もっとも、Cよりは便利なので使わせていただいていますけどね。
べ、別に好きでC++を使っているんじゃないんだからね! Cより便利だから使ってあげているだけなんだからねっ!
おっさんが書いてるんだぜ?きめぇ
>>616 iostreamとマニピュレータの登場は、標準化委員会の発足より古いはず。
D&Eによれば入出力に演算子を使うのはDoug McIlroy、
マニピュレータはAndrew Koenigのアイデアだそう。
printf より優れてる点は型安全な点とポリモーフィズムだな。 printf 風マニピュレータを作らなかったのは C++ の汚点だな。
621 :
デフォルトの名無しさん :2007/08/25(土) 06:21:38
なんで queue には clear() が無いの?
ああ、すまん 作るの忘れてた
納得した
何のqueueにclearが無いの?
625 :
デフォルトの名無しさん :2007/08/25(土) 11:05:14
参照渡しでもらった引数をさらに別の関数に参照渡しするのって なにか問題ありますか?
G++ の STL の queue, priority_queue, stack. コンテナアダプタには clear() が用意されて無いけど何か理由があるんでしょうか.
G++wwwwwwなんという未来言語wwwwww
無知発見
自己解決しました.
>>627 =630
そんなエサで俺様が釣られるかクマー
>>625 別に問題ない。
寧ろ、参照渡しでもらったものをポインタ渡しするほうがおかしいし、
参照渡しでもらったものを値渡ししてしまったら意味が違ってしまう。
何でないんだろうね。 プリンタジョブとかに queue を使ったとして、 ジョブを全部破棄とかすることあるだろうに。
1億と2000年前からpopしなさい、というお達しか
while(!q.empty()) { q.pop(); } としろ、ということか。
そうだdequeをつかおう
q.~queue(); new(&q) std::queue<T>; 冗談だよ、冗談。
素直にq=std::queue<int>();と書いてやれよw
queue のソースを書き換えればいいんじゃね?
queue を継承した my_queue を(ry
(x = 1) = 2; これ、Cだとエラーなんだが、C++ではコンパイルできる 何で?
x = 1の結果が、Cは右辺値、C++は左辺値と定められているから。
>>642 やっぱりそういうこと?
ストラウストラップの本とK&RとCの規格書調べたんだけど、それらしい記述を
見つけられなかったんだけど、どこかに明記されている?
=演算子が参照を返すからじゃね?
>>643 642じゃないけど
C言語はJIS X 3010の.5.16代入演算子
代入式は、代入後の左オペランドの値を持つが、左辺値ではない。
C++は手元にあるのが15年前のARM日本語版しかないけど、5.17代入演算子
代入演算子の結果は、代入が行われた後に左のオペランドに格納してある値である。従って、結果も左辺値である。
Cの規格書って何を調べたの?
X3014にも5.17 1節目の最後に「結果は,左辺値とする。」と書いてある。
>>644 型と右辺値左辺値は別の段階の話。
三項演算子で変数返すコード書いて左辺値にしても大丈夫
たくさんのレスthx
>>645 同じ規格書の同じとこ読んだんだけど、
代入式:
条件式
単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ってなってたから、代入式ってのは上の3行目(波線部分)の代入式
のことを言ってるのかと勘違いしてた
単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これ全体を代入式と言ってるのか
とすれば x = 1 という代入式の結果は左辺値ではないということに
なるか
代入式は、代入後の左オペランドの値を持つが、左辺値ではない
と書いてあるけど、代入式の結果は と書いてくれたほうがクリアになるなあ
~~~~~~~~~~~~~~~~~
BNF記法が分かってなかった
>>648 なるほど
C++のほうはEffectiveにも参照を返すと書いてあるから
理解できた
C++の規格書も買うかな
禿の本がまだなら規格書よりそっちを先に読んだ方がいいよ
>>651 調べ物するときは同じ内容について
色々な本に目を通してるんだけど、
結局、規格書に明記されてると確信に変わる
んで安心できる
禿の本ってEffectiveのこと?
結構高度だから必要に応じて関連する項目を
潰していこうと思ってる
>>652 最初、Cの規格書もそこを見てたんだけど
検索できなくて疲れるから買ってしまった
禿本 : Bjarne Stroustrup著 プログラミング言語C++
>>650 代入式の結果が左辺値か右辺値かは、構文から
決定できる問題ではないので、構文を記した部分は関係ないぞ。
657 :
デフォルトの名無しさん :2007/08/26(日) 03:47:09
class Hoge{private:vector<CFoo> m_vecFoo;}; Hoge::Hoge(){ //落ちる場合1 CFoo foo = CFoo(age,sage); m_vecFoo.push_back(foo); //落ちる場合2 CFoo foo; foo = CFoo(age,sage); m_vecFoo.push_back(foo); //落ちない場合 CFoo* foo = new CFoo(age,sage); m_vecFoo.push_back(*foo) } あるクラスCFooについて、newでインスタンスを生成した場合は落ちないんですが、 newを使わないで直接生成した場合(そういうのをなんていうのか知りませんが) push_backの行で落ちてしまいます。一応どの場合もコンパイルは通ってます。 原因がまったく分からないのでエスパーしてください^^;お願いします。 デバッグ結果:xutilityファイル内↓ inline void __CLR_OR_THIS_CALL _Container_base::_Orphan_all() const { // orphan all iterators _Lockit _Lock(_LOCK_DEBUG); if (_Myfirstiter != _IGNORE_MYITERLIST) { for (_Iterator_base **_Pnext = (_Iterator_base **)&_Myfirstiter; *_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter) (*_Pnext)->_Mycont = 0; ←この辺でとまってる模様 *(_Iterator_base **)&_Myfirstiter = 0; }
658 :
657 :2007/08/26(日) 03:53:14
//さらにもう一個、落ちる場合 CFoo foo(age,sage); m_vecFoo.push_back(foo); ちなみに、push_backをコメントアウトして飛ばせば一応落ちないで動いてるようなので 落ちているのはpush_backの行みたいです。
その「あるクラス」がどんなものなのか説明しろよ。 ちゃんとコピーコンストラクタでディープコピーしてるかとか。
660 :
デフォルトの名無しさん :2007/08/26(日) 09:15:04
>>659 すいません。力尽きて寝てました。
実際のCFooはでかいのでそのまま貼ることはできませんが、
・コンストラクタの引数にポインタ型がある
・メンバにもポインタ型がある
・引数つきで生成されること前提なのでデフォルトコンストラクタとか作ってない
・唯一書いてある引数ありのコンストラクタは、メンバを初期化リストで初期化せずに
コンストラクタの中身で初期化してる
・単純なGet〜みたいな関数はヘッダに直接書いてある
この辺がなにか関係してるでしょうか?
レスに間が空いててもいいが、わざわざ寝てましたなどと言わなくていい
レスに間が空いててもいいし、わざわざ寝てましたなどと言ってもいい
>>660 >659の質問に答えたまえ。
コピーコンストラクタを設けていないのなら、C++を初歩から勉強しなおせ。
664 :
デフォルトの名無しさん :2007/08/26(日) 09:51:36
ディープコピーって何ですか?
本読め Effective C++とかEffective STLとか
666 :
657 :2007/08/26(日) 10:35:13
なんかポインタのメンバとかもってたりするクラスは コピーコンストラクタなるものをきちんと実装しないと 値渡ししたりするときに問題が発生しやすいらしいので m_vecFooにはポインタを渡すことにしました。
参照を参照のままコピーするのが浅いコピー 参照先を複製してコピーするのが深いコピー
668 :
デフォルトの名無しさん :2007/08/26(日) 10:52:14
コピーコンストラクタを実装してなかったことが原因な気がしてきてはいるのですが なぜpush_backの段階で落ちてるんでしょうか? 二重でdeleteされてるわけでもないし、理屈がわかりません。
669 :
デフォルトの名無しさん :2007/08/26(日) 10:52:28
ディープキスって何ですか?
保育園でするもの
671 :
657 :2007/08/26(日) 10:59:13
>コピーコンストラクタなるものをきちんと実装しないと >値渡ししたりするときに問題が発生しやすいらしいので 訂正ですが、ポインタのメンバを持ってるクラスの コピーコンストラクタをきちんと実装してない場合、 ”値渡しする段階”で問題がでるのではなくて、 ”後始末の段階”で二重のdeleteが起きたりするので危険なんですよね? なんでpush_backしただけで落ちるんでしょうか? どんな可能性が考えられますか?
とりあえず、デバッガで 本当に push_back の行で落ちてるのかどうか確認してみた方がいいんじゃない?
>>671 CFoo foo = CFoo(age, sage);
CFoo bar = foo;
とりあえずこのコードで落ちたりしないか?
あと、 >CFoo foo; >foo = CFoo(age,sage); これをちゃんと動かしたいなら、代入演算子も定義しとけ。
675 :
デフォルトの名無しさん :2007/08/26(日) 11:38:52
>>672 >>673 CFoo foo = CFoo(age, sage);
CFoo bar = foo;
としたらpush_backをコメントアウトしても落ちました。
ってことはやっぱりコピーコンストラクタなるものが
きちんと実装されてないのが原因っぽいです。
でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?
で、勝手に作られたものでは”破棄時”に問題がでるので、
自分でうまく実装しないと危険ってだけなんじゃないんでしょうか?
>>671 それはもちろんだが、その前に、解放済みの動的資源を参照するオブジェクト
ができてしまうことがマズイだろ
677 :
657 :2007/08/26(日) 11:43:25
あぁ、なんかコピーをした段階で落ちてるんじゃなくて、 一時オブジェクトが解放される段階で落ちてるみたいです。
>>656 式の結果が左辺値になるか右辺値になるかは構文ではなく
言語の仕様ということか
それなら黙って認めるしかないから明白だ
>675 >自分でうまく実装しないと危険ってだけなんじゃないんでしょうか? その「危険」の内容が、落ちるってことだ。
誰かスレッドについて教えてくれ。 自プロセスのスレッド数を CreateToolhelp32Snapshot、Process32First、Process32Next 使ってスレッド数を出力するだけのプログラムで なんでcntThreadsの値が8になるんだ? CreateThreadとかしてないのに・・・
知らんけど、システム的なDLLの誰かが作ったスレッドなんじゃない?
純粋に自分の作ったスレッドの数のみを知る方法ってないのかな?
ある
自分で作ったのなら自分で管理して数えればいいじゃん
ProcessWalkerを使ってみたんだが、やはり複数立ち上がってる・・・ 確かに自分で数えればいいんだが、 パフォーマンスログでスレッド数見ると 自分で立ち上げたスレッド数以上立ち上がってて たまに増減するんだよね。
だから何だ?チラシの裏にでも書いてろ。
そりゃ裏でスレッドを作られったって、それはWin32の勝手だろうに。
690 :
デフォルトの名無しさん :2007/08/26(日) 13:03:42
C/C++の文法自体は大体理解できたが、大規模なプログラムの作り方が さっぱり分からん 大規模なものだと、だいたいフォルダごとに纏められていて総数数百、数千のファイルがあるが どのような感じでそんな構造をつくっていけばいいのかさっぱりです。 Webにはどこも同じような、内容ばかりポリモを動物を使っての説明w 結局みんな大規模なものはかけないのかな?
はは
>>690 大規模っつーことで複数人での開発を想定するが
個人的にはプロセスやDLL等の境界で切ってあるほうがずっとやりやすかったかな
切らないんなら、適切にスタブを作るのが常套かと思う
Facadeなどの下に隠すのも良い
画面がいっぱいあるだけの良くある業務系なら、それぞれの画面に飛べるように
なっていて、それぞれが独立していれば概ね問題は無い
まあ所詮ケースバイケースで王道は無いだろ
「銀の弾丸はない」のだと知れ
大規模なプロジェクトと動物ポリモとどういうつながりが?
>>687 オーディオデータとか動画扱ってる場合とかWindowsが勝手にスレッド作る場合はよくあるお
>>675 >でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?
各メンバのコピーコンストラクタを呼び出す、というコピーコンストラクタを作ってくれる。
同様に代入の場合は各メンバに対しoperator=を呼ぶ。
メンバにポインタがある場合ポインタがコピーされるだけで、ポインタが指す先は複製されない。
まーメンバがコピーコンストラクタが上手く動くクラスとポインタ以外の 基本型だけならデフォのコンストラクタで問題ないことも多い ポインタ生のままで保持せずにboost::shared_ptrでくるんだりしてれば 適切に参照カウント処理してくれる そうでないならちと考えろってこった
697 :
デフォルトの名無しさん :2007/08/26(日) 13:31:27
>>693 私が言いたいのはWebで恰もC++知ってますみたいな講座書いてる奴の大半は
動物ポリモみたいなことかいてるだけで実用的なことは一切出来ないのかな?
と思っただけですよ
しらねぇ つーかどうでもいい 動物ポリモは確かにくだらねぇしオリジナリティはねぇな
初心者の為に端折って説明してるだけなんだよ
あれで初心者が解るのか疑わしい
わからなかった? 精進するよ
>>697 動物ポリモみたいなこと書いてないで君もさっさと大規模なもの作れる頭持つか諦めなさい。
そうだね スレ汚しすまそ
逆に実用的でコーディング時の仕様に依存しないポリモーフィズムってなに
705 :
デフォルトの名無しさん :2007/08/26(日) 14:30:57
まだ、いってんの? C++ 講座 で検索してみなよ どこもおなじようなことしか書いてないからw
そりゃC++ 講座だもん
707 :
デフォルトの名無しさん :2007/08/26(日) 14:41:55
偉そうに書いてるわりには、実際に作ったソフトを公開してる人いないよね 実際はC++の文法だけしか理解できていない可能性高し
だからなんだよ?どうでもいいだろ? チラシの裏にでも書いてろよ。
有能だけどそこまで親切じゃない人もいるんだよ
>>707 はアホそうに書いてるだけで、実際に作ったソフトを公開してないよね
実際はC++の文法ですら理解できていない可能性高し
711 :
デフォルトの名無しさん :2007/08/26(日) 14:56:11
大規模な開発なんて経験つんでやっていくものじゃないの Webのしかも言語自体の解説に何期待してんだか
>>707 遊びの延長や使い捨てや自分専用で作るのと
公開するソフトを作るのではかかる手間が桁違いだろ
公開ライブラリを作ってる人達の実力は底が知れない 具体的にいうとboost関係の人達
知れるかどうかって話で言うと、何も公開していない人のほうが底が知れないね。
715 :
デフォルトの名無しさん :2007/08/26(日) 15:25:40
>>713 そうか?
以前正規表現を使いたくてboostを使ったが速度でイマイチだったから
自前で実装したけど?
716 :
デフォルトの名無しさん :2007/08/26(日) 15:30:47
>>715 そうか?
以前正規表現を使いたくてお前のを使ったが速度でイマイチだったから
自前で実装したけど?
どうでもいから出て行ってくれないかな。
boostはC++の実験場だから チューニングはしてないよ
チューニングに関する実験でもチューニングしてないよ
boost::uniform_01< boost::mt11213b, float > rnd( boost::mt11213b( (unsigned long)(time(0)) ) ); oven::random_shuffle( vec, _1 * rnd() ); // std::random_shuffle( vec.begin, vec.end, _1 * rnd() ); std::random_shuffleの乱数生成関数オブジェクトにboost::uniform_01を使ってみたんですが なんかうまくばらけてくれませぬ というわけでstd::random_shuffle用のいい乱数発生方法を教えてください
Boostなんてたいしたこと無いだろ これが一番典型的な例 ____ progress_ |← reject| boostの中の人 display ユーザー . ̄.|| ̄ ̄ ┗(^o^ )┳(^o^ )┳(^o^ )┛≡=- || ┏┗ ┗┗ ┏┗ ≡=-  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
それがboostの典型なら、boostの中でrejectされたりしないだろう。 boostの中で平均的に評価されているものが、他との比較でreject扱いになって 初めて「boostなんてたいしたことない」になる。
progress.hppには まるで役に立たないprogress_displayと すごく役に立つprogress_timerが同居しています そんな兄弟いますよね
Visual Studio .NET 2003環境の問題について教えてください。 アラビア語リテラルの入った.ccのソース(MySQL)のコンパイルが出来ません。 error C3209: '・ァル館・' : Unicode 識別子は現在サポートされていません。 というエラーが表示されます。(ソースUTF8の場合) 秀丸でShift-JISにしたり、UTF8にしたりしたのですが、どちらもエラーでした。 VSのエディターではShift-JISの場合、アラビア語が文字化けもなく表示されます。 (UTF8では文字化けして表示されます。) 2時間くらいググッても分かりませんでした。 この問題の解決法を教えてください。 エロイ人お願い!
>>724 VC が UTF-8 を認識できてないんだろ。どうやるのか知らんけど。
Shift_JIS でアラビア語が扱えないのは確実。
英語版に言語パック入れたら?
BOMつきUTF-8ってVS2003で食えたっけ VS2005なら大丈夫のはずだが リテラルはワイド文字なのか? そうだと仮定すると、ソース修正して 16進でUnicodeのコードポイントを記述してやるのが一番手早い Perlか何かを使えば簡単だろ
728 :
724 :2007/08/26(日) 23:45:35
素早いレス、感謝感激です。
>>725 アドバイス、d。
どこで聞けば分かりそうですか?ご存じでしたら教えてください。
オプションやらヘルプやら一通り見てみたのですが、分かりませんでした。
>>726 ちょっと難しそうです。d。
>>727 > BOMつきUTF-8ってVS2003で食えたっけ
BOMつきかどうかを確認する方法をご存じでしたら教えてください。
> リテラルはワイド文字なのか?
リテラルはワイド文字です。
確かにソース修正が一番簡単ですね。
ただ、ソースの下の方を見てみたら、ヒンディ語・ヘブライ語・・・と限りなく続いてますので、結構大変かも。
>>728 BOMを確認したければファイルの先頭をバイナリエディタで見てみろ。
BOMつきでなければ、VS2005でも食えない。
ワイド文字リテラルなら、話は簡単だな。
手でやらずに簡単なフィルタープログラムを書いて、機械的に変換してしまえ。
そんなら多国語でも関係ない。
730 :
デフォルトの名無しさん :2007/08/26(日) 23:55:03
助けて!以下のプログラムでメモリがおかしくなるお! 分母150 試行回数100000で繰り返すとなるお! 助けて! #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i,j,dom,cnt,max,ret,k; int ch; int array[128]; int over, less; long int times; i = j = k = dom = cnt = times = max = 0; printf("input dominator >"); scanf("%d", &dom); printf("input times >"); scanf("%ld", ×);
731 :
730続き :2007/08/26(日) 23:55:39
LOOP: k = 0; over = less = 0; while(getchar() != '\n'); printf("dominator = %d times = %d\n", dom, times); sleep(1); srand(time(NULL)); for(i=0; i<times; i++){ cnt++; ret = rand() % dom; if(ret == 7){ array[k] = cnt / 100; array[k]++; k++; array[k] = -1; printf("%d\n", cnt); if(cnt > max){ max = cnt; } if(cnt > dom){ over++; } else{ less++; } cnt = 0; } }
732 :
730続き :2007/08/26(日) 23:56:15
for(i=0; array[i] != -1; i++){ for(j=0; j<array[i]; j++){ printf("*"); } printf("\n"); } printf("MAX = %d\n", max); printf("OVER = %d ELSE =%d\n", over, less); printf("%d/%d\n", over+less, times); printf("%f\n", times / (double)(over + less)); printf("Retry ? (y/n) >"); ch = getchar(); if(ch == 'y' || ch == 'Y'){ goto LOOP; } return 0; }
733 :
730 :2007/08/26(日) 23:56:54
このままじゃパチンコで勝てないお! 助けてお!
734 :
デフォルトの名無しさん :2007/08/27(月) 00:00:33
こんなプログラム書いて何になるの?
735 :
デフォルトの名無しさん :2007/08/27(月) 00:01:41
736 :
724 :2007/08/27(月) 00:01:41
>>729 ありがd。見てみたら、BOMついてませんね。
付けてオンパイルしてみます。ノシ
>>730 ざっとみだけど
>int array[128];
が足りてないだけじゃないの?
>>730 メモリをケチるな!
array[128] → array[2048]
期待値は (1/150)*100000=666.67
739 :
730 :2007/08/27(月) 00:10:46
できたおおおおおおおおおお! これで勝てるお!
740 :
730 :2007/08/27(月) 00:11:55
期待値の詳細希望
741 :
730 :2007/08/27(月) 00:14:06
なるほどお!ボヌスが666.67回くるってことかお! ありがとお!
742 :
730 :2007/08/27(月) 00:17:43
やっぱりすごいお さっぱりわからなかったのに すぐ回答がきたお どうしたらそうなれるかお?
>>742 毎日2時間、電灯のヒモでボクシング。これを1年続けること。
みんな半年から1年ぐらい アーバンチャンピオンと スパルタンXで鍛えてるはず
>>740 100000回×(1/150)=666.67回 kがインクリメントされるわけだから
array[k]はarray[668]って式で参照される可能性があるわけで
array[128]と宣言したのではあきらかに足りないってことなんではないかと>期待値云々
こういう実行時に入力される値に依存するような大きさの配列はメモリの動的確保で扱うべきだとは思うけどね
746 :
724 :2007/08/27(月) 01:39:46
>>736 ファイルの先頭にBOM(というか、ZERO WIDTH NON-BREAKING SPACE。ef bb bfの3バイト)を付加したら
無事、オンパイルできました。
>>746 いや、ファイル先頭にある場合、つまりBOMである限り、
それはBOMであってZERO WIDTH NON-BREAKING SPACEとは言わないんだ。
748 :
724 :2007/08/27(月) 02:02:45
www.vista-osx.com/kensaku.htm
750 :
デフォルトの名無しさん :2007/08/27(月) 15:06:25
ヘッダファイルの書き方について質問です。 自分で複数ファイルのプログラムを作ったとき、 たとえば、mian.c , sub.c , sub.h という3つのソースファイル からなるプログラムの場合、 $ gcc main.c sub.c としますよね。 でも#include<stdio.h>などでは、 stdio.hにはプロトタイプ宣言しか無くて、printf( );とかの定義が無いはずなのに $ gcc main.c stdio.c などとしなくてもいいのはなぜですか?
パス通ってるからじゃないん?よーわからんけど
引数で指定しなくてもリンクされるようになってるから。
C++のvector配列って結構処理重いんでしょうか。 10MB前後のテキストデータをmallocしたポインタ読み込んで、区切り文字単位に編集・分解していった場合と、 stringに読み込んでからvector<string>に編集・分解していった場合で、 処理時間が前者が約25秒、後者が約60秒掛かったのですが、こんなもんなんですかね。
コードplz
755 :
デフォルトの名無しさん :2007/08/27(月) 15:34:02
vector に malloc なんか使ってるから・・・
>>753 vector<string>版も意外に速いなw
STLコンテナは基本的に値を保持するんで、その場合はstringのインスタンスを
コピーしまくることになる
ポインタだけで操作すれば格段に速いのは当たり前だ
vector<>が遅いというよりはメンバのコピーに時間がかかっているだけなので、
そこが性能のボトルネックになっているのなら、
vector<char*>でポインタを保持するなり
vector<int>でインデクスを保持するなりするとよいだろう
757 :
753 :2007/08/27(月) 15:45:43
>>756 なるほど、言われてみればインスタンスのコピー云々で納得です。
御指導ありがとうございましたm(_ _)m
758 :
デフォルトの名無しさん :2007/08/27(月) 16:01:38
質問です。 i = (char*)malloc(sizeof(char) * 256); でメモリ領域を確保したのですが、256バイト以上使用することができます。 なぜでしょうか?教えてください
759 :
デフォルトの名無しさん :2007/08/27(月) 16:03:02
>>758 本来アクセスしちゃいけないところにアクセスしてるだけ
CはC#などとは違ってそんな事しても例外は発生しないし
たまたま何のエラーも出ない事がある
だからってそんな事やってたらきっとそのうちクラッシュするよ
>>758 一般的にmallocは、予めOSから確保しておいたでっかいメモリの塊から
必要な分だけを切り分けて自身の戻り値にしている(残りは次回以降のmallocなどで使う)。
理由は、OSのメモリ確保処理が大抵大容量の確保に向いていて小回りが利かないから。
そういうわけでその256バイトの後ろにも、OSから見れば
アプリケーションが確保した(実態はmallocが抱えていたり
他のmallocなどの呼出で使われている)メモリ空間が広がっている。
だから一見256バイトの後ろも読み書きできるように見えるというわけ。
762 :
デフォルトの名無しさん :2007/08/27(月) 16:16:24
758です。 勉強になりました。 ありがとうございます。
運が悪いと範囲外に書き込んだときに他の変数の値書き換えたりすることがあるから範囲外アクセスはNGよ
質問させて頂きます。 現在UNIX環境でコンソールベースのプログラムを組んでいるのですが CUIからメニューの操作、カーソル操作の為のエスケープシーケンスに悩んでおります コンソールベースのプログラム自体あまり組んだ事ないのですが CUIからメニュー操作というのは可能なのでしょうか?
環境によるかもだけど、ncursesとか調べてみると幸せになれるかもしれない。
>>764 こんなのでいいなら簡単にできるけど
エスケープシーケンスの設定が済んでいることが前提
#include <stdio.h>
int main(void){
int i, x, y;
printf("\x1b[2J"); // clear screen
for(i=1;i<=9;i++){
x=i;
y=(i%2)+1;
printf("\x1b[%d;%dH", y, x); // cursor move
printf("%d", i);
}
return 0;
}
malloc使う奴はクソだとか言われる事が増えてきてる中、このスレは落ち着きますね…
まじで?そんなこと言う奴がいるのか・・・
vector型の配列をランダムに並び替えるには自前で作るしかないですかね?
std::random_shuffle だっけ
>>765-766 有難うございます。
ncursesについて詳しく調べて見たいと思います。
エスケープシーケンスからの操作なのですが、設定とはどう行うかご教授願えないでしょうか?
検索しても見つからなくてorz
>>772 UNIX環境なら使うターミナルを選ぶだけかな…
MS-Windows環境なら ansi.sys を読み込ませる
>>772 TERM環境変数
普通はシェルの初期化スクリプトなどで設定するが、
普通にシェルを操作できてるんなら、まあ大丈夫だろう
>773 えー。それって、Windows環境で、DOS-Exeを動かす場合だけでそ。
>>773-775 有難うございます。
凄く勉強になります。
ご教授して頂いた所を詳しく調べてみたいと思います。
だれか俺にbashとansi.sysの関係を教えてくれ。
すまん。レス番見間違えた。
プログラム初心者なのですが,助けてください. VC++2005Express,WinXP Pro環境で, コンソールアプリケーション上でWM_TIMERを使いたいのですが, 調べてみると不可視ウィンドウを作れば良いと書かれていました. そこで,以下のようなウィンドウを生成しているのですが,うまく動きません. ご教授いただけないでしょうか? HWND Create(){ WNDCLASS wcHide; HWND hwndHide; // ウィンドウクラス wcHide.style = 0; wcHide.lpfnWndProc = (WNDPROC)MWndProc; wcHide.cbClsExtra = 0; wcHide.cbWndExtra = 0; wcHide.hInstance = (HINSTANCE)GetModuleHandle(NULL); wcHide.hIcon = NULL; wcHide.hCursor = NULL; wcHide.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcHide.lpszMenuName = NULL; wcHide.lpszClassName = ""; hwndHide = CreateWindow ( wcHide.lpszClassName, "", WS_DISABLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, wcHide.hInstance, 0); }
781 :
780 :2007/08/28(火) 03:01:24
LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wp, LPARAM lp) { switch ( iMessage ) { case WM_CREATE: SetTimer(hWnd , 5000 , 1 , NULL); return 0; case WM_TIMER: printf("test\n"); return 0; } return 0; } とりあえず,5秒毎に"test"を出力できるようにしたいのですが, よろしくお願いします.
783 :
780 :2007/08/28(火) 03:20:40
正しくはご教示でしたか 間違えて使っていました.ありがとうございます. >うまく動かないってのはどんな状況? 何も表示されずに終了してしまいます. 以下を試してみましたが何も表示されませんでした. ・main文でCreate()を呼び出した後にwhile(1)やsleepをはさんでみる ・WndProc()関数の最初にprintfでチェッカーをはさむ よろしくお願いいたします.
>>780 メッセージループはあるか?
なければググれ
785 :
デフォルトの名無しさん :2007/08/28(火) 03:32:35
ウィンドウクラスの名前が無い。 RegisterClassしてない。 SetTimerの第2引数と第3引数が逆とか、 ウィンドウプロシージャで自分で処理しないメッセージをDefWindowProc()に渡してない。
786 :
780 :2007/08/28(火) 03:40:59
>>784 ありがとうございます.
ありません.早速ググってみました.
>>785 ありがとうございます.
調べてみます.
787 :
780 :2007/08/28(火) 04:42:09
>>784 >>785 ありがとうございました.
ご指摘の通り,メッセージループ,RegisterClass,DefWindowProc()
全てを書いたところ,意図した動きをしました.
お世話になりました.
ちょっと質問。 ・外部ハードからデータを所得(配列に格納)し、そのデータ長に数値計算を施し結果を画面上に表示させたい この動作で、随時変化しているデータ長の所得・数値計算・グラフ描画、 この3つを同時?(なるべくリアルタイムにあるデータ長の数値計算結果をグラフ描画)したいんだけど、 こういう場合ってどんな風に処理・流れにさせればいいの? 例えば、マルチスレッド(出来るかどうかよくわかりませんが)を使って データ所得→計算→描画 | →データ所得→計算→描画 | →データ所得→計算→描画 こんな感じで計算させつつデータを所得。描画させつつ計算。みたいに出来ますか?
所得
790 :
デフォルトの名無しさん :2007/08/28(火) 06:00:16
データ所得税
791 :
788 :2007/08/28(火) 06:06:24
すんません。取得の間違いでした
その程度なら今のPCは十分に早いから データ所得→計算→描画→データ所得→計算→描画 で十分じゃね? データ取得に時間掛かるならデータ取得部分だけ別スレッドで回した方がいいけど。
典型的なProducer-Consumerパターンでないの?
>>788 出来る出来ないで言えば、出来ると思う。
どっちかいうと、例えばデータをファイルに書き込んでるなら、
データ書き込みとデータ読み出しの排他処理してるだろうから、
あんまり頻繁に読み出しに行くとデータ更新を阻害しそうで
そっちの方が怖い。
>>788 読む限りでは出力先は画面でないの
ファイルに書き戻したりしてないように見えるけど
Windows SDKの_msize()で、callocした領域のサイズを見ようと呼び出したのですが、 呼び出した行でプロセスが停止してしまいます。 エラーも何も帰ってこず、前の行のprintfは呼ばれて、次の行のprintfは呼ばれていないという 状況です。_msize()の説明を見ると、動的確保されていない領域でも エラーが帰ってくるみたいですが… こういった症状聞いたことある方いませんか? VC6でデバッグビルドです。よろしくお願いします。
ぬるぽではないのか
798 :
796 :2007/08/29(水) 00:11:55
ガッ
引数に入れてやったポインタがNULLを指してるってことでしょうか 今環境がないので試せないですが、if ( p == NULL ) とかで見てみます
だめだこりゃ
? 違うんですか?
違う
よくわからないので教えて貰えませんか? _msizeの戻り値を参照してるところで止まってる訳でもなく、 _msize自体で止まるので、引数として渡してやったポインタがNULLなのかと思ったのですが
>>803 NULLに対する対処くらいしていてもよさそうだけど
>>804 よく読んでみれば、
この関数は、パラメータを検証します。memblock が null ポインタの場合、
「パラメータの検証」に説明されているように、_msize は無効なパラメータ ハンドラを
呼び出します。エラーが処理されると、この関数は errno を EINVAL に設定し、-1 を返します。
とのことなので、-1が返ってくるようですね。
ぬるぽってヌルポインタ(Javaとかだとヌル参照例外)のことですよね?
引数のポインタがNULLでも動くなら、
>>797 は何について仰ってるのでしょうか?
>>803 試しに_msizeの引数にNULL入れたら、Assert出て落ちた。
VS2005 Standard Edition
「止まる」というのは、関数から戻って来ないのか、不正終了するのか、どっち?
ねるぽ
確認しないとわからないかも…
というのは、Windowsのサービスとして動かしてるのです。
サービスでも普通のプログラムと同じようになんかダイアログでて
落ちるのなら前者の関数から戻ってきてないのだと思いますが、
出なくて静かに落ちるなら、タスクマネージャからプロセスが生きてるか確認しないとわからないかも
>>796 のそこで止まるというのは、_msizeを挟んで呼び出し前と呼び出し後を
ログに吐かせたときに、呼び出し前までしか吐かれてなかったのです。
Assert出て落ちるのなら、プロセスが静かに死んでそうな気がしてきました。
確認してなかったのか
ウザ〜イ!ウザイよ小沢さん。想像で答えられてもウザ過ぎるよ。
まぁ「初心者歓迎」ってついとるし、初心者はバグの見所もわかんねだろ。 免罪符にゃならんが。 そこら辺分からんと答えよう無いしな。
そこだけ切り出してコンソールアプリにでもしてみれば。 NULLじゃないけど IsBadReadPtrに引っかかるポインタとか
サービスであっても、デバッガアタッチするといいb
814 :
デフォルトの名無しさん :2007/08/29(水) 13:31:03
>>805 本当によく読んでるのか?
> _msize は無効なパラメータ ハンドラを呼び出します。
無効なパラメータ ハンドラが何やるかしってるか?
> 無効なパラメータが見つかると、C ランタイムは、
> 現在割り当てられている無効なパラメータ ハンドラを呼び出します。
> 既定により無効とされているパラメータが見つかった場合、
> ワトソン博士のクラッシュ レポートが起動します。
> 実行中のアプリケーションはクラッシュし、分析用のクラッシュ ダンプを
> Microsoft に提供するかどうかをユーザーに求めるメッセージが表示されます。
> デバッグ モードでは、無効なパラメータが見つかるとアサーション エラーになります。
かなり初歩的な質問で申し訳ないんだけど 現在VC++ 2005 Express Editionで開発中で、所謂多重定義の問題にハマっています Formアプリで、複数のFormをどんどん遷移していくような感じなのですが イメージとしては、ATMのような、各画面1クリックでどんどん進むようなので、それぞれの画面が 個別のFormとして作られています。 (Form1がForm2を作って、Form2が3を・・のような) で、聞きたい事は、VC++2005ExpEditでは、Formを作ると、そのclassの定義がすべてForm1.h のように、ヘッダファイルに書かれてしまいます。 このとき、Form1とForm2で相互にincludeしたい場合、多重includeガードをしても、定義のせいで リンクがエラーになり、コンパイルが通りません。 いちいちForm1.hの中身を.cppにコピペし、宣言のみを.hに書き直すようなことをしなければいけないのでしょうか うまい回避方法があれば教えてください。 (長文すみません)
C++/CLI?
API直で叩けばいいんじゃね?
stlのstring使っています。 このstringを1行ごとに読み込んで処理したいのですが、どのようにすればいいでしょうか? tokenが使えないので、ちょっと苦労しています。一旦とってきたstringをcharに変えるのも、どうかなぁ……って気がしますし、 できれば、stringのままで一行ごとの読み込みがやりたいんですが、やり方を教えてください。 VC++2005 WinXPHomeです。
findとかiteratorで改行しらべる
>>815 #ifndef Form1_H
#define Form1_H
#include "Form2.h"
class Form1 : public Form
{
};
#endif
----------------------
#ifndef Form2_H
#define Form2_H
#include "Form1.h" //Form1.hからincludeされた場合はForm1_Hが定義済みなのでインクルードガードで無視される
class Form2 : public Form
{
};
#endif
こんな感じで書かれてればエラー出ないと思うんだが‥‥
821 :
デフォルトの名無しさん :2007/08/29(水) 23:48:13
つか、C++を使ってなぜ.NETなのかさっぱり分からん
つか、C++を使ってるのか.NETなのかさっぱり分かってないんだろう
>>818 std::istringstreamとstd::getline(std::stringを引数にとるほう)はだめ?
>>818 意味がイマイチわからんかったが、
istringstream と >>
じゃだめか?
>>823 あ
そっちじゃなきゃだめだわ
(大域のgetline か basic_istream<> の istream)
>>818 boost, boost-sandbox or pstade使ってもいいなら良い方法があるんだけどいいかな? by boost厨
basic_istream<> の istream × basic_istream<> の getline ○
聞いてくれよ、おら C++のunionにメソッドを置おけること、昨日知ったよ、orz これって常識?
unionを使うことが非常識
どちらかというと常識ではないと俺は思う。 自身で使ったことがないし、他人が使っているのを見たこともないし。
なんかクラスWidgetがあって、 Widget(); という文があったら、Widgetのオブジェクトを(デフォルトコンストラクタで)作成して、 次の行に逝く前にすぐ消される(デストラクタが呼ばれる)と思います。 んじゃ、こういう場合はどうだろうと思い、↓を書いてみました。 Widget *w = &Widget(); 「Widget() はこの行でデストラクタが呼ばれ消えてしまうので、ポインタwは無効になるだろう」と考え、 考え通り、すぐデストラクタが呼ばれました。 んじゃ、参照はどうだろうと・・・ Widget &w = Widget(); 自分の考えとは違ってすぐにデストラクタが呼ばれず、この関数(またはブロック)を抜けるところでデストラクタが呼ばれました。 参照だと何か特殊なんですかね・・・
参照には null が無いから
834 :
デフォルトの名無しさん :2007/08/30(木) 00:34:16
大きなファイルサイズの読み込みを早めるためにMemoryMappedFile使う場合、 ファイル全てのアドレスを割り当てたらまずいですよね・・? やはりマッピングアドレスを動的に変化させる仕組みが必要でしょうか? そうすると編集時に問題になってしまいそうですが、何かセオリーみないなモノはあるのでしょうか?
>>832 const参照なら標準規格でも明文化された規定になっている。
(知っている人は少ないかもしれないが)
けれど、非const参照の初期化に一時インスタンスの使用はできないことになっている。
一時インスタンスは右辺値だが、非const参照の初期化には左辺値が要求されるため。
最近のVC++やg++ではエラーになる。
どうせお前が使っているのはBorand C++だろう。窓から投げ捨てろ。
>>832 参照は一時オブジェクトを捕まえておける
関数の戻り値とかもおっけー
837 :
836 :2007/08/30(木) 00:40:53
const参照だけだっけか。すまそ。
>>823 ,824
thx istringstreamでいってみます。
>815 別にForm1の定義がまるまる欲しいわけじゃないでそ。 Form *createForm2(); みたいな生成関数があれば大抵足りるんじゃないの。
>>820 ガードは試してみたんですが、「定義」が.hに書かれているので・・
>>839 まったくそのとおりなんですが
VCを使うと、デフォルトでヘッダファイルに定義が書かれているんですよ
なので、どうしたものだろうかと
やっぱり、いちいち自分でヘッダファイルに書いてある定義をcppに持っていって、ヘッダファイルでの
宣言は改めて書くようにしないとダメなんでしょうか
>>835 BCCタンを悪く言うと痛い目にあうお(#^ω^)ビキビキ
>>840 form2.h では、#include "form1.h"のかわりに、
class Form1;
と書いとけ。
これで、Form1* ほげほげって書けるようになる。
form1.h でも同様にする。
form1.cpp, form2.cpp では、両方のヘッダファイルをincludeする。
844 :
デフォルトの名無しさん :2007/08/30(木) 21:06:59
BorlandC++5.5.1を使ってコンパイルしているのですが、 このコンパイルをプログラム側からSystem()関数で行った場合に、 プログラム側でコンパイルでエラーが出たかどうかを判断できないのでしょうか? 具体的には System(bcc32 helloworld.c); の返り値とかで判断できないものでしょうか?
845 :
844 :2007/08/30(木) 21:07:40
すみません、C言語です。
無理。
847 :
844 :2007/08/30(木) 21:33:22
>>846 そうですか、意外とプログラム側から分かる情報は少ないんですね。。。
どうしようかな・・・
諦めろ お前には無理 お前のプログラム側から分かる情報なんて皆無
んあ? コンパイルに失敗したかどうかは分かるんじゃない? エラーが出たのかどうかは分からんが。 BCCのsystem()は良く知らん。 gccのなら、↓でcommandの終了コード取れたと思うけど。 status = system("command"); if(WIFEXITED(status)) exit_code = WEXITSTATUS(status);
850 :
844 :2007/08/30(木) 22:02:00
>>849 manpageを見る限りだと、<sys/types.h>と<sys/wait.h>の二つをインクルードするみたいなのですが、
これをコンパイルしたところ、sys/wait.hをオープンできないというエラーがでます。
何故でしょうか・・・;;
ちなみにそのWEITSTATUSの返り値はint型でいいのでしょうか?
お前がアホだから
852 :
デフォルトの名無しさん :2007/08/30(木) 22:06:34
数千行から1万行程度で書けて、出来たとき達成感のあるような練習課題思いつけば教えてください テトリスとかどうかなと思ってるんですが
将棋でも作れば?
>>850 いや、ちょっと待ち。
BCCはWindowsの話じゃないのか?
gccはUNIXとかLinuxの話で。
WEXITSTATUSがBCCでも存在するか知らんのだが。
>>850 なぜなら、manpage は bcc じゃないから。
戻り値よりも、obj ファイルや exe ファイルが生成されてるかどうかを見た方が楽なんじゃないか。
858 :
844 :2007/08/31(金) 00:21:14
>>856 それだとコンパイルするたびに、objファイルを消さないといけないですよね。
コンパイル前にobjファイルとexeファイルを消すプログラムにすれば済む話かもしれないですけど・・・
>>852 2ch専用ブラウザ機能付きテトリス
セルフコンパイル機能付きテトリス
英日翻訳機能付きテトリス
OCR機能付きテトリス
人工無能機能付きテトリス
>>844 エスパーすると君が本当に必要なのは make および makefile に関する知識だ
人工無能機能付きテトリスに期待
今更過ぎる質問なんですがWindows2000にVC++2.0って インストール不可なんでしょうか? うまく行ったかなと思ったら、最後の最後でレジストリの 書き込みに失敗しましたとかって出てしまいました。 他のバージョンのVCとかは一切インストールしていない 状態です。
可能ですよ
864 :
862 :2007/08/31(金) 00:53:42
>>863 レスありがとうございます。
Win2Kのインストールから、もう一度やり直してみます・・・orz
サービスパック(SP4)入れる前にVCをインストールした方が
良かったのかな・・・?
#include <iostream> //typedef int link; class link {}; int main(){ link l; } g++4.1.2で怒られました。コンパイラ不信になりそうです。 変数名をNULLにするような常識外れなのかもしれませんが、 こういう名前空間の衝突はどこを見れば予想できますか?
>>g++4.1.2で怒られました。コンパイラ不信になりそうです。 君のレベルではコンパイラのバグなど、コンパイラ側の問題に遭遇することは無い。 コンパイルエラーはすべてコンパイラのせいではなく、自分が悪いのだと認識したほうがいい。
>>865 エラーメッセージを見れば予想できるよ。
__declspec(novtable)は、どういう時に使うものですか?
>>865 自分の作ったクラスとか関数をすべて自分の名前空間に入れれば衝突を気にせずに済むよ
>>866 標準ヘッダをインクルードしたらグローバルにunistd.hがぶちまけられる、
ってのはバグでなくてもショックでした。
>>867 初お目見得のエラーメッセージって初心者キラーなもので…。
class hoge{ link l; };
: error: ‘link’ does not name a type
危なそうな名前は回避するしかないんですかね。気をつけます。
>>869 あなるほど、ちと面倒ですがそうします。皆さんありがとう。
標準入出力等の一部の関数は、 名前空間というものが無いCの関数として公開されたAPIを用いて実装されてるわけで、 たとえ標準Cの関数だけをstd名前空間に入れてもそいつらが使ってるAPI関数はそのままグローバルに残り そりゃ凄い規模の汚染が発生していることだろう。 VCのIDE上でグローバル名前空間::からの入力予想をかけたらその凄まじさがよくわかる。 ただ大文字で始まるようなものは少ないんで、 「クラスの名前は先頭大文字でキャメル」とかそれなりに一般的な命名規則使ってれば遭遇しにくく 知らずに有効なコーディングルールを使ってるとかえって危ない場合ってあるんだなぁとかそういうことを思った。
A を直接作ることが無いのであれば、 A のコンストラクタで仮想関数テーブルを初期化する処理は必要ない、無駄だ、ということか。なるほど。
setcurrentdirectoryを使って、 ネットワーク上のPCのディレクトリを指定したいのですが、 記述の仕方を教えてください。
novtableはATLのウィザードで作ったクラスで良く見る。
>>845 \\servername\sharename
1万行だなんて身近スg
std::basic_ifstream<wchar_t>で文字を読み込むと日本語が文字化けしちゃうんですか 何故でしょうか?読み込むテキストはUTF-8で書いてあります
UTF-8なlocaleをstreamにimbue()汁 それがサポートされていれば、の話だがな
これimbue(std::locale("japanese"));やstd::locale::global(std::locale("japanese")); これは 試しましたがダメでした
> UTF-8なlocaleを これが読めなかったのか janapeseとかいうlocaleを使っているところを見ると、VC++か? なら、C++localeに任せるのは諦めろ。 VC++はUTF-8なlocaleをサポートしていない。
そうですか・・・じゃあマルチバイトで読み込んで内部で変換するしかないですね ありがとうございました
>>884 汎用的なcodecvt<>のセットがどっかにあるんなら俺も欲しいな
boost::iostreams::codeconverterとかはpublicなデストラクタを備える
codecvt<>実装を要求するんで、VC++標準のcodecvt<>は使えないしな
iconvあたりを使ってデッチあげる手もあると思うが、状態をmbstate_tで
管理しなければならない辺りが悩ましげだし、wchar_tのバイト数が決まってないのも
やっぱ面倒だよな
CSimpleStringクラスのCopyChars()をそのまま使うと、「古い形式で使われています」と 警告がでるんですが、この関数の新しいバージョンってありますか? 探したけど見つかりませんでした
#define _SECURE_ATL
やっぱりないですよね #pragma warning( disable : 4996 )で消しました
#if (_MSC_VER > 1310) #pragma warning(push) #pragma warning(disabel:4996) #pragma warning(pop) #endif
template <class Ch,class Tr=std::char_traits<Ch> > これって何してるのですか?
その気になれば、Trをstd::char_traits<Ch>でない何かにすることもできる、と
テンプレート引数のデフォルト値
template <class Ch,class Tr=std::char_traits<Ch> > class basic_string; があるときに basic_string<char> ってするだけで basic_string<char, std::char_traits<char> > ってするのと一緒になるという手抜きができますよってこと?
そう
basic_ofstreamを拡張して EUC出力したいのですけど何か参考になる URLとかないでしょうか?
>>896 コード変換はストリームの管轄ではない。
>>879-886 でも、basic_ostream<char>だとcodecvtは使われないのか?
locale関係に挫折したら、邪道だけどストリームバッファを
作成して書き込み前の瀬戸際で変換をかけるという手もあると思う。
unsigned char --> charの変換だけが欲しいのに なんでここまで大がかりになるのかよーわからん。 C++の言語設計ポリシーがきもいのが原因なんだろうけどさー
【自己責任で】あっさり変換しちゃえ。 究極的にそれができるから、C/C++が好きだ 美しくスマートに書くのは確かにめんどいが
t
興味本位でModern買って、今日届いたけど難しいんだよな? もっと勉強してから読むか
第三章を読んで(いい意味で)爆笑するといいよ
クラスのメンバにfstreamを持たせるのってよくない? コピーコンストラクタをちゃんと書いてないとコピーできないよね。 なんかもっといい方法ってあるんだろうか。。
fstream を局所的に使う設計に変更するとか
refcount付きのfstream*入りクラスつくってメンバにいれるとか
unicode_iteratorの最強さは異常 組み込みでも使えるな
memcpy.asmというファイルでエラーが出て困っています これはどういう時に呼び出される命令なんでしょうか?
memcpy使ってないときにも落ちちゃうんですが 別の関数とかクラスが内部で使ってる場合もあるんですかね?
ああ
>912 そりゃ、メモリコピーなんて非常に基本的な機能だからいろんなところで使われてるだろう。
てかダメだろう落としてちゃ。もうプログラムングやめた方がいいんじゃねぇの
じゃあ原因の特定はむずかしいですね どうしよう
デバッガでコールスタック見ればいいんじゃない
>>917 今やってみたら原因がわかった気がします
ありがとうございました
基本的な質問ですみません VC++6でwindows コンソールアプリを作っていますが たとえば int nA; nA = 0; while(1){ print("count=%d",nA++); Sleep(500); } でカウンタ値を表示しますが マウスをコンソールにあわせると、タイトルバーに「選択」とでて処理が止まってしまいます これをやめさせるにはどーしたらよいでしょう?
>>919 コンソールウィンドウの「簡易編集モード」をオフにするとか。
あれ?マウスカーソル持って行っただけで選択になったっけ?
VCで/clrを付けると、GC(gcnew)が使えるようですが、これは.NETと関係あるんですか?
>>920 マウスを持っていって置くだけでなります
923 :
919 :2007/09/02(日) 04:54:02
>>920 ありがとうございます
「簡易編集モード」でぐぐったら、プロパティで変えられるんですね
変えたらならなくなりましたが
このウィンドウだけ、プログラム上から変える方法はあるんでしょうか?
レジストリ書き換えれば(ry
>>922 「置く」なんてオレ語を使うからややこしくなる。
クリックしているんじゃないの?
クリックすることを「置く」なんて言っても通じないよ。
クリックのことを押すと言うのはよくやる。
押すじゃなくて置く
持っていく→アクティブ/非アクティブ関係なく窓の上 置く→アクティブで窓の上 で、アクティブにするのにクリックしたんだと思ったが違うのか
よし引っ張れ! それだ
クリックしたんじゃねぇか
ダブルクリック→つっつく
ドラッグ→ひっぱる
最小化→消す
プー吹いた
CかC++にはinterfaceっていう予約語があるんですか?DirectX関係のソースに使われてました。 大文字でもなくマクロではないと思うし、処理系の拡張なら__interfaceという感じになってそうですし、 VC++だと色が変わるので、予約語だと思ったんですが。 でもWikipediaとかの予約語一覧にも載ってない…
C#じゃね?
939 :
デフォルトの名無しさん :2007/09/02(日) 19:20:41
ねーよ
virtual
941 :
デフォルトの名無しさん :2007/09/02(日) 19:25:45
struct
import
extern
null
945 :
デフォルトの名無しさん :2007/09/02(日) 19:30:43
po
inter
947 :
デフォルトの名無しさん :2007/09/02(日) 19:41:16
949 :
デフォルトの名無しさん :2007/09/02(日) 19:52:22
陸上では日本人では全く勝負にならんが、コンピュータでもそうなんですかね? Code Projectなんかがヘビーなコンポーネントを公開しているのはほとんど海外組み
ICFPの上位にgoogleのチームに混じって日本人が入っていたりするよ
951 :
デフォルトの名無しさん :2007/09/02(日) 21:52:22
すみません C言語でtelnetした後に続けてサーバーに出力を自動で送信する方法はありませんか? エミュレータと通信してましてエミュレータと接続した後に エミュレータ上のモニターに対してコマンドを送りたいです 具体的には system("telnet 127.0.0.1 5556"); した後にqというコマンドをエミュレータのモニターに送りたいのですが スレッドが一つだと処理がtelnetから動かず スレッドを二つにして system("q"); と入力を行うとエミュレータでなくDOS上でqが行われるようでうまく動きません
OSを書け
>>951 そういう場合はexpectを使え、ということになっている
一瞬
>>953 が煽りに見えたが、そうだ、ターゲットOSを書け
みんな詳しいな おれなんて文法理解するだけで精一杯だよ
957 :
デフォルトの名無しさん :2007/09/02(日) 22:15:50
やりたい事があったら文法なんて関係ないさ。
958 :
デフォルトの名無しさん :2007/09/02(日) 22:16:34
説明不足すみませんでした OSはWinXP エミュレータはQEMU エミュレータ上のOSはDebian Cの開発環境はVisualStdioを使っています そしてWinXP上のC言語とQEMUで通信しております
>>956 ・簡単なアプリを作る→その肉付けをしていき内容を濃くする
・簡単なアプリを作る→簡単なアプリを作る
・高度なアプリを作る→半年後見直すと自分で組んだプログラムが恥ずかしく感じ組みなおす
・高度なアプリを作る→挫折する
これらを繰り返していくうちに身に付くから、今できることをやるだけで色んな知識を覚えていくよ
>>957 >>959 もともと発想力がないからか、自分で課題が思い浮かばないけど
とりあえず持ってる参考書は全て読んで、サンプルだけでも動かして
ちょこっと変更したりすることをしばらく続けて見ようと思う
いまはイテレーターアダプタと格闘中。
>>951 >>958 多分勘違いしてはる
system()はコマンドを実行するようなモノであって、
線路(パイプ、FILE*など含む)に送信する働きはない
試作では、send(),recv()かなんかを使うことになるのでは
そっからはやり方はいろいろあるけど、自力で見出していくのでは
>>951 例えばTeraTermを使っていいなら、自動運転用マクロ言語内蔵だから接続先からの特定のキーワードを待って
それに対して一定の反応を返すことくらいちょちょいのぱーだよ。
>>951 ソケット開いてtelnet話せばいいだけだろ
なんでそんな単純な事も解からないんだ
氏ねよw
964 :
デフォルトの名無しさん :2007/09/02(日) 23:08:25
>>960 サンプルだけ動かして
「俺、C++できるよ」
なんて言ってるような奴にはならないでね
965 :
デフォルトの名無しさん :2007/09/02(日) 23:10:29
>961 system関数は使えないんですね・・・ recv()考えて見ます >962 それはちょっと使えそうにないので他の手を考えてみます
>>964 まだ初期段階だから先は長いと思ってる
まあ仕事でC++使えば一気に向上するとは思うけど
>>965 詳細はよくわからんが、connectしてデータをsendすればいいだけではないの??
telnet特有のネゴシエーションとか、ログイン処理とか URGデータの処理とか考えなけりゃね。
>>968 そうかログイン処理が必要だな
こりゃ失礼
今時telnetってとこには突っ込まんが せめてライブラリ使うかexpectに汁っての 下らない仕事のためにtelnetを喋るTCPクライアントをわざわざ手書きするなんて ナンセンス極まりない
思うに、telnetで接続して、"q\n"かなんか、何か簡単にシグナルしたかったんだろう そのくらいの軽務なら、connect(), recv()でいいんじゃないかと思った CreateThreadはできるけど、system()がわからない。 きっと、IPC(広義の)の初心者さんなんだ ヒントくらいでいいんじゃまいかとw
telnetぐらい3日でかけるだろ どうせ暇なニート学生だろ?
ニート学生って言語矛盾じゃないか
どうせ学校もろくにいかないで 2chが動画サイトめぐりだろ 身分があるだけでニートとかわらんだろw
何がしたいのかは知らないが、 そもそも telnet を使う必要が無いんじゃないか?
976 :
デフォルトの名無しさん :2007/09/03(月) 00:10:10
Cの基本的な文法については勉強して次は実際にSourceForgeでオープンソースの プログラムを読もうと思っていたのですが難しすぎて分かりません みなさんはある程度文法の勉強をしてからどのようにして勉強していきましたか?
作りたいものを作る。それが一番。
>>976 Cなら簡単に1万行ぐらいまでなら
読めるようになる方法がある。読めない文法だけ
飛ばしてたぶん処理追えるようにはなるとは思う
環境ちょっと限定になるけどな
>>976 必要に迫られれば、驚くほどの速度で習得可能
文法の次はアルゴリズムの勉強がお勧め
アルゴリズムに関する説明(自然言語)を元にC言語ソースにする
これが結構難しい
読むのと書くのは別の能力。
書くスキルあげつつ読みたいなら モジュールバラしテクニックを身に着けるといいよ。 単純にどこで処理が範囲かわかったら あとは改造する楽しいよ。
982 :
デフォルトの名無しさん :2007/09/03(月) 00:25:40
読むと書くのは別の能力だというのは分かりますが
ある程度うまい書き方とか定石なども学びたいと思いまして
今コーディングの本を読んでいるのですがいきなり書いてそれに慣れてしまうと
ものすごい危険なコードを何の意識もなく書いてしまったりしてしまうのかと思いまして
>>979 今読んでいる本が終わったらアルゴリズムの本も読んでみようと思います
>>982 最初から完璧なコードが書けるなどと思うな
最初は誰でもつたないんだ
それを気にせずコード書け
書かなきゃいつまでたっても上手くはならん
C++だったらそれこそ20冊ぐらい読まないと駄目だからなぁ… と言っても読みながら書かないと理解できないような内容だから 読もうとしてる内に書く経験も積むことになるが
20冊って何の本だよ
986 :
デフォルトの名無しさん :2007/09/03(月) 00:35:03
>>983 今は本を読んで演習問題などでコードを書いているという状況です
>>984 何かお勧めの本などはありませんか?
文法覚えたなら簡単なソフト作ればいいんじゃね? 何でもいいから動くもの作らんと、モチベーション維持が大変だ 目標があってC言語勉強したんだろうから、目標までの道のりを 考えて一歩ずつ進むしかないよ。 といいつつも、俺はなんもしてないな。
手じかに役に立つ類のちょろっとしたものを書きたいのなら ぶっちゃけCは向いてないよあまり
演習問題を一通りやって何かを作ろうとしてもアイディアが出なければ 大学とか専門学校で出される課題のようなプログラムを作るといいよ ここには宿題スレもある事だし
ライブラリとかマクロとか使ってカスタムすればLL言語並の「軽い」C++ができるぜ ただし作った奴以外には読めない使えない代物になるけど
>>986 人に薦められた本が君に適している確率はかなり低いよ。
マスターしたけりゃ立ち読みして読みやすいと感じた本を読め。
仮にその本が結局ハズレでも、その次に選ぶ本はより君に適しているはず。
992 :
デフォルトの名無しさん :2007/09/03(月) 00:52:56
>>987 どうやれば市販のソフトのようなものが作れるかもよく分からない状況で
みなさんvisual studioとか使ってるんですか?
>>991 はいわかりました
VisualStudio使ってるよ VC++とVC#だけだけど
994 :
デフォルトの名無しさん :2007/09/03(月) 00:58:05
>>993 どのようなアプリをつくったんですか?
公開できるようなものではないと思いますがw
うめるか
998 :
992 :2007/09/03(月) 01:07:49
うm
仕事で作った物って公開できないのが大半だな・・・
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。