【初心者歓迎】C/C++室 Ver.16【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/04/10(日) 22:33:06ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1111231578/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2005/04/10(日) 22:35:37Windowsなら
SendMessage(処理させたいWindowのハンドル, WM_KEYDOWN, VK_RETURN, 0);
0003デフォルトの名無しさん
2005/04/11(月) 01:07:260004デフォルトの名無しさん
2005/04/11(月) 01:20:58STLのmapの内部では、キーの値をもとにツリー構造を構成しているとのことですが
そうするとmapに要素を挿入するときに、0からインクリメントした値のキーを使った場合は、
検索のオーダーは最悪になってしまうのでしょうか・・?
0005デフォルトの名無しさん
2005/04/11(月) 01:26:45実装によるけど、まぁ大抵は心配無用じゃないかな。
0006デフォルトの名無しさん
2005/04/11(月) 01:29:40普通はツリーといってもバランスドツリーが使われてるから、そんなにひどくならない。
↓で遊んでみるといい。
ttp://www.ececs.uc.edu/~franco/C321/html/RedBlack/redblack.html
0007デフォルトの名無しさん
2005/04/11(月) 01:46:09お返事ありがとうございます。
それほど酷くないとのことで安心しました。
>>6氏のページは今からJavaをインスコして遊んでみますヽ(´∇`)ノ
0008デフォルトの名無しさん
2005/04/11(月) 03:26:03面白いな。0から順に昇べきでノードを追加していくと、左右の木の深さが
4段階以上になると、ずるっと回転操作が行われるのな。
回転操作のプログラムを組んでみた事はあるが、実際にこうして視覚的に
見れるとよく理解できるもんだ。
0009デフォルトの名無しさん
2005/04/11(月) 03:33:19コマンドの結果を変数に入れたいのですが、わかりません。
例えば system("echo hello"); の結果を変数に入れる事を考えた場合
どのような方法がありますか。
0010デフォルトの名無しさん
2005/04/11(月) 05:01:13質問するときの「自分は初心者です。」って言うのは嫌われるぞ?
0011デフォルトの名無しさん
2005/04/11(月) 08:23:51system()を使うならファイル経由。
直接得たいならFILE * fp = popen("echo hello", "r");して後はファイルと同じ要領で入力。
0012デフォルトの名無しさん
2005/04/11(月) 12:04:14確かにそうですね。気をつけます。
>>11
回答ありがとうございました。
popen関数を使えばいいのですね大変参考になりました。
0013デフォルトの名無しさん
2005/04/11(月) 12:07:330014デフォルトの名無しさん
2005/04/11(月) 12:09:09その初心者歓迎スレで「自分は初心者です」ってバカみたいじゃない。
0015デフォルトの名無しさん
2005/04/11(月) 22:17:580016デフォルトの名無しさん
2005/04/12(火) 13:22:33という関数かマクロは標準にはあるのでしょうか?
boostにあるのならそれでもかまいません。
自分で作っちゃってもいいんですが、既にあるのならそれを使いたいなと。
0017デフォルトの名無しさん
2005/04/12(火) 14:00:17渡したポインタ(仮にp)からn要素先ではなく、nバイト先なのかな?
ってことは、p+nではなくて((char*)p)+nか。
型を戻さないといけないから、(T*)((char*)p+n)だね。
C++ならreinterpret_cast<T*>(reinterpret_cast<char*>(p)+n)か。
0019デフォルトの名無しさん
2005/04/12(火) 15:27:09002016
2005/04/12(火) 15:34:400021デフォルトの名無しさん
2005/04/12(火) 16:05:080022デフォルトの名無しさん
2005/04/12(火) 16:10:51てめえは何が言いたいんだ?標準でそんなマクロがあるとでも?
0023デフォルトの名無しさん
2005/04/12(火) 16:25:240024デフォルトの名無しさん
2005/04/12(火) 16:43:01そんなことすら理解できないのか?
0025デフォルトの名無しさん
2005/04/12(火) 16:52:180026デフォルトの名無しさん
2005/04/12(火) 16:58:230027デフォルトの名無しさん
2005/04/12(火) 17:00:200028デフォルトの名無しさん
2005/04/12(火) 17:04:560029デフォルトの名無しさん
2005/04/12(火) 17:14:59世界の民が号泣。
0030デフォルトの名無しさん
2005/04/12(火) 18:38:070031デフォルトの名無しさん
2005/04/12(火) 23:24:580032デフォルトの名無しさん
2005/04/13(水) 12:49:21デリゲートって便利ですか?
0033デフォルトの名無しさん
2005/04/13(水) 13:12:45似てはいる、C++でのメンバ関数ポインタとthisポインタのペアの型のコンテナだ
一長一短。
0034デフォルトの名無しさん
2005/04/13(水) 13:34:08なんでそんな謎の操作が必要なのか非常に気になる
0035デフォルトの名無しさん
2005/04/13(水) 14:42:26struct HOGE {
int size; // この構造体とその後に続くデータの合計サイズ
:
};
こんなのが連なったデータ列を操作しなきゃならんのです。
0036デフォルトの名無しさん
2005/04/13(水) 14:53:09ありがとうございます。
なんとなく理解できました。
0037デフォルトの名無しさん
2005/04/13(水) 16:30:40今いる研究室ではC++ですが、来年から違う研究室に移る予定です。
その研究室ではCを使ってるみたいです。
現在私はCもC++もその他のプログラムも未経験です。
Cから勉強すべきかC++から勉強すべきか迷ってます。
どっちから始めたほうがとっつきやすいでしょうか?
そしてお勧めの参考書などはあるでしょうか?
0038デフォルトの名無しさん
2005/04/13(水) 16:38:560039デフォルトの名無しさん
2005/04/13(水) 16:51:130040デフォルトの名無しさん
2005/04/13(水) 17:07:31一杯ありすぎてよく分かりません。どなたかこれを入れたらいいよっていうの無いでしょうか。
0041デフォルトの名無しさん
2005/04/13(水) 17:13:34Debian Linux + gcc + Emacsを入れとけ。
0042デフォルトの名無しさん
2005/04/13(水) 17:20:350043デフォルトの名無しさん
2005/04/13(水) 17:21:040044デフォルトの名無しさん
2005/04/13(水) 17:22:35別になんだっていいよ、kernel2.4以上を採用しているLinuxなら。
Fedora coreでもいいし。
0045デフォルトの名無しさん
2005/04/13(水) 17:26:140046デフォルトの名無しさん
2005/04/13(水) 17:27:54004737
2005/04/13(水) 17:42:16結局、先にC++学んでおいて、
研究室変わる頃にCの勉強始めればおkですか?
0048デフォルトの名無しさん
2005/04/13(水) 17:43:52研究室変わる頃に、その研究室でもC++に移行しているかも知らん。
0049デフォルトの名無しさん
2005/04/13(水) 17:52:56あのさ、君、プログラミングする研究室は辞めた方がいいわ。
どうもスキルも無さそうだし、興味も無さそうだし、どうかんがえてもうまくやっていけないな。
0050デフォルトの名無しさん
2005/04/13(水) 17:56:20005137
2005/04/13(水) 18:16:12その後やりたい研究分野を扱っている研究室でCが必須である事を知り
そのため計算物理のためにCかC++を勉強しないといけなくなった。
そういうことで今度は挫折は許されないわけです。
まぁここで叩かれようと頑張りますとも。
アドバイスくれた方ありがとうございました。
0052デフォルトの名無しさん
2005/04/13(水) 18:41:510053デフォルトの名無しさん
2005/04/13(水) 19:01:00今学生なんだっけ?
http://www.amazon.co.jp/exec/obidos/ASIN/B0002ERS18/250-6079416-1867423
↑コレ買っておけば?3800円で統合開発環境手に入るわけだし。学生の特権だと思うけど。
0054デフォルトの名無しさん
2005/04/13(水) 19:16:270055デフォルトの名無しさん
2005/04/13(水) 19:18:490056デフォルトの名無しさん
2005/04/13(水) 19:22:220057デフォルトの名無しさん
2005/04/13(水) 19:39:530058デフォルトの名無しさん
2005/04/13(水) 20:34:100059デフォルトの名無しさん
2005/04/13(水) 20:39:05VCユーザもしない。(VCユーザは普通の人ではなく、厨房なので当てにはならないが。)
0060デフォルトの名無しさん
2005/04/13(水) 20:43:12とりあえずcygwinでもつっこんどけば?
0061デフォルトの名無しさん
2005/04/13(水) 21:00:00懐が痛むのは質問者であってこっちじゃねーし。
0062デフォルトの名無しさん
2005/04/13(水) 21:12:28「コンソールで色出したいんですが・・」
とかアホな質問がくるけどな
0063デフォルトの名無しさん
2005/04/13(水) 23:57:57{
const char* p = "Hoge";
return p;
}
hoge()から帰ってくるポインタを使って
文字を表示したりするのは違法ですか?
0064デフォルトの名無しさん
2005/04/14(木) 00:07:54合法だけど
return "Hoge";
でいいやん。
0065デフォルトの名無しさん
2005/04/14(木) 00:08:41合法
0066デフォルトの名無しさん
2005/04/14(木) 00:11:47どうせなら
inline const char * hoge() {return "Hoge";}
で。
0067デフォルトの名無しさん
2005/04/14(木) 01:53:17それが合法なのは、プログラム領域に確保された
文字列定数"Hoge"へのポインタを返してるからだ。
const char* hoge()
{
const char p[5] = "Hoge";
return p;
}
こんな感じの実装は文句なしに違法。
0068デフォルトの名無しさん
2005/04/14(木) 01:56:340069デフォルトの名無しさん
2005/04/14(木) 01:58:210070デフォルトの名無しさん
2005/04/14(木) 02:06:57そこでマジックナンバーを書いている辺りが情けない。
0071デフォルトの名無しさん
2005/04/14(木) 02:38:20頭悪いか、経験が無いってすぐわかる。
0072デフォルトの名無しさん
2005/04/14(木) 08:04:250073デフォルトの名無しさん
2005/04/14(木) 09:53:01char buffer[ 1024 ];
...
strcpy( buffer, "Hoge" );
...
char* p = strstr( buffer, "Hoge" );
return p;
0074デフォルトの名無しさん
2005/04/14(木) 10:26:06> return p;
あり得ねえ
あり得るって言う香具師はプログラムするな
0075デフォルトの名無しさん
2005/04/14(木) 10:34:260076デフォルトの名無しさん
2005/04/14(木) 10:40:04オチは 67 と同じ。
0077デフォルトの名無しさん
2005/04/14(木) 11:51:35いまさらだがアドバイス。
言語なんかどうでもいいんだよ。どうせどれも文法がちょっとずつ違うだけだろ。
わかんなくなったらネットにいくらでも資料が転がっている。
必要なのは、プログラムを作るための考え方。それが身についてないと
どんな言語を使ってもろくに動かない糞ソースを生み出すだけ。
0078デフォルトの名無しさん
2005/04/14(木) 17:15:59それだと最大64KBまでしかメモリを割り当てれない気がするんですが、
それ以上割り当てるにはどうしたら良いのでしょう?
0079デフォルトの名無しさん
2005/04/14(木) 17:20:38MS-DOS?
0080デフォルトの名無しさん
2005/04/14(木) 17:26:16はいそうです
諸事情でWinAPIは使えません
コンパイラはBCC5.5です
0081デフォルトの名無しさん
2005/04/14(木) 17:28:14BCC 5.5ってWin32アプリしか作れないだろ。
DOSアプリとコンソールアプリを勘違いしていないか?
0082デフォルトの名無しさん
2005/04/14(木) 17:30:13OSはWinXPです・・
0083デフォルトの名無しさん
2005/04/14(木) 17:37:270084デフォルトの名無しさん
2005/04/14(木) 17:39:590085デフォルトの名無しさん
2005/04/14(木) 17:40:17Win32アプリケーションの場合もある。BCC 5.5自体もそうだし。
main()から始まるプログラムでもCreateWindowはできるし、
逆にWinMainからでもRead/WriteConsoleでコマンドプロンプトを使う入出力ができる。
とりあえずprintf("%u", sizeof (size_t));をやってみろ。
reallocの2番目の引数はsize_t。大抵unsigned intのtypedefだが。
0086デフォルトの名無しさん
2005/04/14(木) 17:44:13ありがとうございます。
4って出ました。
unsigned longなんですね。
0087デフォルトの名無しさん
2005/04/14(木) 17:45:31unsigned intの最大値を調べてから質問し直してください。
0088デフォルトの名無しさん
2005/04/14(木) 17:45:59ってやってみろ。
0089デフォルトの名無しさん
2005/04/14(木) 17:47:24Win32ではint/unsigned intも32bit化されて4Byteになっている。
0090デフォルトの名無しさん
2005/04/14(木) 17:50:09そ、そうだったんですか・・・詳しい情報感謝します
0091デフォルトの名無しさん
2005/04/14(木) 17:55:26ただしアプリケーション(1プロセス)が使用できるアドレス空間は2GB。
2GB以上(〜4GBの)メモリを確保するのは難しい。
0092デフォルトの名無しさん
2005/04/14(木) 17:55:520093デフォルトの名無しさん
2005/04/14(木) 19:05:070094デフォルトの名無しさん
2005/04/14(木) 19:16:50http://www.marbacka.net/asm64/arkiv/64bit_addressing.html
0095デフォルトの名無しさん
2005/04/14(木) 19:31:15struct stack_type{
intdata;
struct stack_type *p;
};
struct stack_type *talloc(void);
int main(void)
{
printf("******");
struct stack_type *stack, *temp;
stack = talloc();
stack->p = 0;
while(1){
scanf("%d", stack->data);
temp = stack;
stack = talloc();
stack->p = temp;
}
return 0;
}
struct stack_type *talloc(void)
{
return (struct stack_type *)talloc(sizeof(struct stack_type));
}
以上のようなプログラムで、「構文エラー : ';' が 'type' の前に必要です。」
というエラーが出ます。場所はmain関数の中で一番最初に宣言している、
struct stack_type *stack, *temp;です。
009695
2005/04/14(木) 19:32:41これの意味がわかりません。
ちなみに直前のprintfをはずすとなぜかコンパイルエラーも起こらずに、
実行されてしまいます。
どの部分が影響されてこのようなエラーが出るのでしょうか?
0097デフォルトの名無しさん
2005/04/14(木) 19:41:25009896
2005/04/14(木) 19:43:47最初は書いていなかったんです。
しかし、コンパイラがエラーをはかずに実行まで行ってしまい、
その後のwhileループも実行されずに無事に?終わってしまいました。
そのため、printfを追加したら、上記のようなエラーが帰ってきました。
0099デフォルトの名無しさん
2005/04/14(木) 19:48:51途中に書けるようになったのはC++からだっけ?
0100デフォルトの名無しさん
2005/04/14(木) 19:48:54変数宣言より前に普通の文を書いてはいけない。
対策はC99対応コンパイラを使う、もしくはC++としてコンパイルするなど。
010196
2005/04/14(木) 19:50:02そうだったんですか!
ありがとうございます。
0102デフォルトの名無しさん
2005/04/14(木) 20:30:07buf = (char *)malloc(1024);
こんな風にした場合、bufのサイズ(ポインタのではない)
を求めるスマートな方法を教えて下さい
0103デフォルトの名無しさん
2005/04/14(木) 20:36:03もっともスマートにして唯一採りうる手法として、malloc関数を呼んだ時点での領域確保のサイズを記録しておく。
つまり、
int a;
char* buf;
a = 1024;
buf = (char*) malloc (a * sizeof (char)); /* <- 必ずsizeof演算子でサイズを計算しておくこと。環境対策。*/
0104デフォルトの名無しさん
2005/04/14(木) 20:39:57出来ればそれはしたくなかったのですが、それしか無いですか・・・
0105デフォルトの名無しさん
2005/04/14(木) 20:46:11他にも方法があった。
自分でメモリ周りのライブラリを作る。そしてサイズを返す関数もつくればいい。
0106デフォルトの名無しさん
2005/04/14(木) 20:47:07sizeof (char) はどんな環境でも1を返すことは知ってるか?
0107デフォルトの名無しさん
2005/04/14(木) 20:57:36知らなかったらどうするの?
0108デフォルトの名無しさん
2005/04/14(木) 20:57:47勘弁して下さいorz
ありがとうございました
0109デフォルトの名無しさん
2005/04/14(木) 21:21:16どうかしたらどうするの?
0110デフォルトの名無しさん
2005/04/14(木) 21:27:20ガーベジコレクション
0111デフォルトの名無しさん
2005/04/14(木) 22:02:17WindowsならHeapAlloc()を使えば、HeapSize()でサイズを取得できる。
0112デフォルトの名無しさん
2005/04/14(木) 22:07:010113デフォルトの名無しさん
2005/04/14(木) 22:54:01他の環境に移植したこと無いでしょ
0114デフォルトの名無しさん
2005/04/14(木) 23:02:25俺はもともと組み込み屋なんだけど
0115デフォルトの名無しさん
2005/04/14(木) 23:07:22>>106
0116デフォルトの名無しさん
2005/04/14(木) 23:10:11sizeof(char)が1を返すかどうかを決めているのはコンパイラだ。
それが正しいCコンパイラかどうかは決まっていない。
0117デフォルトの名無しさん
2005/04/14(木) 23:14:37C/C++コンパイラではないコンパイラのことまで心配する義理などどこにもない。
っていうと少々語弊があるけど。
0118デフォルトの名無しさん
2005/04/14(木) 23:15:13アホ?
0119デフォルトの名無しさん
2005/04/14(木) 23:20:16極端な奴だな。
おおよそC言語っていうのがほとんどなんだよ。
0120デフォルトの名無しさん
2005/04/14(木) 23:28:440121デフォルトの名無しさん
2005/04/14(木) 23:30:340122デフォルトの名無しさん
2005/04/14(木) 23:32:51ここは初心者歓迎なんで、あなたみたいな人は大歓迎ですよ。
でも、もともと組み込み屋ってことは今は違う仕事してるんですよね?
もしかして無職ですか?
0123デフォルトの名無しさん
2005/04/14(木) 23:36:31たぶん、俺は君より社会的地位が上だと思うよ。
0124デフォルトの名無しさん
2005/04/14(木) 23:40:28後輩に「sizeof(char)ってした方が移植が楽だろ」とかえらそうに言ってるんですか?
0125デフォルトの名無しさん
2005/04/14(木) 23:47:56sizeofしておいたほうが統一性があってよい。
0126デフォルトの名無しさん
2005/04/14(木) 23:58:210127デフォルトの名無しさん
2005/04/15(金) 00:06:320128デフォルトの名無しさん
2005/04/15(金) 00:08:050129デフォルトの名無しさん
2005/04/15(金) 00:10:41なんで?
0130デフォルトの名無しさん
2005/04/15(金) 02:32:29知らなかった。ソースきぼんぬ。
0131デフォルトの名無しさん
2005/04/15(金) 02:38:50とかされる可能性も考えたら?w
0132デフォルトの名無しさん
2005/04/15(金) 02:41:17良く考えたらその通りだ。
0133デフォルトの名無しさん
2005/04/15(金) 11:20:250134デフォルトの名無しさん
2005/04/15(金) 11:22:510135デフォルトの名無しさん
2005/04/15(金) 12:10:55その無駄に豊かな想像力を生かして、あなたは
#define sizeof(t) 3
の可能性も考えた方がいいですね。
0136デフォルトの名無しさん
2005/04/15(金) 13:20:07へー。知らなかった。
0137デフォルトの名無しさん
2005/04/15(金) 14:18:40malloc+memset
ではどっちが速い?
0138デフォルトの名無しさん
2005/04/15(金) 14:36:09実装によるべ。calloc()の方が遅いことは余りないと思うけど。
0139デフォルトの名無しさん
2005/04/15(金) 16:09:32何で自分で計らないのさ?
0140デフォルトの名無しさん
2005/04/15(金) 17:00:05想定すべきは、そうすればなんらかのメリットがある、という行為であって、
全ての場合を想定するなら、定理証明支援システムでも使えばいい。
メリットがない想定はあまり意味がない。
いい加減消えてくれないか。
C言語自体が矛盾を持っているんだから、君の発言は無意味な事が多いんだよ。
0141デフォルトの名無しさん
2005/04/15(金) 18:46:02#include <windows.h>
int main(void)
{
HANDLEhHeap;
LPTSTRlpFilename;
SIZE_TdwBytes = 1024;
hHeap = HeapCreate(0, dwBytes + 1, dwBytes + 1);
lpFilename = (LPTSTR)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwBytes + 1);
GetModuleFileName(NULL, lpFilename, dwBytes);
printf("%s", lpFilename);
HeapFree(hHeap, 0, (LPTSTR)lpFilename);
return 0;
}
Heap関数を勉強しようと思って、自分のフルパスを表示するコードを書いたんですが、
(例外処理を除き)このままではヤバイって所はありますか?
ググってもドキュメントが見つからないのでMSDNだけ見てやったんですが・・
0142デフォルトの名無しさん
2005/04/15(金) 19:33:070143デフォルトの名無しさん
2005/04/15(金) 19:45:13HeapCreate()が返したハンドルはHeapDestroy()すべき。
そもそもGetProcessHeap()を使えばその手間は省ける。
ヒープから外れるけどprintfの%sが受け付けるのはマルチバイト文字列。(const char *とかPCSTR)
UNICODEビルドしたらアウト。tchar.hの_tprintf使え。
0144デフォルトの名無しさん
2005/04/15(金) 20:14:35ありがとうございます。
助かりました。
0145デフォルトの名無しさん
2005/04/15(金) 20:23:28おまいはスレタイが読めんのかと小一時間(ry
0146デフォルトの名無しさん
2005/04/15(金) 20:27:54ボクの目を覚まさせてくれてありがとう!
愛してるよ…
0147デフォルトの名無しさん
2005/04/15(金) 20:28:46最高に頭悪そうな発言してください in ム板 (IV)
http://pc8.2ch.net/test/read.cgi/tech/1108989422/
0148デフォルトの名無しさん
2005/04/15(金) 20:35:49#define char wchar_t
に意味があると考える知的障害者なら
ナニをやるか解ったモンじゃないだろに。
つかネタだったんだが。
>君の発言は無意味な事が多いんだよ。
俺が誰だか解るとは、君はもしや…ノイローゼ?
0149デフォルトの名無しさん
2005/04/15(金) 20:37:16>>140 おまえが消えろよ
0150デフォルトの名無しさん
2005/04/15(金) 22:41:23void*p = malloc(sizeof(size_t) + size);
*(size_t*)p = size;
return (void*)((size_t*)p +1);
とか質問者に教えた方がまだましだったと思うんだけど。
0151デフォルトの名無しさん
2005/04/15(金) 22:42:360152デフォルトの名無しさん
2005/04/15(金) 22:43:350153デフォルトの名無しさん
2005/04/15(金) 22:59:150154デフォルトの名無しさん
2005/04/15(金) 23:47:240155デフォルトの名無しさん
2005/04/16(土) 21:47:30進捗状況を表示させたいと思っています("%d%", int)
この後、前に表示した画面を消去したいと思っています。
printf("\x01b[2J");
みたいな使い方ができるのでしたらお教えください。
また、指定した行数・文字数を消す方法があればお教えください。
// コンパイラ:VC++6
// WindowsXP SP2
/*以下のスレから流れてきました*/
http://pc8.2ch.net/test/read.cgi/tech/1112845322/281-294
http://pc8.2ch.net/test/read.cgi/tech/1066747198/75-76
0156デフォルトの名無しさん
2005/04/16(土) 22:01:520157デフォルトの名無しさん
2005/04/16(土) 22:12:17某のコンパイラの場合はWindows98上でコンパイルするとWindows2000でもエスケープシーケンスが効いてたと思う。
Windows2000上でコンパイルすると何やってもダメだった。
0158デフォルトの名無しさん
2005/04/16(土) 23:19:34レス、ありがとうございますた。
>>156
APIって見たときは「初心者の私には難しそう_| ̄|○」
って感じましたが、ググってみたらいろいろと情報が出てきました。
もう少しいろいろと勉強して、がんばってみたいと思います。
ありがとうございました。
0159デフォルトの名無しさん
2005/04/17(日) 03:07:02RSXNTにVT100/ANSI端末シミュレーションライブラリが同梱されていて
それをリンクすればprintfなどのIO周りをエスケープシーケンス対応
のものに入れ替えることが出来る。VC6とリンクできるライブラリも
入ってたと思う。
0160デフォルトの名無しさん
2005/04/17(日) 18:38:59char*型でないとコンパイラに怒られてしまいます
wchar_tとcharの変換もしくはwifsreamにwchar_t*型を渡す方法を
どなたか伝授してください
0161デフォルトの名無しさん
2005/04/17(日) 18:51:34cstdlibのstd::wcstombs()
あるいはWinAPIのWideCharToMultiByte()
0162160
2005/04/17(日) 19:05:10隊長!wcstombsを使ったらリンカのやつ
basic_stringが既に定義されていますとか言いやがります
どうしたらいいですか?
0163デフォルトの名無しさん
2005/04/17(日) 19:27:35ここで教えて欲しいなら、
エラーメッセージをそのままコピペしろ。
環境もなるべく詳しく書け。
0164デフォルトの名無しさん
2005/04/17(日) 20:57:22クラスのconstメンバ関数が例外を投げるときは、
どのように宣言すればいいのでしょうか?
e.g.
int SetDetails(int d)const, throw(const char*) ;・・・??
0165デフォルトの名無しさん
2005/04/17(日) 21:03:15int GetDetails(int d)const, throw(const char*) ;・・・です。
0166デフォルトの名無しさん
2005/04/17(日) 21:40:32例外 hoge を投げるなら
int GetDetails( int d ) const throw( hoge );
例外を投げないなら
int GetDetails( int d ) const throw();
別に指定しなくても例外は使える。
というか、指定したら、もしGetDatails内で呼び出した別の関数が
hoge以外の例外を送ってきたら、それを再送出しないですむように
実装しないとあかんぞ。
0167デフォルトの名無しさん
2005/04/17(日) 22:01:32> hoge以外の例外を送ってきたら、それを再送出しないですむように
>実装しないとあかんぞ。
了解です。
0168デフォルトの名無しさん
2005/04/17(日) 22:18:20intx = 555 ;
int main( void )
{
cout << "x = " << x << '\n' ;
intx = 333 ;// �@
cout << "x = " << x << '\n' ;
for( int i = 0 ; i < 3 ; i ++ ) {
int x = i * 100 ;
cout << "x = " << x << '\n' ;
//★cout << "::x = " << ::x << '\n' ; //ここで�@を参照するには??
}
cout << "x = " << x << '\n' ;
cout << "::x = " << ::x << '\n' ;
return 0 ;
}
例えばこの時、コメント部分でも書いているのですが、for文の中で、
//�@を参照するにはどのように記述すればいいのですか?
0169デフォルトの名無しさん
2005/04/17(日) 22:19:55ツッコミどころはたくさんあるが、とりあえず質問の答えは、無理。
0170デフォルトの名無しさん
2005/04/17(日) 22:21:14その変数を参照することを指定する記法はない。
だから、ポインタか参照で介さない限り無理。も
0171170
2005/04/17(日) 22:23:240172デフォルトの名無しさん
2005/04/17(日) 22:24:35ご教授、ありがとうございます。
0173デフォルトの名無しさん
2005/04/17(日) 23:10:13しかし、こうやると、イチイチ cout を使うたびもう一度設定しなければ
なりません。
一回設定したら、ずっと有効になるようにしたいのですが、どのようにすれば
よろしいですか?
0174デフォルトの名無しさん
2005/04/17(日) 23:31:19幅は出力のたびに指定するしかない。
ただ、普通はwidth()を使わずマニピュレータを使う。
#include <iomanip>
cout << setw(10) << 10 << endl
<< setw(20) << 20 << endl
<< setw(30) << 30 << endl;
みたいな感じにずらずら続けて出力できる。
0175デフォルトの名無しさん
2005/04/17(日) 23:43:42どうもです。
0176デフォルトの名無しさん
2005/04/18(月) 00:48:15printf("%d", x);
とすると、クラスxのメンバのa(x.a)が表示されるようにするには
どのように記述すればよろしいですか?
0177デフォルトの名無しさん
2005/04/18(月) 00:50:270178デフォルトの名無しさん
2005/04/18(月) 02:12:15仮にクラスxにoperator int()があったとしても、printf()ではPOD型以外は渡せないので
printf("%d", x);
と言うわけには行かない。
0179デフォルトの名無しさん
2005/04/18(月) 20:34:52printf("%d", ( (int)x ) );
でもダメなんでつか?
0180デフォルトの名無しさん
2005/04/18(月) 20:38:15それなら大丈夫。
だが、printf("%d", static_cast<int>(x));推奨。
つーか、括弧多過ぎ。
0181デフォルトの名無しさん
2005/04/18(月) 20:49:370182デフォルトの名無しさん
2005/04/18(月) 21:01:120183デフォルトの名無しさん
2005/04/18(月) 21:12:05printf("%*s",空白の数," ");
0184デフォルトの名無しさん
2005/04/18(月) 21:18:270185デフォルトの名無しさん
2005/04/18(月) 21:29:41おーーありがとうございます!ずっと思い出せなかったのでかなりうれしいです!!
0186デフォルトの名無しさん
2005/04/18(月) 21:31:10非標準じゃないよ。
0187デフォルトの名無しさん
2005/04/19(火) 02:42:03thx!
0188デフォルトの名無しさん
2005/04/19(火) 09:35:17シープラスプラス??激しくアレな人教えてください
はじめからここで聞くべきでしたね ごめんなさい
0189デフォルトの名無しさん
2005/04/19(火) 09:38:51死ねよマルチ
0190デフォルトの名無しさん
2005/04/19(火) 09:42:40どこがマルチなんだ?wキチガイか 氏ね房うざすぎ おまえが氏ね
0191デフォルトの名無しさん
2005/04/19(火) 09:57:38>>189は消防からやり直して氏ねよ
2chのルールだけ気にしすぎて通常の人間の会話が理解できない房決定
0192デフォルトの名無しさん
2005/04/19(火) 12:51:42好きな様に読めば?
0193デフォルトの名無しさん
2005/04/19(火) 13:08:56バイナリ<-->アスキー
変換てどうやるんですか
初期化時にはできるんですが途中からしたいのでお願いします
0194デフォルトの名無しさん
2005/04/19(火) 13:31:03char answer = c++;
std::cout << answer << std::endl;
0195デフォルトの名無しさん
2005/04/19(火) 13:32:17最後の引数が違うなあ。" " じゃなくて "" だ。
0196デフォルトの名無しさん
2005/04/19(火) 15:36:54ある関数の中で例えば int i; と変数定義した場合、
他の関数の中で i=0; などと代入はできませんよね?
でも、他の関数の中でも int i; i=0; とやるとコンパイルできるみたいですが、
この場合、最初に出てきた int i; と他の関数で出てきた int i; は別物と考えればいいんでしょうか?
0197デフォルトの名無しさん
2005/04/19(火) 15:51:440198デフォルトの名無しさん
2005/04/19(火) 16:16:07ありがとうございました。
0199デフォルトの名無しさん
2005/04/19(火) 16:25:180200デフォルトの名無しさん
2005/04/19(火) 16:42:210201デフォルトの名無しさん
2005/04/19(火) 16:42:480202デフォルトの名無しさん
2005/04/19(火) 16:54:39寧ろVC7のディフォルトがVC6と同じなのが気にイラン。
0203デフォルトの名無しさん
2005/04/19(火) 17:14:33}
0204デフォルトの名無しさん
2005/04/19(火) 17:58:36>i+++
スコープ以前に(ry
0205デフォルトの名無しさん
2005/04/19(火) 18:05:530206デフォルトの名無しさん
2005/04/19(火) 18:09:17無理だとしたら何故でしょうか?
0207デフォルトの名無しさん
2005/04/19(火) 18:27:12インスタンスの作成は、テンプレートの特殊化版であっても
通常のクラスと同様に動的生成可能
特殊化版の具現化は、newを使おうが何をしようが
動的には無理。全てコンパイル時に解決されなくてはならない。
0208デフォルトの名無しさん
2005/04/19(火) 18:27:26std::vector<int>* p = new std::vector<int>;
0210デフォルトの名無しさん
2005/04/19(火) 19:28:02スィープラスプラス。一部でシープラプラ。
0211デフォルトの名無しさん
2005/04/19(火) 20:00:330212デフォルトの名無しさん
2005/04/19(火) 20:27:06折りよく「C++の設計と進化」を読んでたんだが、「シープラスプラス」って書いてあった。
0213デフォルトの名無しさん
2005/04/19(火) 21:38:260214デフォルトの名無しさん
2005/04/19(火) 21:39:250215デフォルトの名無しさん
2005/04/19(火) 22:33:430216デフォルトの名無しさん
2005/04/20(水) 06:50:06char str1[80]="こんにちわ";
char str2[80]="8等身です";
とやって、strcpy(str1,str2)に突っ込むと大丈夫なの?
配列を表す名前、str1はstr1の始まるアドレスをさすが、
ポインタではない
という説明をいたるところで見るんだけどstrcpyはchar型配列への
ポインタを引数にとると書いてあるから、配列名じゃだめだろうと
思ってたんだ。
試しに
char *pst1,*pst2;
pst1=str1;
pst2=str2;
とやってstrcpy(pst1,pst2)
とやってみたらstrcpy(str1,str2)と同じ動作をした。
つまり配列の名前はその配列へのポインタとおなじ振る舞いをすると
俺の中で間違った認識が生まれようとしている
おまいらつД`) タスケテクレ !!
0217デフォルトの名無しさん
2005/04/20(水) 06:54:12#include <stdio.h>
#include <string.h>
void main(void)
{
char *str1="こんにちわ";
char *str2="8等身です";
strcpy(str1,str2);
printf("%s",str1);
}
216のが動いて、
これが動かない原因が超絶にわからないのですが…
0218デフォルトの名無しさん
2005/04/20(水) 08:10:210219デフォルトの名無しさん
2005/04/20(水) 08:50:010220デフォルトの名無しさん
2005/04/20(水) 08:53:31配列の名前から値を取り出すと先頭要素ポインタになる
あと、>>217は文字列リテラルに上書きできないという別の問題だね
正確なこと忘れちゃったから微妙に間違っている可能性大w
0221デフォルトの名無しさん
2005/04/20(水) 09:09:28> char str1[80]="こんにちわ";
> char str2[80]="8等身です";
char型の変数80個分の配列を確保し、その個々の変数に文字列「こんにちわ」の各文字を格納する。
char型の変数80個分の配列を確保し、その個々の変数に文字列「8等身です」の各文字を格納する。
>char *str1="こんにちわ";
>char *str2="8等身です";
char型の変数を指すためのポインタ変数を確保し、どこかに確保されている文字列リテラル「こんにちわ」の先頭ポインタ値を入れる。
char型の変数を指すためのポインタ変数を確保し、どこかに確保されている文字列リテラル「8等身です」の先頭ポインタ値を入れる。
これらの処理の、どこに共通性があるんだ?
0222デフォルトの名無しさん
2005/04/20(水) 09:36:580223デフォルトの名無しさん
2005/04/20(水) 10:04:23>つまり配列の名前はその配列へのポインタとおなじ振る舞いをすると
>俺の中で間違った認識が生まれようとしている
正しくは
「式の中に現れた配列名はその配列の先頭要素へのポインタとして評価される」
ただし例外もあるのでややこしい。
詳しくはCFAQでも読め。
0224デフォルトの名無しさん
2005/04/20(水) 10:13:34回答どうもです
回答とCFAQを読んで
配列名は先頭要素のポインタへと成り下がるから
strcpy(配列名,配列名)
が動くことはわかりました。
しかし221さんの仰せられることは理解できますが
char *str1="こんにちわ";
char *str2="8等身です";
strcpy(str1,str2);
としたとき、
str1,str2ははそれぞれ"こんにちは","8等身です"
の先頭を指すポインタとなるから、やはり
strcpy(str1,str2);
は動かないとおかしいと思うのです。
配列名のstr1も後者の文字列リテラルへのポインタとして宣言したstr1
もどちらもポインタで、strcpy()にとられる引数として
文句ないように見えるのですが…
0225デフォルトの名無しさん
2005/04/20(水) 10:23:36の場合は、”こんにちわ”の文字の後ろに70char分空きがあるだけ
0226デフォルトの名無しさん
2005/04/20(水) 10:30:44文字列リテラルはCではchar*, C++ではconst char*
strcpyが通らないのはC++でコンパイルしてるんじゃ?
Cなら通るはずだぞ。
0227デフォルトの名無しさん
2005/04/20(水) 10:36:460228デフォルトの名無しさん
2005/04/20(水) 10:40:56c++でコンパイルしていますが、イマイチよくわかりません
ただ、
char str1[]="こんにちわ";
char *str2="8等身です";
strcpy(str1,str2);
printf("%s\n",str1);
これは通りました
constcharについてすこし調べてみます
引き続き224についてなにか情報がありましたら、よろしくお願いします
0229デフォルトの名無しさん
2005/04/20(水) 10:46:53正しくは「C++ではconst 文字の配列」
ところがCとの互換のため char* への代入が認められている。
で、char* str = "hoge"; としたとき、strを介して文字列リテラルを
書き換えようとしたときの動作は未定義。
実装によってはstrcpyが通るかもしれん。
0230デフォルトの名無しさん
2005/04/20(水) 10:48:170231デフォルトの名無しさん
2005/04/20(水) 10:53:07アホ杉w
0232デフォルトの名無しさん
2005/04/20(水) 10:53:17> しかし221さんの仰せられることは理解できますが
できてないよ。
0233デフォルトの名無しさん
2005/04/20(水) 10:54:26書き換えようとしたときの動作は未定義。
ということは、書き換えられる方は、素直に配列として宣言しておけ
と言うことなのでしょうかね…
結果としてよくわかりませんでしたが次に進んでみることにします
教えてくださった皆さんありがとございました
0234デフォルトの名無しさん
2005/04/20(水) 10:58:14理解できてないでしょうか?
char *str="こんにちわ";
printf("%x\n",str);
も
char str[]="こんにちわ";
printf("%x\n",str);
も、割り当てられているメモリのアドレスにかなり距離がありますが、
どちらもアドレスが出力されるのですが…
0235デフォルトの名無しさん
2005/04/20(水) 11:02:18同じ内容の文字列リテラルは記憶領域を共有する可能性があるから、
文字列リテラルを書き換えるとロクなことにならない。
C では、おそらくこれくらいの曖昧な理由しかないが、 C++ では、
const なオブジェクトを書き換えることになり、明確に未定義動作となる。
プログラムの動作を保証したいのであれば、
同じ型のポインタでも、指している先の記憶領域が
リテラルであるかどうかは意識する必要がある。
0236デフォルトの名無しさん
2005/04/20(水) 11:02:450237デフォルトの名無しさん
2005/04/20(水) 11:09:55出直してきます
0238デフォルトの名無しさん
2005/04/20(水) 11:15:12>>234氏はたぶん理解してるでしょ。
ちなみに、
char *str1="こんにちわ";
char *str2="8等身です";
strcpy(str1,str2);
printf("%s",str1);
BCCはこれを通すな。いいんかw
0239デフォルトの名無しさん
2005/04/20(水) 11:17:140240193
2005/04/20(水) 11:24:03FILEでなくストリーム(fstream)なんです…
ストリームにされてるファイル名を意識しないようにしたいので
開きなおすことはできないんです
あとモードを変更した後もファイルポインタは開きなおす前と
同じ位置をポイントしている必要があるんですが
開きなおしによってバイナリ/アスキー変更した場合だと
ファイルポインタの位置を復元することができません('\n'の関係で)
0241234
2005/04/20(水) 11:31:11未定義のことはさせないほうが良いという結論に達しました
int i = 3;
i = i++;
が7になることもあるんですね
ありがとうございます
0242デフォルトの名無しさん
2005/04/20(水) 11:43:460243デフォルトの名無しさん
2005/04/20(水) 11:49:29出来てない。
一番の違いは、そのポインタ値が示す先にあるオブジェクト。
配列の中身は書き換える事が可能だが、
文字列リテラルは書き換えが出来ないオブジェクト。
ちなみに、リテラルは「定数」の事。
1 = 2;
が出来ないのと、根本的な理由は一緒。
0244デフォルトの名無しさん
2005/04/20(水) 11:58:40char a[80]="文字列";
は aに "文字列" がコピーされるの
つまり
char a[80];
strcpy(a,"文字列");
と等価
char* b="文字列";
とはぜんぜん違う。
0245デフォルトの名無しさん
2005/04/20(水) 13:14:55http://park15.wakwak.com/~o0o0o0o0/bokumetsu/
0246デフォルトの名無しさん
2005/04/20(水) 14:33:110247デフォルトの名無しさん
2005/04/20(水) 17:24:52お前はそんなに領域破壊がしたいのか
0248234
2005/04/20(水) 18:01:18なるほどでも
char a[80];
strcpy(a,"文字列");
char* b="文字列";
としたあとにaもb同様にアドレスをさすじゃないですか
char *a="あああ"
char *b="いいい"
この場合もaもbもアドレスをさしますよね
その結果何故strcpy(a,b)として領域破壊が起こるのか未だに
理解できません、、、
定義されていない動作かとおもいましたが
aもbもポインタそのもののはずです
0249デフォルトの名無しさん
2005/04/20(水) 18:02:42ちゃんと嫁よマジで
0250234
2005/04/20(水) 18:03:14自動的に文字列リテラルとなり、書き換え不能となるのでしょうか?
それなら納得がいくのですが…
0251234
2005/04/20(水) 18:14:17すみません
さらに調べてみると
ポインタで宣言したchar *b="いいい"は静的記憶領域に
記憶されることがわかりました。
たぶんwindowsのメモリ領域のヒープとなんかのことだと思いますが、
つまり書き換え不可能で、書き換えようものならばセグメンテーション
フォールトを起こして落ちてしまうようです。
char a[]="あああ";
の場合は書き換え可能な領域(0x4000番地?)に確保されるため、
書き換え可能なので、strcpyの第一引数としてokで
ファイナルアンサーでしょうか
0252デフォルトの名無しさん
2005/04/20(水) 18:22:58書き換え可能だが第一引数としてダウト
0253デフォルトの名無しさん
2005/04/20(水) 18:23:520254234
2005/04/20(水) 18:24:13つまりstrcpy(a[],b)じゃなくてstrcpy(a,b)です。
0255デフォルトの名無しさん
2005/04/20(水) 18:24:260256234
2005/04/20(水) 18:25:45未定義のもの、意図しない動作ではあるが論理的に正しいモノは
通ることがわかりました。
今後アプリを作っていく上で意識しながらやっていこうと思っています。
0257デフォルトの名無しさん
2005/04/20(水) 18:52:06┌─┬─┬─┬─┬─┬─┬─┐
│ あ │ あ │ あ. │\0│
└─┴─┴─┴─┴─┴─┴─┘
↑
「確保」 されるのはこの領域
char *b = "いいい";
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┐
│ ========================>※│ い │ い │ い. │\0│
└─┴─┴─┴─┘ 参照 └─┴─┴─┴─┴─┴─┴─┘
↑
「確保」 されるのはこの領域
char *b = "いいい"; の時点で※の領域が確保されるわけではない。
確保されるのは char *b 分の領域のみ。
※の領域はプログラム起動時にメモリ上のどこかに配置される。
どこに配置されるかは処理系依存。
ちなみに変数のアドレスを printf("%p\n", b); で表示するのは間違い。
正しくは & 演算子を使う。
printf("%p, %d\n", &a, sizeof(a));
printf("%p, %d\n", &b, sizeof(b));
0258デフォルトの名無しさん
2005/04/20(水) 19:03:02ポインタに変換されるんだから&なしでも%pは平気だと思うが。
0259デフォルトの名無しさん
2005/04/20(水) 19:12:45printf("%p %p\n", b, &b);
0260デフォルトの名無しさん
2005/04/20(水) 19:49:16あんたがぐだぐだ言ってるからおれまで混乱してきた
謝罪と賠償を求める
0261デフォルトの名無しさん
2005/04/20(水) 19:55:140262デフォルトの名無しさん
2005/04/20(水) 20:47:11スマソ
bはchar配列だと思っていた。
0263デフォルトの名無しさん
2005/04/20(水) 22:11:16perlなら「'-' x 20」って一発で書けちゃうような処理ですけど
char c='-';
string s;
while (cnt--)
s += c;
return s;
仕方なくこんな関数書いたんですけど、
標準ライブラリにこんな処理する関数無かったっけ?
0264デフォルトの名無しさん
2005/04/20(水) 22:22:07これだけでいいだろ
0265デフォルトの名無しさん
2005/04/20(水) 22:25:380266デフォルトの名無しさん
2005/04/20(水) 22:26:45std::string hoge( 20, '-' );
または
std::string hoge;
hoge.assign( 20, '-' );
0268デフォルトの名無しさん
2005/04/20(水) 22:27:41うげー…、そんなのあったのか、サンクス…
0269デフォルトの名無しさん
2005/04/20(水) 22:32:02memset(s, 20, '-');
0270デフォルトの名無しさん
2005/04/20(水) 22:35:37size_t len = 20;
char c = '-';
string s;
s.insert(s.begin(), len, c);
return s;
0271デフォルトの名無しさん
2005/04/21(木) 00:08:43int a[ 4 ];
int *b;
とした時、b=a, b++, b+1, はOKでa=b, a++はエラーとなる。
ここまでは良いんですが、
a + 1 がOKと書いてあり、その理由が分かりません。
配列aに1を加えると言うのもどう言う事なのか…
どなたが教えてください。
0272デフォルトの名無しさん
2005/04/21(木) 00:12:190273デフォルトの名無しさん
2005/04/21(木) 00:22:39ctype にあるわけなかろ
0274デフォルトの名無しさん
2005/04/21(木) 01:12:430275デフォルトの名無しさん
2005/04/21(木) 01:20:41質問の意味がわからんのだが、
例えば
int a[3]
があった場合、aと&a[0]の違いか?
値は一緒。でも型が違うので動作が違う。
0276デフォルトの名無しさん
2005/04/21(木) 01:38:33printf("%p %p\n", a, a + 1);
printf("%p %p\n", &a, &a + 1);
0277デフォルトの名無しさん
2005/04/21(木) 01:38:38レスどうも。
>>でも型が違うので動作が違う。
ここのところをもう少し詳しくご教授いただけますか。
0278277
2005/04/21(木) 01:42:51>>276見てわかりました。どうもありがとうございました。
0279デフォルトの名無しさん
2005/04/21(木) 01:59:14275と276は流れが違うけど。
どうせなら、
printf("%d %p %p\n", sizeof(&a[0]),&a[0], &a[0]+1);
printf("%d %p %p\n", sizeof(a),a, a + 1);
printf("%d %p %p\n", sizeof(&a),&a, &a + 1);
を動かしてみな。
0280デフォルトの名無しさん
2005/04/21(木) 06:42:41出来るだけ移植性の高いものがいいですが、gccだけで使えるものでもかまいません。
0281デフォルトの名無しさん
2005/04/21(木) 07:17:450282デフォルトの名無しさん
2005/04/21(木) 08:07:550283デフォルトの名無しさん
2005/04/21(木) 10:34:04ttp://www.st.rim.or.jp/~phinloda/cqa/cqa17.html
ここの一番最初嫁
0284デフォルトの名無しさん
2005/04/21(木) 10:41:20char*とstringに入れるにはどうすればいいのですか?
0285デフォルトの名無しさん
2005/04/21(木) 10:48:06string moge;
copy(hoge.begin(), hoge.end(), inserter(moge, moge.end());
0286デフォルトの名無しさん
2005/04/21(木) 10:48:56ifstream input;
vector<char> v((istreambuf_iterator<char>(input)),istreambuf_iterator<char>());
char* p = &v[0];
string s(v.begin(),v.end());
v.push_back('\0');
0287286
2005/04/21(木) 10:51:21ifstream input;
vector<char> v((istreambuf_iterator<char>(input)),istreambuf_iterator<char>());
v.push_back('\0');
char* p = &v[0];
string s(v.begin(),v.end()-1);
0288284
2005/04/21(木) 11:54:03返答ありがとうございます。
0289デフォルトの名無しさん
2005/04/21(木) 13:37:34private変数の数だけpublic関数が増えてしまいます。↓こんな感じ。
class foo {
int a;
int b;
public:
int GetA(); //private変数の数だけpublic関数を用意する
int SetA();
int GetB();
int SetB();
};
これでいいんですか? もしくは、漏れは次にどんな本を読めばいいんでしょうか。
C++の文法自体は一通り覚えました。
0290デフォルトの名無しさん
2005/04/21(木) 14:16:38ならば次は本ではなく実践、足りないと思ったらまた本読む
0291デフォルトの名無しさん
2005/04/21(木) 14:30:250292デフォルトの名無しさん
2005/04/21(木) 14:51:09設計を見直せ。
クラスの内部だけで必要な情報ならパブリックなセッタゲッタは必要ないはずだ。
0293デフォルトの名無しさん
2005/04/21(木) 16:18:160294デフォルトの名無しさん
2005/04/21(木) 16:33:32コードは長いので2回に分けて書きます
void mo12(void){
char str12[5]={0};/*結果を入れてもらう変数*/
int strbl;/*strlenghtの結果を入れる為の変数*/
putchar('\n');
for(;1;){
printf("\t文字を入力してください(zで終了):");
try{
gets(str12);/*値を取得してstr12に格納*/
}catch(...){
printf("エラー");
break;
}
0295デフォルトの名無しさん
2005/04/21(木) 16:34:25//str12[0]='z';
strbl=strlen(str12);//文字の最大数を測定
//元の値の表示
if(strbl>5){er=-3;error1(&er);break;}
putchar('\t');
for(i=0;i<strbl;i++){printf("%X ",str12[i]);}
printf("が入力されました\n\t");
for(count=0;count<strbl;count++){
er=mondai12(str12,count);/*文字をHEXコードに変換し、上位ビットと下位ビットを入れ替える関数*/
if(er<0){/*エラー処理*/error1(&er);}else{
//結果の表示
if(count==0){/*最初のみ表示*/printf("上位ビットと下位ビットを入れ替えると");}
printf("%X ",er);
}
}
printf("\n\n");
for(count=0;count<strbl;count++){/*大文字か小文字のzを検索該当する値があれば-5をerに代入*/
if(str12[count]==0x7a||str12[count]==0x5a){
er=-5;}
}
if(er==-5){break;}
}
}
0296デフォルトの名無しさん
2005/04/21(木) 16:40:35おーい、向こうのスレに書かれていたレスは読んだのか?
0297デフォルトの名無しさん
2005/04/21(木) 16:42:42すみません、移動します(汗
0298デフォルトの名無しさん
2005/04/21(木) 16:42:51そんなことするより素直にgets()を捨てればいいのに。
0299デフォルトの名無しさん
2005/04/21(木) 16:44:27str = "(0,1,2,3,4,5)";
int ParseStart = strcspn(str,"(");
int ParseEnd = strcspn(str,")");
char *p = strchr(str,'(') + 1;
char *q = new char[ParseEnd-ParseStart-1];
strncpy(q,p,ParseEnd-ParseStart-1);
strの[(]と[)]に挟まれた部分[0,1,2,3,4,5]を抜き出したいのですが、
上記のような記述でもうまくいかないので、やり方があれば教えてください。
0300デフォルトの名無しさん
2005/04/21(木) 16:48:34char * str = "(0,1,2,3,4,5)":
char * buf = new char[strlen(str)];
sscanf(str, "(%[^)])", buf);
printf("%s\n", buf);
delete[] buf;
// C++ならC++らしく書くべきだとは思うのだけど。
0301デフォルトの名無しさん
2005/04/21(木) 16:51:24#include <stdio.h>
int main()
{
char *str = "(0,1,2,3,4,5)";
char r[32];
sscanf(str,"(%[^)]s)",r);
printf("%s\n",r);
return 0;
}
0302デフォルトの名無しさん
2005/04/21(木) 17:04:00できました!
どうもありがとうございました。
0303デフォルトの名無しさん
2005/04/21(木) 21:24:25C言語でのインラインアセンブラ用の命令を解説しているHP、
またはweb, VCのMSDNライブラリ用の検索語を教えてもらえませんか?
0304デフォルトの名無しさん
2005/04/21(木) 21:29:310305デフォルトの名無しさん
2005/04/21(木) 21:29:340306デフォルトの名無しさん
2005/04/21(木) 21:31:56http://developer.intel.com/design/pentium4/manuals/index_new.htm
0307デフォルトの名無しさん
2005/04/21(木) 21:49:25>>303の紹介してくださったページを読んできます。
0308デフォルトの名無しさん
2005/04/22(金) 00:28:59xalloc で例外処理をキャッチするみたいな事が本に載っていたのですが、
new.h をインクルードしてやってみても、xalloc の部分でエラーが出ます。
except.h exception.h 、共にありませんでした。
ちょっと、わかりにくいかもしれませんが、どうすればいいんでしょうか?
ご存知の方 Help !!
0309デフォルトの名無しさん
2005/04/22(金) 00:34:55それは昔のコムパイラかと
今はstd::bad_alloc(だっけ)
0310デフォルトの名無しさん
2005/04/22(金) 00:52:46これから色々テストしてみたいと思います。
0311デフォルトの名無しさん
2005/04/22(金) 01:54:17下のプログラムを考えたときに、aaaでprintfで答えが出るのに
main関数では答えは 2 3 とならずに 1 1 に戻ってしまいます。
どうすればmain関数で 2 3 となるんですか?
#include<stdio.h>
void aaa(int a,int b)
{
a=a*2;
b=a*3;
printf("%d %d\n",a,b);
}
int main(void)
{
int a=1;
int b=1;
aaa(a,b);
printf("%d %d",a,b);
return 0;
}
0312デフォルトの名無しさん
2005/04/22(金) 01:56:362.aaa()を呼び出しているところを直せ
以上
0313デフォルトの名無しさん
2005/04/22(金) 01:59:24Cの関数は値渡し。
aaa()の引数をポインタにすればいい。
以上の話がわからなかったら入門書をよく読め。
0314デフォルトの名無しさん
2005/04/22(金) 01:59:34すみません。どのように直せばいいのでしょうか?
0315デフォルトの名無しさん
2005/04/22(金) 02:01:05aaa関数の関数定義は引数が値渡しになっているのでmain関数のa,bとaaa関数でのa,bは別のメモリ領域を指していることになるからです。
0316デフォルトの名無しさん
2005/04/22(金) 02:03:57アセンブリ言語を調べてみなさい。
Cソースをコンパイルすると、どのようなアセンブリソースになるのかということを知りなさい。
関数呼び出しの仕組みだけでなく、Cの理解がより深まることでしょう。
0317デフォルトの名無しさん
2005/04/22(金) 02:06:54できれば直していただきたいのですが。
0318デフォルトの名無しさん
2005/04/22(金) 02:07:57まともな入門書なら「値渡し」とは何か
しっかり解説してるはずだが。
0319デフォルトの名無しさん
2005/04/22(金) 02:08:04{
*a=*a*2;
*b=*a*3;
printf("%d %d\n",*a,*b);
}
aaa(&a,&b);
0320デフォルトの名無しさん
2005/04/22(金) 02:10:33ま、直してみたところで「2 6」と出力されるわけだが。
#include<stdio.h>
void aaa(int *a, int *b) {
*a = *a * 2;
*b = *a * 3;
printf("%d %d\n", *a, *b);
}
int main(void) {
int a = 1, b = 1;
aaa(&a, &b);
printf("%d %d", a, b);
return 0;
}
0321デフォルトの名無しさん
2005/04/22(金) 02:11:25ありがとうございます。
>318
入門書持ってません。今度買ってみます。
0322デフォルトの名無しさん
2005/04/22(金) 02:12:12ありがとうございます。
0323デフォルトの名無しさん
2005/04/22(金) 05:54:19private:
〜
public:
〜
private:
〜
のようにprivateが2回出てきたりしてるソースがあるのですが、
これって別にc++の文法的とか構文的な意味があるわけではなくて、
ただメンバの役割的に見た目上でグループ分けしたかったりしたいだけですよね?
(また、自分がそうしたいなら別にどこにどんな順序で何回書いてもいいんですよね?)
0324デフォルトの名無しさん
2005/04/22(金) 06:21:14入門書も持たんと何をやろうってんだ愚か者が・・・
0325デフォルトの名無しさん
2005/04/22(金) 06:23:08private、protected、publicはそれ以後別の指定が出るまではそのレベルのメンバだって示すだけだし、
一つのクラス宣言中に一回しか書いちゃいけないなんて決まりも無いから何回書こうが勝手
まぁ、あまり何度も出ると見難いけどな
0326デフォルトの名無しさん
2005/04/22(金) 06:50:01なさいじゃねーよ。何勘違いしてんだよ偉そうに。
たまにいるんだよなーこういう勘違い野郎。
教える教えられるという関係性以前に
他人様と話をしてる事を忘れてんじゃねーよバカが。
0327デフォルトの名無しさん
2005/04/22(金) 06:51:260328デフォルトの名無しさん
2005/04/22(金) 09:51:20この!=の使い方はどういうことでしょうか。
if文でもないのに比較演算子が…教えてくださいお願いします。
例として簡単な他の使用例なんかも教えていただけると助かります。
ちなみにこの関数は
・成功すると、要求したデータ (32 ビット値) が返ります。
・失敗すると、0 が返ります。
だそうです。
hoge = (GetWindowLong(hWnd, DWL_DLGPROC) != 0);
0329デフォルトの名無しさん
2005/04/22(金) 09:53:540330328
2005/04/22(金) 09:57:00何か今まで無意識に使ってました。
0331デフォルトの名無しさん
2005/04/22(金) 10:49:49__property int A = {read = GetA, write = SetA};
みたいな書き方ができると便利なんですが・・・。
0332デフォルトの名無しさん
2005/04/22(金) 11:31:48自前プリプロセッサ作れ
0333デフォルトの名無しさん
2005/04/22(金) 11:48:49__declspec( property(ほげほげ))
0334デフォルトの名無しさん
2005/04/22(金) 12:43:21VC にプロパティあるだろ。
0335デフォルトの名無しさん
2005/04/22(金) 14:31:27また、そのメリットって何なのでしょうか?
0336デフォルトの名無しさん
2005/04/22(金) 14:37:26勝手に生成されないようにできる。
例えばSingletonではインスタンスが勝手に作られては困るのでコンストラクタをprivateにし
インスタンス取得用のstaticメンバ関数を用意するとか。
0337デフォルトの名無しさん
2005/04/22(金) 15:21:29ちょっとした例があるな。
0338デフォルトの名無しさん
2005/04/22(金) 16:24:560339デフォルトの名無しさん
2005/04/22(金) 16:36:11ご教授ありがとうございました。
0340デフォルトの名無しさん
2005/04/22(金) 16:39:100341デフォルトの名無しさん
2005/04/22(金) 17:38:170342デフォルトの名無しさん
2005/04/23(土) 00:25:26{
int t;
t = *a;
*a = *b;
*b = t;
}
void swap(int *a, int *b)
{
int *t;
t = a;
a = b;
b = t;
}
上の関数だと引数の値が入れ替わるのに、
下の関数だと入れ替わらないのはなぜですか?
0343デフォルトの名無しさん
2005/04/23(土) 00:26:38上はポインタじゃなくて値そのものを代入しているから。
0344デフォルトの名無しさん
2005/04/23(土) 00:28:04void swap(int **a, int **b)
にして、ポインタを入れ替えれば変わるぞ。
0345デフォルトの名無しさん
2005/04/23(土) 00:30:370347デフォルトの名無しさん
2005/04/23(土) 00:39:480348デフォルトの名無しさん
2005/04/23(土) 00:43:200349341
2005/04/23(土) 00:44:290350342
2005/04/23(土) 00:45:450351デフォルトの名無しさん
2005/04/23(土) 00:45:470352デフォルトの名無しさん
2005/04/23(土) 00:50:02とりあえずメモリの状態を図に書いて一つ一つ追っていくとか
そういうとこから始めてみるのがいいと思うんだ
0353デフォルトの名無しさん
2005/04/23(土) 00:53:01何か良い方法はないでしょうか
0354デフォルトの名無しさん
2005/04/23(土) 01:14:22http://www.fides.dti.ne.jp/~oka-t/libraries.html#regexp はどうだ?
0355デフォルトの名無しさん
2005/04/23(土) 01:17:010356デフォルトの名無しさん
2005/04/23(土) 01:20:170357デフォルトの名無しさん
2005/04/23(土) 01:21:15ネットワークプログラミング相談室 Port13
http://pc8.2ch.net/test/read.cgi/tech/1109793931/
0358デフォルトの名無しさん
2005/04/23(土) 01:25:42COMのVBScript.RegExpとか
0359デフォルトの名無しさん
2005/04/23(土) 03:11:41うわっ、本当にレス返してやがった。
#include <stdio.h>
void swap(int **a, int **b)
{
int *t;
t = *a;
*a = *b;
*b = t;
}
int main(void)
{
int i = 123, j = 456, *a = &i, *b = &j;
printf("交換前 i = %d, j = %d\n", *a, *b);
swap(&a, &b);
printf("交換前 i = %d, j = %d\n", *a, *b);
return 0;
}
0360目の前は壁だらけ・・
2005/04/23(土) 06:51:31どうしても気持ち悪くて前に進めないので誰か助けてください。
ファイル入出力で
if(NULL == (fp = fopen("ファイル名","r")){
printf("オープンエラー\n");
return EXET_FAILURE;
}
と普通にソースコードが書かれている参考書しか見当たらないのですが
条件式を書く部分にファイルオープンの関数が入っていて
条件式としてだけでなくその関数が動いている??
文法的に理屈を説明できる人がいれば、ずっと気持ちが悪いので助けてください・・
0361デフォルトの名無しさん
2005/04/23(土) 08:27:22まずfp = fopen("ファイル名","r")の式が実行される。
つまりfopenの戻り値をfpに代入しているわけだな。
= (代入演算子)は代入した値(この場合fopenの戻り値)が演算子の結果となるので、それをNULLと比較している。
その書き方は真似するな。せめてif ((fp = fopen("ファイル名", "r") == NULL) {にしろ。
俺はこうしているが好きにしろ。
FILE *fp = fopen();
if (!fp)
0362デフォルトの名無しさん
2005/04/23(土) 08:59:55ポインタも入れ替えできるよ
実際それも入れ替わってる
値が入れ替わらないのはあたりまえ
0363デフォルトの名無しさん
2005/04/23(土) 10:25:560364デフォルトの名無しさん
2005/04/23(土) 10:29:370365デフォルトの名無しさん
2005/04/23(土) 11:11:16なにが原因なのか教えていただけると助かります。
gccとvcでやってみたのですがどちらも期待どおりの動作をしませんでした
// printf("%s\n", (itostr(10)).str);
itostrの引数を定数にするとvcでは期待した結果が得られました
#include <stdio.h>
typedef struct {
char str[20];
} ITOSTR ;
ITOSTR itostr(int i) {
ITOSTR its;
sprintf(its.str, "%d", i);
return its;
}
int main()
{
int i;
for (i = 0; i < 10; i++)
printf("%s\n", (itostr(i)).str);
return 0;
}
0366365
2005/04/23(土) 11:19:34vc7.1
です、よろしくお願いします
0367デフォルトの名無しさん
2005/04/23(土) 11:28:15漏れの VC6、VC7.1、VC8β、BCC 5.5.1 では動くよ
0368デフォルトの名無しさん
2005/04/23(土) 11:32:39拡張子は .c でよろしくお願いします。
0369デフォルトの名無しさん
2005/04/23(土) 11:43:53通った。
追記。VC4 でも OK。
0370デフォルトの名無しさん
2005/04/23(土) 11:53:10vc7.1でコンパイルする時に/O2オプションをつけていたのが原因でした
gccのほうはMinGWを使ってるのが原因なのから不明です・・・
0371デフォルトの名無しさん
2005/04/23(土) 12:16:01だとしたらオプションしだいで想定どおり動いたとしても間違ったプログラムということになる。
ま、このスレは環境依存OKだからそれでもいいのかもしれんけど。
0372デフォルトの名無しさん
2005/04/23(土) 12:24:25一時オブジェクトの寿命は完全式(だったかな?名前忘れた)の終わりまで。
つまりこの場合はprintf()の呼び出しが終わった後に破壊される。
0373デフォルトの名無しさん
2005/04/23(土) 12:29:05a == (b = c)
の形の比較は、>361の言う通り。
(b = c)ではまず代入が処理され、代入後のbが値として返る。
それとaとを比較する事になる。
(b = c)は、bにcを代入し、bの値を返す式、なわけ。
fopenは、ファイルを開き、開いたファイルへのポインタを返す。
書かれたのがどこであろうと、fopenは常にこの両方を行なう。
a == (b = c)で、比較だけでなく代入操作も行なわれるのと理屈は同じ。
ちなみに、a = ++b;とか書くと、aへの代入とbのインクリメントが両方行なわれたりもする。
0374デフォルトの名無しさん
2005/04/23(土) 12:34:06と言いたい。
0375デフォルトの名無しさん
2005/04/23(土) 15:19:47そんな本捨てろ。
文脈として、
if ((fp = fopen(...)) == NULL) {
...;
}
の方が読み易いだろ?
まぁ私は
fp = fopen(...);
if (fp == NULL) {
...;
}
とするが。
0376デフォルトの名無しさん
2005/04/23(土) 15:48:30> if ((fp = fopen(...)) == NULL) {
> ...;
> }
> の方が読み易いだろ?
主観的な事だからなんとも言えないww
> まぁ私は
> fp = fopen(...);
> if (fp == NULL) {
> ...;
> }
> とするが。
無駄に冗長。短いほうが良い。
0377デフォルトの名無しさん
2005/04/23(土) 15:54:08冗長
0378デフォルトの名無しさん
2005/04/23(土) 15:54:580379デフォルトの名無しさん
2005/04/23(土) 16:13:170380デフォルトの名無しさん
2005/04/23(土) 16:19:06vc7.1では空の文字列が表示されて
gcc3.3.3では意味不明文字が表示されました、これであなたから納得できる回答がえられるのかな?
0381デフォルトの名無しさん
2005/04/23(土) 16:19:300382デフォルトの名無しさん
2005/04/23(土) 16:47:180383デフォルトの名無しさん
2005/04/23(土) 18:21:53比較するときに定数の方を左に書くと間違って代入してしまうことがなくてよいという説もある。
見易さに対する意見としては同意だし、この場合には==と=を間違っても代入にはならんけど。
確かgccだとifとかwhileの条件の中で代入すると警告でなかったっけ?(オプションかも)
0384デフォルトの名無しさん
2005/04/23(土) 18:24:24>>360のような書き方って醜いだけで全然意味がないと思う。
0385デフォルトの名無しさん
2005/04/23(土) 18:28:3317: warning: format argument is not a pointer (arg 2)
g++ なら出ない。
関数から構造体を返したときの扱いが C と C++ で違うみたいだな。
ちょっと調べてみよう。
0386デフォルトの名無しさん
2005/04/23(土) 18:52:06定数を比較演算子の右側に置くのは両辺が変数のときに破綻する。
>>376
C++/C99なら>>361のように宣言ついでに初期化すれば冗長ではない。
0387デフォルトの名無しさん
2005/04/23(土) 18:55:59それじゃ意味が変わっちゃってるな。
「"=="と間違えて"="と入力するのを防ぐために定数を比較演算子の右側に
置く意義は、両辺が変数のときに破綻する。」
0388デフォルトの名無しさん
2005/04/23(土) 19:01:050389デフォルトの名無しさん
2005/04/23(土) 19:08:31頭悪いなお前。単にURI貼ればボロも出なかったのに。
0390デフォルトの名無しさん
2005/04/23(土) 19:12:410391385
2005/04/23(土) 19:25:28調べてきた。
ttp://www-ccs.ucsd.edu/c/express.html ("array lvalue expression")
ttp://www.kuzbass.ru/docs/isocpp/conv.html#conv.array
配列からポインターへの変換が、
Cでは配列型の左辺値のみに起こり、
C++では右辺値でも起こることになってるみたい。
ここで itostr の戻り値は右辺値なので、可変長引数の領域には
Cでは char [20] がまるごとコピーされて格納され、
C++では char* が格納されることになる。
gcc で警告されたのも納得できる。
それぞれのアセンブリ出力も取ってみたが、
この違いを反映したものになった。
0393デフォルトの名無しさん
2005/04/23(土) 20:59:57URIIIIIIIIIIIIIIIII
0394デフォルトの名無しさん
2005/04/23(土) 22:15:45Uniform Resource Locator
0395デフォルトの名無しさん
2005/04/23(土) 22:25:46頭悪いな
0396デフォルトの名無しさん
2005/04/23(土) 22:35:240397デフォルトの名無しさん
2005/04/23(土) 22:45:20バカ杉
0398デフォルトの名無しさん
2005/04/24(日) 05:55:29inet_ntoa(inaddr)で変換したときに、255.255.255.255って表示させて
みたいんですけど、うまくいきません。
ためしたのは
IN_ADDR inaddr;
u_long sss=(u_long)0xffffff;
strcpy(&inaddr.S_un.S_addr,(char)sss);
です。
よろしくお願いします。
0399デフォルトの名無しさん
2005/04/24(日) 05:56:43とでます。
ちゃんとキャストしてるつもりなのですが…
0400デフォルトの名無しさん
2005/04/24(日) 07:00:00なんでそこで strcpy() なの?
0401デフォルトの名無しさん
2005/04/24(日) 08:22:33memcpy(&inaddr.S_un.S_addr, &sss, sizeof (u_long));
0402デフォルトの名無しさん
2005/04/24(日) 08:58:21>400
char型にしてstrcpyで無理矢理入れてしまえるかと浅はかな考えで
思いつきました。
>401
ネットワーク関連では構造体がいろいろでてきて卒倒しそうでしたが
一つ一つ地道に理解してゆく上での手助けとなりました。
ありがとう
0403デフォルトの名無しさん
2005/04/24(日) 14:26:100404デフォルトの名無しさん
2005/04/24(日) 16:48:49言わなくていいことをわざわざ口に出さないではいられない奴って。
死ねばいいのに。
0405デフォルトの名無しさん
2005/04/24(日) 16:51:05おまえもなー
0406デフォルトの名無しさん
2005/04/24(日) 16:52:010407デフォルトの名無しさん
2005/04/24(日) 16:57:17それも知らず下手に作るとデータ壊れるぞ
0408デフォルトの名無しさん
2005/04/24(日) 17:00:580409デフォルトの名無しさん
2005/04/24(日) 17:03:25発見次第これからも仕返しとして言わなくていいことを言わせてもらおうと思う。
403みたいな糞は、頭に浮かんでしまった言葉が
人を傷つける言葉だと分かっているのに
自分の中にとどめておくことがストレスになるから
口に出さずにはいられなくなってしまうという、
アナル小さい病と潔癖症の合併症。
0410デフォルトの名無しさん
2005/04/24(日) 17:05:14「プログラマー向いてないと思う」とか言ってしまう糞バカ。
質問スレなのに。
こういうバカはプログラマーの前に人間に向いてないから死ねばいいと思う。
0411デフォルトの名無しさん
2005/04/24(日) 17:17:16先を越されるのが怖いから他人の勉強に足止めを食らわせたいって
素直に言えよバカ。
0412デフォルトの名無しさん
2005/04/24(日) 17:18:180413デフォルトの名無しさん
2005/04/24(日) 17:21:41だからぁ、2chでその程度で一々傷つく方がどうかしているって事実に気付けよ。
ここはそう言う乗りの場所。被害者面して荒らして回る方がよっぽど迷惑だぞ。
そうだな、他人を糞呼ばわりしたかどであんたも人間止めてみたらどうだ?
0414デフォルトの名無しさん
2005/04/24(日) 17:26:560415デフォルトの名無しさん
2005/04/24(日) 17:29:01いつも自分がそれにあわせることに汲々として
それが絶対だと信じて疑わない、おてて繋いで一斉ゴール教育の被害者。
0416デフォルトの名無しさん
2005/04/24(日) 17:32:140417デフォルトの名無しさん
2005/04/24(日) 17:36:040418デフォルトの名無しさん
2005/04/24(日) 17:39:480419デフォルトの名無しさん
2005/04/24(日) 17:41:270420デフォルトの名無しさん
2005/04/24(日) 17:45:11バカの常套句。
0421デフォルトの名無しさん
2005/04/24(日) 17:47:550422デフォルトの名無しさん
2005/04/24(日) 17:58:35はははははははっはははっはは
あっはっはっはっはっはっは
うわっはっはっはっはっはっは
ケケケケケケケケケ
うけけけけけけけけけけk
彼の帰った後、部屋の雰囲気が何か違うことに気づいた。違和感がある。
テーブルだ。いつの間にかテーブルの上に見慣れた花瓶が置いてあった。
チッ チッ チッ ゴォーン 柱時計が午後4時を告げる。
はっ・・・・・・・・・その時 私は気づいた。
彼の話はすべて事実だったのだ・・と。
いや、だからさ、おちけつだとか必死だとか言ってる奴は、騙されたと思って、豆類、ちりめんじゃこなどの小魚、レバー、乳製品、卵黄、カシューナッツ、ごま、そば、たけのこ、ブロッコリー、バナナなどにも多く含まれています。
0424423 ◆yBEncckFOU
2005/04/24(日) 18:03:140425デフォルトの名無しさん
2005/04/24(日) 18:03:300426デフォルトの名無しさん
2005/04/24(日) 18:07:24の議論は有益だと思うがなああ
0427デフォルトの名無しさん
2005/04/24(日) 18:11:060428デフォルトの名無しさん
2005/04/24(日) 18:25:160429デフォルトの名無しさん
2005/04/24(日) 18:34:350430デフォルトの名無しさん
2005/04/24(日) 18:36:52int kaijo( int n)
{
int ans;
ans = 1;
for( ; n > 0; n--)
{ ans *= n;}
return ans;
}
と、しても上手く行ったのですが繰り返し部分を
while( n-- > 0)
{ ans *= n}
に変えるとコンパイルはできますが実行するとエラーとなります。
ためしにwhile(n-->1)にするとあり得ない答えが出てきました。
これはfor文ではans*=nの計算を行い、その後n--されるためOK
while文はans*=n--と言う定義されてない?計算のためおかしな動作となる。
と言う解釈であってますか?
0431デフォルトの名無しさん
2005/04/24(日) 18:42:28nが評価された後nを-1してそれから
ans*=nを行っているんじゃないの
0432デフォルトの名無しさん
2005/04/24(日) 18:42:320433デフォルトの名無しさん
2005/04/24(日) 19:00:28while(n-->1)とした時は確かにnに5を入れて計算したら24でした。
(n-->0)の時は最後に0をかけて答えが0になってしまう。
メイン関数の中で分母としてこの値を使ったためにエラーとなったと。
ありがとうございます。
>>432
x^pを求める関数本で
int aaa(int x, int y)
{
int z = 1;
while(y-->0)
{ z *= x}
return z;
}
と言った感じになっていたんで、試しにやってみたいんです。
この場合はyが計算に使われないからうまく行ってたんですね。
0434デフォルトの名無しさん
2005/04/24(日) 19:09:23知恵をあげよう
do
{
ans *= n;
} while(--n>0)
0435デフォルトの名無しさん
2005/04/24(日) 19:26:20今回の場合は0が渡された場合の処置も必要になりますが。
0436デフォルトの名無しさん
2005/04/24(日) 19:37:370437デフォルトの名無しさん
2005/04/24(日) 19:38:37do-whileにするだけじゃなくて、--nになってんのも忘れんなよ
0438デフォルトの名無しさん
2005/04/24(日) 22:43:01プログラマー向いてないと思う
0439デフォルトの名無しさん
2005/04/24(日) 23:03:570440デフォルトの名無しさん
2005/04/24(日) 23:21:03実行のたびに計測値が大きくばらついてしまいます(100ms〜180ms)。
これはマルチプロセッサが原因なんでしょうか?
それとも他に理由があるのでしょうか?
どなたかご教授ください。ちなみにw2k、Pen4-3GHzです。
0441デフォルトの名無しさん
2005/04/24(日) 23:28:100442デフォルトの名無しさん
2005/04/24(日) 23:28:440443デフォルトの名無しさん
2005/04/24(日) 23:38:26地方から出稼ぎに来ている44歳の無職です。先日都内のハロワの
トイレに入ってウンコをしようと思ったのですが、
「トイレットペーパー以外の物は流さないで下さい」と張り紙がしてあっ
たのでウンコをビニール袋に入れて持って来ました。
非常に不便さを感じました。皆さんはどのようにしているのでしょうか
参考に聞かせてくれませんか?
0444デフォルトの名無しさん
2005/04/25(月) 00:13:01いや、便があったんだろ?
0445デフォルトの名無しさん
2005/04/25(月) 01:10:15スレ間違えてないか?
http://pc8.2ch.net/test/read.cgi/tech/1108989422/
0446デフォルトの名無しさん
2005/04/25(月) 06:32:080447デフォルトの名無しさん
2005/04/25(月) 06:32:40そう僻むなよ
0448デフォルトの名無しさん
2005/04/25(月) 14:28:18プリプロセッサの話なので微妙にCとは違うかもしれませんが…。
#define str.substring(x) MySubString(x)
という風に . を含む置換マクロは組めないのでしょうか。
'.' : マクロ定義内で指定された文字の使い方が間違っています。
と出てエラーになってしまします。
ご教授よろしくお願いいたします。
0449デフォルトの名無しさん
2005/04/25(月) 14:50:05"."など変数名に使用できない文字はマクロ名にも使用できません。
0450デフォルトの名無しさん
2005/04/25(月) 14:54:31エラーのとおり。つーか、一体全体藻前は何がしたいのだ?
0451デフォルトの名無しさん
2005/04/25(月) 14:59:00>>450
JAVAのソースを、プリプロセッサでごにょごにょしてC++のソースに変換したかったのです。
素直にStringクラスつくってソースエミュレーションします。
0452デフォルトの名無しさん
2005/04/25(月) 15:05:520453デフォルトの名無しさん
2005/04/25(月) 15:24:03なるべくなら同じソースファイルから、#ifdefの切り替えによってソース互換性を保ちたかったのです。
0454デフォルトの名無しさん
2005/04/25(月) 15:33:000455デフォルトの名無しさん
2005/04/25(月) 15:38:370456デフォルトの名無しさん
2005/04/25(月) 15:40:480457デフォルトの名無しさん
2005/04/25(月) 18:54:45for( i=0; i<N; i++){
for( j=0; j<M; j++){
for( k=0; k<L; k++){
c[i][j] += a[i][k] * b[k][j];
}
}
}
参考書では2つ目と3つ目のfor文の間に c[i][j]=0; が入ってますが、
自分で作った時には初期化を忘れて上記のように組みました。
このプログラムでは初期化してないのでc[i][j]の値が不定のはずなのに
何故か正しい値が求められました。何故なんでしょうか?
配列も初期化しないと不定の値になると本に書いてあるのですが…
0458デフォルトの名無しさん
2005/04/25(月) 19:00:450459デフォルトの名無しさん
2005/04/25(月) 19:17:43ありがとうございます。
0460デフォルトの名無しさん
2005/04/25(月) 19:45:05可能ですか?
0461デフォルトの名無しさん
2005/04/25(月) 19:47:280462デフォルトの名無しさん
2005/04/25(月) 19:56:380463デフォルトの名無しさん
2005/04/26(火) 03:59:15CHoge *hoge;
という感じにクラスhogeのポインタを生成し、ファイルAの関数内で
hoge=new CHoge(hwnd,100,100);
と、インスタンスを生成します。
ソースファイルBの先頭で
extern CHoge *hoge;
として、こちらのファイルB内の関数内などでhogeを使いたいのですが、
どうも上手くいってないようです。
ポインタの使い方が間違ってるでしょうか?
間違えてなければ別の部分にに問題があると分かるので、
教えて下さい。お願いします。
0464デフォルトの名無しさん
2005/04/26(火) 04:07:46毎度毎度同じ事を書かないとならない。
それだけの情報では誰も判断できないよ。
上手くいってないと判断した理由はなに?
あてずっぽうに言えばインスタンスを生成するタイミングと
B内の関数が参照するタイミングが前後してるんじゃないかと
思うけど、分からない。
まともな回答がほしかったらソース晒せ。
0465デフォルトの名無しさん
2005/04/26(火) 04:09:32それだけの情報ではなんともいえないが、
例えばファイルB内でhogeを参照する段階で生成済みであることが保証されているなら問題ないかと。
グローバル変数だとその辺が厄介だから、避けた方がいいと思うんだけどね。
0466デフォルトの名無しさん
2005/04/26(火) 04:18:43ファイルBとその中の関数というのは、CHogeを定義(実装)しているものです。
で、ファイルBでhogeを使おうとしていた所を、思いついてthisとしたら
上手くいきました。
どちらにしろそのインスタンス自身のポインタをさしていると思うのですが、
なぜhogeではいけないのでしょうか?
仮にもう一つ別のインスタンスを作ったとして、
クラス定義のなかでhogeと書いていたらおかしくなりそうな感じはしますが、
インスタンスはhoge一つしか作ってません。
0467デフォルトの名無しさん
2005/04/26(火) 04:54:07グローバルインスタンスの初期化のタイミングの問題。
恐らくは、コンストラクタ内でhogeを参照しているのではないか?
hoge = new CHoge(...)
としているのなら、コンストラクタが呼ばれたときには未だhogeには代入されていないぞ。
0468デフォルトの名無しさん
2005/04/26(火) 04:54:41をいをい、無茶苦茶なことしてるな。
どこがおかしいかいちいち指摘する元気も出ないわ。
一から勉強しなおせ。
0469デフォルトの名無しさん
2005/04/26(火) 04:59:440470デフォルトの名無しさん
2005/04/26(火) 05:26:450471デフォルトの名無しさん
2005/04/26(火) 13:48:480472デフォルトの名無しさん
2005/04/26(火) 20:15:21バイナリの読み書きをリトルエンディアンで行うにはどうすればいいですか?
それとBIG_ENDIAN LITTLE_ENDIANが両方defineしてあるみたいですが、
場合分けはどうすればいいですか?
0473デフォルトの名無しさん
2005/04/26(火) 20:19:02後者は知らんが前者はマクロ書けばいいだけじゃ?
0474デフォルトの名無しさん
2005/04/26(火) 20:38:31ifstream.read で読み込んだ時点でエンディアンを変換させることはできませんか?
0475デフォルトの名無しさん
2005/04/26(火) 20:40:270476デフォルトの名無しさん
2005/04/26(火) 20:46:55printf文に日本語が入っているとエラーとなることがあります。
キルケ・ unknown escape sequence:'\214'
などと表示されます。
日本語を削るとコンパイルできるんですが。
何故でしょうか?
0477デフォルトの名無しさん
2005/04/26(火) 20:52:080478デフォルトの名無しさん
2005/04/26(火) 20:57:01コンパイルできなくて悩んでると、大抵の場合日本語を削除すると上手くいったり…
日本語が使えない環境だと完全にコンパイルできないんじゃないんですか?
0479デフォルトの名無しさん
2005/04/26(火) 21:00:450480デフォルトの名無しさん
2005/04/26(火) 21:01:10ってやって保存してからコンパイルして味噌
0481デフォルトの名無しさん
2005/04/26(火) 21:01:430482デフォルトの名無しさん
2005/04/26(火) 21:02:38エラーは日本語の文字コードがエスケープシーケンスと被ってるんじゃね?
0483デフォルトの名無しさん
2005/04/26(火) 21:03:45いろいろ調べてみたんですが、よくわかりませんでしたのでご教授お願いします
0484デフォルトの名無しさん
2005/04/26(火) 21:05:49おまえはレスが読めんのかと
0485デフォルトの名無しさん
2005/04/26(火) 21:06:422、日本語も通るコンパイラを使う
3、もっと勉強する
0486デフォルトの名無しさん
2005/04/26(火) 21:08:020488デフォルトの名無しさん
2005/04/26(火) 21:11:570489デフォルトの名無しさん
2005/04/26(火) 21:15:30それはどうなマクロですか?
0490デフォルトの名無しさん
2005/04/26(火) 21:21:02とりあえずおめでとう
レスはちゃんと読もうな
0491デフォルトの名無しさん
2005/04/26(火) 21:26:12streamのラッパクラス作って、内部でエンディアン判定、変換させればいいべ。
0492デフォルトの名無しさん
2005/04/26(火) 21:29:220x5cを含む漢字の前に'\'を足してもいいね。
0493デフォルトの名無しさん
2005/04/26(火) 21:32:41なるほど、ありがとうございます。とりあえず試してみます。
0494デフォルトの名無しさん
2005/04/26(火) 21:38:13例えばprintfって打ち込むところを間違ってpintfって打ち込んだとする
直そうと思ってpの次にrを入れるわけなんだが、入れると
iが上書きされてprntfって感じになっちゃう
こんな感じでなにをしても文字が全部上書きされちゃう状態
上書きされちゃうから一文字間違ったらその一行やり直しになってしまう
オプションとか見てもどれいじればいいのかわからないぽ
かなりめんどくさいので上書きされないようにする方法おしーて
0495デフォルトの名無しさん
2005/04/26(火) 21:39:18Insertキー。普通は刻印が「INS」となっていると思われる。
0496デフォルトの名無しさん
2005/04/26(火) 21:39:410497デフォルトの名無しさん
2005/04/26(火) 21:41:28おお、上書きされないようにできたー
ありがとう〜〜
0498Insert
2005/04/26(火) 21:42:230499476
2005/04/26(火) 21:42:54>>480の方法でコンパイルは出来ましたが実効すると文字化けするようになりました。
>>492
どういうことでしょうか?
ox5cとは\記号のことではないのでしょうか?
Meadowを使ってるためバックスラッシュが表示されますが。
0500デフォルトの名無しさん
2005/04/26(火) 21:47:25BackSpaceやHome押すときに間違えて押したりして上書きモードになることがよくある
VCのウィンドウの、ステータスバーの右端の方に「上書」って書いてあるとこがあるから
そこの文字がグレイだったら挿入モード、黒だったら上書きモード
0501デフォルトの名無しさん
2005/04/26(火) 21:48:25おまいはエスケープシーケンスを知らんのかと
あとox5cじゃなくて0x5c
0502デフォルトの名無しさん
2005/04/26(火) 22:06:45更に言語と関係ないこと訊いてくるよ。
0503デフォルトの名無しさん
2005/04/26(火) 22:12:44492は間違っている。問題の字の後ろにバックスラッシュを付けるのが正しい。
Shift JISだと'表'は95 5cになる。2バイト目だけを見てコンパイラがバックスラッシュと解釈してしまう。
Cではバックスラッシュを2つ並べるとバックスラッシュを表すエスケープシーケンスになるから、
'表\'とすると95 5c 5cとなり、コンパイラが\\のエスケープシーケンスとして認識し95 5cを出力させるのがこの対策。
0504476
2005/04/26(火) 22:13:18だめだったら日本語使わずにやります。
色々とご迷惑かけました。
0505476
2005/04/26(火) 22:23:54ありがとうございます。
確かに「表」と使ってました。
それに今までコンパイル出来なかった日本語の後に
バックスラッシュ付けたらコンパイルできるようになりました。
本当に皆さんご迷惑をおかけしました。
0507デフォルトの名無しさん
2005/04/26(火) 23:22:56L"だめぽ"
0508デフォルトの名無しさん
2005/04/26(火) 23:47:550509デフォルトの名無しさん
2005/04/27(水) 01:29:03「これからの嵐」 ワラタ
0510デフォルトの名無しさん
2005/04/27(水) 09:59:44基底クラスから、派生クラスの関数を呼ぶ方法はありませんでしょうか。
以下ことの発端です。
JAVAのObjectのように、自滅してくれるクラスを作ろうと試してみました。
Objectクラスに参照カウンターを持たせ、デストラクタにて参照カウントを-1します。
カウントが0になってしまったのなら責任を持って参照先をdeleteします。
参照先は「ObjectData構造体」です。
この実装自体はうまくいき、きちんと自滅してくれます。
次にObjectを継承して、Stringクラスというものを作ってみました。
参照先は「StringData構造体」です。
デストラクタで参照カウントが0になった場合、「ObjectData」ではなく今度は「StringData」を消さなければなりません。
void* m_pDataというポインタを持っているため、指しているアドレスは同じですが
delete (ObjectData*)m_pData とすると正しく解放されません。
もちろんObjectクラスはStringクラスなんぞ知らないし、どう派生されるかもわからないので
delete (StringData*)m_Data と書くわけにもいきません。
ここで考えました。
「String::release()を呼び出せれば正しく解放できるんだけどなぁ…。
releaseはオーバーライド必須にすればいい」
ですがObjectのデストラクタでreleaseを呼ぶと、Object::releaseを呼んでしまいます。
releaseを純粋仮想関数にすると「純粋仮想関数を呼び出してますよエラー」になってしまいます。
0511デフォルトの名無しさん
2005/04/27(水) 10:12:33仮想デストラクタでぐぐれ、というかその前に仮想関数でぐぐれ、というかboost::shared_ptrあたりでぐぐったほうがいいかも
0512デフォルトの名無しさん
2005/04/27(水) 10:15:310513デフォルトの名無しさん
2005/04/27(水) 10:17:51お返事ありがとうございます。
仮想関数については、
「基底クラスポインタから呼び出しても、派生クラスのものが呼ばれるようにする」
と解釈いたしました。
これですと
class Object{
public:
~Object(){
//ここで派生先の関数を呼びたい
}
};
という目的とは合致しないように思えますが、私の解釈が検討はずれなのでしょうか。
0514デフォルトの名無しさん
2005/04/27(水) 10:23:550515デフォルトの名無しさん
2005/04/27(水) 10:25:43{
for(j=0; j<NUM-i; j++)
{
nCount++;
}
}
nCount を NUM使って数式にしたい。
0516デフォルトの名無しさん
2005/04/27(水) 10:27:14ありがとうございます。
template<T> として delete T とするのでしょうか。
Objectクラスの中でそうしようと思っても、ObjectはStringDataを知らないので目的通りの使い方はできないように思えます。
templateについては自信がないため、もしかすると超突拍子のない返事となっているかもしれません。
その際はご容赦ください。
0517デフォルトの名無しさん
2005/04/27(水) 10:31:21これで何が起こるか確認した方がいいよ。
#include <iostream>
class A
{
public:
virtual ~A() { std::cout << "A::~A()" << std::endl; }
};
class B: public A
{
public:
~B() { std::cout << "B::~B()" << std::endl; }
};
int main(int argc, char *argv[])
{
A *a = new B();
delete a;
return 0;
}
0518デフォルトの名無しさん
2005/04/27(水) 10:32:12デストラクタが仮想かどうかが問題になるのでしょうか?
基底クラスのポインタに、派生クラスのアドレスを代入して使っている場合
解放したときにきちんと派生デストラクタが呼ばれないのを防ぐため
というのが仮想デストラクタの意義だと解釈しておりましたが…。
現状 String::~String() → Object::~Object() の順で呼ばれております。
もちろん~String()で参照カウンターを参照し、StringDataの削除を行なえばいいのですが、
カウンターの管理はObjectにまかせたいのです。
0519デフォルトの名無しさん
2005/04/27(水) 10:48:34カウンターの管理はObjectで行ない、削除の必要の有無を返してStringで削除汁。
0520デフォルトの名無しさん
2005/04/27(水) 10:49:28> カウンターの管理はObjectにまかせたいのです。
設計がクソな気がしてきた。
String::~String() で削除できないような StringData って一体何なの?
0521デフォルトの名無しさん
2005/04/27(水) 11:11:58カウンターの管理のうちの一つとして「Objectのデストラクタにて参照カウンタを減算」があります。
Objectのデストラクタが実行された後に、Stringに依頼を出す手段を探しています。
そもそもすでにStringはデストラクタで解体されてしまっているのに、
そこに命令を送ることは無理な気もしています。
>>520もおっしゃっているとおり、設計がクソというか、言語の概念自体誤認識しているのかもしれません。
0522デフォルトの名無しさん
2005/04/27(水) 11:24:180523デフォルトの名無しさん
2005/04/27(水) 11:30:30そうしてしまいますと、Stringを継承したクラスを作るときに困ってしまいます。
「 カウンターが1のときは、Objectのデストラクタで0になる。
つまりObjectのメソッドに bool checkRelease(){ return (1 == m_nCnt) } でも作って
派生クラスはこれを参照することを義務付ける」
とするのが正しい実装なのかもしれません。
というか、基底クラスのデストラクタから派生クラスのメソッドを呼ぶ方法がなければこれを使うしかないわけですが…。
0524デフォルトの名無しさん
2005/04/27(水) 12:02:57つーかObjectとかStringって何者なん?
>Objectクラスに参照カウンターを持たせ、デストラクタにて参照カウントを-1します。
>カウントが0になってしまったのなら責任を持って参照先をdeleteします。
これだけならboost::shared_ptrがそのまんまの機能を持ってるんだけど。
0525デフォルトの名無しさん
2005/04/27(水) 12:14:49(NUM)*(NUM+1)/2
0526デフォルトの名無しさん
2005/04/27(水) 12:37:22違うメモリブロックに確保された時に以前に取得していた
ポインタが無効になってしまうのですが、それを
int* p = malloc(10 * sizeof(int));
int* hoge = &p[5];
int* newP = realloc(p, 100 * sizeof(int));
if (newP != p) {
hoge += newP - p;
}
と hoge を補正しても大丈夫でしょうか?
0527デフォルトの名無しさん
2005/04/27(水) 12:50:07hoge = &newP[5];
の何が不満だ?
0528デフォルトの名無しさん
2005/04/27(水) 12:56:24void f(int* p, int* hoge)
{
p = realloc(p, 100 * sizeof(int));
}
f(p, &p[5]);
のように、関数にポインタを渡さなければならないときに困るんです
0529デフォルトの名無しさん
2005/04/27(水) 12:58:35設計を見直すべき。
0530デフォルトの名無しさん
2005/04/27(水) 13:22:21>hoge += newP - p;
うまくいきそうな気がするけど、厳密には未定義。
安全を期すなら、こう。
hoge = newP+(hoge-p);
0531デフォルトの名無しさん
2005/04/27(水) 13:42:56>p = realloc(p, 100 * sizeof(int));
メモリが確保できなかったときにメモリリークする。
0532デフォルトの名無しさん
2005/04/27(水) 13:54:08STLに素晴らしい機能があるのは存じております。
私もC++だけでの開発となれば絶対そっちを使うのですが…。色々と事情がありまして。
>StringDataをObjectDataから派生させりゃいいんじゃないの?
>つーかObjectとかStringって何者なん?
データを参照するポインタみたいなものです。
参照カウンターを共有しており、デストラクタが動作した際に参照カウンターを減算。
0に達した場合はデータの破棄を行います。
JAVAのStringと記述的にもほぼ同等になることを目指しています。
0533デフォルトの名無しさん
2005/04/27(水) 14:04:52ObjectData自体に参照カウンタを持たせて、COMみたいにAddRef, Releaseで参照カウンタを増減させ
参照カウンタが0になったら自殺(delete this)。StringDataはObjectDataから派生。
ObjectはObjectDataをAddRef, Releaseで管理。(ObjectDataのdeleteはObjectData自身に任せる)
でいいんじゃないの?
0534デフォルトの名無しさん
2005/04/27(水) 14:25:05お返事ありがとうございます。
ObjectData側が自滅できるのならば私の望んでいる実装が可能そうです。
delete thisというのができるのを正直知りませんでした。
これで実装をためしてみようかと思います。
ObjectData側にreleaseを作り、それを仮想クラスとして扱えば
常に正しい型のreleaseが呼べますね。
これからすぐにでも試してみます。
0535デフォルトの名無しさん
2005/04/27(水) 14:52:23正しく解放されました!
delete this という知識が無かったので深みにはまってしまったわけですね。
的確なアドバイスに大変感謝いたします。
0536デフォルトの名無しさん
2005/04/27(水) 15:30:12OFN_ALLOWMULTISELECT | OFN_EXPLORERを指定して、複数ファイルの選択を取得したいんですが、パース部分のコードがどうにも、冗長になってしまいます。
MFCの場合、GetNext〜等あるようですが・・・・
(CodeProjectにあったCFileDialog(MFC)の機能を移植したCFileDialog(WTL)を使えばいいのかなぁ・・・)
スマートなコード見本等、ありませんか?
よろしくお願いします。
0537デフォルトの名無しさん
2005/04/27(水) 15:41:140538デフォルトの名無しさん
2005/04/27(水) 15:50:350539デフォルトの名無しさん
2005/04/27(水) 16:27:52WTL
WTL
0540デフォルトの名無しさん
2005/04/27(水) 17:56:190541デフォルトの名無しさん
2005/04/27(水) 18:06:58標準ではない
0542540
2005/04/27(水) 19:33:490543デフォルトの名無しさん
2005/04/27(水) 19:34:36hoge += newP - p;
がダメで
hoge = newP+(hoge-p);
だといいのでしょうか?
0544543
2005/04/27(水) 19:41:11よく考えずに聞いてしまって申し訳ないです。。
0545デフォルトの名無しさん
2005/04/27(水) 20:26:56の時に、&p[0] ってアドレスを取得してもやっても大丈夫?
0546デフォルトの名無しさん
2005/04/27(水) 20:35:06pと同じ意味じゃん。
0547デフォルトの名無しさん
2005/04/27(水) 20:40:250548デフォルトの名無しさん
2005/04/27(水) 21:09:17ぬるぽ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬ・る・ぽーーーーーーーーーーーーーー!!
0549デフォルトの名無しさん
2005/04/27(水) 21:32:54落ち着け
0550デフォルトの名無しさん
2005/04/27(水) 21:34:07そう
0551デフォルトの名無しさん
2005/04/27(水) 21:47:18&*pってなってぬるぽになっちゃうんじゃ?
0552デフォルトの名無しさん
2005/04/27(水) 21:53:470553デフォルトの名無しさん
2005/04/28(木) 00:26:44#ifndef __cplusplus
# if defined(__STDC_VERSION__) && (__STDC_VERSION__>=199901L) /* c99 */
# define INLINE inline
# else
# define INLINE
# endif /* (__STDC_VERSION__) && (__STDC_VERSION__>=199901L) */
#endif /* __cplusplus */
のようにやっているのですが、他に何かいい方法はないでしょうか?
0554デフォルトの名無しさん
2005/04/28(木) 00:30:280555デフォルトの名無しさん
2005/04/28(木) 23:09:09さらにVC/BCCはいつのバージョンからかは知らないが__inlineがある。
0556デフォルトの名無しさん
2005/04/29(金) 19:29:470557デフォルトの名無しさん
2005/04/29(金) 20:09:41const float data[][3] = { ... };
.hファイル内で
extern const float data[][3];
これでコンパイルしたらdata変数がリンクエラー。
.cファイルはコンパイルされているのに。
分からない...
0558デフォルトの名無しさん
2005/04/29(金) 20:16:55C99/C++のinlineと同じ。
予約識別子になるように下線がついているだけ。
0559557
2005/04/29(金) 20:20:01constはずしたらエラー消えた。
0560デフォルトの名無しさん
2005/04/29(金) 22:15:04http://www.tietew.jp/cppll/archive/12001
0561デフォルトの名無しさん
2005/04/29(金) 23:03:530562デフォルトの名無しさん
2005/04/29(金) 23:33:160563デフォルトの名無しさん
2005/04/29(金) 23:44:270564デフォルトの名無しさん
2005/04/29(金) 23:54:07そのたびにcoutへの眼差しは変わっていく。
「Cとの最初の差異」として本に書かれているのを初めて目にする時。
クラスと演算子オーバーロードを学習し、ストリームクラスが何をやっているのかを理解する時。
使い倒すうち、他の標準ライブラリと比べて「何かが浮いてる」ことに気づく時。
その他もろもろ。
0565デフォルトの名無しさん
2005/04/30(土) 00:36:400566デフォルトの名無しさん
2005/04/30(土) 00:50:31int main(void)
{
printf("hello, world\n");
return 0;
}
どこにでも載ってるコレをコンパイルしようとしたら
エラー E2209 smp1.c 1:インクルードファイル"stdio.h"をオープンできない
と言ってきました。どうすればいいでつか。
コンパイラはBorland C++ Compiler 5.5です。
0567デフォルトの名無しさん
2005/04/30(土) 00:56:22マルチすんなボケ
0568デフォルトの名無しさん
2005/04/30(土) 00:57:36たいていはインストールに失敗
今までできていたのに突然できなくなったのは
HDDに入っていた所にアクセスできなくなった(消した、壊れた、等)
0569デフォルトの名無しさん
2005/04/30(土) 00:58:09bcc32.cfgとilink32.cfgはちゃんと作った?
0570デフォルトの名無しさん
2005/04/30(土) 01:10:31うーん、わからん。消してしまった場合は
どうすれば?
0571デフォルトの名無しさん
2005/04/30(土) 01:12:200572デフォルトの名無しさん
2005/04/30(土) 01:13:00ダメなら再インスコ汁
0573デフォルトの名無しさん
2005/04/30(土) 01:27:11たいていは失敗している(w
0575デフォルトの名無しさん
2005/04/30(土) 05:43:39変数とか関数の前につけてるアンダーバーって何の目印ですか。
どういった目的で付けますか。
0576デフォルトの名無しさん
2005/04/30(土) 07:21:06逆ギレしてんじゃねぇよm9(^д^)プギャー
覚悟なんぞどうでもいいわ
0577デフォルトの名無しさん
2005/04/30(土) 07:50:300578デフォルトの名無しさん
2005/04/30(土) 08:02:17予約された識別子とまぎらわしいからヤメレ。
0579デフォルトの名無しさん
2005/04/30(土) 08:03:38.c で .h を #include してなくて、さらに C++ でコンパイルされてる疑いが強いな。
0581デフォルトの名無しさん
2005/04/30(土) 10:41:42日本語の勉強もしてください。
>577は裏方みたいな関数という意味合いのマークとしてアンダーバーをつけているのではないかといっている。
>578は例えば__STDC__のようなコンパイラ側で用意した(予約された)識別子と紛らわしいといっている。
0582デフォルトの名無しさん
2005/04/30(土) 10:47:460583デフォルトの名無しさん
2005/04/30(土) 10:51:520584某
2005/04/30(土) 10:56:02#include<stdio.h>
#define KAZU 10//データの数
int main(void)
{
int i = 0,J = 0,x = 0,y = 0;
int a[KAZU],b[KAZU];//データの入れ箱,順序付け
for( x = 0; x < KAZU; x++){
a[i] = x;
b[i] = 0;
}
i = 0;
do{
i++;
j = 1;
do{
j++;
if(a[i] > a[j]){
y = b[i];
y++;
b[i] = y;
}
if(a[i] < a[j])
b[j] = b[j] + 1;
}while(!(j == KAZU));
}while(!(j == KAZU-1));
for( x = 0; x < KAZU; x++)
printf("a[%d]:%d\n",x,b[x]);
return(0);
}
0585某
2005/04/30(土) 10:57:02printfで出力できていないようなのです
誰か教えてもらえませんか
0586デフォルトの名無しさん
2005/04/30(土) 11:05:45J = 0
↑これはなんだ・・・
最初のforで
10回もの間 a[0] と b[0] を書き換えて、残りの要素は未初期化なのはおかしいだろ
最初からいろいろおかしいぞ、それ
いつも思うんだが、全角スペース使うなりしてインデントして書き込めよ
見難いったらありゃしない
0587デフォルトの名無しさん
2005/04/30(土) 11:24:47目が悪いなら自分でエディタにコピペでもしろよ。
一々インデントするのは面倒だし、それをコピペした馬鹿がコンパイルできないって煩いだろうが。
0588デフォルトの名無しさん
2005/04/30(土) 11:26:01「順序付け」の意味を定義せよ。
0589デフォルトの名無しさん
2005/04/30(土) 11:33:28せめて半角スペースが潰れただけならポップアップで読めばいけるんだが、
>>584の場合は元からしてインデント無しだからなぁ。
つーか回答者がなんでそこまで考えにゃならんのよ。
0590某
2005/04/30(土) 11:43:22#define KAZU 10//データの数
int main(void)
{
int i = 0, int j = 0, int x = 0, int y = 0;
int a[KAZU],b[KAZU];//データの入れ箱,順序付け
for( x = 0; x < KAZU; x++){
a[x] = i;
b[x] = 0;
}
i = 0;
do{
i++;
j = 1;
do{
j++;
if(a[i] > a[j]){
y = b[i];
y++;
b[i] = y;
}
if(a[i] < a[j])
b[j] = b[j] + 1;
}while(!(j == KAZU));
}while(!(j == KAZU-1));
for( x = 0; x < KAZU; x++){
i = 0;
printf("a[%d]:%d\n",i,b[i]);
i++;
}
return(0);
}
0591デフォルトの名無しさん
2005/04/30(土) 11:45:55裏方みたいな変数とか関数ってなんですか。
全然ぴんとこないのですが。
関数なんて、値を渡してなんか処理をして返してくれる
って意味では全部裏方っぽいです。
0592某
2005/04/30(土) 11:46:57荒れる原因を作ってしまったみたいで
aの配列に入った数を
bの配列で小さい方から番号を付けて
それを出力するプログラムです
擬似言語からCになおしたつもりだったんです
0593デフォルトの名無しさん
2005/04/30(土) 11:58:44aの内容は未定義になってしまってるけど、
これは単なる間違いで、なんか値が入ってるものなんだな?
「bの配列で小さい方から番号を付けて」
というのはaの配列要素の一番小さいものが0で、
それより大きい中で一番小さいものが1という風に
すると考えていいな?
aの中に同じ値が複数ある場合は同位にしていいのか?
0594デフォルトの名無しさん
2005/04/30(土) 12:00:540596某
2005/04/30(土) 12:08:40すんません
<<594さん
そこは
a[i] = i % 5
でした
<<593さん
例をあげさせていただきますと
a[1]=10
a[2]=20
a[3]=15
a[4]=10
b[1]=1
b[2]=4
b[3]=3
b[4]=1
ってな感じになります
ヘタレな文章でごめんなさい
0597デフォルトの名無しさん
2005/04/30(土) 12:23:59使う側からは見ない/見て欲しくないものとかそんな感じかな。
例えばfoo()という関数を公開していて、fooはその機能を実現するために_hoge(), _hoge2()を使うとか。
VCだと非標準の関数とかに使われているな。(_beginthreadとか)
0598デフォルトの名無しさん
2005/04/30(土) 12:25:04適当なロダにうpったけど、こんなんじゃ駄目なん?
ttp://www.uplo.net/www/vip14319.txt
0599某
2005/04/30(土) 12:38:44ありがとう
しかし、これは結果じゃなくて、過程が大事なんです
色んなアルゴリズムを習得するという目的なんです
ほんとすいません
0600デフォルトの名無しさん
2005/04/30(土) 12:40:49ぴんと来る人がそういう識別子を使ってるってわけで
ぴんと来ない人は使う必要ないよ
0601デフォルトの名無しさん
2005/04/30(土) 12:44:27どういう意味か、と問われて
使う必要はない、と答えるのはいかがなものか。
0602デフォルトの名無しさん
2005/04/30(土) 12:59:120603デフォルトの名無しさん
2005/04/30(土) 13:39:53荒れるから馬鹿な発言は控えてくれ
0604デフォルトの名無しさん
2005/04/30(土) 14:26:440605デフォルトの名無しさん
2005/04/30(土) 14:47:150606デフォルトの名無しさん
2005/04/30(土) 14:47:35予約されてるのは一文字目がアンダースコア、二文字目が大文字ないしはアンダースコアの場合、
…じゃないの? _Foo は駄目だが _foo はオーケーなはず。
0607デフォルトの名無しさん
2005/04/30(土) 15:27:13_foo もグローバルな名前ではアウト。(ローカル変数や構造体メンバならセーフ)
でもメンドクサイから>605
0608デフォルトの名無しさん
2005/04/30(土) 15:28:290609デフォルトの名無しさん
2005/04/30(土) 15:36:160610デフォルトの名無しさん
2005/04/30(土) 15:51:410611デフォルトの名無しさん
2005/04/30(土) 16:24:100612デフォルトの名無しさん
2005/04/30(土) 17:12:34このAAを見るたびにアームスレイブを連想する俺はライトノベル板にいけばいいのか。
0613デフォルトの名無しさん
2005/04/30(土) 21:38:09foo_()
int hoge_;
ほら、いいでしょ。
0614デフォルトの名無しさん
2005/04/30(土) 23:03:30クソ
0615デフォルトの名無しさん
2005/04/30(土) 23:13:46そんなに先頭につけるのが好きなんですかw
0616デフォルトの名無しさん
2005/04/30(土) 23:37:030617デフォルトの名無しさん
2005/05/01(日) 00:02:15うp
0618デフォルトの名無しさん
2005/05/01(日) 17:30:46newした場合に確保されるエリアの状態を調べるために
char* buf1 = new char[28]; ::memset(buf1, 0, 28);
char* buf2 = new char[28]; ::memset(buf2, 0, 28);
cout << (int) buf1 << endl;
cout << (int) buf2 << endl;
として、アドレスを表示させるとbuf1+28=buf2にならずに
buf1+40=buf2になっています。
いろんなサイズで試してみると16byteの倍数+8byteになっているようなのですが、
この8byteは何のためのデータなのでしょうか?
0619デフォルトの名無しさん
2005/05/01(日) 17:34:19OS(などシステム側の)管理領域。
メモリチャンクをリスト管理してたら次のメモリチャンクをポイントする必要があるだろ。
0620デフォルトの名無しさん
2005/05/01(日) 17:35:54buf1のすぐ後ろにbuf2があるとは限らない。
位置関係に相関性自体存在しない。
0621デフォルトの名無しさん
2005/05/01(日) 17:54:550622デフォルトの名無しさん
2005/05/01(日) 18:35:27いちおう呼ばれることになってる。
呼ばれる順番の問題があるんで、あんまりお勧めできるもんじゃないが。
0623デフォルトの名無しさん
2005/05/01(日) 22:53:12定数Nを定義して
Nに100000を代入したいんですが、
#define N 1000000L
という式だとmainすら動きません。
#define N 100000L
ならmain以降しっかり動くのですが・・・
どうすればいいのですか?
0624デフォルトの名無しさん
2005/05/01(日) 22:58:14意味ワカンネ
0625デフォルトの名無しさん
2005/05/01(日) 23:02:12わかる人、お願いします。
0626623
2005/05/01(日) 23:03:24Nに1000000を代入したいんです。
#define N 1000000L
と記述すると何もおこらずプログラムが終了してしまうんですが・・・
0627デフォルトの名無しさん
2005/05/01(日) 23:04:330628デフォルトの名無しさん
2005/05/01(日) 23:06:050629デフォルトの名無しさん
2005/05/01(日) 23:06:540630デフォルトの名無しさん
2005/05/01(日) 23:09:53記述は正確に。
>と記述すると
記述しただけでは何も起こらないのが当然。
「コンパイルした/実行した」と明示するべし。
> mainすら動きません。
関数が「動く」と言うのはどういう意味か。
「実行できる/コンパイルできる/期待どおりに動く」と
明示するべし。
0631デフォルトの名無しさん
2005/05/01(日) 23:16:440632デフォルトの名無しさん
2005/05/01(日) 23:25:030633623
2005/05/01(日) 23:33:14すいません。
上から四行は
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000000L
のようになっています。
Nはmain () 内で
int a [N] ;
というように使っています。
#define N 100000L
と記述した場合コンパイルも通り、
実行もでき、自分が欲しい結果も返ってきています。
しかし
#define N 1000000L
と記述した場合
コンパイルは通りますが
実行時には何も起こりません。
main ()
の上の方に
printf ( "main開始") ;
と記述してで動作を確かめてみたところ
そのprintf ( "main開始") ;というのも実行されていません。
この場合もコンパイルは通っています。
0634デフォルトの名無しさん
2005/05/01(日) 23:33:22とりあえず定数に代入でおかしいと思うようになれ
0635デフォルトの名無しさん
2005/05/01(日) 23:37:24大きすぎるローカル変数を定義するとそういうことがある。
mallocで動的に確保すれば良い。
0636デフォルトの名無しさん
2005/05/01(日) 23:37:34環境が何だか知らんが、スタックオーバーフローしてんじゃない?
0637デフォルトの名無しさん
2005/05/01(日) 23:38:180638デフォルトの名無しさん
2005/05/01(日) 23:42:290639デフォルトの名無しさん
2005/05/01(日) 23:44:38コンパイラとオプションによっては出る。
0640デフォルトの名無しさん
2005/05/01(日) 23:52:060641623
2005/05/01(日) 23:53:12スタックサイズを確認して変更するか、
mallocで動的に確保するかどちらかとにかくやってみます。
実行時にStack Overflowとはでてきてません。
コンパイラはBCCです。
0642640
2005/05/01(日) 23:55:360643デフォルトの名無しさん
2005/05/01(日) 23:58:410644デフォルトの名無しさん
2005/05/01(日) 23:59:570645デフォルトの名無しさん
2005/05/02(月) 00:18:51ちょっと知ったつもり程度の人間は往々にして人に教えたくなる。
別にプログラムに限らんが。
お題を出された方が頭は使いやすいからいい練習にもなるしな。
練習台にされる方も、相手を自動回答装置としか考えてないのでお互い様。
0646デフォルトの名無しさん
2005/05/02(月) 01:31:130647デフォルトの名無しさん
2005/05/02(月) 01:33:100648デフォルトの名無しさん
2005/05/02(月) 01:44:370649デフォルトの名無しさん
2005/05/02(月) 02:42:120650デフォルトの名無しさん
2005/05/02(月) 03:18:03エラー訂正の精度も低いが、エラー訂正のエラー検出をする人もいっぱい(ry
2chの情報全般に言える性質だけどな。
難しくなると途端に信頼性が低下するあたりも。
要は便所の落書きに精度を求めるなという事だ。
0651デフォルトの名無しさん
2005/05/02(月) 03:33:080652デフォルトの名無しさん
2005/05/02(月) 04:34:490653デフォルトの名無しさん
2005/05/02(月) 09:07:550654デフォルトの名無しさん
2005/05/02(月) 13:31:30class foo{
private:
public:
int x[10];
};
これらの変数にアクセスする際に
boo.x[0]
boo.x[1]
などとしているのですが、これを
boo.a
boo.b
のようにアクセスできるうにすることはできないでしょうか?
参照を使ってみようと試みましたが、宣言の仕方がわかりません。
0655デフォルトの名無しさん
2005/05/02(月) 13:45:28{
public:
foo() a(x[0]){}
int &a;
int x[10];
};
0656デフォルトの名無しさん
2005/05/02(月) 13:46:02foo() : a(x[0]){}
ね
0658デフォルトの名無しさん
2005/05/02(月) 13:52:36初期設定子とか参照型とかじゃね?
0659デフォルトの名無しさん
NGNG今使ってる本、namespaceとか全く無いんですが、大丈夫なのでしょうか?
後iostream.hとかなってますし
0660デフォルトの名無しさん
2005/05/02(月) 18:55:33クラスつかや名前空間なんぞそこまで気にすることも無い
0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
2005/05/02(月) 20:18:140663デフォルトの名無しさん
2005/05/02(月) 20:22:33どの職に向いているか向いていないか、単一の条件で決められるわけでもなく、しかも誰もそんなこと聞いてないんだよ。
0664デフォルトの名無しさん
2005/05/02(月) 20:23:34何に向いてるんだ?
0665デフォルトの名無しさん
2005/05/02(月) 20:27:450666デフォルトの名無しさん
2005/05/02(月) 20:40:02聞いてもいないのにもらえた貴重なアドバイスなのに、
なに切れちゃってんの?
やっぱり向いてないねえ。全然ダメだわ。
0667デフォルトの名無しさん
2005/05/02(月) 20:42:35荒すなら厨房板池
0668デフォルトの名無しさん
2005/05/02(月) 20:45:490669デフォルトの名無しさん
2005/05/02(月) 20:46:54来たぜ、馬鹿がw
0670デフォルトの名無しさん
2005/05/02(月) 20:47:170671デフォルトの名無しさん
2005/05/02(月) 20:57:300672デフォルトの名無しさん
2005/05/02(月) 20:58:340673デフォルトの名無しさん
2005/05/02(月) 21:01:35WindowsのWireless Zero Configuration(WZC)の設定をプログラムから
行うには、どのようにすれば良いのでしょうか?
おそらく、どこかに設定情報のファイルがありそうなのですが、見つかりません。
ご存知の方がいらっしゃいましたら教えて下さい。
0674デフォルトの名無しさん
2005/05/02(月) 21:19:42-lH100000のように16進数でスタックサイズを指定できる。
これはデフォルト値(1MB)
0675デフォルトの名無しさん
2005/05/02(月) 21:23:58詳しくはしらんけど、普通はレジストリじゃねーの?
レジストリでそれらしいのを検索してみろ。
0676デフォルトの名無しさん
2005/05/02(月) 21:51:15struct foo{
union{
int x[10];
struct{ int a; int b; };
};
};
の方が良いかもしれんし、悪いかもしれん
0677デフォルトの名無しさん
2005/05/02(月) 22:19:010678デフォルトの名無しさん
2005/05/02(月) 23:57:23そりゃワザと書いて無いからね
0679デフォルトの名無しさん
2005/05/03(火) 00:02:05{
a ^= b;
b ^= a;
a ^= b;
}
0680デフォルトの名無しさん
2005/05/03(火) 00:23:58いまだにそんな馬鹿な事をやってる奴いるのか。
0681デフォルトの名無しさん
2005/05/03(火) 00:45:14よりも
swap(a,a);
のほうがかっこいいと言いたいらしい
0682デフォルトの名無しさん
2005/05/03(火) 01:00:27アフォ発見!
0683デフォルトの名無しさん
2005/05/03(火) 01:02:50アフォ発見!
0684デフォルトの名無しさん
2005/05/03(火) 01:04:050685デフォルトの名無しさん
2005/05/03(火) 01:05:04とでも言うと思ったのか!!
0686デフォルトの名無しさん
2005/05/03(火) 01:05:040687デフォルトの名無しさん
2005/05/03(火) 01:12:04>>679のswap()で同じ変数入れたら0になるのは分かるのだが笑いどころがわからん
0688デフォルトの名無しさん
2005/05/03(火) 01:18:110689デフォルトの名無しさん
2005/05/03(火) 01:31:320690デフォルトの名無しさん
2005/05/03(火) 01:38:220691デフォルトの名無しさん
2005/05/03(火) 02:26:220692デフォルトの名無しさん
2005/05/03(火) 02:30:270693デフォルトの名無しさん
2005/05/03(火) 14:49:540694デフォルトの名無しさん
2005/05/03(火) 14:53:42外からクラスのどんな情報を渡してあげれば可能になるでしょうか?
void* cnew(classname)
{
return new classname;
}
みたいな事をやりたいんでつが。
0695デフォルトの名無しさん
2005/05/03(火) 15:03:25∴∵∴∵:。∴∵∴∵∴: --─- ∴∵∴∵∴∵∴∵
∴∵゜∴∵∴∵∴∵ (___ )(___ ) ∴∵。∴∵∴∵ ゜
∴∵∴∵∴:∵∴∵_ i/ = =ヽi ∴∵∴∵。∴∵∴
∴∵☆彡∴∵∵ //[|| 」 ||] ∴:∵∴∵∴∵:∴∵
∴∵∴∵∴∵ / ヘ | | ____,ヽ | | ∴:∵∴∵∴∵:∴∵
∴゚∴∵∴∵ /ヽ ノ ヽ__./ ∴∵∴∵:∴∵∴∵
∴∵∴∵ く / 三三三∠⌒> ∴:∵∴∵:∴∵
∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∵∴∵∴∵
∧∧ ∧∧ ∧∧ ∧∧
( )ゝ ( )ゝ( )ゝ( )ゝ ムチャシヤガッテ・・・
i⌒ / i⌒ / i⌒ / i⌒ /
三 | 三 | 三 | 三 |
∪ ∪ ∪ ∪ ∪ ∪ ∪ ∪
三三 三三 三三 三三
0696デフォルトの名無しさん
2005/05/03(火) 15:22:53template <typename T>
T *cnew()
{
return new T;
}
マクロ
#define CNEW(classname) new classname
0697デフォルトの名無しさん
2005/05/03(火) 17:48:50内包クラスの生成失敗などでクラスの生成を中止させる場合はコンストラクタ内でクリーンアップし、bad_alloc例外を投げればよいのでしょうか?
いまいちどう処理すればいいのか分からないのですが‥‥orz
0698デフォルトの名無しさん
2005/05/03(火) 18:31:34そんだけの情報じゃなんとも。もっと具体的に。
0699デフォルトの名無しさん
2005/05/03(火) 19:16:23平たく言うとコンストラクタ内で自身の生成を中断して通知したいという事です。
0700デフォルトの名無しさん
2005/05/03(火) 19:36:17内包クラスの生成失敗が例外によって通知されるなら、
基本的にクリーンアップは必要ない。
単に例外を素通りさせるか、catchして別のものをなげ直す。
それから、メモリ確保エラーじゃない限りbad_allocを投げるのは良くない。
0701デフォルトの名無しさん
2005/05/03(火) 19:37:29例外を投げればいい。
クリーンアップは基本的にデストラクタで。
部分的なメンバに対するクリーンアップが必要なら、
そいつをクラスにしてデストラクタを定義できないかどうか考えてみるといい。
それでも、ほんとうに駄目な時に、コンストラクタ本体の中に
try,catch を配備する事を考える。
0702デフォルトの名無しさん
2005/05/03(火) 19:44:080703デフォルトの名無しさん
2005/05/03(火) 20:35:18//このとき改行文字等は除外しないと後で思わぬエラーが生じる
for (i = 0; (c = getchar()) != EOF; i++) {
if (c != '\r' && c != '\n')
pBuf[i] = c;
else
i--;
}
こういうソースがあるんですが、「i--」の部分が分かりません。
i=i-1をした後、for内でi=i+1をしてるってことですよねこれ。
これじゃ元に戻って無限ループしちゃうんじゃないですか?
0704デフォルトの名無しさん
2005/05/03(火) 20:41:34条件部がiに関する条件じゃないから、iが更新されなくても
直接問題になるわけではない。そのソースは
i = 0;
while((c = getchar()) != EOF)
if(c != '\r' && c != '\n')
pBuf[i++] = c;
と等価で、こうすればiがループに関係していないことがわかると思う。
ちなみに、スタイルの問題として、ループに直接関係のないことを
forの初期化・更新式で行うのは避けるべきだという考えもある。
0705デフォルトの名無しさん
2005/05/03(火) 20:43:38i--するのは、特定の条件を満たしたときのみ。
0706デフォルトの名無しさん
2005/05/03(火) 20:51:41あ、なるほど。c=getcher()は繰り返すだけで進んでいくんでしたね。
ありがとうございました。
あともう一つ聞きたいんですが、
len = (int)strlen(src) + 1;
temp = (char *)malloc(len);
len = (int)strlen(src);
if (len >= 1024) {
er();
free(temp);
return -1;
}
というソースがあるのですが、この上2行を
len = (int)strlen(src);
temp = (char *)malloc(len+1);
としてlenの宣言を一回にまとめていないのは、何か理由があるんでしょうか?
0707デフォルトの名無しさん
2005/05/03(火) 20:53:03書いた人の好み
0708デフォルトの名無しさん
2005/05/03(火) 20:55:39どうせならこうしようぜ
temp = (char*)malloc((len = (int)strlen(src)) + 1);
0709デフォルトの名無しさん
2005/05/03(火) 23:03:27実行時にnewをする事はできない?
0710デフォルトの名無しさん
2005/05/03(火) 23:26:49どういうこと?
0711デフォルトの名無しさん
2005/05/04(水) 00:34:20mallocはまだしもなぜコンストラクタが出て来るんだ。
0712デフォルトの名無しさん
2005/05/04(水) 00:40:180713デフォルトの名無しさん
2005/05/04(水) 01:36:07その型のオブジェクトを作ったりは出来ないですよね?
0714デフォルトの名無しさん
2005/05/04(水) 01:46:090715デフォルトの名無しさん
2005/05/04(水) 10:44:100716デフォルトの名無しさん
2005/05/04(水) 11:28:00で確保したエリアのサイズを、後から調べる方法ってありませんかね?
0717デフォルトの名無しさん
2005/05/04(水) 11:31:23ありません。ラッパクラスでも作ればできなくはないですが。
0718デフォルトの名無しさん
2005/05/04(水) 11:33:34うんざりするほど既出
0719デフォルトの名無しさん
2005/05/04(水) 11:34:130720716
2005/05/04(水) 11:50:13即レス感謝です。
0721デフォルトの名無しさん
2005/05/04(水) 13:49:04http://pc8.2ch.net/test/read.cgi/tech/1113102515/
の>>113のn次元配列動的生成関数を
class対応版のn次元配列動的生成関数にはできませんか?
生成部分だけコールバック関数を用意すれば可能ではありますけど
もっとエレガントにできないかと思って。
0722デフォルトの名無しさん
2005/05/04(水) 13:56:08vector使ったら?
0723デフォルトの名無しさん
2005/05/04(水) 14:29:18STLとは盲点ですた。
vectorと多次元配列で調べたら
boost::multi_arrayってのが見つかって目的の物そのものですた。
いいヒントありがとん。
0724デフォルトの名無しさん
2005/05/04(水) 15:46:20どうやらEOFまで書き込んでしまってるようです。
ifstream in;
ofstream out;
in.open("test.txt",ios::in | ios::binary);
out.open("test2.txt",ios::out | ios::binary);
while(!in.eof()){
out.put(in.get());
}
下のようにすれば、EOFを書きこまずに済みましたが、
なんだか冗長な気がします。
while(!in.eof()){
int c=in.get();
if(!in.eof())
out.put(c);
}
そもそも eof() って、次の get() 等が失敗することを
知るためのものではないのですか? get() 等が失敗した後でしか
eof() は真にならないのでしょうか。
0725デフォルトの名無しさん
2005/05/04(水) 15:49:13get() 等が失敗した理由を後でチェックするため
0726デフォルトの名無しさん
2005/05/04(水) 15:50:32int c;
while((c=ifs.get())!=EOF){
out.put(c);
}
こうしてみるとか
0727デフォルトの名無しさん
2005/05/04(水) 16:39:56std::ifstream in("test.txt", std::ios::in | std::ios::binary);
std::ofstream out("test2.txt", std::ios::out | std::ios::binary);
out << in.rdbuf();
0728デフォルトの名無しさん
2005/05/04(水) 17:00:18system("copy test.txt test2.txt")
0729724
2005/05/04(水) 17:33:12なるほど。fail()とかと同レベルの関数ってことですね(と解釈しました)。
>>726
それはアリなんでしょうか。
自分の環境では動きましたけど、get()が失敗したときに
EOFが返るっていう保証はあるのでしょうか。
Cの#define定数と混在させるのはなんだか不安です。
ios::eof とかいう定数が定義されてればいいな、と思ったのですが。
>>727-728
コピーそのものが目的ではなくて、ファイル終端検出についての
質問でした。説明不足ですみません。
0730デフォルトの名無しさん
2005/05/04(水) 19:09:22大丈夫。basic_istream<T>::get()が失敗するとchar_traits<T>::eof()が
返り、char_traits<char>::eof()はEOFを返すことが保障されている。
27.6.1.3 Unformatted input functions -4
21.1.3.1 struct char_traits<char> -7
0731デフォルトの名無しさん
2005/05/05(木) 20:36:32try
{
...
}
catch(...)
{
...
}
といった感じのプログラム見たんですが、catchのカッコ内の
... は何を意味するんでしょう。可変個引数でしょうか。
例外処理はしたこと無いので。
検索しても、...の意味は出てこない。
0732デフォルトの名無しさん
2005/05/05(木) 20:37:43投げられた例外を全てcatchすることを意味する。
0733デフォルトの名無しさん
2005/05/05(木) 20:51:050734デフォルトの名無しさん
2005/05/05(木) 23:41:34エディットコントロールから入力された文字を
数値に変換したり、内部処理した数値を再び
エディットコントロールに戻して表示するには
どうすればいいですか?
0737デフォルトの名無しさん
2005/05/06(金) 00:06:33MSCのフォームって何。
いろいろあるけど、atoi()とか、sprintf()あたり
0738IMO
2005/05/06(金) 03:14:30どうすればいいか教えていただけませんか?
簡単なプログラムなんですが、
// mydll.c ///
#include <stdio.h>
int hello()
{
printf("Hello world!\n") ;
}
////////////////////////////
を
gcc -c mydll.c
でmydll.oにして、
gcc -shared -o mydll.dll mydll.o
でdllにしたいのですが、
Cannot export _bss_end__: symbol not defined
Cannot export _bss_start__: symbol not defined
Cannot export _data_end__: symbol not defined
Cannot export _data_start__: symbol not defined
collect2: ld returned 1 exit status
というエラーになってしまいます。
http://www.sixnine.net/cygwin/translation/mingw-doc/mingwfaq.html
に書いてある方法でもできないみたいです。
0739724
2005/05/06(金) 03:30:53たしかにそのほうが安心かも…。
std::istream::traits_type::eof()を#defineして使うことにします。
ありがとうございます。
0740デフォルトの名無しさん
2005/05/06(金) 07:36:520741デフォルトの名無しさん
2005/05/06(金) 09:29:08ダメだこりゃ。
0742デフォルトの名無しさん
2005/05/06(金) 09:35:26char chr[64];
(中略)
}
で、この場合chrは最後にfreeしなくていいんですよね?
この関数は何度も呼ばれるんですけど、
関数が終わるたびにchar chr[64]で使ったメモリは開放されているのか不安で。
0743デフォルトの名無しさん
2005/05/06(金) 09:41:14int i;
}
このiと同じ
0744デフォルトの名無しさん
2005/05/06(金) 10:58:50MSのVS.NETを買わなきゃいけないのでしょうか?使い勝手は悪くてもかまわない
から、JavaのJDKとかG++みたいに無料のコンパイラーがどっかに無いでしょうか?
無料じゃなくても、もっと安いのがあればそれでもいいんですが。VS.NETは
ちょっと手がでません。
0745デフォルトの名無しさん
2005/05/06(金) 11:13:43g++
0746デフォルトの名無しさん
2005/05/06(金) 11:17:32VCTK
0747デフォルトの名無しさん
2005/05/06(金) 11:35:27無料のコンパイラとか使うのもいいと思うけど、
環境設定とか開発効率とか、無意味な所で時間を食ったら本末転倒。
時間は金で買えない。
0748デフォルトの名無しさん
2005/05/06(金) 11:43:10g++って自分で書いてるだろ
0749デフォルトの名無しさん
2005/05/06(金) 12:01:03好きなの選べ
http://msdn.microsoft.com/visualc/vctoolkit2003/ (別途PlatformSDK必須、nmakeなど場合によっては.net FrameworkSDKも、ライブラリ関連のツールが配布されてないので注意)
http://www.borland.co.jp/cppbuilder/freecompiler/ (Windows2000までのSDKは同梱、make,ライブラリ関連等必要な周辺ツールは同梱)
以下Windows用gcc
http://www.mingw.org/
http://www.cygwin.com
0750デフォルトの名無しさん
2005/05/06(金) 12:19:33も忘れないでやってくれ。最近Dのほうしか見られてない気がするが。
0751724
2005/05/06(金) 14:58:33ダメなのか。#define SEOF std::istream::traits_type::eof()
とかいう意味で書いたのだが。
0752C言語をしようとおもうモナ
2005/05/06(金) 15:31:31もちろんフリーソフトでおねがいします。
0753デフォルトの名無しさん
2005/05/06(金) 15:32:470754デフォルトの名無しさん
2005/05/06(金) 15:37:38そんなの分からん、知りたくも無いならbcc。
…Windows環境だよな?
0755デフォルトの名無しさん
2005/05/06(金) 15:39:360756デフォルトの名無しさん
2005/05/06(金) 16:05:55安易にマクロを使うのはお勧めできない。
定数は const を使って定義することをまず考えたほうがいい。
ただし、この場合は
std::istream::traits_type::int_type const SEOF = std::istream::traits_type::eof();
となり、かなり冗長な定義になることや、
eof() が関数であることを考えるとマクロで書いた場合に比べて
インライン展開が効かないことによって非効率なコードになるかもしれない。
iostream ライブラリではファイルの終端は
bool eof() で判定するように設計されている。
その他のエラーも考慮して、
while((c=ifs.get())&&ifs.good())
とするのが正解だろう。
0757デフォルトの名無しさん
2005/05/06(金) 16:37:15どうしてでしょうか。
//任意の数字を入力し、平方根を求める。
//入力された数字が負の場合処理を打ち切る。
#include <stdio.h>
#include <math.h>
int main(void)
{
int a;
printf("数字を入力 : ");
scanf("%d", &a);
if (a < 0) {
printf("自然数を入力してください。");
}
else {
printf("%lfの平方根 = %lf", a, sqrt(a));
}
return 0;
}
0758デフォルトの名無しさん
2005/05/06(金) 16:50:08突っ込みどころ満載だがね。
main()関数を次のように汁。
int main(void)
{
int a;
printf("...");
if (scanf("%d", & a) < 1 || a < 0) {
printf("自然数を...\n");
} else {
printf("%dの平方根 = %g\n", a, sqrt(a));
}
return 0;
}
0759デフォルトの名無しさん
2005/05/06(金) 16:53:19結果を表示するprintfの1つ目の引数が%lfでsizeof double幅の
変数を要求してるのに、sizeof int 幅の変数を渡してるから。
0760デフォルトの名無しさん
2005/05/06(金) 17:12:500761757
2005/05/06(金) 17:22:19ありがとうございます。
解決できました。
0762デフォルトの名無しさん
2005/05/06(金) 17:58:56operatorによって
str = "左側" + "右側";
という式を定義したいのですが、
CString operator+(char *pszA, char*pszB){
}
を定義しようとすると(CStringは自作の文字列クラスだと思ってください)
'operator +' の宣言で、クラス型のパラメータが 1 つも指定されていません。
とエラーになってしまいます。
やろうとしていること自体は、技術的に可能でしょうか?
可能なら、正しいやり方を知りたいです。よろしくお願いいたします。
0763デフォルトの名無しさん
2005/05/06(金) 18:03:21まあ、この場合ポインタの加算でもともとこんなの存在しないけど
0764デフォルトの名無しさん
2005/05/06(金) 18:08:08CString operator+(const CString& strA, const char *pszB);
CString operator+(const char *pszA, const CString& strB);
を作って文字列(char *)同士の加算をしたければstatic_cast<CString>("左") + "右"などとキャストするしかない。
0765デフォルトの名無しさん
2005/05/06(金) 18:31:510766デフォルトの名無しさん
2005/05/06(金) 18:53:30キャストせんとconst char*同士の演算だと解釈されるぞ。
0767デフォルトの名無しさん
2005/05/06(金) 18:57:14CTaskを基底クラスにしで自機やら敵やら弾やらを派生してタスクリストをループさせることでゲーム全体を処理しています。
その中で弾と敵との当たり判定で
for (CTask *task=ActiveTask->Next, *next; next=task->Next, task!=ActiveTask; task=next)
{
if (task->Group==TASK_ENEMY)
{
Kill();
CEnemy* enemy=(CEnemy*)task; // ←ここ
enemy->Vit-=ShotStr;
とあるのですが、CEemyはCTaskからの派生クラスなので、CEnemy* enemy=(CEnemy*)task;はダウンキャストになると思います。
このダウンキャストは危険だと思うのですが。タスクシステムの参考にしていたのですが、dynamic_castを使ってNULLチェックを
した方がいいような気がするのですが、その必要はないのでしょうか?
キャストについて詳しい人がいたらよろしくお願いします。
0768デフォルトの名無しさん
2005/05/06(金) 19:02:51Cマガ編集部とゲーム・ノ・シクミの著者に言えよ
0769デフォルトの名無しさん
2005/05/06(金) 19:08:52そのインスタンスがCEnemyであることがわかっているのなら問題はない。
assertチェックくらいは入れておいた方がいいと思うが。
0770デフォルトの名無しさん
2005/05/06(金) 19:15:53最新のCマガでそんなコード載せてるのか。
継承使って if(task->Group==...) なんて、アフォか。
仮想関数使えよ。キャスト自体が要らなくなるだろ。
と、記事も読まずに突っ込み。
0771デフォルトの名無しさん
2005/05/06(金) 19:20:42dynamic_cast を使ったほうが安全だが、 dynamic_cast は
一般的にクラス階層の大きさに応じてコストがかかる。
当たり判定は高速な処理が要求されそうだから、
そのコストが受け入れられないのかもしれない。
それにしても、なんだか古臭いコードだな。
0772デフォルトの名無しさん
2005/05/06(金) 19:21:310773デフォルトの名無しさん
2005/05/06(金) 19:23:07stitic_castするぐらいならCString("hoge")+"moge"で充分だろ。
>>767
なんならの手段でダウンキャストの結果を保証できるならdynamic_castする必要はない。
dynamic_castだとパフォーマンスに影響がある場合だとか。
0774デフォルトの名無しさん
2005/05/06(金) 19:23:32assert( dynamic_cast<CEnemy*>(task) );
0775772
2005/05/06(金) 19:32:12なるほど。
でも実際に使ってるのがCスタイルキャストじゃぁ
dynamic_cast でヌルが返ってこなくてもダメな場合って無い?
多重継承使ったりするとダメな気がする。ちょっと試してみようかな。
0776デフォルトの名無しさん
2005/05/06(金) 19:34:42haru foo();
0777レイザーラモン
2005/05/06(金) 19:36:050778デフォルトの名無しさん
2005/05/06(金) 19:36:11お返事ありがとうございます。
なるほど。残念ながら "ぬるぽ" + "ガッ!!" はそのまま足し算するわけにはいかないのですね。
0779772
2005/05/06(金) 20:45:28けど怪しいのでさらに調べてみると、
Cスタイルキャストに対して static_cast, reinterpret_cast の
どっちが適用されるかは不定ということになっていた。
これをもとに実験してみると、
クラスの定義が同じソース内に現れていれば static_cast で、
宣言だけ( class A; class B; とか)だと、警告も無しに reinterpret_cast の動作になった。
やっぱりCスタイルキャストはクソだな。
0780デフォルトの名無しさん
2005/05/06(金) 21:00:24: QWidget( parent, name )
{
...
}
メソッドの後ろに付くコロンってどういう意味でしたっけ?
0781デフォルトの名無しさん
2005/05/06(金) 21:11:11メンバ変数と基底クラスの初期化。
コンストラクタにしか付かない。
0782デフォルトの名無しさん
2005/05/06(金) 23:29:450783デフォルトの名無しさん
2005/05/06(金) 23:31:440784デフォルトの名無しさん
2005/05/06(金) 23:43:33メンバがクラスの場合、そのコンストラクタで初期化できる。
constなメンバを初期化できる。(つーかそこでしかできない)
0785デフォルトの名無しさん
2005/05/07(土) 00:03:10初期化と代入の区別をしっかりしような。
0786デフォルトの名無しさん
2005/05/07(土) 00:26:35{
CString inp_a , inp_b, inp_c, inp_d;
double aa=0, bb=0, cc=0, sum_abc=0;
if (m_check_a.GetCheck() == BST_CHECKED){
m_edit_a.GetWindowText(inp_a);
aa = atof(inp_a);
}
if (m_check_b.GetCheck() == BST_CHECKED){
m_edit_b.GetWindowText(inp_b);
bb = atof(inp_b);
}
if (m_check_c.GetCheck() == BST_CHECKED){
m_edit_c.GetWindowText(inp_c);
cc = atof(inp_c);
}
sum_abc = aa + bb + cc;
m_edit_d.SetWindowText(sum_abc);
}
0787デフォルトの名無しさん
2005/05/07(土) 00:27:590788786
2005/05/07(土) 00:29:36最後の行でコンパイルエラーになってしまい
こっちが困ぱいしています。何がおかしいのでしょうか?
0789デフォルトの名無しさん
2005/05/07(土) 00:31:29エラーメッセージを貼らない奴は無視しようぜ。
0790デフォルトの名無しさん
2005/05/07(土) 00:40:080791デフォルトの名無しさん
2005/05/07(土) 00:46:070792デフォルトの名無しさん
2005/05/07(土) 00:53:33str.Format("%f",sum_abc);
m_edit_d.SetWindowText(str);
0793デフォルトの名無しさん
2005/05/07(土) 00:55:350794デフォルトの名無しさん
2005/05/07(土) 01:57:22変換するというツールを練習で作ってるのですがファイルの終端を
検知することができません。
スマートな検知方法があればご教授ください
0795デフォルトの名無しさん
2005/05/07(土) 02:04:34C/C++でreadfile()?WindowsのReadFile()か?
0796デフォルトの名無しさん
2005/05/07(土) 02:12:18すみません。
0797767
2005/05/07(土) 02:56:21その次のダウンキャストは大丈夫 という流れなんですね。
>なんだか古臭いコードだな。
そうなんですか?
タスクシステムは便利だなぁと思いつつタスク同士の処理(今回の当たり判定とか)になるとなんか逆に不便だな…と思う今日この頃。
ぼちぼちがんばるとします。
0798デフォルトの名無しさん
2005/05/07(土) 03:14:14ダウンキャストは良くない設計の現れ。
仮想関数をうまく使えないか考えろ。
0799デフォルトの名無しさん
2005/05/07(土) 03:42:47a[10]={0,1,2,3,4,5,6,7,8,9}
と、しておいて
0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 から一つ選べ
とprintfで表示して、scanfで選んだ数字(たとえば3)を次は
0, 1, 2, 4, 5, 6, 7, 8, 9 から一つ選べ
と言う風に3だけ表示させないようにするにはどうすればいいでしょうか?
0800744
2005/05/07(土) 03:48:29どうもありがとうございました。
g++でも、ウインドウズのアプリが出来るんですか?
LinuxとかUnix用だと思っていました。
他に皆さんがあげてくれたものを、自分で少し調べてみます。どうも。
0801デフォルトの名無しさん
2005/05/07(土) 03:49:13何が分からないの?
丸投げではなく、出来る所まで作って貼り付けてみ
0802デフォルトの名無しさん
2005/05/07(土) 06:26:060803デフォルトの名無しさん
2005/05/07(土) 07:03:520804デフォルトの名無しさん
2005/05/07(土) 08:05:41ソートするという意味です。
COBOLだとSORT文っていう、ファイルの中身を
ソートする命令がありました。
Cのqsortみたいにメモリ上の配列などをソートする関数はあるけど、
ファイルの中身そのものをソートする関数はあるのでしょうか?
0805デフォルトの名無しさん
2005/05/07(土) 09:16:100806デフォルトの名無しさん
2005/05/07(土) 09:18:48やっぱりメモリに読み込まないとダメですか。
ありがとうございました。
0807799
2005/05/07(土) 09:38:24{
int a[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
int b[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
printf("Player1の手札\n");
for(i=1;i<=10;i++)
{printf("%d=[%d] ",i,a[i]);}
printf("\nplayer2の手札\n");
for(i=1;i<=10;i++)
{printf("%d=[%d] ",i,b[i]);}
for(i=1;i<=10;i++)
{
printf("\n『『『『%d回戦』』』』\n\n《player1》\n出す札の番号を入力して下さい\n",i);
scanf("%d",&x);
printf("場に出したカード[%d]\n",a[x]);
printf("\n《player2》\n出す札の番号を入力して下さい\n");
scanf("%d",&y);
printf("場に出したカード[%d]",b[y]);
0808799
2005/05/07(土) 09:38:49{printf("\n\nplayer2の勝ち!!\n");}
else if(a[x]==1&&b[y]==13)
{printf("\n\nplayer1の勝ち!!\n");}
else if(a[x]<b[y])
{printf("\n\nplayer2の勝ち!!\n");}
else if(b[y]<a[x])
{printf("\n\nplayer1の勝ち!!\n");}
else if(a[x]==b[y])
{printf("\n\nドロー!!\n");}
}
}
while(printf("\n続けるなら何か数字を入力して下さい。続けないならCtrl+zを入力して下さい\n"),EOF!=scanf("%d",&play));
return 0;
}
int tehuda()
{
return (int)((double)rand()/(RAND_MAX+1.0)*13)+1;
}
今こんな感じで作っているのですが、最初に表示した手札を次は選んでいないものだけ表示させたい、と言う所がわからなくて詰まっています。
何か助言をお願いします。
0809デフォルトの名無しさん
2005/05/07(土) 09:56:033を選んだら、4-9をずらして配列に入れればいいんじゃない?
選んだ数字がn、配列の最大値(カードの枚数)をmaxとすると
for(i=n;i<max;i++)a[i]=a[i+1];
max=max-1;
これで配列の中身は
0,1,2,4,5,6,7,8,9
になるでしょ。
0810デフォルトの名無しさん
2005/05/07(土) 10:46:18max--;
for(i=n;i<max;i++)a[i]=a[i+1];
の方が良い。
0811デフォルトの名無しさん
2005/05/07(土) 11:51:51system("sort +1 foo > bar");
0813デフォルトの名無しさん
2005/05/07(土) 14:26:560814799
2005/05/07(土) 16:12:01例外処理 (初回) は Card.exe にあります: 0xC0000005: Access Violation。
と言うメッセージが出るのですが、どういう意味ですか?
0815デフォルトの名無しさん
2005/05/07(土) 16:29:15初期化してないポインタを触ったとか
配列を超えたとかじゃねーの
0816デフォルトの名無しさん
2005/05/07(土) 16:31:310817799
2005/05/07(土) 16:57:45{
int a[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
int b[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
printf("Player1の手札\n");
for(i=1;i<=10;i++)
{
printf(" %d=[%d]",i,a[i]);
}
printf("\nplayer2の手札\n");
for(i=1;i<=10;i++)
{
printf(" %d=[%d]",i,b[i]);
}
for(j=1;j<=10;j++)
{
printf("\n--------------------------------------------------------------------------------");
printf("\n『『『『%d回戦』』』』\n\n《player1》\n出す札の番号を入力して下さい\n",j);
printf("現在の手札は\n");
for(i=x;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
scanf("%d",&x);
printf("場に出したカード[%d]\n",a[x]);
0818799
2005/05/07(土) 16:58:57printf("現在の手札は\n");
for(i=y;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
scanf("%d",&y);
printf("場に出したカード[%d]",b[y]);
if(a[x]==13&&b[y]==1)
{
printf("\n\nplayer2の勝ち!!\n");
}
else if(a[x]==1&&b[y]==13)
{
printf("\n\nplayer1の勝ち!!\n");
}
else if(a[x]<b[y])
{
printf("\n\nplayer2の勝ち!!\n");
}
else if(b[y]<a[x])
{
printf("\n\nplayer1の勝ち!!\n");
}
else if(a[x]==b[y])
{
printf("\n\nドロー!!\n");
}
}
}
0819799
2005/05/07(土) 16:59:18return 0;
}
int tehuda()
{
return (int)((double)rand()/(RAND_MAX+1.0)*13)+1;
}
今現在はこういう感じです。
for(i=y;i<max;i++)a[i]=a[i+1]; max--;
これの意味は解ったつもりなんですが…
0820デフォルトの名無しさん
2005/05/07(土) 17:11:15for(i=x;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
0821デフォルトの名無しさん
2005/05/07(土) 17:23:520822デフォルトの名無しさん
2005/05/07(土) 17:33:26突っ込みどころ満載だなぁ。
>for(i=y;i<max;i++)a[i]=a[i+1]; max--;
>これの意味は解ったつもりなんですが…
わかってない。
printf("現在の手札は\n");
(*1)for(i=x;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
scanf("%d",&x);
printf("場に出したカード[%d]\n",a[x]);
(*1)はカードの入れ替えなんだから、ここじゃなくて勝敗が決まったあとだろ。
この行は持ちカード全部表示なんだからfor(i=0;i<max;i++)になる。
勝敗が付いたあとで、
for(i=x;i<max;i++)a[i]=a[i+1];
for(i=y;i<max;i++)b[i]=b[i+1];
max--;
あと、maxが0になった場合の処理も必要。
0823デフォルトの名無しさん
2005/05/07(土) 17:34:05i が max - 1 のとき、 a[max - 1] = a[max] という風になるが問題なし?
0824デフォルトの名無しさん
2005/05/07(土) 17:41:29int* i;
int *i;
ってどっち使ってますか?
0825デフォルトの名無しさん
2005/05/07(土) 17:43:030826デフォルトの名無しさん
2005/05/07(土) 17:45:20C++なら前者のほうがいい。区別する理由が無いから、Cでも前者。
0827デフォルトの名無しさん
2005/05/07(土) 17:45:260828デフォルトの名無しさん
2005/05/07(土) 17:47:090829デフォルトの名無しさん
2005/05/07(土) 17:49:330830デフォルトの名無しさん
2005/05/07(土) 17:51:060831デフォルトの名無しさん
2005/05/07(土) 17:51:20そうか?、プログラミング言語Cはいい加減すぎるよ。
0832デフォルトの名無しさん
2005/05/07(土) 17:53:140833デフォルトの名無しさん
2005/05/07(土) 18:17:040834デフォルトの名無しさん
2005/05/07(土) 18:34:440835デフォルトの名無しさん
2005/05/07(土) 18:42:450836デフォルトの名無しさん
2005/05/07(土) 18:44:15まだ青いな
0837デフォルトの名無しさん
2005/05/07(土) 18:48:02http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=32
Res:52
0838799
2005/05/07(土) 18:52:48>>822
ありがとうございます。なんとかできたみたいです。ただ、maxが0になった場合の処理はとくにしなかったのですが、何故か
何事もなく終了したんですが、何か問題があるのでしょうか?
0839デフォルトの名無しさん
2005/05/07(土) 18:53:33あなたのように黄ばみたくはありませんw
0841デフォルトの名無しさん
2005/05/07(土) 19:18:45fwriteでエラーを起こしてエラー処理の試験をしようと
思っていたんですが、fopen後にopenしたファイルを削除しても
特にエラーとはならずにfwriteが実行されているようです。
(openしてからwriteするまでに別のトリガがあるのでそのトリガを
発生させる前にファイルを削除した)
ほかにopen後にファイルのパーミッションを書込み禁止に設定
してみても同様に特にエラーが発生しませんでした。
ほかにエラーを発生させる方法としてディスクをフルに近い状態に
しておく位しか思いつかないのですが、何かほかに方法はあるで
しょうか?
また、どうしてこういう動作をするかという仕組みも教えてもらえると
助かります。
0842デフォルトの名無しさん
2005/05/07(土) 19:28:59それは激しく環境依存だが何か解決作は提供されている
例えばwinAPIでは排他させるものが用意されている
0843デフォルトの名無しさん
2005/05/07(土) 19:33:49Solaris9環境の場合だとどういう解決策があるでしょうか?
0844デフォルトの名無しさん
2005/05/07(土) 19:44:41とか?
0845799
2005/05/07(土) 19:45:58プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
と言うエラーが出ました。考えてみますが多分解らないような気がしますorz
でも、本当にわざわざありがとうございます。
>>838の問題は、何とか自分で解決してみます。
801,809,810,815,816,822,837氏、いろいろありがとうございました。
0846デフォルトの名無しさん
2005/05/07(土) 20:03:56多分バッファリングされててファイルにアクセスしてないんだろう。
setbufでバッファリングを無効にしてみれば?
0847デフォルトの名無しさん
2005/05/07(土) 20:04:37マイクソのcompilerだね
たぶん"プリコンパイル"使わないように設定すれば別の道が開けると思われ
0848デフォルトの名無しさん
2005/05/07(土) 20:14:200849デフォルトの名無しさん
2005/05/07(土) 20:15:150850724
2005/05/07(土) 20:57:31>>756
毎回細かい解説ありがとうございます。
std::istream::traits_type::eof() は知識として覚えておき
iostreamの設計者の意思に沿って
ifstream::eof() や ifstream::good() を使うことにします。
while(c=ifs.get(),ifs.good()){ //'\0'もコピーしたいので「&&」を「,」にしました
ofs.put(c);
}
初めは eof を2回呼び出すコードになってしまい
気持ち悪かったですけど、こうしてみるとスッキリして満足です。
どうも自分は STL 使い始めたばっかで定石を知らなすぎるので
人のコードを見て勉強することにします。
0851デフォルトの名無しさん
2005/05/07(土) 22:05:26テスト用に小さいパーティションがフロッピーディスクを用意し、>846で。
尚、リリース用のコードではバッファリング無効にしたら阿呆なので、
fwrite()だけでなくfclose()でもエラーチェックする必要がある点に留意のこと。
0852デフォルトの名無しさん
2005/05/07(土) 22:15:48とりあえずこんなんじゃだめ?
#ifndef NDEBUG
#define fwrite(p, size, n, fp) 0
#endif
0853デフォルトの名無しさん
2005/05/08(日) 01:54:15以下で十分。
while(c=ifs.get(), ifs){
ofs.put(c);
}
なぜならば通常、以下のように操作するから。
while(ifs)
{
//...
}
0854デフォルトの名無しさん
2005/05/08(日) 02:03:07明示的に good() をテストしたほうが読みやすいなぁ。
「なぜならば」の後ろも理由になってないし。
0855デフォルトの名無しさん
2005/05/08(日) 12:43:27>>844
flockでLOCK_EX|LOCK_NBをフラグに設定してやってみましたが
書き込み側では変化なしでした。
>>846
open後にsetbuf(fp,NULL)としてみましたがこちらも変化なし。
setvbuf(fp,NULL,_IONBF, 0)としてバッファリングしないように
した後に書き込みファイルを削除しても同様でした。
フロッピー方法で試してみるしかないかな・・・。
0856デフォルトの名無しさん
2005/05/08(日) 16:47:34っていうか開いてるファイルを削除できてしまうものなのか?
パスの間違いじゃなくて?OSはなんなの?
0857デフォルトの名無しさん
2005/05/08(日) 16:55:33もしWinだったら、APIで共有Lvを指定しないと開いてるファイルでも削除できる
他のOSはよく知らんが、
UNIX/LINUXなんかでPerlでopenしても、lockしないと削除したりできるしなぁ・・・
0858デフォルトの名無しさん
2005/05/08(日) 17:25:09考慮しなきゃならんのね。
Win2000で fopen(path,"wb"); で試した限りでは
fclose するまで削除できんかったので、他の環境でもそんなもんだと思ってた。
0859デフォルトの名無しさん
2005/05/08(日) 17:38:35Unixでは、あるプロセスがfopen("foo", "r+")していると
仮令rm fooしてファイルを削除したつもりになっても
ディスク上にfooの実体が存在しつづける。
従って、自プロセスからしか見えない一時ファイルを簡単に作れる。
>>855
だから>851。
0860デフォルトの名無しさん
2005/05/09(月) 22:04:480861デフォルトの名無しさん
2005/05/09(月) 22:07:200862デフォルトの名無しさん
2005/05/09(月) 22:14:580863デフォルトの名無しさん
2005/05/09(月) 23:10:20「しーたすたす」と読むのが通
0864デフォルトの名無しさん
2005/05/09(月) 23:48:280865デフォルトの名無しさん
2005/05/09(月) 23:50:500866デフォルトの名無しさん
2005/05/09(月) 23:56:430867デフォルトの名無しさん
2005/05/10(火) 00:03:590868デフォルトの名無しさん
2005/05/10(火) 00:18:06ある変数がどうやって記憶されるか。
auto(スコープから抜けると破棄)、static(実行中常に存在)、
register(レジスタに置かれる(ような気分になる))など。
0869867
2005/05/10(火) 00:32:48と初期化したら、ストレージクラスが正しくありません(たしか...)
みたいなことをコンパイラが発したんですけど、
それはUCHARの初期化はムリということですか?
もっと別のことかな...。初期化削ったら、エラー取れたけど。
ちょっと気になるので聞いてみました。
0870デフォルトの名無しさん
2005/05/10(火) 00:41:52エラーメッセージが出たなら、それに従え。
エラーメッセージの意味がわからないならコピペしろ。
UCHARが何者であるかも重要、かもしれない。
0871デフォルトの名無しさん
2005/05/10(火) 01:08:17VCに付いてるヘッダしか持って無いが、
typedef unsigned char UCHARって有るぜ
0872デフォルトの名無しさん
2005/05/10(火) 03:15:08static UCHAR v = 0;
}
こうかね?
0873867
2005/05/10(火) 09:37:390874867
2005/05/10(火) 09:38:120875デフォルトの名無しさん
2005/05/10(火) 11:46:59シープラ
0876デフォルトの名無しさん
2005/05/10(火) 12:10:320877デフォルトの名無しさん
2005/05/10(火) 21:26:13Linux/gccで
double a,b;
b=a>>1;
としたところ
: error: invalid operands to binary >>
とエラーが出てしまいます。
1時間程ネットで調べてもなかなか情報を得られなかったため、
ご教授いただければ幸いです。
0878デフォルトの名無しさん
2005/05/10(火) 21:30:21できないし、意味が無い。
0879デフォルトの名無しさん
2005/05/10(火) 21:34:58できないですか。
ビットの中身を覗くだけでもできないものでしょうか。
0880デフォルトの名無しさん
2005/05/10(火) 21:36:260881デフォルトの名無しさん
2005/05/10(火) 21:37:460882デフォルトの名無しさん
2005/05/10(火) 22:19:14int i;
return(i);
とかが当たり前でした。
でも最近は、
int i;
return i;
ってやるのが普通みたいです。
皆さんは()つけますか?それともつけませんか?
0883デフォルトの名無しさん
2005/05/10(火) 22:21:280884デフォルトの名無しさん
2005/05/10(火) 22:24:59関数の中で宣言した変数は、その関数から抜けた時に自動的にメモリ開放されるんでしょうか?
例えば、
この辺で変数宣言
if (比較){
成功時処理
}else{
return 0;
}
変数メモリ開放
return 1;
とやったら、比較失敗時は宣言した変数のメモリが開放されないままなのですか?
0885デフォルトの名無しさん
2005/05/10(火) 22:26:320886デフォルトの名無しさん
2005/05/10(火) 22:27:29for(int i=0; i<sizeof(double); i++)
for(int mask=128; mask>0; mask>>=1)
printf("%d", ((char*)&a)[i]&&mask);
こんなんでどうよ。
エンディアンの都合にあわせて変えてくれ。
0887デフォルトの名無しさん
2005/05/10(火) 22:27:32mallocでもしてるのか?
0888デフォルトの名無しさん
2005/05/10(火) 22:41:38スコープというものを勉強してみるといい
>>887
宣言と動的メモリ確保を一緒にするなよ
0889884
2005/05/10(火) 22:46:23char *str;
というポインタの宣言ではこのポインタのメモリは残らないのですか?
いくつかのWEB上にあるコードを見たところ、解放されていません。
でもポインタはメモリ上の位置を指す為の情報を保持しているのですよね。
0890デフォルトの名無しさん
2005/05/10(火) 22:48:06それで値が消えるわけではないぞ?
0891デフォルトの名無しさん
2005/05/10(火) 23:11:48保持しているとは言っても最初は使い物にならないでたらめな値になっている。
だからmalloc/callocや&や配列・文字列リテラルからちゃんとしたメモリへのポインタを取得し、
ポインタ変数へ代入している。
0892デフォルトの名無しさん
2005/05/10(火) 23:14:300893デフォルトの名無しさん
2005/05/10(火) 23:58:23「ポインタのメモリ」なんて表現は曖昧。
「ポインタ自身のメモリ」と「ポインタの指すメモリ」を区別する必要がある。
0895デフォルトの名無しさん
2005/05/11(水) 00:18:38Cの標準ライブラリはこれで全てですか?
ぐぐっても他に出てこないんだけど。
0896デフォルトの名無しさん
2005/05/11(水) 00:29:150897デフォルトの名無しさん
2005/05/11(水) 00:30:310898デフォルトの名無しさん
2005/05/11(水) 00:51:33言葉の意味が曖昧で危なっかしいな。
884に出てくる「変数メモリ開放」ってのは実際のコードで書くとどうなるの?
0899デフォルトの名無しさん
2005/05/11(水) 09:27:44ヘッダー中のクラスのprivateの部分を見せないようにするにはどのようにしたら良いですか?
0900デフォルトの名無しさん
2005/05/11(水) 09:35:25抽象クラスと生成関数の組み合わせか、 pimpl を使う。
0901デフォルトの名無しさん
2005/05/11(水) 10:09:45pImplイディオム調べてみました。面白いですね。
どちらにしろ、ある程度の手続きが必要ですね。
ありがとうございます。
0902デフォルトの名無しさん
2005/05/11(水) 11:00:47つ union{}
0903デフォルトの名無しさん
2005/05/11(水) 13:12:12一応動いちゃいますが。
void hoge()
{
int* a;
ArrayInt( a );
if( a )
{
delete[] a;
a = NULL;
}
}
void ArrayInt( int* a )
{
a = new int[5];
for( int i = 0; i < 5; i++)
a[i] = i;
}
0904デフォルトの名無しさん
2005/05/11(水) 13:14:43まずくない。
0905デフォルトの名無しさん
2005/05/11(水) 13:15:57特に問題は無いが、new 失敗時に NULL を返すのではなくて例外を投げる
コンパイラもあるぞ。
0906デフォルトの名無しさん
2005/05/11(水) 13:16:37ローカライズはソースなら問題ないでしょ。
複数人で組むプロジェクトとかだと、人にも判る様に書かなくちゃだけど。
0907デフォルトの名無しさん
2005/05/11(水) 13:23:06即レス有難うございます。
失敗時の処理が頭からすっぱ抜けてました
ちょいと改変して、この方法で行ってみます。
0908デフォルトの名無しさん
2005/05/11(水) 13:29:04おいおい・・・
ArrayIntでaを書き換えても、呼び出し元のaは変化しないぞ。
0909デフォルトの名無しさん
2005/05/11(水) 13:32:240910デフォルトの名無しさん
2005/05/11(水) 13:33:19むしろ例外投げるのが普通。
大抵のコンパイラは例外投げつつnull返すと思うが
0911デフォルトの名無しさん
2005/05/11(水) 13:46:27確認用にこんなんしてた
void hoge()
{
int* a;
ArrayInt( a )
for( int i = 0; i < 5; i++ )
printf( str, "%d\n", i )
↑
そりゃ動くわな・・・
0912デフォルトの名無しさん
2005/05/11(水) 13:49:23例外投げつつnull返すってなんだよ…
0913デフォルトの名無しさん
2005/05/11(水) 13:56:10落ち着け俺
printf( "%d\n", i );
です
sprintf( str, "%d\n", i );
OutputDebugString( str );
と使っていたもので。と、言い訳してみる。
0914デフォルトの名無しさん
2005/05/11(水) 13:58:07あと例外投げてnullを返すとか意味不明すぎ
0915デフォルトの名無しさん
2005/05/11(水) 13:59:19set_new_handlerで何もしないハンドラを設定したときはnullを返すってことじゃね?
0916903
2005/05/11(水) 14:08:45色々失敗しまくった。
他の方法を探ってみます。
0917デフォルトの名無しさん
2005/05/11(水) 16:15:250918デフォルトの名無しさん
2005/05/11(水) 16:19:08性的変数?やらしー
0919デフォルトの名無しさん
2005/05/11(水) 16:21:01変数が必要無くなった時
0920デフォルトの名無しさん
2005/05/11(水) 16:39:11実行終了時
0921デフォルトの名無しさん
2005/05/11(水) 18:34:200922デフォルトの名無しさん
2005/05/11(水) 18:56:37そういう時はこれを書くんです。
急速にスレの質が低下してまいりました
0923デフォルトの名無しさん
2005/05/11(水) 19:35:28質問のレベルが低いから、レベルの低い人でも答えられるから、だから
0924デフォルトの名無しさん
2005/05/11(水) 19:40:130925デフォルトの名無しさん
2005/05/11(水) 23:12:05Shell_NotifyIcon() でタスクトレイにアイコンを
登録する時、Windows2003 のコンソール上では
サービス開始後に正常に表示されるのですが、
ターミナルサービスの管理者モードでリモート
接続した画面で実行するとShell_NotifyIcon()で
失敗してしまいます。
理由が分かる人は教えてください。
ちなみに 失敗(FALSE)直後のGetlastError() は
「2」を返します。タイムアウトでは無いようです。
0926デフォルトの名無しさん
2005/05/11(水) 23:36:15独学で勉強してるんだけど、分らない所があるので
教えてください。
何回目で100を超えたかを出力したいんですが、
どうすればよいでしょうか?
おねがいします。
{
int i = 0 ;
int sum = 0 ;
while(sum<100) {
sum=sum+i ;
i=i+1 ;
}
}
0927デフォルトの名無しさん
2005/05/11(水) 23:39:07メンタマひんむいてスレタイを良く見てください。
0928デフォルトの名無しさん
2005/05/11(水) 23:45:23while( sum < 100 )
{
count++;
// sumの計算式
}
0929デフォルトの名無しさん
2005/05/12(木) 00:41:500930デフォルトの名無しさん
2005/05/12(木) 00:53:42物事を始めるのに年齢は関係ないよ。
おっさんや年寄りの話を聞いてるといちいち「50の手習いで」とか前振り付けるヤツが多い。
そんなにうまくいかなかったときの免罪符が欲しいのかと・・・。
おっと本題からずれた。
単に1+2+3+4+・・・で合計が百超えたときに何回足したか知りたいんだろうけど
{
int i = 0 ;
int sum = 0 ;
while(sum<100) {
i=i+1 ;
sum=sum+i ;
}
i=0から足しても意味無いからi=i+1を先に持ってきたけど、
これならwhileのループから抜けたときに
最後に足した数=足した回数が入るからiが目的の値そのものになる。
まぁ、プログラムの考え方としては>928のようにカウンタ用意するのが正解なんだが。
0931926
2005/05/12(木) 00:54:32丁寧にありがとう。
言語がまったく分らずC++はシャープの意味と思ってました。
以後気をつけます。
>>928
ありがとう。
書いてくれた式を見ながらでも、書けるまで一時間も掛かって出来ました。
一応書いた式です。
int i = 0 ;
int sum = 0 ;
int count=0;
while(sum<100) {
i=i+1 ;
sum=sum+i;
count++;
}
Console.WriteLine(count);
}
ホントに、ありがと!
0932デフォルトの名無しさん
2005/05/12(木) 01:00:57Cでは長いデータは配列として扱うしか無いんですか?
容量の小さいデータ型しか無いみたいなんですが。
PHPではarray[0]="abcde";array[1]="12345";と文字列を1次元配列に出来ましたが、
Cでは2次元配列を使うのでしょうか。
配列にすると関数に要素数を渡さないといけないらしいから非常に面倒な気がします。
0933デフォルトの名無しさん
2005/05/12(木) 01:05:210934デフォルトの名無しさん
2005/05/12(木) 01:11:03文字列を手軽に扱いたいのなら、stringを使ってみたら?
と書こうとしたら、Cなのね。Cの文字列の話から説明するのはめどいです・・・。
0935デフォルトの名無しさん
2005/05/12(木) 01:14:09文字列の最大長が255文字とか限られてるなら構造体って手がある
0936932
2005/05/12(木) 01:15:32って今調べてみたらC++でも使えるみたいな事が書いてあった・・・_no
という事なのでC++に乗り換えます。
それと>>932の最後一行は”配列”→”多次元配列”でした。
0937デフォルトの名無しさん
2005/05/12(木) 01:18:43C++ならPHPと同じように文字列(のクラス)の配列が使える。
Cなら、char型ポインタの配列になる。
char* str[10];
str[0]="abcde";
str[1]="12345";
って感じ。
リテラルじゃなくて文字列を代入するにはmallocとかしないとダメだけど。
0938926
2005/05/12(木) 01:22:43そういう気持ちがあったかもしれないです。
やる気があれば年齢は関係ないですね。
以後気をつけます。ありがとう。
int i = 0 ;
ここですが、iも結果が同じとの事ですので試してみました。
そこで一つ分らないことがあるんですが
int i = 0 ; とint i = 1 ;
iで表示だと i=0 と i=1 両方とも14と出るんですが
上記の書いたcount だと
i=0が14と出て、i=1だと13が出ます。
説明不足だったんですが、
1から何個目で100を超えるかだったので
1から14を足すと105となり、
14を出したいんですが、i=0だと
何か問題等あるんでしょうか?
0939デフォルトの名無しさん
2005/05/12(木) 01:33:23変数の中身を考えながらプログラムを1つずつ追ってみればいいんだよ。
>931のプログラムでi=0からはじめた場合、
i=1,sum=1,count=1
i=2,sum=1+2=3,count=2
...
i=14,sum=1+2+...+14=105,count=14でループから抜ける。
i=1からはじめた場合
i=2,sum=2,count=1
i=3,sum=2+3,count=2
...
i=14,sum=2+3+...+14=104,count=13でループから抜ける。
つまりwhileループに入る前にi=1だとループに入った瞬間i=i+1でi=2になるから思ったとおりの動作にならないだけ。
0940デフォルトの名無しさん
2005/05/12(木) 01:38:05気を配ればよいです。
sum=0;
count=0;
while( sum < 100 )
{
count++;
// sum計算
}
この場合、sumが100以上(100含む)であれば、数えない。
つまり、sumが0〜99のとき、カウントが+1。
countもiも同じ役目なので、どちらか一つで十分です。
0941926
2005/05/12(木) 02:02:57詳しくありがと。
いろいろな考え方があるんですね。
939さんの一つ一つ入れていくのは手間ですが、
動作が一つ一つ分って勉強になり、式の変動がわかりますね。
940さんの方は、回数の考え方に気を配れば一つ一つ追っていかなくても
いいですね。
最初の内は、両方とも考えながらしていってみます。
0942932
2005/05/12(木) 02:06:400943デフォルトの名無しさん
2005/05/12(木) 02:50:25int i = 1;
count = ceil( sqrt( i*i - i + 200.25 ) - i + 0.5 )
0944デフォルトの名無しさん
2005/05/12(木) 12:04:03MyClass::Delete()
{
delete this;
}
の動作は保障されていますか?
0945デフォルトの名無しさん
2005/05/12(木) 12:19:14・this は new によって生成されたオブジェクトを指している。
・delete this より後に this を使わない。
このふたつの前提条件が必要。
Delete() およびコンストラクタ、デストラクタを private にして、
これらの前提条件を満たすように実装すれば、保証を与えることは可能だと思われる。
そうでなければ、前提条件を崩すコードが簡単に書けるので、危険なコードだと言える。
0946デフォルトの名無しさん
2005/05/12(木) 12:22:44Delete()関数を抜けるまでに、他タスクに移動しない事も必要じゃないか?
0947944
2005/05/12(木) 12:33:14>>945さんの前提条件を満たしてのことです。
delete thisしてメモリを解放したのに、その後Delete関数から抜ける(呼出し元に返る)
プログラムはどうなっているのでしょうか?
0948デフォルトの名無しさん
2005/05/12(木) 12:36:400950デフォルトの名無しさん
2005/05/12(木) 12:42:51スタックとかヒープとか関数呼び出しの仕組みを
もっと勉強してください。
0952デフォルトの名無しさん
2005/05/12(木) 12:50:13狂ったコードだと思ったけど
COMがこれだね。
hresult release(){
if(--ref == 0){delete this;}
}
newで生成された保障がないのにdeleteってのも変だな。
0953デフォルトの名無しさん
2005/05/12(木) 12:59:28メモリの解放っていうのは、
「もうここは使わないので、他のルーチンで使用しても良いですよ」
と、上位に伝えるだけで、メモリの値を初期化したりしないからそういう関数でも正常に動いて見えるだけです。
>>948
クラスを動的に定義したら、Delete()関数も動的になるっしょ?
0954デフォルトの名無しさん
2005/05/12(木) 13:04:42C++では、>>944の例は、下のCプログラムと同じ。
struct MyClass
{
};
void MyClassFinalize( MyClass *this )
{// deleteで呼ばれるデストラクタ
}
void MyClassDelete( MyClass *this )
{
MyClassFinalize( this );
free( this );
}
このMyClassDeleteが正常に動くのは納得できるよな?
0955デフォルトの名無しさん
2005/05/12(木) 13:13:01>クラスを動的に定義したら、
( ゚д゚)ポカーン
0956944
2005/05/12(木) 13:19:50他のスレッドが割込み、解放したメモリ領域を確保して書き込みした場合、
呼出し元に戻るプログラム(アセンブラでいうとret?)は保障されなくなる気がするのですが・・・。
0957944
2005/05/12(木) 13:30:57>>944は前提条件さえあっていれば問題ないですね。
お騒がせしてすみませんでした。
0958デフォルトの名無しさん
2005/05/12(木) 14:29:41main()
{
int c/*, sp*/;
/*sp = 0;*/
while ((c = getchar()) != EOF) {
if (c == ' ') c = ' ';
putchar(c);
}
}
上記は二つ以上の空白をひとつの空白に置き換えながら、入力を出力に複写するプログラムのつもりです。
どうにも上手く動かないので、思い通りにいかないわけを教えてください。
宜しく御願いします。
0959958
2005/05/12(木) 14:30:47前に書いたソースを流用したのですが、消し忘れてました。
0960デフォルトの名無しさん
2005/05/12(木) 14:32:39が何やってるか理解してる?
0961デフォルトの名無しさん
2005/05/12(木) 14:38:39は
if (c == ' ') c = ' ';
のつもりでした。こぴぺの際消えた模様です。
復帰改行などと同じように¥nなどのエスケープ文字列がスペースにも用意されてるのかと思ってたのですが、
調べてもみつかりませんでしたので、’’でスペースをくくってみました。
0962デフォルトの名無しさん
2005/05/12(木) 14:44:010963デフォルトの名無しさん
2005/05/12(木) 14:45:470964デフォルトの名無しさん
2005/05/12(木) 14:47:340965デフォルトの名無しさん
2005/05/12(木) 15:06:31JPAG2000ってのが何なのか知らんが試せ。
0966デフォルトの名無しさん
2005/05/12(木) 15:21:29cはint(実質char)だから1バイト文字1つしか入らない。
だから半角スペース2つと比較なんかできない。
出力する前の文字を覚えておいて、
「前(old)もスペース、今回(c)もスペースなら出力しない」って流れがいいかと。
(実際は「oldかcがスペースで無いなら出力する」になるけど)
int c;
int old=0;
while ((c = getchar()) != EOF) {
if (c != ' ' || old != ' ') {putchar(c);old=c;}
}
0967958
2005/05/12(木) 16:26:23よく理解できました。
ありがとうございました。
0968デフォルトの名無しさん
2005/05/12(木) 23:23:46スタックの無いメモリアーキテクチャのシステムでは、
C/C++は実現不可能なのでしょうか?
0969デフォルトの名無しさん
2005/05/12(木) 23:39:57んなこたーない
0970デフォルトの名無しさん
2005/05/12(木) 23:44:40> 自動変数って必ずスタックを使わなければならないのでしょうか。
スタックを使う環境が多いだけで、
必ずスタックを使わなければならない、と言う訳ではない。
0971デフォルトの名無しさん
2005/05/13(金) 01:17:46サーバでコンパイルする事について書かれた記事をWEBで見かけたのですが、
もしかしてCやC++のプログラムは実行するプラットフォーム上でコンパイルしなければならないのですか?
別のプラットフォーム上で実行プラットフォームで走らせるプログラムをコンパイルする事は出来ない?
0972デフォルトの名無しさん
2005/05/13(金) 01:20:16できるけど、めんどい場合が多い
まずは、こっちで動いてあっちのコードをはくコンパイラを用意しないとね
まあクロス開発とかでググってみたら
0973デフォルトの名無しさん
2005/05/13(金) 01:20:29そういうことがしたい場合は「クロスコンパイラ」と呼ばれるものが必要になる。
0974971
2005/05/13(金) 01:40:480975デフォルトの名無しさん
2005/05/13(金) 02:01:22もし複数のプログラムで同じライブラリがインクルードされていた場合、
それぞれのプログラムにそのライブラリのコードが付加されてしまうのでしょうか?
これを共有させるにはどうしたら良いんでしょうか。
0976デフォルトの名無しさん
2005/05/13(金) 02:03:38ヘッダファイルには実体ができるようなものは置かない(インラインは除く)
構造体とか関数のプロトタイプ宣言は実体ができないからね
つかライブラリってヘッダファイルのことだよね?
0977デフォルトの名無しさん
2005/05/13(金) 02:13:36ライブラリのリンク形態には、スタティックリンク、ダイナミックリンクがある。
スタティックリンクはライブラリのコードがそれぞれのプログラムに含まれる。
ダイナミックリンクはライブラリのコードを共有する。
0978デフォルトの名無しさん
2005/05/13(金) 02:17:100979デフォルトの名無しさん
2005/05/13(金) 02:48:23・1つのソフトを構成する複数の.cが同じヘッダファイルをincludeする場合
・複数のソフトが同じライブラリを使う場合
前者と後者では、そもそも「共有」の概念からして異なる。
前者の場合、「そもそもヘッダファイルではグローバル変数の確保や
関数の実装をしない」という暗黙のルールで重複を回避する。
後者の場合、複数のソフトで共通利用するライブラリを
ダイナミックリンクライブラリにする事で重複を回避する。
お前が言ってるのがどっちなのか分からんと、何とも言えん。
0980デフォルトの名無しさん
2005/05/13(金) 02:52:31sprintf( str, "Data " STR, temp);
文字列の連結って、これで合ってました?
0981デフォルトの名無しさん
2005/05/13(金) 08:57:32コンパイル時に計算結果の値に置換されます?
0982デフォルトの名無しさん
2005/05/13(金) 09:07:48勿論。
0983デフォルトの名無しさん
2005/05/13(金) 10:31:13a = 34524.54 // = xxx * yyy * zzz(高速化のため先に計算)
アホかとバカかと
0984デフォルトの名無しさん
2005/05/13(金) 10:34:580985デフォルトの名無しさん
2005/05/13(金) 11:23:47"constキーワードを付けたメンバは自動的にstatic(つまりクラスのメンバ)になってしまいます。"
と書いてた。
"クラスのメンバ"とあるけど、スコープ内(ソース内)のみ参照できるという意味
の方が正しいのでは?
0986デフォルトの名無しさん
2005/05/13(金) 11:29:33(´・∀・`)ヘー
0987デフォルトの名無しさん
2005/05/13(金) 12:25:19ライブラリの関数にint set_callback( int (*p_callback_func)(char* ) );
という感じのものがありこの関数にクラスのメンバ関数を渡すことはできるのでしょうか?
クラスのメンバ関数を静的(static)にはしたくありません。
ご存知の方がいましたらよろしくお願いします。
開発実況環境VC.net Standard Linux gccです。
0988デフォルトの名無しさん
2005/05/13(金) 12:26:21staticにするしかない
0989デフォルトの名無しさん
2005/05/13(金) 12:27:250990デフォルトの名無しさん
2005/05/13(金) 12:28:35this をグローバルに保存してグローバル関数から
呼び出すか、C++ FAQ に書かれてるようにするかしかない
0991デフォルトの名無しさん
2005/05/13(金) 12:32:13世界の平和のため、そのサイトを晒すべき。
0992デフォルトの名無しさん
2005/05/13(金) 12:34:160993デフォルトの名無しさん
2005/05/13(金) 12:35:55ここまで知障なこと書く香具師がいるわけないし
0994デフォルトの名無しさん
2005/05/13(金) 12:38:56ググると一件ヒットするな
0995デフォルトの名無しさん
2005/05/13(金) 12:40:390996デフォルトの名無しさん
2005/05/13(金) 12:41:24> 開発実況環境
開発実況?
0997987
2005/05/13(金) 12:43:53DirectXSDKのコールバックなんかもそうしてましたね。
ガチガチのC言語で作成されたライブラリをC++に埋め込むのはあまり相性よくないのかな。
Cで書けゆわれたらそれでもいいですが、個人的にC++のほうが好きなんですね
そろそろスレも終わりそうなので急ぎにて失礼ですがどうもありがとうございました。
0998デフォルトの名無しさん
2005/05/13(金) 13:00:440999デフォルトの名無しさん
2005/05/13(金) 13:13:411000デフォルトの名無しさん
2005/05/13(金) 13:27:2610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。