1 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:04:59 ] 言語の入門者向け解説スレです。 教えて欲しいのではなく宿題を丸投げしたいならこちらへ。 C/C++の宿題を片付けます 108代目 pc11.2ch.net/test/read.cgi/tech/1211980711/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 28 pc11.2ch.net/test/read.cgi/tech/1211198816/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:16:33 ] Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/ Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/ Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/ Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/ Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/ Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
3 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:17:18 ] Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/ Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/ Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/ Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/ Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/ Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/ Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/ Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/ Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/ Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/ Part 25 ttp://pc11.2ch.net/test/read.cgi/tech/1203343907/ Part 26 ttp://pc11.2ch.net/test/read.cgi/tech/1206196600/ Part 27 ttp://pc11.2ch.net/test/read.cgi/tech/1209429897/ Part 28 ttp://pc11.2ch.net/test/read.cgi/tech/1211198816/
4 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:47:27 ] 過去スレってなんか意味あるの?
5 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:57:47 ] こんだけ続いてるんだぞ、ってアピール
6 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:15:31 ] ●持ちには
7 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:23:55 ] スレタイが凝っているスレなら、歴代スレタイ見てるだけで面白いけどなw
8 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 01:50:35 ] 変数aに対して、変数b回階乗したい。答えはcに格納。 int a,b,c,e -------------- 例えば、a=2 b=4 2^1=2 2^2=4 2^3=8 2^4=16 ----------- これをfor文で回したい。 for(e; e<=b; e++) c=a*e …普通の乗算になってしまう。 階乗にするにはどうすれば良い?
9 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:01:40 ] c=1; for(e; e<=b; e++) c=c*a; かな?
10 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:03:20 ] eがおかしいな c=1; for(e=0; e<b; e++) c=c*a;
11 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:04:39 ] e初期化しろ
12 名前:デフォルトの名無しさん [2008/06/02(月) 02:04:45 ] ポインタの配列と配列のポインタの表記法についてですが、 void func(struct person* p[]) と void func(struct person *p[]) と void func((struct person *)p[]) と void func((struct person *p)[]) と void func(struct person *(p[])) ってどうどれぞれどう違うんでしょう?
13 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:11:15 ] void func(struct person* p[]) void func(struct person *p[]) void func(struct person *(p[])) 全て等価 void func((struct person *)p[]) void func((struct person *p)[]) コンパイルエラー
14 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:12:41 ] void func(struct person* p[]) /* ポインタのポインタ */ void func(struct person *p[]) /* ポインタのポインタ */ void func((struct person *)p[]) /* 間違い */ void func((struct person *p)[]) /* 間違い */ void func(struct person *(p[])) /* ポインタのポインタ */
15 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:15:39 ] void func(struct person* p[]) void func(struct person *p[]) この二つは同じものである。* の前後のスペースから何を想像しても勝手だが、 いずれもまず p[] が *p と解釈され、よって *p[] は **p でありこれはポインタへのポインタを意味する。 void func((struct person *)p[]) void func((struct person *p)[]) この二つは文法的に誤りである。 void func(struct person *(p[])) 上で述べたとおり、括弧をつけるまでもなくまず p[] が解釈される。つまり最初の二つと同じである。
16 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:20:57 ] なお、関数の引数リストの中で配列を宣言することはできない。 Cでは配列全体をやりとりすることができないからである。 配列はほとんどの場合ポインタに成り下がって関数に渡される。 だから関数の引数リストで[]と書いたらそれは本当はポインタであることを意味する。 ただし、この解釈の変換は最初の一回だけであることに注意すること。 p[][5] は「要素が5の配列へのポインタ」であってポインタへのポインタではない。
17 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:32:25 ] Ubuntustudio(ubuntulinux 8.4相当)上でeclipseを使っています。 Glibを使おうとwww.gnome.gr.jp/docs/glib-2.8.x-refs/glib/glib-compiling.html を見ながらコンパイラの引数にpkg-configを加えたのですがうまくいかず、 glib.h及びstdlib.hなどの標準ヘッダファイルから、 /usr/include/stdlib.h error: storage class specified for parameter ‘atof’ などのエラーが200個近く発生して途方にくれています。 コンソールで試しても同じで、引数のpkg-configを外しても元に戻ることはありませんでした。 何が原因かさっぱり分かりません。どうかよろしくお願いします。
18 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:44:30 ] >>16 だから、成り下がってって表現すんなって。 配列を渡す事ができないからアドレス渡すだけだろ? ポインタを渡したいならポインタのアドレス渡さなきゃダメだろ?
19 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:45:59 ] >>17 200個出たからといって200個直す必要は必ずしも無いよ。 最初の1個をとりあえず解決してみるといい。
20 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 02:58:55 ] >18 関数に渡すことが出来ないから成り下がるんじゃないよ 関数云々以前にまず成り下がるの 構成概念をよくしらない人は黙ってなさい
21 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:02:12 ] ポインタって、無造作にポインタと言う言葉を「ポインタ値」と「ポインタ変数」の両方の意味で使うから混乱しちゃう人もいるのよね 理解してれば文脈で区別はつくけど
22 名前:デフォルトの名無しさん [2008/06/02(月) 03:04:15 ] 配列のポインタとポインタの配列とポインタのポインタの違いを教えてください。 関数の引数に指定したい場合はどうしたらいいのですか? void func(struct person* p[]) void func(struct person *p[]) void func(struct person *(p[])) はポインタのポインタ?
23 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:05:27 ] >>20 ・成り下がる、をどういう意図で使っているのか ・「ほとんどの場合」に当てはまらないのはどういう状況か この二つについて説明を求めます。
24 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:08:44 ] (*p)[5] 要素が5の配列へのポインタ *p[5] 要素数が5のポインタの配列 **p ポインタへのポインタ 関数の引数には配列そのものは使えない 代わりに配列の先頭要素へのポインタ(例: p[] )か、 配列そのものへのポインタ(例: (*p)[5] )を使う
25 名前:デフォルトの名無しさん [2008/06/02(月) 03:10:40 ] >>24 (*p)[5] と *p[5] は違うんですか?
26 名前:デフォルトの名無しさん [2008/06/02(月) 03:13:09 ] あ、なんでもないです・・・そういう文法なんですね・・・
27 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:13:54 ] >23 上については前スレに書いてあるだろ 下については&配列名で配列へのポインタ(成り下がった先頭要素へのポインタではなく)を渡す場合があるな
28 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:15:59 ] あなたの書き方だとint型の引数を受け取る関数があった場合、 まるで「int型の変数」が渡されるかのように見えます。 「int型の変数」を渡したい場合、その変数が格納されているアドレスを 渡さなければその「int型の変数」を扱えないでしょう? なのにポインタ(に成り下がって?)関数に渡される、と表現しているのが 非常にまずいと言っているのです。
29 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:18:27 ] 変数が格納されているアドレスが渡される? それはひょっとして参照渡しですか? Cは常に値渡しですが何か? 規格読み直せ
30 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:19:39 ] >>29 値渡しであるからこそ、変数のアドレスを渡さなければ その変数自体を扱う事ができないといっているのです。 意味を理解していますか?
31 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:23:29 ] 実引数に配列を指定した場合、 ・配列の先頭要素が格納されているアドレスが渡される という表記は数あれど ・配列のポインタが渡される などという表記がされているものを見た事がありません。
32 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:24:53 ] 他所でやれ
33 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:25:09 ] int型の変数を関数に値渡しするのに、アドレスを関数に渡す必要がどこにあるんだ?
34 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:25:53 ] >>33 ですから、ポインタを関数に渡すという表現がおかしいといっているのですが
35 名前:デフォルトの名無しさん [2008/06/02(月) 03:42:58 ] ポインタはどうやって学ぶべきか pc11.2ch.net/test/read.cgi/tech/1193166476/ ポインタ死ねよ。 pc11.2ch.net/test/read.cgi/tech/1171172537/
36 名前:デフォルトの名無しさん [2008/06/02(月) 03:48:17 ] Cの実行速度が速いって言われるけど理由はなんでですか? Javaには便利な文字列型があるけどCには無いってのも関係していますか? VSのように便利・安全なものほど遅いという感じで覚えておけばよかですか?
37 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 03:53:04 ] 神話。忘れよう。つか覚えないほうがいい。
38 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 09:55:45 ] まーここでもりあがるなら全スレを埋めるつもりでソッチでお願いw C言語なら俺に聞け(入門篇) Part 28 pc11.2ch.net/test/read.cgi/tech/1211198816/977-
39 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 09:59:25 ] >>36 JavaはJITで最適化してない状態ではある意味インタプリタ言語として動いてます。 ある意味といったのは、HTMLなんかのようなその都度スクリプトを解析するのでは なくJavaVMが扱える中間コードになっているから。 C言語は実行する環境向けに最適化されています。 コンパイルでできあがるのはマシン語です。
40 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:02:09 ] >>36 効率のよい実装を目標として作られたから それ以上でもそれ以下でもない
41 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:23:36 ] 失礼します 長文になりますがつまずいてしまったので、質問させてください #include <stdio.h> int funcJIJOU(int x){ return x * x; } #define macroJIJOU(x) (x) * (x) void main(void){ int i = 1, j = 1, k = 1, l = 1; int x, y; while(i <= 5){ x = i++; y = i++; printf("x * y結果:%d\n", x * y); } while(j <= 5){ printf("j++ * j++結果:%d\n", (j++) * (j++)); } while(k <= 5){ printf("関数結果:%d\n", funcJIJOU(k++)); } while(l <= 5){ printf("マクロ結果:%d\n", macroJIJOU(l++)); } return; } 上のようなものを書いてみました
42 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:24:28 ] 連投になり、申し訳ありません 上記の実行結果: x * y結果:2 x * y結果:12 x * y結果:30 j++ * j++結果:1 j++ * j++結果:9 j++ * j++結果:25 関数結果:1 関数結果:4 関数結果:9 関数結果:16 関数結果:25 マクロ結果:1 マクロ結果:9 マクロ結果:25 ここで実行結果を見てx * y結果と関数結果は思った通りになりました j++ * j++結果とマクロ結果が同じであることも思った通りではありました ですがなぜ1 9 25と一つとばしなのかがわかりません j++の度にjが1足されるのだとすれば2 12 30となると思うのですが・・・ ご教示ください
43 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:29:09 ] 後置インクリメント演算子はそれが含まれるステートメントが処理された後に インクリメントが行われる。 printf("j++ * j++結果:%d\n", (j++) * (j++)); は、 jが1としてステートメントを処理した後に、インクリメントが2回行われる。 次のループでは3としてステートメントを処理した後に、というかんじです。
44 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:29:41 ] >>42 www.kouno.jp/home/c_faq/c3.html#2
45 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:34:32 ] printf("j++ * j++結果:%d\n", (j++) * (j++)); は printf("j++ * j++結果:%d\n", (j) * (j)); j++; j++; と同じ
46 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:36:08 ] >>43 ,45 未定義動作だろうが。 うそを教えるなよ
47 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:44:30 ] >>46 おー、すまん。 コンパイラによって結果が違うこともあるのか。
48 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:46:48 ] >>43 ,44,45,46 早速の回答ありがとうございます 問題が解決しました
49 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:48:38 ] >>48 あなたがお使いのコンパイラはあくまで>>45 のいうような動作をするだけで 別のコンパイラだと違った結果を出すこともあると覚えて置いてください。
50 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:51:34 ] >>47 そういう言い方すると単に評価の順序が不定みたいな感じがするが、 >>41 のコードはコンパイルすら通らない可能性もあるし、実行時にエラーが発生する可能性もある。
51 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:52:18 ] >>49 ありがとうございます >>46 様の言われている未定義動作と、言うのはコンパイラ別に判断される動作、ということなのですね
52 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:53:04 ] >>42 副作用完了点の間で同じ値を二度変更するのは常に未定義である。 未定義であるとは、その結果 ど ん な こ と が 起きても、 例えばパソコンが壊れるようなことがあったとしても、 規格もコンパイラもいっさい責任を持たないということである。 一般に言ってそのようなコードを書くことはまったく推奨されない。 少なくとも、全てを自己責任で行わなくてはいけない。
53 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:54:32 ] 「規格が明確に定義していない」には3種類あって、以下のように定義されている。 ・処理系定義(implementation defined)の動作 どう動作するかを実装が選択する。そのプログラムがコンパイルできないというのは許されない。 (この構成概念を使ったプログラムは誤りというわけではない。) (実装が)何を選んだかは(コンパイラの作者が)文書にしておかなければならない。 規格が合法な動作をいくつか用意していてそこから選ぶことができるかもしれないし、 必要条件をとくに課していないかもしれない。 ・未規定(unspecified)の動作 処理系定義の動作に似ている。ただし、どういう動作を選んだかは文書にする必要がない。 ・未定義(undefined)の動作 本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。 コンパイルできないかもしれないし、誤った動きをするかもしれないし (クラッシュしたり黙って誤った結果を出したり)、 あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。 以上、CFAQより抜粋
54 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:56:00 ] >>51 違う 「やってはいけないこと」の類
55 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:57:28 ] まあ、勉強用の課題でだされたのかもしれないけど 普通にプログラミングしてて printf("j++ * j++結果:%d\n", (j++) * (j++)); は気持ち悪いと思ってまず組まないけどなw
56 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 18:03:09 ] C言語なら俺に聞け(入門篇) Part 28 pc11.2ch.net/test/read.cgi/tech/1211198816/992- www.kk.iij4u.or.jp/~kondo/bmp/ ここを参考にしたのですが先頭の2バイトに設置されている"BM"が曲者で ヘッダも14バイトなのでせめて2バイト予備で入れてくれればいいのに・・・ という状況で・・・・ 自分のプログラムで使う構造体なら考慮して作りますけどすでにある 共通のフォーマットだとそうもいかなくて無理やりやってるんですよねorz
57 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 18:03:25 ] >>前スレ992 gcc なら #pragma pack(1) でおk
58 名前:992 mailto:sage [2008/06/02(月) 18:04:29 ] >>57 ある構造体だけを指定してpack制御するとかは無理ですかね?
59 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 18:08:01 ] >>58 #pragma pack(2) struct ほにゃらら; #pragma pack(0) // 元に戻す
60 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 18:10:09 ] >>56 struct Foo {unsigned char c[14];}でも用意して、適宜変換する関数群でも用意しておけばよかろ。 static inline unsigned long getBfSize(const Foo f) { union { unsigned long u; unsigned char c[4]; } v; v.c[0] = c[2]; v.c[1] = c[3]; v.c[2] = c[4]; v.c[3] = c[5]; return v.u; } 位の関数なら、最適化で消えてなくなるだろ。
61 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 18:12:26 ] #pragma pack(push, 1) struct ほにゃらら; #pragma pack(pop) // 元に戻す つーのもあったような
62 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 18:15:53 ] >>61 そっちのほうが行儀がいいな
63 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:01:24 ] >>20 あなた、感覚がかなり可笑しいよ。アセンブラ勉強したら? 成り下がるって事ではなく内部からすれば Call by Value の方が処理多くなるでしょよ。 一般の言語から C 系に来ると逆転するんだよね。
64 名前:デフォルトの名無しさん [2008/06/02(月) 22:20:11 ] 3人のテストの点数がそれぞれ90,45,82(int型)だった。3人の平均点を実数(float型)で求め、少数点以下1桁まで出力するプログラムを書け。 の作成をして頂けませんか‥‥?? 手元にemacsがなく、しかし、答え合わせをしたく思います‥!!
65 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:20:44 ] 規格の仕様と実装の区別がついてない方はお引取りください
66 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:21:26 ] >>64 教えて欲しいのではなく宿題を丸投げしたいならこちらへ。 C/C++の宿題を片付けます 108代目 pc11.2ch.net/test/read.cgi/tech/1211980711/
67 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:25:07 ] >>64 脳内にCインタプリタを構築して、神と鉛筆を持って脳内ステップ実行してみろ。 机上デバッグといって昔はみんなそうしてた。
68 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:26:37 ] >>67 懐かしいなw 学校にコンパイラすらなくてマシン語手打ちしてたときは そんな感じだったよw
69 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:32:21 ] >>64 サンプル・・・だけどあえて罠が入ってる。 int a,b,c,d; float e; a = 90; b = 45; c = 82; c = a + b + c; e = c/3; (ここに標準出力)
70 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:33:28 ] その程度のコードでemacsは必要ないな
71 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:33:37 ] >>64 emacsでないと書けないというのは奇妙な話だ。 君のコンピュータにはメモ帳がないのか?
72 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:35:34 ] Cと思わせてemacsだったのか
73 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:35:35 ] 文脈から外人の気配を感じる 君のソースをここに書いてみて もし間違いがあれば指摘してもらえるよ
74 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:36:09 ] >>65 あなたは実引数に配列識別子を指定した場合、 関数に対してポインタに成り下がったものが渡ると思いますか? それとも、配列の先頭アドレスを指すポインタに変換された後、 そのポインタが指すアドレスが渡ると思いますか?
75 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:48:54 ] >>74 お引取りください
76 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:49:52 ] 人の話を論理的に解釈できない奴になに言っても無駄だよ 放置しろ
77 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:49:55 ] おとこわりします
78 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 22:57:41 ] >>74 その2つは、同じことを言い換えただけだと思います。
79 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:09:33 ] >>78 むやみに触ると火を吹くよ>< たぶん、たぶんなんだけど、後者だと思う。 C言語は値渡しだから、ポインタ変数を引数に指定した場合に、 それ自体を関数側で操作する事はできず、ポインタ変数の値である 番地しか渡せない。つまり、ポインタ変数を渡したい場合は、 そのポインタ変数が格納されているアドレスを渡さないといけないって いいたいんだと思う。 こんがらがってきたorz …噴火したらゴメンヨ。
80 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:10:55 ] 気を取り直して、、、 >>69 ありがちな罠ワロスw
81 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:12:41 ] 罠とは関係ないけどdはなんだったんだw
82 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:29:11 ] Dだって? 忘れろ 忘れるんだ 2.0なんか出てないんだ
83 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:32:45 ] 「プログラムと同じフォルダ内のbmpファイル(256色)(200*300pix)をプログラム実行 時に読み込ませ,1pixごとにそのRGB値を調べさせてCSV形式で書き出すプログラム 」 というプログラムを「C/C++の宿題を片付けます」で作っていただいたのですが、RGB値を読み込むことが出来ません。どうすれば読み込めるようになるか教えてください。 以下のプログラムが作っていただいたプログラムになります。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6759.c
84 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:38:32 ] なぜ ここで 聞く
85 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:55:11 ] つーかGetPixel使ったほうが楽だよ
86 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:05:00 ] >>85 GetPixelはこのプログラミングにそのまま使っても問題ないのでしょうか? あと流れとしては GetPixelでpixel指定をする。 ↓ 指定したPixelでRGB値を読み込む。 ↓ これをfor文で繰り返す。
87 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:11:19 ] 課題かなんかで使っちゃダメって言われてないなら問題ないでしょ int i,j; COLORREF savecolor[XSIZE][YSIZE]; for(i = 0; i < XSIZE; i++){ for(j = 0; j < YSIZE; j++){ savecolor[i][j] = GetPixel(i, j); } } あとはCSV形式にするだけ
88 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:20:43 ] >>87 私自身の実験解析手段なので、使わせていただきます。 あと、これを用いた時にRGB値を調べるのによいプログラミングはどういったものなのでしょうか? RGB値を読み込むものを探したらいろいろと出てきてどれを使えばよいのか分からないのですが。 お手数おかけします。
89 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:27:21 ] ごめん >>87 のGetPixel引数1個足りないわ HDCにビットマップをロードしとかないとダメだった RGB値を調べるというのは意味がちょっと分からないけど GetRValue, GetGValue, GetBValue でCOLORREF型からRGBが取得できる
90 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:27:45 ] ビットマップって意外と面倒なんだよなw 縦のライン数が正か負で情報の保存されてる方向がちがうんだよなw
91 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:38:02 ] >>89 HDCは普通に画像を読み込んで、それをFILEのポインタで用意したものを使ったらいいのでしょうか? あとざっと調べてみたのですが、GetRValue, GetGValue, GetBValueは例えば color=getpixel() で読み込んだものを r[i][j]=GetRValue(color) 見たいな感じで組んでいけばいいでしょうか?
92 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:38:47 ] まじめにBMPをサポートするとこんな感じ? www.kk.iij4u.or.jp/~kondo/bmp/dumpbmp.c ここの下のほうにあった www.kk.iij4u.or.jp/~kondo/bmp/
93 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:50:38 ] >>92 ありがとうございます。このデータを参考にもう一度プログラムを練ってみようと思います。 本当にありがとうございました。
94 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:57:38 ] 1から100の合計を求め、改行を表示するプログラムを教えてください
95 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 01:00:11 ] おせっかいかもしれませんが、ついでなので最適化もしておきました。 #include <stdio.h> int main(){puts("");return 0;}
96 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 01:03:07 ] 申し訳ございませんが、合計は返りちでお願いします
97 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 01:07:46 ] 教えて欲しいのではなく宿題を丸投げしたいならこちらへ。 C/C++の宿題を片付けます 108代目 pc11.2ch.net/test/read.cgi/tech/1211980711/
98 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 01:15:54 ] あ、気分を害しちゃいましたか? 宿題ではないんですけどね
99 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 01:21:32 ] int ReSum(int min, int max) { int sum = 0; for(; min < max; min++) sum += min; printf("\n"); return sum; }
100 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 01:23:59 ] エレガントですね ありがとうございます これからもちょくちょくお邪魔することにしました
101 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 06:12:04 ] #include <stdio.h> #include <ctype.h> void Oomoji( char *st ); void main() { char *moji = "abc"; char moji2[] = "abc"; Oomoji(moji2); } //大文字に変換する関数 void Oomoji( char *st ) { int i = 0; while( *(st+i) != '\0' ) { *(st+i) = toupper( *(st+i) ); i++; } printf( "%s\n", st ); } すいません、質問したいのですが変数moji2だと、ちゃんと大文字に変換できる のですが、ポインタ変数mojiだと変換できないのですが、なぜなのか教えて もらえないでしょうか、お願いします。開発環境はVisual C++です。
102 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 06:23:57 ] mojiのポインタ内に入ってるのはchar型じゃなくてconst char型だから書き換え不可 C++じゃなくてC言語だと書き換えも可能だけど絶対やらない事
103 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 06:38:17 ] >>102 ありがとうございます。
104 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 07:49:47 ] >>102 つまりchar *型で宣言した文字列は絶対にconst charになるので、 101のような書き換えは、するなと言うことなんですかね?
105 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 07:57:49 ] ポインタと配列は同じだと思ってる人多いけど気を付けた方がいい それと配列を関数を通してポインタにキャストするのも、あまり好ましくはないかな・・・ void Oomoji2( char sz[], size_t sz ) 微妙に意味合いが変わるしね ついでに、strncpyみたいに配列サイズの指定も推奨
106 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 09:05:56 ] >>101 コンパイラによっては、文字列リテラルは読み取り専用領域に用意される (オプションで動作を切り替えられるコンパイラもある) >char *moji = "abc"; この場合、読み取り専用領域に確保された文字列"abc"を指すように、ポインタmojiを初期化している mojiは"abc"を指しているだけで、その指す先は読み取り専用領域だから、書き換えられない >char moji2[] = "abc"; この場合、"abc"という内容で配列moji2を初期化している どこか別の領域を指しているわけではなく、moji2自身に文字列の内容が含まれているので、書き換えられる
107 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 09:31:12 ] >>106 どうも、ありがとうございました。理解できたと思います。
108 名前:デフォルトの名無しさん [2008/06/03(火) 10:01:10 ] scanf関数での入力に手を焼いているけど、一番無難な入力関数ってなんだろ?getchar関数だと、処理速度が気になるし。
109 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 10:05:07 ] fgets
110 名前:デフォルトの名無しさん [2008/06/03(火) 10:33:56 ] fgets(buff,BUFF_SIZE,stdin); fflush(stdin);
111 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 10:35:11 ] fflush(stdin)は処理系依存って怒られるぞw
112 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 13:55:50 ] 文字列を配列30個作り、奇数15の配列を順に表示するのはどうやんの? 今日変な課題出された。
113 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 13:58:49 ] for(i=1; i<30; i+=2) puts(str[i]);
114 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 13:59:05 ] >>112 奇数15というのは文字列の配列30個のうちの奇数番号の配列15個でOK?
115 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 14:03:25 ] >111 処理系依存っつか未定義な
116 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 14:05:40 ] 番号は0スタートでいいんだよね?念のため
117 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 15:11:05 ] 変な課題だな。
118 名前:デフォルトの名無しさん [2008/06/03(火) 15:26:06 ] #include <stdio.h> #include <stdlib.h> #define LIMIT 50 /* スタックに入る数の最大値 */ typedef int a ; /* 真偽値の型 */ int StackArray [LIMIT] ; int top ; /* スタックの先頭を指す */ void push (int x) ; /* 関数のプロトタイプ宣言 */ int pop (void) ; /* 関数のプロトタイプ宣言 */ a push_1 (void) ; /* 関数のプロトタイプ宣言 */ a pop_1 (int n) ; /* 関数のプロトタイプ宣言 */ void error (void) { } int main(int argc, char **argv) { int order, x, y ; top = 0 ;
119 名前:デフォルトの名無しさん [2008/06/03(火) 15:26:45 ] while (1) { printf ("\n現在のデータ数:%d\n", top) ; printf ("現在のスタックの状態:") ; {int i ; for (i=0; i<top; ++i) printf ("%d ", StackArray[i]) ;} printf ("\n") ; if (push_1 ()) printf ("(1) push ") ; if (pop_1 (1)) printf ("(2) pop ") ; printf ("(3) finish ") ; if (pop_1 (2)) printf ("(4) + (5) − (6) × ") ; printf (">") ; scanf ("%d", &order) ; switch (order) { case 1: if (push_1 ()) { printf ("input data: ") ; scanf ("%d", &x) ; push (x) ;} else error () ; break ; case 2: if (pop_1 (1)) { printf ("%d\n", pop ()) ;} else error () ; break ; case 3: return EXIT_SUCCESS ; case 4: if (pop_1 (2)) {y=pop() ; x=pop() ; push (x+y) ;} else error () ; break ; case 5: if (pop_1 (2)) {y=pop() ; x=pop() ; push (x-y) ;} else error () ; break ; case 6: if (pop_1 (2)) {y=pop() ; x=pop() ; push (x*y) ;} else error () ; break ; default: error () ; } } }
120 名前:デフォルトの名無しさん [2008/06/03(火) 15:27:07 ] a push_1 (void) { return top < LIMIT ; } void push (int x) { StackArray [top] = x ; top = top++ ; } a pop_1 (int n) { return 0 <= top-n ; } int pop (void) { top = top-- ; return StackArray [top] ; }
121 名前:デフォルトの名無しさん [2008/06/03(火) 15:33:36 ] 逆ポーランド記法のプログラムを作ってて、1〜9の範囲の整数を入力したいんですけど、どこに入れたらいいですか? また、1〜9の範囲の整数を入力するプログラムって #include<stdio.h> int main(void) { int x; if(x>0 || x<10) { printf("1〜9の整数です\n"); } else { return 0; } } こんな感じでいいですか?
122 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 15:45:10 ] だめです
123 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 15:53:18 ] >typedef int a ; /* 真偽値の型 */ アホなことやるな
124 名前:デフォルトの名無しさん [2008/06/03(火) 15:53:55 ] #include <stdio.h> void main() { int year, month, day, weekday; for (year = 2001; year <= 2100; year++){ for (month = 1; month <= 12; month++){ weekday = ((year + year/4 - year/100 + year/400 + (13*month+8)/5 + 13) % 7)+8; if (weekday == 13) printf("%4d年 %2d月 %2d日\n",year, month, weekday); } } } この実行結果の13日の金曜日の個数はどうやって求めればいいですか?
125 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 15:55:42 ] >>118 なんか全体的に気色悪い書きかただなぁ
126 名前:デフォルトの名無しさん [2008/06/03(火) 15:57:21 ] >>122 どこがダメですか?教えてください
127 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 16:04:02 ] とりあえず top=top++; top=top--; これ未定義
128 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 16:09:27 ] >>121 >>118-120 までで出来てるんじゃないのか?(>>127 の間違いあるけど) それとも自分で書いたソースじゃないのか? とりあえず1〜9を判定したいなら scanfでxに値を入れてから if(x>0 && x<10) だ
129 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 16:14:38 ] >118 ・真偽型なんか宣言するな ・スタックの状態を判定する関数の名前をもう少し工夫しろ ・while(1)よりも、orderを初期化した上でdo{ ... }while(order!=3); のほうが構成的に綺麗 気になるのはそんなとこか
130 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 16:19:08 ] >>126 x に値が入っていない 条件は || じゃなく && return は else の外に出せ(elseは必要ない)
131 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 16:26:11 ] >>124 変数に記録でもすれば?
132 名前:デフォルトの名無しさん [2008/06/03(火) 18:04:59 ] #include<stdio.h> int main(void) { int x; scanf("%d", &x); if(x>0 && x<10) { printf("1〜9の整数です\n"); } return 0; } これでいいですか?
133 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 18:14:47 ] OK
134 名前:デフォルトの名無しさん [2008/06/03(火) 19:21:21 ] C言語でミリ秒待たせるプログラムですが みなさんのお薦めで教えて 簡単なヤツがいいです
135 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 19:23:44 ] >>134 DOSならSleep Linuxならusleep
136 名前:デフォルトの名無しさん [2008/06/03(火) 19:47:24 ] Sleep()がコンパイラにダメだと言われました、 ミリ秒待たせるにはどうしたらいいでしょうか(T_T) sleepとか色々な綴りもやりました(;_;)
137 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 19:54:08 ] gettimeofdayとnanosleep
138 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 19:54:15 ] >>136 Cの標準関数じゃなくAPIになるから、環境をかけ。OSとコンパイラの種類とバージョンだ。
139 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:02:02 ] 要素数noであるint型の配列vcの要素の最小値を返す関数 int min_of(const int vc[],int no)の作成の仕方を、どなたか教えてもらえませんか?
140 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:08:53 ] int min_of(const int vc[],int no) { /* 必要な変数を宣言 */ /* 最小値を記憶する変数にvcの最初の値を入れる */ /* カウンタを1から初めてno未満であるあいだ1ずつ増やしながらループし */ { /* vcのカウンタに対応する位置の値と、 最小値を記憶している変数の値のどちらが小さいか調べ、 その小さいほうを最小値を記憶する変数に格納する */ } /* 最小値を記憶した変数をreturnする */ }
141 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:13:22 ] >>136 #include <Windows.h>
142 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:15:37 ] いつも思うんだが <widows.h>の hってなんの略?
143 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:16:29 ] header
144 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:16:30 ] >>142 ヘッダーのh 拡張子だよ cソースの場合はxxx.c
145 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:17:16 ] 最近の学生はヘッダという言葉を知らんのか
146 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:19:09 ] >>143 >>144 >>145 あ、ヘッダーだったのか ありがとう
147 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:27:35 ] いいかい?これはおまじないだから忘れないようにね! #include<stdio.h> とか教えられたんじゃない? スタジオドットエッチ、とか発音してそうな雰囲気だよー
148 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:30:21 ] でも本当に最初の最初はおまじないって教わった事を思い出した まあ、最初からヘッダファイルがどうとかこうとか言ってたら中々始まらないしなぁ
149 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:32:14 ] まあな。 ちょっとなれたころに #include<stdio.h> なんかをはずしてみると、今まで使えてた関数が コンパイルエラー起すでしょ、とか言って教えれるんだけどな。
150 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:33:09 ] 最初からできるわけないもんな。 ファイル分割とかしてみてえと思って何回挫折したことか。懐かしいわぁ
151 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:33:25 ] #include <cstdio> とか h のないのを見かけるのですがあれは何ですか?
152 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:33:28 ] stdio.hを外してコンパイルエラーが出る関数ってのは難しいな。 FILE外したら関数以前にエラーが出るからなぁ。
153 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:34:08 ] >>151 それはすれ違い。
154 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:35:30 ] >>152 ん?極端に言うと、stdio.h無しだと何もコンパイルできない、と言っている?
155 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:38:24 ] >>154 逆。大抵の関数はエラーにならない。
156 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:40:39 ] stdio.h stdlib.h まあ、この二つをググッて調べてみるといいよ。 どういう関数が使えるようになるかわかる
157 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:45:52 ] >>155 やってみたら警告で済ませてくれた。 コンパイラやさしいな!
158 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:46:41 ] 何の警告が出たんだ?
159 名前:デフォルトの名無しさん [2008/06/03(火) 20:46:42 ] 実は簡易的なHTMLの<この中の内容>を取り出す関数を作ろうと思っているのですが、 html->nextはHTMLの内容 #define BODY_SIZE 214 /* <>の切り出し */ html->body = (char *)malloc((size + 1) * sizeof(char)); if(html->body == NULL) goto END; char *tmp; while(*html->next++ != '<' && *html->next != '\0'); for(int len=0; html->next[len] != '\0'; len++){ if(html->next[len] == '>'){ html->body[len] = '\0'; break;} if(len >= size - 1){ size += BODY_SIZE; tmp = (char *)realloc(html->body,size); if(tmp != NULL) html->body = tmp; else goto END;} html->body[len] = html->next[len]; } HTMLの<>内を取得していくにあたり、動的なヒープ領域が足りなくなれば、 reallocを使って拡張し、また取得していく、という処理なのですが、 コードが複雑になり、非常に読み難いものになってしまい、 これをもっと簡潔には出来ないものでしょうか?
160 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:48:10 ] >>158 printfは組み込み関数じゃないよって警告。
161 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:50:11 ] >>159 それこそ線形リストがいいんじゃね?
162 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:55:18 ] >>161 今は>>159 のコードを簡潔にしたいです。
163 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:55:53 ] あー、printfは使うのね
164 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:02:09 ] >>163 てか、各種ライブラリを使わずに使える関数って何があるの? read と write は知ってるんだけど
165 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:09:33 ] >>159 そのソースの全体的な思想が分からないからなんともいえないんだけど '<'から、次に見つかる'>'までがとにかく取れればいい、というのであれば strposとかでキュッキュすればいいんじゃないかな。 <<>とか<hoge foo=">">とか無視していいならね。
166 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:11:26 ] >を多用しているソースは苦手だなw
167 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:14:40 ] 環境はVS2005、Windowsなのですが、 strposをMSDNで調べましたが、見つかりません。
168 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:18:11 ] >>167 アイヤー。ごめん。strposはphpですた。 Cだとstrstr?
169 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:21:46 ] >>168 はい
170 名前:デフォルトの名無しさん [2008/06/03(火) 21:23:00 ] >>168 なるほど、 ではreallocの部分は簡潔になりますでしょうか?
171 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:23:59 ] コピーの開始地点と終了地点がわかってから一気にmalloc()すれば realloc()必要ないでしょ。
172 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:31:27 ] >>171 strstrで二点間(<>)の出現場所を計算して mallocする、ということでしょうか? ではstrstrを使わない場合で >>159 のreallocの部分を簡潔にするためにはどうすればいいでしょうか?
173 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:33:07 ] >>172 双方の出現場所が分かれば必要なサイズが分かるでしょ? んでmalloc。 出現場所を調べる部分を簡潔にしたかったのでstrstr案を 出したわけでして、なぜ却下されたのだろう。ふしぎ!
174 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:34:54 ] >>172 なぜstrstr()やらstrchr()を使わない? サイズが事前にわからないのならrealloc()するのは仕方ない。それが嫌 ならコピー元のhtml->nextの残りサイズと同じサイズをmalloc()してお くしかない。 Cではこのへんが限界だよ。C++ならもっとすっきり。
175 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:37:47 ] >>174 strchr!思い出させてくれてありがとう。 indexofとかじゃなかったっけ?とかせっせと探してたんだw
176 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:38:46 ] とゆーか構造体htmlの仕様がなんか怪しくね
177 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:40:20 ] 単にソースをすっきりさせるだけなら、size を html->body_size にして、 bool html_ensure_capacity(html_t *html, size_t new_size) { void *tmp; if (new_size < html->body_size-1) return true; html->body_size += BODY_SIZE; tmp = realloc(html->body, html->body_size); if (tmp == NULL) return false; html->body = tmp; return true; } で、html_ensure_capacity(html, len);を呼ぶ。
178 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:41:42 ] >>173 私が先程聞いたのは、strstrを使わない場合に >>159 のコードのreallocを簡潔にする方法は無いか、という事です。 却下ではなく、場合の話です。 新しく聞いている訳で、あなたが教えてくれたstrstrを使う案を退けたつもりはありません。
179 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:42:52 ] 簡潔という言葉が一体何を意味するのかがいまいち判然としないが、たぶん無い
180 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:44:25 ] 俺だったら内容コピーしたりせずに先頭を示すポインタと長さを表す変数で済ませるね
181 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:46:22 ] あ、boolとか書いちゃったよ。てへ☆
182 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:47:23 ] 本当に簡潔に済ませたいならreallocなんか使わずに済む方法を考えること 見たところファイルを全部メモリにロードしてるようだし、 範囲確定してから戻ってmalloc & strncpyすればいいじゃない
183 名前:デフォルトの名無しさん [2008/06/03(火) 21:48:06 ] ではとりあえず >>179 >>180 >>168 で試していきます。では
184 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:48:40 ] >>178 あ、タグを見つける部分を簡潔にするのと realloc周りを簡潔にすることのどちらかしか行わないのね。 両方すればいいのにな、と思っただけですスミマセンスミマセン。
185 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:51:16 ] 短い=簡潔 と思っているフシがあるのかな? goto使ってたり、}の場所が、とか。 なんか、いろいろ違和感を感じるコードだなって思うわ。 とりあえず試行錯誤しながらがんばって成長してくだされ。
186 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:53:51 ] 構造体の仕様とか名前付けのセンスとかでいろいろ察してしまう 個別のタグ内容を割り当てる構造体にファイル全体へのポインタを含めて そこからデータをコピーしてくるってのは正直気色悪い
187 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:56:02 ] >>186 あなたが気持ち悪くならない方法を教えて下さい。
188 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:57:02 ] まあタグ以外の内容がいらないなら一つ一つバラしてコピーした後に ファイル全体のバッファを捨てることになるんだろうけど ふつーテキストと合わせてなんかやるよね
189 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:58:33 ] >187 ファイル全体のバッファ(のどこか)を指しているポインタは独立で用意して関数の引数で渡す だけ
190 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:58:47 ] >>186 まだ成長途中なんだなあって思えてほのぼのするよね。 自分が昔書いたコード見たら気持ち悪い、というか、 なんでこう書いちゃったのwwって思う場所がよく見つかる
191 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:04:14 ] >>189 その様にした理由を教えて下さい。
192 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:06:49 ] >191 気色悪いから
193 名前:デフォルトの名無しさん [2008/06/03(火) 22:10:36 ] >>192 論理的理由を聞いている訳ですが、
194 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:11:23 ] >193 ない
195 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:24:34 ] >>193 経験で分かるようになるよ。 「気持ち悪い」っていう感覚ってかなり重要だよ。
196 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:45:12 ] C言語なんだけど 終了しますか?(Y/N)とか、終了(1) 継続(0)とか、入力をさせる。 んで入力値をscanfで取って判断してるんだけど、 scanfって直前のEnterとか認識不能なコードをストリームに 残しておくとのこと おかげでバグだらけで困っているのだ… 他にキーボードからの入力を受け取れて不具合の無い関数は無いかな? 初歩くさくてすまんが…
197 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:46:04 ] getcharとかそんなのなかったか?
198 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:49:32 ] 動作が定義されている環境ならば fflush(stdin) でいいかな。
199 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:50:51 ] >>196 標準入力は全てfgets()で済む。
200 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:51:43 ] 早速ありがとう。けど使い方がよくわからん 今ケータイだから使用例なんかを挙げて もらえるとすごく助かるかも@新入社員、今帰り 明日午前中にコードレビューだから帰ったら今日中に 仕上げなきゃ…
201 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:54:30 ] printf("終了しますか?(Y/N)"); do { c = getchar(); } while(c == 'y'); こんなんとかか?CUI系の関数使うの久々だから自信ない
202 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:04:51 ] >>200 ケータイだから使用例をってどういう流れだ? conio.hのgetchとかもいいんでないの?
203 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:33:03 ] 確定的にある入力を捕まえたいなら プロンプトを表示する前にずべての文字を読み捨てておく それが唯一の汎用な解
204 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:44:12 ] しかし、すべての文字を読み捨てたのかまだ文字が残ってるのかを知る術はない
205 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:50:46 ] バグが出るのはscanf()が悪いんじゃなくて使い方を理解してないのが悪い。 まあ、きちんとした使い方を理解させないで安易にscanf()で入力させる入門書や教師が一番悪いんだが。
206 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:59:22 ] 仕事を持ち帰らせる会社が悪い。新入社員なら特に。
207 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:05:14 ] >>196 だけど、様々ありがとう! とりあえずgetcharを用いて行ってみるよ 文字として受けるから書式指定せずにいけるからね これから実装だ…
208 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:12:37 ] fseek(stdin,0,SEEK_END) って未定義だっけ?
209 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:13:20 ] >>206 納期は明日の午前だからしょうがない 別に業務じゃないけど、納期に遅れる訳にはいかないことを 教えるためだと思う
210 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:13:53 ] wikipediaには改行コードまで読み飛ばすって方法が載ってるけど、scanf()が行単位で動作してないんだから、 そんなことしてたら、エラーのときと正常動作のときと動きがちがってくるとか面倒なことがありそう。 stdinをfflush()したりファイルポインタを先頭にもどすとかってフラッシュのやりかたがあるけど、移植性ないし リダイレクトとかされたら、どう動くかわからんし。 fgets()とかで行単位で読み込んで、sscanf()を使うなり自力で解釈するのがシンプルで紛れのないやりかた。
211 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:23:35 ] >>209 業務では無いみたいだし、つか勝手に持って帰ってるだけだと思うけど 「納期に遅れる訳にはいかない」なら会社に泊まらせた方がまだいいなぁ
212 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:25:34 ] C言語で、リスト構造によるスタックとキューから要素数を取得する方法を教えてください(><)
213 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:27:34 ] 要素数を別に記憶していないなら、先頭から始めて末尾まで順に辿ってその回数を数えるしかない
214 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:13:26 ] >>211 泊まり込みなんてほんとにあんのかなあ? 寝ないと逆に集中出来ないんじゃね?
215 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:16:47 ] 3日ぐらい寝ずに仕事すれば覚醒する。
216 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:18:40 ] 寝ないと集中できない は真 泊り込みなんてほんとにある も真
217 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:25:08 ] 会社で寝ればすべて解決
218 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:57:58 ] >>217 移動時間が節約できるんだよね。 あとは思い立った瞬間に仕事ができるんだよね。 夜2時とかにひらめくこともある。
219 名前:デフォルトの名無しさん [2008/06/04(水) 08:19:08 ] 132のプログラムを118〜120のプログラムの中に入れたいんですけど、どこに入れたらいいですか?教えてください
220 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:35:54 ] >>219 1〜9の範囲の整数を入力してくれなかったら困るなあってところにいれる
221 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 19:35:54 ] >>218 無理をすると、あとでしっぺ返しがくる。 無理をしなければ納期に間に合わないようであれば、納期を延ばしてもらう。 これがいい。 そういう調整能力を身につけることも、プログラマーにとっては重要。
222 名前:デフォルトの名無しさん [2008/06/04(水) 21:51:52 ] >>221 それがヒューマンスキルってやつ?違う?
223 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:54:28 ] 何かの大賞とった川柳思い出した 無理をさせ 無理をするなと 無理を言い だったけな?
224 名前:デフォルトの名無しさん [2008/06/04(水) 22:17:30 ] ベーシックのスレは何処でつか?
225 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:18:08 ] (*p)++と*(p++)の違いがわかりません。
226 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:20:36 ] (*p)++は、 int n = *p; n++; *p = n; *(p++)は、 int* p2 = p + 1; くらいだと思っとけ
227 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:24:39 ] (*p)++; は中身をインクリメント *(p++) 及び *p++ は はポインタをインクリメント
228 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:46:52 ] 文字列の配列ってどうやって作るんですか? char str[5] str[1] ="文字列1" str[2] ="文字列2" str[3] ="文字列3" printf(%s\n,str[1]); とやってもエラーになるんですが。
229 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:48:06 ] それは文字列の配列じゃなくて 文字の配列だからね どうしてもしたいなら二次元配列使う
230 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:49:41 ] str[][8] = { "文字列1", "文字列2", "文字列3" }
231 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:50:15 ] せめてこうだな char* str[5] まー、何がやりたい分からないから、これがベストとはとても言えないが
232 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:10:12 ] >>228 厳密な意味での文字列の配列とは、文字の二次元配列の各行要素に文字列が入っているものを言う。 char strlist[3][8]; このように宣言したとき、strlist[0] 〜 strlist[2] は、それぞれが char str[8]; と宣言した str と等価となる。 しかし、上記の配列では、全ての行要素の配列の大きさが同じである必要がある。 つまり、それぞれの行に入る文字列の長さが違っても、最も長いものに合わせなければならず、メモリを浪費しがちである。 それが嫌な場合には、主に文字列へのポインタの配列が使われる。 char *strlist[3]; char str0[5], str1[8], str2[4]; strlist[0]=str0; strlist[1]=str1; strlist[2]=str2; 見ての通り、strlist[0] 〜 strlist[2] は charへのポインタであり、それぞれが対応する配列の先頭を指している。 ということはそれぞれを文字列として扱うことができ、しかもそれぞれに対応する配列の大きさを個別に設定できる。 ただし、実際にはこのように静的な配列を行要素に使うことはほとんどない。通常、malloc() で割り付けた動的な領域を使う。 malloc() の扱いには熟練を要するので、安易に手を出すのは控えること。 それと念のために言っておくが、Cの配列の添字は 0 から始まる。char str[5]; と宣言したら各要素は str[0] 〜 str[4] である。
233 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:13:28 ] 早い話、C言語に文字"列"型というものは存在しない
234 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:17:15 ] >>233 それを言ってもまったく早くはならないと思うが
235 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:40:55 ] 早い話、文字列は使わないほうがいい こうですか
236 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:58:14 ] 文字列をしっかり理解してないのに文字列の配列に手を出すな だろ
237 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:00:21 ] char str_array[N][]とchar *str_array[]じゃ、メモリ構成的にも全くの別物だしな
238 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:26:26 ] いきなり好奇心からCを勉強するのはおバカさん Cの前にPASCALを勉強することはお利口さん ただし、ハマるとオ××に転落さん そこにさえ気をつければ、本当はPASCALから入って欲しいのだが Cの勉強は、PACALを初歩をマスターしてからという奴 Free-PASCAL/Turbo-Delphi/ラザルス(だったけ) みたいなフリーな処理系がネットで入手可能だし、条件は 恵まれているのだが... なにせ、良いPASCALの入門書は絶版に近いのがイタい。 やっぱり××ムの影響だろな。
239 名前:デフォルトの名無しさん [2008/06/05(木) 00:38:16 ] >>238 はいはいスレチスレチ
240 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:58:13 ] Cは初心者にはかなりハードルが高いプログラミング言語だよ
241 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:03:31 ] でもCから始めたよ
242 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:11:20 ] >>240 書き方次第だよ 判定式の中に計算とかそういうのをやらなければどうってことはない。
243 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:27:05 ] >>222 「約束を守る」という社会人の鉄則にすぎないのですが、なにか?
244 名前:デフォルトの名無しさん [2008/06/05(木) 01:27:45 ] 基本はわかった スキルあげるため、どういう本がいい?
245 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:32:14 ] 基本がわかったんなら自分で判断しろよw
246 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:35:42 ] ある程度の大きさの配列を宣言するとき、256とか1024とかキリのいい数字で割り当てた方がいいですか?
247 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:37:18 ] いや別に
248 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:38:47 ] >>238-242 以前こんなコードみた int split_tsv(char ****split,char *filename); 【仕様】 タブ区切り文字列のみで構成されるテキストファイルを読み込み を文字列配列の配列に変換。 char ***(ポインタ変数)をsplitに参照渡しする。 (sはNULL不可) 戻り値は、行数. こういったコード、ちょっとやればすぐに出てくるけど、これって初心者向けか? 初心者には絶対に弄らせたくないコードだよな。 構造型プログラミング言語の黎明期の時代に、多くのプログラミング言語(特に PASCAL)が型の概念を導入したんだが、実プロジェクトに投入したら中間型が乱造 されてしまい名前空間管理が極度に困難になって開発が大停滞してしまった。 このことの反省を十分に取り入れたのがCなんだが、 型の概念を徹底的に学んでない初心者がCで上のようなコーディングをしなければな らないんだとあせるのは、危険きわまりない。とは家、中間型(作業型)の問題も実 にやっかい。 この世界は、やはり余り普通の人が入ってくる世界じゃないよ。
249 名前:デフォルトの名無しさん [2008/06/05(木) 01:51:40 ] >>243 きめぇ
250 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:12:04 ] **** はさすがに気色悪い 自分ならそこまでやるなら多段の構造体に仕込んじゃうかも…つーかC++(略
251 名前:デフォルトの名無しさん [2008/06/05(木) 02:19:31 ] char配列で表現した2進数を、頭から一文字ごとに比較したいのですが、 ソースAのような表記ではそもそも「error C2446: '==' : 'const char *' 型から 'int' 型への変換ができません。」が発生しコンパイルが通らず、 ソースBのような表記では、1文字ではなく、文字列全てを読んでしまって、if分岐に入ってくれません。 使用しているOSはWindowsXPHome, 使用しているコンパイラはVisual Studio 2005 Academic Editionです どなたかご教授いただけないでしょうか ソースA) char tmp[8]; strcpy(&tmp[0], "11111000"); if (tmp[0] == "1") { ... } if (tmp[1] == "1") ... if (tmp[7] == "1") { ... }
252 名前:デフォルトの名無しさん [2008/06/05(木) 02:20:02 ] ソースB) char tmp[8]; strcpy(&tmp[0], "11111000"); if (strcmp(&tmp[0], "1") == 0) { ... } if (strcmp(&tmp[1], "1") == 0) ... if (strcmp(&tmp[7], "1") == 0) { ... }
253 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:23:15 ] '1'
254 名前:デフォルトの名無しさん [2008/06/05(木) 02:27:21 ] >>253 if (strcmp(&tmp[0], '1') == 0) { ... } とした場合は、下記のエラーが出てしまいます・・・ error C2664: 'strcmp' : 2 番目の引数を 'char' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
255 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:27:59 ] いや、 tmp[n] == '1' って事を言っているんだろう
256 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:31:01 ] なんでBのほうにとるw
257 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:33:55 ] >>255 おお、コンパイルも通り、動いてほしい動作もしてくれました! ありがとうございました! …よろしければなぜ通ったのか、っていうか"1"、'1'の違いは何なのか、お時間があればお教えくださいませんか
258 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:36:15 ] ああ、あつかましくて申し訳ないです。 入門サイトの、それについての解説が載っているページへのリンクや、 ググルキーワードでもお教えいただければ…
259 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:38:15 ] そんなのも知らないのにstrcpyとかは知ってるのか
260 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:40:05 ] "1" は { '1' , '\0' } の文字列、 n == "1" で比較してるのは(正確には違うんだろうけど)アドレス '1' は 1バイトの文字コード(要するに数値)になる まあ>>236
261 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:40:32 ] "1"だと文字列なので中身は 1\0 (\0:ヌル文字) となって先頭の1の部分のアドレスが入る '1'だとそのままの文字が入る あと8文字入れたいなら\0まで考えて tmp[9]取っときなさい
262 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:43:59 ] >>259 恐縮です 独学の偏った順番で勉強しているからだと思います… >>260 ありがとうございます! 文字列処理も場数ということで… 気を引き締めて使用していきたいと思います
263 名前:デフォルトの名無しさん [2008/06/05(木) 02:47:02 ] >>261 あー、自分の手元のソースの方ではヌル文字を意識した配列していたのですが… 問題点を抽出化したサンプルを作成する際に、手落ちしてしまったみたいです… ようするに、まだヌル文字分まで意識して文字列配列を宣言することを、意識しなれていない、ということですね 繰り返さないように精進します ありがとうございました!
264 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:51:37 ] >>251 '1' は文字定数である。 Cでは文字はすべてそのマシン上での文字セットに対応する整数値と等価である。 そしてこれが通常 char 型の変数に格納される。 連続したchar 型からなるデータ領域に任意の文字の値を並べて格納し、 最後にヌル文字( '\0' )を加えたものが文字列と呼ばれるデータ構造である。 文字列は通常、その先頭の文字へのポインタを使って操作される。 配列の場合はその配列名が先頭の文字へのポインタに変換されるので、 つまり大抵の場合は文字列を格納した配列の名前を使って文字列を操作する。 この場合、配列 tmp に文字列を格納し、tmp という名前を通じて操作しようとしている。 "1" は「文字列リテラル」と呼ばれる、固定の文字列である。 コード上では配列名同様に '1' へのポインタに変換される。 コンパイラによる自動的な変換がある限られた場合を除き、 どんなときも == 演算子で互いに比較する対象は 「同種の」データオブジェクトでなければならない。 この場合 tmp[0] は char 型つまり整数型であるのに対し、 "1" はその文字列リテラルの先頭を指すポインタ型であるから 正しく比較できるわけがない。文字定数 '1' を使え。
265 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:52:32 ] もう四半世紀近くやってきて思ったこと。 経験は絶対的に必要だが、努力や熟練とは異質の世界だなと最近痛感。 足を洗うヨテイ
266 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:56:02 ] >>263 if (tmp[0] == "1"[0]) とか if (tmp[0] == *"1") でもコンパイルが通らない事は無いがオススメはしない 文字列が指すのがポインタってのはこれが一番わかりやすいかも?
267 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:58:04 ] &tmp[0]は絶対に蛇足(tmpと同じ)ということも覚えておくこと
268 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 03:06:25 ] C++だとvectorと合わせるために&tmp[0]とかやるけどな 趣味で好きな方を選べばいいと思う
269 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 03:12:41 ] &(tmp[0])はtmpと等価だがtmpをポインタ変数と同一視するのはCでもやめたほうがいい。 Cでは変更不能なポインタ変数というのが無い(C++ではある)から。 仮に実際にそうであっても、変更不能なポインタ変数であるとtmpをコード上で見なすこと はしないほうがいい。 *(tmp++)とか書けないだろ?だからポインタ変数とまぎわらしい書き方はしないほうがいい。 char配列をchar*型引き数に渡す場合は、(char*)&(tmp[0])とか(char*)&tmpというキャスト をして値渡し(アドレス値は、ポインタ変数にアサイン可能)する。
270 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 03:30:10 ] >>265 食っていくだけなら経験があればいい 腕を上げるには努力や熟練よりも好奇心が必要 と、八半世紀(ってなんだ)くらい思い続けてるんですがどうですか
271 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:09:27 ] >>249 なに、すべてはお金のため。あなたもその年になれば嫌でも理解するでしょう。
272 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:42:19 ] 独学で先週から勉強してるんですが、引数だの返却値だののくだりで分からなくなりました 高校時代の数学の成績を聞いて一言返すだけのプログラムなんですが seisekiがどんな値でも返事が「苦手なんすね」になります どうしたら成績に合った返答ができるようになりますか? どうやらこのスレで自分の質問だけかなり低レベルなようですがよろしくお願いします #include <stdio.h> int func ( int ); int seiseki ; int main ( void ) { printf("高校時代の数学の成績は5段階評価で言うと大体どのくらいでした? :"); scanf("%d",&seiseki); switch(func(seiseki)) { case 1 : printf("苦手なんすね\n"); break; case 2 : printf("普通っすね\n"); break; case 3 : printf("得意なんすね\n"); break; default: printf("え?\n"); } return 0; } int func ( int seiseki ) { if(seiseki == 1 || 2) return 1 ; if(seiseki == 3) return 2 ; if(seiseki == 4 || 5) return 3 ; else return 4 ; }
273 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:45:46 ] int func ( int seiseki ) { if(seiseki == 1 || seiseki == 2) return 1 ; if(seiseki == 3) return 2 ; if(seiseki == 4 || seiseki == 5) return 3 ; else return 4 ; } if ( seiseki == 1 || 2 ) だと、seiseki == 1 もしくは 真(0以外) になるから 必ず真になってしまって条件の意味が無い
274 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:46:15 ] >>272 >if(seiseki == 1 || 2 if(seiseki == 1 || seiseki == 2
275 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:48:14 ] >>273-274 即レスありがとうございます! 引数とかの問題じゃない初歩的な間違いだったんですね・・・
276 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:22:54 ] >>269 正しく理解していれば混同することなどナイヨ そんな冗長なキャスト使うほうが読んでて知識を疑うわ
277 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:00:54 ] >>269 もし君が配列名をポインタ値として扱うべきでないと真剣に考えるなら、 tmp の要素にアクセスするあらゆる場所で ((char *)&tmp)[0] のように書くべきである。 しかし前スレで書いたように、C規格はそのような冗長な書き方を避けるために、 配列はその先頭要素へのポインタ値に成り下がるという動作を規定した。 規格を正しく理解するかぎり、tmp[0] という書き方はまったく正当で安全である。 理解しないならどのような書き方をしたとて遅かれ早かれ間違いを起こすだろう。 1から10までアセンブラを叩くようなものの考え方を押し通すまえに、 高級言語というものがそもそも何のためにあるかを考え直すこと。
278 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:35:41 ] どっちも正しいんだから好きな方を選べばいい
279 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:41:45 ] >>265 俺も、アセンブラから始めて、pascal C++と4半世紀歩んできたが、今C++&boostで面白さが更に拡大してきた。これで10年は戦えそうだ。
280 名前:ロベ [2008/06/05(木) 13:34:30 ] ・BMPファイルの情報(画像サイズ、色数等)を表示する ・BMPファイルの画像を上下・左右反転させる ・BMPファイルの画像を回転させる ・BMPファイルのカラー画像をグレースケール化する 式 Y=0.298912*R+0.586611*G+0.114478*B ・Windows形式とOS/2形式どちらにも対応できるようにする このようなプログラムを作りたいのですが ネットで調べてもほとんど参考になるものを見つけれませんでした どこか参考にできるHPなどありますかね?
281 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:47:27 ] >>280 BMPファイルのフォーマット解説 www.kk.iij4u.or.jp/~kondo/bmp/
282 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:49:23 ] あと>>56 >>83 >>92 も参考に
283 名前:ロベ [2008/06/05(木) 13:56:26 ] >>281 >>282 ありがとうございます 参考にします!!!
284 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:52:45 ] 今まで struct hoge __attribute__((aligned(16))) hogehoge[] = { {-0.53878,5.12228,-0.46578}, {-0.53878,5.62244,-0.05845}, {-0.53878,5.12228,-1.13112}, {-0.53878,6.47772,-0.82431}, {-0.53878,6.55215,-0.05845}, ・ ・ } とソースに組み込んできた情報が肥大してきたので ファイルから読み込む予定なんですが 16バイト区切りで読み込みに必要なメモリをmalloc させる方法ありますでしょうか?
285 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:21:06 ] ない。gccの拡張機能でもなかった気がする。
286 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:23:30 ] >>284 UNIX系だとmemalign()とかposix_memalign()があるかもしれない。 VC++だと_aligned_malloc()というのがあるかもしれない。 malloc()を使っても簡単にできますけどね。
287 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:25:42 ] malloc自体は16バイト境界に合わせてくれる保証がないから、 大きめに取って自分で境界調整するしかなかった気がする なんにせよ処理系に依存する話
288 名前:284 mailto:sage [2008/06/05(木) 15:27:59 ] >>285 マジっすかorz >>286 >UNIX系だとmemalign()とかposix_memalign()があるかもしれない。 >VC++だと_aligned_malloc()というのがあるかもしれない。 ちょっと調べてみます。 ちなみにCygwin + gcc 環境での開発になります。 >malloc()を使っても簡単にできますけどね。 これで思いついたのが、実際に必要なサイズ+16バイトでmallocで 確保した上でアドレスを16バイト区切りになるようにずらすというのもいけそうですかね?
289 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:34:37 ] >>288 >確保した上でアドレスを16バイト区切りになるようにずらすというのもいけそうですかね? freeするときに元のアドレスに戻すのを忘れないように
290 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:41:13 ] 戻すのは危険な香り 確保した領域の先頭を指すポインタと実際に使う領域の先頭を指すポインタを別に用意したほうがいいかも
291 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:42:59 ] >>289 そうですね。 >>290 ポインター2個の予定です。 こういうケースのアドレスのずらし方がわからないorz
292 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:49:58 ] ポインタの内部表現によるけど 基本的には整数値として見たときに 16の倍数になるように後ろにずらせばいいんじゃないの?
293 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:07:58 ] >>277 だからtmpは定数を表すマクロシンボルじゃないんだって。Cでは予約語や関数以外、識別子を定数と みなすことはされない。(もしかして関数も変数なのかも知れないし) Cでは、配列識別子は、実質ポインタ変数だよ。ただしポインタ変数として書き換え不能という属性がある。 書き換え可能なポインタ変数を、型は同じでも属性が異なるポインタ変数に値を複製する場合も、 明示的キャストが必要.本来的にはCではポインタの型(格)だけでなく変数属性にも煩いぞ。 異なる格や属性のポインタ変換が多用され、多用できるが故のメリットを享受するのに必要な当然の 危機管理文化だ。 Cは簡潔記述が目的で設計されたわけじゃない。この点、絶対誤解するな。 コードを簡潔かつ流麗にし記憶しやすくする為に、型/格/属性の相違をすべて型に吸収させいちいちそれ にもっともらしい名前を付けることによる弊害(乱用され、乱造されるので、ちょっとしたコード書くの にも、膨大な資料を参照しなければならなくなるハメになり、そのうち正しいコード(他人のバグに依存し ない)を書く事すら不能になる)だけは避けたいというのが設計理念。 Cはキャストまみれの冗長記述になるのが自然だし、冗長に書いて真価を発揮する。
294 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:14:04 ] >Cはキャストまみれの冗長記述になるのが自然だし、冗長に書いて真価を発揮する ありえない そんな思想で作られたとしたら そもそも配列がポインタに変換される仕様が入るはずがない
295 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:15:46 ] >>291 void *p = malloc(required_size + 16); uintptr_t addr = (uintptr_t)p; addr = (addr & ~0xf) + 16; struct hoge *phoge = (struct hoge *)addr; ... free(p);
296 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:27:30 ] >>293 ぜんっぜん逆。 Cはそういうわずらわしさを、ある一定の原則さえ守っていれば(そこがちょっと難しいが) 環境ごとの差異にさえ捕らわれずに排除できることを目指した。 だからそれぞれの型の複雑な格上げや符号拡張や変換や比較の法則があって、 そしてそれらが 自 動 的 に 行われる。 お前さんは単にそういう原則を正確に把握していないために、 コードの実際の動きを予想することができなくて、ガチガチに規定した冗長コードを書いてしまうだけ。
297 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:30:30 ] Cには配列という概念は無い ポインタ(変数/値)に対する演算子[]が定義されてるだけ pointer[integer_value]は無名変数(ポインタの型/属性/格に対応する型/属性/格を持つ)を 表す。
298 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:32:35 ] 少なくとも strlen((char *)&array) はないだろ常識的に考えて
299 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:33:36 ] >>297 「概念」はあるよ。 オブジェクトがないだけ。
300 名前:284 mailto:sage [2008/06/05(木) 16:33:43 ] >>295 おーありがとうございます。
301 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:43:27 ] >ただしポインタ変数として書き換え不能という属性がある。 すくなくともこれは大間違い 配列に代入しようとしたときと char*constに代入しようとしたときの エラーメッセージを読めばわかるはず 配列識別子は配列全体そのものを表す ただし一部の例外を除いてその先頭要素への ポインタ値(変数ではなく)に変換される だよ
302 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:47:00 ] >>296 言語仕様を勝手にガチガチに規定して、それに依存したコードを書いてると後で泣きを見るかも知れません (俺モナー)
303 名前:284 mailto:sage [2008/06/05(木) 16:57:47 ] 早速組み替えて思ったように動作しました。 感激!!ありがとうございます。
304 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:10:29 ] 必要のないキャストが大量にあるコードを見たときの常人の反応は 「うわあ、この人はすごい厳密なコードを書くんだなぁ」じゃなくて 「うわあ、この人はC言語の仕様をよく知らないんだなぁ」だ 一方で、明示的なキャストが大量に必要なコードがあったとしたら、 たぶんそれは設計に問題がある
305 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:14:22 ] Cの経験がある常人って事か… 普通に考えてどっちであろうが 常人がコードを見たら「うわぁ…」としか思わないだろ とか思ってしまったよ
306 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:16:15 ] ポインタを制するものはCを制すとはよく言ったものだ
307 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:29:01 ] 特定のコンパイラは文句を言わないだけで本当は必要なキャストが大量にあるコードを 見たときの賢人の反応は 「うわあ、この人はC言語の仕様の良く知らない人なんだなぁ」じゃなくて 「うわあ、この人はC言語の仕様の流動的な部分に依存しない信用のおける人」だ 一方で、明示的なキャストが皆無に出来るほど、型やクラスが大量に作ってあるような (その反面、根本改革は至難の技になる)コードは、CじゃなくてPASCAL系とかで書いた ほうがいいんじゃないかという気がする。 というのは独り言
308 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:32:40 ] C++への移植のためにキャストは必要
309 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:36:42 ] キャストしたら負けかな、と思っている
310 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:49:44 ] >>307 >特定のコンパイラは文句を言わないだけで本当は必要なキャスト 具体例plz
311 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:59:54 ] 少しでも心配だなと思うところには明示的にキャスト そうじゃないところは面倒なのでスルー そんな俺
312 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 18:29:04 ] char a = 2; int b = a << 8; こんな感じのプログラム書いてはまったことならあるな 格上げって処理系依存なんだっけ?
313 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 18:36:33 ] 決まってるでしょ。 それでどんな風にはまったの? その例じゃ出ないけど符号拡張?
314 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 18:37:12 ] 規格では両オペランドが演算に先立って整数拡張されるはずだが。
315 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 18:43:32 ] 両方ともunsinedで宣言してたかな? VCだと512が求まるんだがとある環境だとキャストしないと0になった
316 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:04:06 ] なんか冷静に思い出してみると、16ビット環境で32ビットの計算をさせようとしてたのかも typedefされてたのintじゃなくてlongだったような 勘違いスマソ >>312 は忘れて下さい そりゃキャスト必要だよな
317 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:17:05 ] 基本型の型変換にはキャストに似た書式が使われるが、これはキャストとは言わないほうが いいと思うような... int m; double d; d=(double)m; とかね。このコードをint変数をdouble変数にキャストするコードとは言わず、int値をdouble値に 型変換してアサインすると言って欲しい。本当は別の書式にしたいんだろうな。設計者は。
318 名前:デフォルトの名無しさん [2008/06/05(木) 19:19:02 ] これは別に煽ってるとかじゃなくて本当に教えて欲しいんだけど キャストと型変換はまったく違うものなのか?
319 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:25:43 ] C++ではいろいろ増やしたんだよね。型変換だとstatic_castかな。 dynamic_cast static_cast reinterpret_cast const_cast
320 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:53:14 ] ビルトインの型変換(密かに関数が呼び出され、その関数が宣言されない) を使う場合は、使う場所すべてに、わかるようにコメントを入れておくのが後々のことを考えると ベターかと。(書式は一般的なキャスト演算子にするしかないが) コンパイラが変るだけでも影響してくる可能性があるし...
321 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:11:45 ] c言語のスタックについての質問なんですが int fibo_stack( int n ) { int f =0; push(n); while(!empty()) { n = pop(); if( n==0 ) f+=0; if( n==1 ) f+=1; if( n>=2 ) {push( n-1); push( n-2);}; show() }; return f; } の振る舞いにつて説明する問題なのですが、f+=0やf+=1で何が行われているのか解りません。 スタック内部に影響するのでしょうか。ご教示ください。
322 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:13:40 ] f = f + 0; f = f + 1;
323 名前:デフォルトの名無しさん [2008/06/05(木) 20:13:51 ] f = f + 0 f = f + 1 の略
324 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:16:47 ] f = f + 0は理解してます。しかし、これがスタック内に影響があるのかが解りません。 説明不足ですいません
325 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:19:01 ] 意味の分からないことをいわないでくださいおねがいします。
326 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:23:39 ] >317-318 本質的な動作は同じである。 キャストは型変換演算子であって、元の型の値をもとにして 指定したデータ型の右辺値を生み出す。ポインタかそうでないかは関係ない。 単に型変換という場合は、コンパイラによって自動的に行われるものを言う場合が多い。 たとえば>317のコードで言えば d=m; と書いた場合である。 (double) のキャストをつけようとつけまいと、コードのやることは変わらない。
327 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:27:00 ] 自分の考えた振る舞いは n=4の場合 4 _ 3 2 3 3 1 0 3 1 f=0 3 f=1 _ 2 1 2 f=2 _ 1 0 1 f=2 _ f=3 となるのですがこのfが何なのか解りません
328 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:31:54 ] その関数だけ見せられてもわからん 全部貼れ
329 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:32:56 ] つーかこの関数おもいっくそ間違ってるんじゃねぇか?
330 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:32:57 ] >>328 これで全部です
331 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:36:22 ] 関数の処理が正しいかどうかは知らんが フィボナッチ数列ならf(0) f(1)は固定でいれなきゃじゃない?
332 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:36:25 ] >>330 なら答えはひとつしかない 「わからない」 fの値がなんになるかはnの値のほかpush()、pop()、empty()、show()の仕様に依存する fの値がどう使われるかはこの関数を呼んだ場所のコードに依存する つまりこの関数だけ見せられてfがなにものであるか答えられるわけがない
333 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:38:12 ] >>329 少なくともこのままコンパイルにかけたら構文エラーだな
334 名前:デフォルトの名無しさん [2008/06/05(木) 20:38:51 ] >>327 それであってるし0から始まるフィボナッチ数列の四番目は3だからおk
335 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:45:03 ] push()は()内をプッシュ、 pop()はポップしてその値を返す、 empty()はタックが空かどうか判定する、 show()は現在のスタック内表示です
336 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:46:54 ] >>334 fはスタックとは別のところで計算されてると考えてよろしいんでしょうか?
337 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:47:18 ] int fibo_stack( int n ) { vector<int> x; int f =0; x.push_back(n); while(!x.empty()) { n = x.back(); x.pop_back(); if( n==0 ) f+=0; if( n==1 ) f+=1; if( n>=2 ) {x.push_back( n-1); x.push_back( n-2);}; } return f; } 極普通のスタックだと思うのですが因縁つけてくる人が多いので C++になっちゃいますが動くようにしました。 引き続きお答え願います
338 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:49:07 ] そこまでわかっててなぜわからんのかわからん
339 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:49:44 ] 単にフィボナッチ数列というものを知らないのでは
340 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:55:23 ] このプログラムのfを足していく理由がわからないんです。 スタックを計算する上で必要な事なんでしょうか
341 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:03:35 ] fって言う時点でフィボナッチと関連あるとか想像付かないかな・・・ ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0
342 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:09:37 ] 解りました!!fはn番目のフィボナッチ数を計算するためにあったんですね!! ずっとスタック内に影響するものだと思ってました。 ありがとうございました。
343 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:10:51 ] なぜこれで正しく計算できるかまではわかったのかなー? そこが意図のはずだが
344 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:11:56 ] >343 どっちかっつーと数学板の仕事だし… 実用でこんなタコなアルゴリズム書いたら殴られるわ
345 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:12:14 ] やってることは再帰と同じくらい効率悪いなw
346 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:14:47 ] スタックを使う理由がわからん
347 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:17:10 ] 数学的な数列の再帰証明をプログラムに変換するために必要だったんだろう こんなことやる意味がそもそもあるのかと思うけど
348 名前:参考 mailto:sage [2008/06/05(木) 21:28:29 ] 再帰呼び出し関数で、フィボナッチ数列を計算するコードを定義した際にn=0,1の条件で関数が何回 呼ばれるかを計測するプログラム。奇しくもこれはフィボナッチ数列そのものを与えるという トリック unsigned int fib(unsgined int n){ static unsigned int m=0; static unsigned int result=0; if(m==0) m=n; if(n<=1) result++; else{ fib(n-1); fib(n-2); } if(m==n) return result; } (この関数は1回しか呼び出せないのがイタいが)
349 名前:参考 mailto:sage [2008/06/05(木) 21:33:06 ] mなんていらねぇな。 unsigned int fib(unsgined int n){ static unsigned int result=0; if(n<=1) result++; else{ fib(n-1);fib(n-2); } return result; }
350 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:33:08 ] 当たり前って言えば当たり前の結果だよな
351 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:35:29 ] つーか、IT関連の授業教えてる先生ってこんなのばっかり出題してるのか? 大学院とか行って研究するやつなんてすくないんだからもうちょっと実用的 な問題だせよ。 昨日もBMPの読み込みとかなかったっけ?
352 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:40:15 ] この件については議論せずにスルーしような
353 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:46:10 ] >>326 キャストは左辺値にも出来ますが何か? char *p; void *q; (char*)q=p;
354 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:48:42 ] フィボナッチ理解できない人間が結構いることに驚き
355 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:49:57 ] >>353 それはだめじゃないのか?
356 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:51:39 ] >>353 間違いである。少なくともANSI/ISO規格の保証する動作ではない。
357 名前:デフォルトの名無しさん [2008/06/05(木) 22:00:43 ] 固定長のフィールドからなるレコードを fgetsした後にsscanfでバラバラにして フィールド毎にprintfで表示したいんだが うまくsscanfでバラせてないみたい・・・ AAAAA BBB CCCC こうなって欲しい。 入力ファイル(固定長5、3、4の3フィールドからなる) AAAAABBBCCCC
358 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:01:14 ] 禁止しても、抜け穴が幾らでもありそうだな。
359 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:04:01 ] >>357 それって区切りになる文字が無いから失敗するんじゃないの?
360 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:04:15 ] >>357 sscanf(s, "%5s%3s%4s", a, b, c); これで済まないのか?
361 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:06:17 ] >>342 だから>>331 でフィボナッチだっつってんじゃん 関数名見ても分からないとか大丈夫か?
362 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:07:53 ] >>357 ばらせてるけどNULL終端じゃないから残りが出てるだけに5ペリカ
363 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:07:54 ] >>361 まーそういうなって。 初めてのころは「自分が何にはまってるかそれがわからない」 ということもあるよ。 あることをきっかけにどんどん進むのさ・・・
364 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:10:26 ] わかってないのに見当違いのレスつけてるヤツらよりはマシだけどな
365 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:10:34 ] >353 4.5 質問:charのポインタがあって、そのポインタがたまたまintを指していた。 intの次へポインタを進めたい。なぜ以下の式ではうまくいかないのか。 ((int *)p)++; 回答:C言語でキャスト演算子は「ビット列が別の型を持っているふりをして、 そういう風に扱ってやろう」ということを意味しているわけではない。 キャストは変換演算子であって、それは右辺値を生みだすと定義されている。 右辺値であるとするなら、代入することも++で足し算することもできないことになる (古いコンパイラやgccの拡張機能が上のような式を受け付けることは例外である)。 References: K&R2 §A7.5 p.205 / ANSI §3.3.4(とくに注14) / ISO §6.3.4 / Rationale §3.3.2.4 / H&S §7.1 pp.179-80
366 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:28:22 ] 公開された定義に基づいて 再解釈可能なものについては再解釈し、そうでないものは絶対に通さないというのが 基本だったのだが... いつのまにやら処理系に依存する話になってしまった。
367 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:55:01 ] こう書けばとおるが、 *(char**)&q=p; そもそもvoid *へ/からの変換はキャストが不要なのでこの例なら q=p; でよい。
368 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:55:55 ] - キャストが不要なので + 明示的なキャストが不要なので
369 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:56:40 ] ((struct hoge*)p)->fuga
370 名前:デフォルトの名無しさん [2008/06/05(木) 22:58:00 ] **a と a[][] って、同じ?
371 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:58:40 ] 仮引数でなら
372 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:00:54 ] 仮引数でも違う。 というか、不完全型の配列型は存在しない。
373 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:01:33 ] コンパイルは通るよ。
374 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:02:23 ] 通らんかった。二次元はダメか。
375 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:06:05 ] >>370 仮引数に限ってT**とT*[]は同じ。T[][]はT[]が不完全型だから許されない。
376 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:07:39 ] 仮引数の[]は、識別子に最初に結合する一回だけポインタ扱い
377 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:20:18 ] >>369 -> の結果は左辺値になりうる。
378 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:04:07 ] 多次元配列はC/C++の最もクサいところ。使わないでね。なるべく。 (普通の1次元配列を工夫して使って)
379 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:07:57 ] int main(int argc, char** argv) int main(int argc, char argv[][])
380 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:08:46 ] >>379 悪い例ですね、わかります
381 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 02:21:47 ] メモリの動的確保とポインタについて勉強したのですが、 分からないところがあったので質問します ・mallocで確保したメモリは、プログラムの終了と同時に解放されることは保証されているのか ・関数内でmallocで確保したメモリは関数が終了しても解放されず、 別の関数から参照できることは保証されているか 両方、正常に動くことは確認できたのですが、あらゆる環境・状態で成り立ちますか?
382 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 02:25:13 ] ・プログラムが終了すれば解放はされる ・別の関数にアドレスを渡せばそりゃ参照できる
383 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 02:25:20 ] >>381 Cの規格では保証されてない、プログラム終了後の処理はOS頼み ただし、間違いなく解放されると思って問題ない。(されないOSが昔あるにはあったが) 二番目は保証されてる、こっちはそう決まってる
384 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 02:27:49 ] 関数からポインタを返すときって混乱しやすいところだよね。
385 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 04:34:47 ] あんまりC言語関係ないけど #include <stdio.h> #include <stdlib.h> void main(){ int a[25]; int i,j; for(i=0;i<25;i++){ a[i] = rand()%25+1; for(j=0;j<i;j++){ if(a[j]==a[i]){ a[i] = rand()%25+1; j=0; } } printf("a[%d]は%dです。\n",i,a[i]); } } ↑のは a[0]〜a[24に]1〜25の乱数を生成し、且つどれも一致しないというモノなんだけど 乱数が何度やっても決まった値しかでないんだけどどうすればいいのかな? あと、j=0;とかやってたりソースかなり読みにくいので、訂正などあったらガンガンお願いしますmm その際解説もつけてくれるとありがたいです
386 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 04:37:29 ] #include <time.h> srand(unsigned)time(NULL)); を足す
387 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 04:37:53 ] 括弧抜けた srand((unsigned)time(NULL)); ね
388 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 04:46:41 ] あー解説か…まあ細かい話はおいておいて 乱数発生させるには最初に種みたいなのが要るんだけど srand((unsigned)time(NULL)); はプログラムを実行させた時の現在時刻を拾ってきて それを種にするように設定する関数なわけ >>385 のプログラムだと何もして無いのでsrand(1); と設定した事とみなされて 常に同じ乱数が生成されてるのよ
389 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 06:06:42 ] Cのプログラムの中で、 system("hoge")で起きたコマンドの結果を文字配列に格納したい場合、何かいい方法は無いですかね? コマンドライン上ならls > fileで一発なのに・・・orz
390 名前:側近中の側近 ◆0351148456 [2008/06/06(金) 06:21:52 ] >>389 (っ´▽`)っ popen, pclose 標準ライブラリ関数ではないが、unix系OSだと使える。
391 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 06:29:17 ] >>390 感謝。さっそく調べて試してみるっすー。
392 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 08:34:52 ] >>381 まあmallocも関数でvoid*ではあるけどポインタ返ってくるよね?
393 名前:デフォルトの名無しさん [2008/06/06(金) 10:48:52 ] #include <stdio.h> #include <float.h> int main(void) { float f; double x; long double ld; printf("\nTesting the precision of float, double, and long double : \n"); f = 1.0f + 1.0e-7; printf(" 1.0 + 1.0e-7 = %.10f\n", f); f = 1.0f + 1.0e-8; printf(" 1.0 + 1.0e-8 = %.10f\n", f); x = 1.0l + 1.0e-15; printf(" 1.0 + 1.0e-15 = %.20lf\n", x); x = 1.0l + 1.0e-16; printf(" 1.0 + 1.0e-16 = %.20lf\n", x); ld = 1.0L + 1.0e-19; printf(" 1.0 + 1.0e-19 = %.30Lf\n", ld); ld = 1.0L + 1.0e-20; printf(" 1.0 + 1.0e-20 = %.30Lf\n", ld); printf("\nThe experiment above is explained by constants from float.h :\n"); printf(" precision of float : %e\n", FLT_EPSILON); printf(" precision of double : %.15le\n", DBL_EPSILON); printf(" precision of long double : %.30Le\n", LDBL_EPSILON); return 0; } 表示された結果のうち、 1.0 + 1.0e-7 が 1.0000001 にならず、同様に 1.0 + 1.0e-15 が 1.000000000000001 にならず、 1.0 + 1.0e-19 が 1.0000000000000000001 という、きれいな数にならない理由を、FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON との関係から説明してもらえないでしょうか。 よろしくお願いします。
394 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:07:42 ] 宿題丸投げは宿題スレへ 自分で考えるヒントが欲しいなら、まずそこに出てくる制限定数の意味やIEEE浮動小数点数フォーマットについて調べること
395 名前:デフォルトの名無しさん [2008/06/06(金) 11:33:43 ] 板違いごめんなさいッ ありがとうございます。
396 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:42:40 ] 問03 学科の出席簿作成。 15人分の学生を表示し、入力により内容を変動させる。 表示順番: 出席表 <入力>学生番号0〜14 <入力>曜日番号0〜6 <入力>時限番号0〜3 <入力>出欠番号0〜1 <入力>学生番号0〜14の時に99を入力するとプログラム終了。 誰かこの問題教えてください。
397 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:44:01 ] >>396 氏ね
398 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:59:39 ] >>396 /* stdio.h をインクルード */ int main(void) { /* 必要な変数を宣言し、出席簿の初期値を設定 */ /* 学生番号を入力から一時変数に取り込み、それが妥当な値である間、以下の処理を繰り返す */ { /* 曜日を入力から一時変数に取り込み、もし妥当な値でなければエラーメッセージを表示して continue する */ /* 時限を入力から一時変数に取り込み、もし以下略 */ /* 出欠を入力から以下略 */ /* 入力された一時変数の値を出席簿に反映する */ /* 出席簿の現在の内容を表示する */ } return 0; }
399 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:02:11 ] >/* 学生番号を入力から一時変数に取り込み、それが妥当な値である間、以下の処理を繰り返す */ 親切そうに見せて性格悪いなお前
400 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:23:10 ] 出席簿のデータ構造くらいは教えてやったほうがよくね? int book[15][7][4]={0}; まあcharにするほどのサイズではあるまい
401 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:23:58 ] 日曜日に授業あんのかよ
402 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:25:40 ] たまに・・・・・
403 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:28:03 ] >398 必要な変数ってこれでいい? データ形式: (一人分のデータ) 学生番号<int> 名前<char*> 性別<char*> 曜日番号<int[]> 時限番号<int[]> 出欠番号<bool> 変更番号<bool>
404 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:30:25 ] Cにboolはありません
405 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:31:02 ] 396のどこに名前と性別があるんだよ
406 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:32:38 ] じゃあ _Bool で
407 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:34:00 ] 学生の名前も含めて構造体で表すなら struct{ char name[NAMELEN_MAX]; int sex; int attend[7][4]; }student[15]; ってとこか
408 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:38:20 ] >>403 学生番号は不要。要素15の配列の添字で扱えば済む。 名前は動的割付するほど大きなデータじゃない。適当な大きさの配列で十分。 性別は整数でいい。男か女かそれ以外しかないのだから。 曜日、時限、出欠を別々に宣言しても意味がない。多次元配列を使え。 Cにbool型は無い。メモリを節約したいならchar型を使え。 変更番号ってなんだ説明しろ。
409 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:41:19 ] > char name[NAMELEN_MAX]; そこは NAMELEN_MAX+1 にしとけよ 一応
410 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:45:44 ] >>408 退学とかで、欠番の可能性は?
411 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:47:18 ] >>410 問題の前提が番号は0〜14まで15人ってなってる
412 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:47:40 ] そこで性別をenumですよ
413 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:48:43 ] >408 >名前は動的割付するほど大きなデータじゃない。適当な大きさの配列で十分。 初期化したあと変更しないならconstポインタのほうがいいんじゃね?
414 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:52:11 ] 後出しの条件はともかく、まずは>398を作れ 話はそれからだ
415 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:03:48 ] 入力はgetchar?99を入力するとプログラム終了ってどうやんだっけ?
416 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:06:50 ] 本当はfgetsを使うんだがこのレベルの問題ならscanfでいいだろう
417 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:07:31 ] >>415 おいおいそこから教えなきゃいけないのかよ もう一回最初から本を読み直せ
418 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:10:57 ] どうやんだっけ?じゃねーよw 素直に全く分かりませんって言えよ
419 名前:デフォルトの名無しさん [2008/06/06(金) 14:14:51 ] すまぬがちょっと質問。 MinGWとVC++でDLL連携をしようと思って下記みたいなソース書いたんだ。 GeoOpen関数に「1」を渡してるのに 返ってくる値は何故か「63」。 printfで出力される値も「63」。 なんぞこれー DLL作成側cpp(MinGW) extern "C" __declspec(dllexport) int __stdcall GeoOpen(string strLicence, string strGeoDBDir, string strNormalize, int intA) { printf("%u", intA); return intA; } DLL呼び出し側cpp(VC++) // GeoOpen関数のポインタ取得 GEOOPEN geoOpen = (GEOOPEN)GetProcAddress(hGEOCODERDLL, "GeoOpen@16"); int testInt = 1; // GeoOpen関数のポインタ取得成功 if (geoOpen != NULL) { // GeoOpen関数呼び出し int intRes = (*geoOpen)(strLicence, strGeoDBDir, strGeoDBDir, testInt); }
420 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:15:34 ] エラーメッセージって表示しなきゃなんないのか?
421 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:17:05 ] >420 「そんなの問題に書いてないじゃないですか」で押し通せるならしなくていい 常識的にはする
422 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:17:13 ] >>419 MinGWとVC++のstd::stringの内部構造が異なるんじゃないのかたぶん
423 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:19:51 ] というか完璧スレ違い
424 名前:デフォルトの名無しさん [2008/06/06(金) 14:28:13 ] >>422 試しにintを第一引数にしたらちゃんと1が返ってきたよ。 stringが邪魔してたのか、、、これは気づかなんだ。 サンキュー助かった。 >>423 あぁC++はスレチか。すまん
425 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:28:58 ] 異なるコンパイラ、コンパイラが同じでもバージョンが違う場合、モジュール間でのクラス渡しは御法度。 クラスで渡したければCOM使うしかない。
426 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:35:16 ] COMってなんぞえー!?
427 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:37:39 ] C++つかわず、CだけでCOM(ActiveX)のプログラムするのは死ぬほど辛い
428 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 15:48:13 ] 素直にポインタを使え
429 名前:デフォルトの名無しさん [2008/06/06(金) 21:35:24 ] strtokを使ってカンマ区切りの文字列を分け、それぞれの文字配列に格納する関数を作ってるのですが、 関数の中で正常に表示される文字配列が、関数の外だと化けるんですよ! 何が原因なのでしょうか?お手上げです。どなたかどうか、教えてくださいm(_ _)m
430 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 21:36:24 ] ローカル変数を外に持ち出そうとしてるのか?
431 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 21:41:00 ] ソースうp
432 名前:デフォルトの名無しさん [2008/06/06(金) 21:45:23 ] B木の話なんですが質問させてください、二分木でも同じと思いますが ノードに入るkeyの値は自然数としています 現在の木に例えば3という値が入っているときにさらに3を挿入する場合は すでに入っている3の手前と後ろのどちらに入れるかは決まっているんですか?
433 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 21:49:14 ] 比較の仕方によるけど、だいたい後ろになるんじゃね?
434 名前:デフォルトの名無しさん [2008/06/06(金) 21:54:38 ] >>430 文字配列はmainで宣言していて、関数の中では、char*型で引数宣言しています。 >>431 今携帯なので、うち帰ってからまたソースうpさせていただきますね。 すみません、また来ます。ありがとうございます。
435 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 21:57:55 ] >>434 たぶん、その引数のポインタにstrtokの戻り値を代入してるだけだろう? ちゃんとstrcpyしろ
436 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:03:51 ] >434 こういうことをやってないかどうか #include <stdio.h> void hoge(char *str) { str="STRING"; /* 間違い */ /* こっちが正解 strcpy(str, "STRING"); */ } int main(void) { char str[]="string"; hoge(str); puts(str); return 0; }
437 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:04:41 ] >>436 まてそれは大丈夫だろw
438 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:06:36 ] >>437 落ち着け
439 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:08:22 ] >>438 ごめんおちついた、ごめんなさい mainみないで条件反射してしまいました・・・
440 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:10:46 ] 435の解釈が妥当そう。 strtokの戻り値は次のstrtokの呼び出しで破壊されるから、 strdupしておくべし。
441 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:11:29 ] >440 お前も落ちつけよ
442 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:14:59 ] >strtokの戻り値は次のstrtokの呼び出しで破壊されるから されんされん
443 名前:385 mailto:sage [2008/06/06(金) 23:01:23 ] >>386-388 なるほど、ありがとうございます
444 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:08:26 ] >>443 for(i=0; i<25; i++) { j = rand() % (i + 1); a[i] = a[j]; a[j] = i + 1; } こうやるとムダなチェックが必要なくなるよ
445 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:45:33 ] ytteter.so.land.to/upld/up3166.jpg
446 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 02:50:52 ] >>444 ぱっと見では、なんでうまくいくのか分からなかったけど面白い方法だ
447 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 03:23:54 ] わからん
448 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 03:49:22 ] 確かに重複は回避できるけどシャッフルの度合いとしてはどうなんだろう…… 前方にかたよる気がするが
449 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 04:56:54 ] シャッフルの度合いw 前方にかたよるw
450 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 08:03:17 ] もっといい擬似乱数がほしければメルセンヌ・ツイスターでも使えばいいよ。
451 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:00:24 ] >>448 くじ引きは最初と中間と最後のどこで引くのが有利だと思う?
452 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:08:43 ] >>451 商店街のクジ引きなら最後のほうw
453 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:12:39 ] >>452 当たりが1つで残りn個全部ハズレのクジとした場合、 1)引いたクジを戻す場合は常に確率は一緒 2)引いたクジを戻さない場合はそのときによる。 2)は最初に引く人はかなり確率は低いけど当たりも引ける。 後に引く人は当たりを引く確率は上がるが、最初に当たりを引かれると残りは ハズレのみになる・・・・・
454 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:26:24 ] >>453 マジで言ってる? 2)の場合 1回目は 1/n 2回目は (n-1)/n*1/(n-1) = 1/n 最初から最後まで確率は一定だよ。
455 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 10:33:49 ] たぶん>>452 は 商店街とかだと当たりを前半に出すわけにはいかないから、 後半にしか入ってないことをいってるんだと思うぜwww
456 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:25:48 ] >>444 のやり方はこのスレや宿題スレなんかではよく出る中身がある配列のシャッフル for(i=0; i<N; i++) { j = rand() % (i+1); temp = a[i]; a[i] = a[j]; a[j] = temp; } と同じ理屈だろ。 これが偏ってるとか思うヤツはセンスないな。 >>450 擬似乱数の精度の話なんかしてない
457 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:30:52 ] >>454 それは違うな。 あらかじめ引く順番が決められてるなら(2)でも(1)と同じ確率になるが、 自分でいつ籤を引くか決められるなら、(1)とは異なった確率にできる。 たとえば当たり籤が一本しかなかったとして、 当籤が出るまでは誰かが籤を引くたびに当たり確率が高くなっていくが、 当たりが出た途端に当たり確率は0になる。
458 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:31:42 ] 数学的な話か実際の話かの差だから論じても意味が無いと思うけど
459 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:53:49 ] >>456 マジレスすると、センスないのはお前だ。それは偏る。 <Proof> N=3とすると、置換の可能性は3^2=27。 一方、3つの要素の並べ方は3!=6。 27/6は整数ではない。故に、偏る。q.e.d. 実際に列[0,1,2]に対して、6万回の試行をしてみると、 [0,1,2]:9063 [0,2,1]:10843 [1,0,2]:11236 [1,2,0]:11121 [2,0,1]:8719 [2,1,0]:9018 この程度のばらつきが出る。 数学的に考えれば、9000前後の数字が出ている列は、 それぞれ並べ替え方27のうち4を占めていて、 11000前後のはそれぞれ27のうち5を占めている。 正確にシャッフルしたければ、並べ替え方が6!のKnuthシャッフルを使うべし。
460 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:56:32 ] >>459 j = rand() % N; じゃなくて j = rand() % (i+1); になってるんだよ
461 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:57:15 ] >>458 数学的には、確率を考えているか条件つき確率を考えてるかの違い。 数学vs実際の違いじゃないぞ。
462 名前:デフォルトの名無しさん [2008/06/07(土) 14:01:54 ] 暗号化に関する質問です char str[] = hairetu //暗号化する文字列 int j = 0; //暗号化する文字列の現在位置 strとjが上記の場合 while(*(str+j) != ’\0’) このwhileの条件ってどういう意味ですか なぜ文字列に位置を示す数を加算できるのですか??
463 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:04:08 ] それのどこに暗号化が関係してるの?
464 名前:デフォルトの名無しさん [2008/06/07(土) 14:07:01 ] 暗号化のところで出てきたので暗号化特有の構文かと思ったわけです
465 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:07:19 ] >>459 恥ずかしいヤツw
466 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:08:02 ] >>462 配列はその先頭の要素を指すポインタになるから char str[] = ... ; char *p = str; while (*(p + j) != '\0') と書くのと同じ
467 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:09:37 ] >>462 >char str[] = hairetu 本当にこうか?
468 名前:デフォルトの名無しさん [2008/06/07(土) 14:11:04 ] すみません間違いましてあ char str[] = ”hairetu” //暗号化する文字列 微妙に間違いました
469 名前:デフォルトの名無しさん [2008/06/07(土) 14:13:28 ] >>466 最初の char str[] の先が文字化けしてるみたいです…
470 名前:デフォルトの名無しさん [2008/06/07(土) 14:17:59 ] *p = str でpの中身がstrのアドレスになって *(p+j)によってstrの先頭アドレスにjを足したアドレス格納されてる数値を示しているということでしょうか?
471 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:26:49 ] >>470 だいたいそんな感じ p はわかりやすく入れてみただけで・・・ p を介さず直接 *(str + j) と書いても同じこと
472 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:29:31 ] *(str + j) は str[j] と同じ char str[] = "hairetu"; は char str[] = {'h','a','i','r','e','t','u','\0'} と同じ 文字列が終端になる(str[j]=='\0')まで処理を繰り返す
473 名前:デフォルトの名無しさん [2008/06/07(土) 14:39:04 ] ということは char key[128] = "abc" //暗号キー としたとき *(str+j) + key[i++] とすると、これはどういうことですか?
474 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:41:22 ] >>473 *(str+j) と key[i++] を足している 何が疑問??
475 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:41:42 ] それ正確に写してる?
476 名前:デフォルトの名無しさん [2008/06/07(土) 15:00:48 ] 正確に写してます… 例えば*(str+1)はeですよね? それに対してkey[i++]はa,b,cのうちのどれかだと思うんですけど それなら文字と文字を加算するってどういうことですか?
477 名前:デフォルトの名無しさん [2008/06/07(土) 15:04:12 ] eでは無くhairetuのaですた
478 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:06:35 ] 文字も数値として扱われてるから加算しても問題ない
479 名前:デフォルトの名無しさん [2008/06/07(土) 15:08:22 ] そうでした… だいぶん前に習ったので忘れてました。。 ありがとうございました…
480 名前:デフォルトの名無しさん [2008/06/07(土) 15:09:37 ] 度々すみません 文字を数値で扱う場合は変数をintにする必要はないのですか?
481 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:14:57 ] char だって整数型だ
482 名前:デフォルトの名無しさん [2008/06/07(土) 15:23:35 ] 解決しました ありがとうございましあ!
483 名前:429 [2008/06/07(土) 16:48:15 ] >>435-442 遅くなりまして、すみません。長いですがソース↓です。 void hoge(char gyou[512], char *s1, char *s2, char *s3) { int cnt; /* ,の数 */ char *tp; /* 区切り文字へのポインタ */ cnt = 0; memset( s1, 0x00, sizeof(s1) ); memset( s2, 0x00, sizeof(s2) ); memset( s3, 0x00, sizeof(s3) ); tp = strtok( gyou, "," ); while( tp != NULL ){ tp = strtok( NULL, "," ); if ( tp != NULL && cnt == 2 ){ strcpy( s1, tp ); printf("hogeの中のs1の値:%s",s1); }else if( tp != NULL && cnt == 3 ){ strcpy( s2, tp ); printf("hogeの中のs2の値:%s",s2); }else if( tp != NULL && cnt == 5 ){ strcpy( s3, tp ); printf("hogeの中のs3の値:%s",s3); } cnt++; } }
484 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:55:31 ] >>459 pc11.2ch.net/test/read.cgi/tech/1211198816/226 はダメですか?N-BASICの昔からよく目にするからくりですが。
485 名前:429 [2008/06/07(土) 17:01:37 ] void main() { char s1[18]; char s2[3]; char s3[21]; FILE *fp; char gyou[512]; /* 一行のデータ */ memset( s1, 0x00, sizeof(s1) ); memset( s2, 0x00, sizeof(s2) ); memset( s3, 0x00, sizeof(s3) ); fp = fopen(fullFileName, "r") while( fgets(gyou, sizeof(gyou), fp) != NULL ){ hoge(gyou, s1, s2, s3); printf("hoge直後のs1の値:%s",s1); printf("hoge直後のs2の値:%s",s2); printf("hoge直後のs3の値:%s",s3); } } で、中のファイルというのが、 '00099','あああ','123:サンプル','んんん','','2007/03/01','','',, 'タイトル1','タイトル2','タイトル3','タイトル4','タイトル5' '00099','00001','1234123412341234',3000,'','','2008/03/31','2008/04/02 11:20:56','4','えええ' とこんな感じに項目数も、中の文字数もまちまち。 で、たいてい、s1とs3が一文字分ズレてたり、化けてたりします。 一定の規則にしたがって並んだ行だけ処理したいんですが、項目を 入れる文字配列を、s1[]とかにすればいいんでしょうか?ひょっとして・・・
486 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:04:55 ] >>484 ランダムシャッフルは >>456 が偏りも無く最も高速。 それでもう話はついてるのでもういいよ。
487 名前:デフォルトの名無しさん [2008/06/07(土) 17:08:37 ] 恥ずかしながら質問させてください・・・ #include <stdio.h> int main(void){ int i; int goukei, tensu[10]; int max = 0; int min = 999; printf("入力された点数の最高点、最低点、平均点を出力するプログラムです。\n"); puts("点数を入力してください。"); for(i = 0; i < 10; i++){ scanf("%d", &tensu[i]); goukei += tensu[i]; if(tensu > max){ max = tensu[i]; } else if(tensu < min){ min = tensu[i]; } } printf("最高点数は%d、最低点数は%d、平均は%dです。", max, min, goukei/10); } このような感じで、最高点数と最低点数、平均点を出力するプログラムなのですが、 .\1.cpp(18) : error C2446: '>' : 'int' 型から 'int *' 型への変換ができません。 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 .\1.cpp(18) : error C2040: '>' : 'int [10]' は 'int' と間接操作のレベルが異なります。 とエラーがでてしまいます。配列を使わなければコンパイルできるのですが・・エラーの文章を読んでもどうしてなのかがわかりません・・・ どうかご教授くださいです・・・
488 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:10:44 ] やばいわかりましたすみません・・・ifの中身がおかしかったのか・・・回線切手しに増す
489 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:48:15 ] >>487 if(tensu > max){ else if(tensu < min){ このtensuってtensu[i]の間違いじゃないの?
490 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:49:18 ] 俺も回線切ろう・・・
491 名前:デフォルトの名無しさん [2008/06/07(土) 20:36:08 ] >>487 @goukeiは初期化されていない。 Ascanf関数でのアドレス指定は不要。 Bmaxとminの使い方が意味不明。特に、最大値・最小値アルゴリズム。 C存在しない配列にアクセスしている。
492 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:45:07 ] >>485 hoge() は配列 gyou に格納されている元になる文字列から2番目、3番目、5番目のトークンを切り出し、 s1 、s2 、s3 の指している先へコピーする。そこまではいい。問題は、その指している先の大きさが足りていないことにある。 この場合コピーする先は main() で宣言された s1[18] 、s2[3] 、s3[21] である。これらはメモリ上に連続して配置される。 そしてたぶん s2 に3番目のトークンをコピーしたときに、s2 の範囲を踏み越えて s3 にまで書き込んでしまった。 このとき hoge() の中で s2 を表示したときには正しくトークンが書き出される。しかし次に s3 に5番目のトークンが書き込まれる。 ここで、s3 の中にある、s2 から領域を踏み越えて書き込まれた文字列のシッポを塗りつぶしてしまった。 そうなると、全部の処理が収まって main() に戻ってきてから s1 、s2 、s3 を表示させると、当然トークンは壊れている。 文字列をコピーするときは、コピーする先の領域の大きさが十分かどうかが常に問題になる。 特に strtok() では、トークンの長さがどれだけなのか事前に予測しがたいために、さらに難しくなる。 万全に行うには、strtok() の戻り値を一旦保存した上で strlen() でトークンの長さを調べ、 必要な大きさの領域を malloc() などで割り付けて、そこにトークンをコピーする。もちろん使い終わったら free() する。 もし所定の大きさを越えたぶんは捨ててしまってもいいとするのなら、 strncpy() か strncat() か sprintf() を使って領域に入るぶんだけをコピーする。 もっとも、切り出したトークンに特段手を加えないなら、そもそも配列にコピーする必要もないかもしれない。 この場合は、単にトークンの先頭を示すポインタの値を記憶しておけばよい。 strtok() によって切り出される各トークンの本体は strtok() の中にあるのではなく、 最初の strtok() の呼び出しで第一引数に指定したポインタの指し示す先、 つまりトークンを切り出す元になる文字列( strtok() によって加工される)の中にあるからである。 ただし、そうやって切り出した一群のポインタの値を関数の外に持ち出すには、 ポインタのポインタ(ポインタの配列)を使う必要があることに注意すること。
493 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:50:30 ] 追加。 memset( s1, 0x00, sizeof(s1) ); memset( s2, 0x00, sizeof(s2) ); memset( s3, 0x00, sizeof(s3) ); hoge() 内にある上のコードは、きっと君が考えているだろう作業をしてくれない。 なぜならここでの s1 、s2 、s3 は、配列ではなくポインタだからである。sizeof(s?) はポインタのサイズを返す。 厳密に言えば、むしろこの処理は不要である。main() にある同様のコードも不要である。 strcpy() は、それが正しく行われるかぎり、必ずコピーした文字列の末尾にヌル文字を付加する。 あらかじめ領域を 0x00 でクリアしておく必要はない。
494 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:03:20 ] こういうmemset()で0で埋めるテクニック(?)って、使ってるやつはどこで覚えるんだろうな。 職場とか、ヘンなサイトとか?
495 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:14:25 ] >>494 かつて、今はもう時代遅れとなった「固定長の文字列」が使われていたことがあった。 これは、16バイトとか32バイトとかの固定長のフィールドに文字列を書き込んだもので、 それぞれの文字列の長さは最大でもそのフィールドの大きさにしかならないと決まっていた。 そして、フィールドの長さより短いときには、残りをヌル文字が埋めていた。 だから、フィールドに文字列をコピーするときは、あらかじめフィールドを全部ヌル文字で埋めてから、 フィールドの先頭から文字を入れていって、もう文字がなくなったらそこでやめるだけで済んだ。 この仕様の名残がライブラリ関数 strncpy() である。この関数は指定された長さまで文字をコピーし、 文字列の長さが足りないときにだけ、残りをヌル文字で埋める、という一風変わった動作をするが、 これがまさに上で紹介した固定長の文字列を扱うために最適な仕様であった。 そして今でも、そういう古い習慣を引きずってコードを書いているプログラマや、 そういうプログラマに教わったために意味も知らず古い習慣に従っているプログラマがいる。 既に述べたが、今となっては時代遅れであり、やがて消えていくだろう。 もっともそのときにC自体が残っているかどうかは、誰にもわからない。
496 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:16:17 ] >>494 あとでメモリーダンプをするときは領域をmemset()しておくといい ぶっ壊したところが一目瞭然 それ以外では?だな
497 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:36:01 ] >>495 それは意味のあるmemsetの使い方
498 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:38:13 ] >>496 それやるなら、VCのデバッグモードみたいに、フフフフ・・・で埋めるとかだな。 0で埋めるのはうまくない。
499 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:38:16 ] >>497 意味がないとは言っていない。意味を知らない人間も多い時代遅れな使い方だというだけである。
500 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:39:27 ] >>498 なんか福田の含み笑いみたいだなフフフフってw
501 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:40:33 ] >>495 へぇー勉強になるなー
502 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:44:18 ] >>484 方向が逆なだけで456と理屈は同じ
503 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:45:59 ] フフフフフフフ は 0xCC で int 3 だから 万が一そこに IP が飛んだらブレークされる
504 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:14:14 ] バグのあるコードを呼び出したり、バグのあるコードから呼ばれたりするような、開発現場の コードでは、とにかく使用するローカル変数は memsetでクリアしておかないと、何が起こるかわからないし、下手すりゃ責任取らされる ハメになるという職業上の経験から、 何はともわれ最初にmemsetの因習が生まれたモヨウ
505 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:17:19 ] そういや行く先々で何重にもmemsetされてる変数を見たことあるな。
506 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:21:24 ] >>504 そもそも、memset()でクリアしてもバグ対策にならんだろ。
507 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:22:22 ] Windowsの構造体をゼロクリアする慣習が広まったんじゃないかな・・・
508 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:22:41 ] バグが表面化しにくくなるだけな気がするな
509 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:23:13 ] 変数はとにかく宣言時に初期化しておきましょうみたいな慣習だろ
510 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:23:22 ] >506 もちろん根本的な解決ではないけど、なる場合もある 特に文字列の末尾をちゃんと処理しないアホな関数を呼ぶときには
511 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:23:32 ] >>507 バークレーソケットのとある構造体もゼロクリアしないといけなかったような...。
512 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:24:03 ] >>507 unixの職場でも、文字列のmemsetクリアが有効だって信じられてる所を見たことあるよ。
513 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:27:09 ] コボラーの先輩が使ってたからコボルの流儀かと思ってた
514 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:28:09 ] mallocで構造体用のメモリ確保した際、 セットする内容が0が多い場合はとりあえず やちゃえでmemsetは使うけどそれ以外は微妙
515 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:28:58 ] callocはゼロで埋めるんだっけ
516 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:29:27 ] そうえいば、malloc()じゃなくて、calloc()を使うべきとかいうやつも見たことあるな。
517 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:31:28 ] callocだと何か不味いの?
518 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:33:27 ] #define strncpy(d, s, n) ((d)[0]='\0', strncat(d, s, n))
519 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:34:07 ] >518 てめえ!!(笑
520 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:38:13 ] 盛り上がっているところ失礼しますが、rewind(stdin)の動作は規格で決められたものでしょうか? それとも処理系定義とか未規定とか未定義でしょうか?
521 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:42:46 ] callocなんてあったのには驚き。 でも結局のところ関数の中身はmalloc+memsetなんでしょ。
522 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:48:00 ] >>520 c faqにstdinをクリアする一般的な方法はないってかかれていたから、rewind(stdin)にも移植性はないんじゃない?
523 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:52:04 ] rewindってことは入力があった状態に戻したいのか。無理。
524 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:59:52 ] ungetch()しかないね。標準では。 でもそもそも意味違うし。
525 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:04:02 ] >>522 やっぱりそうですか でも引数になるstreamに特に制限はないから未定義ではないと思っていいでしょうか? >>523 いえ、読んでない文字を全て捨てたいのです
526 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:06:50 ] VC特有だろflush(stdin); が有効なのは
527 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:09:49 ] rewind(stdin) ってやったことないから推測だけど、入力にファイルをリダイレクトされていると、 ファイルポインタがファイルの先頭まで戻っちゃうんじゃないの?
528 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:10:58 ] while((ch=getchar())!='\n'); とかで読み飛ばすのは?
529 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:11:34 ] C/C++の宿題スレ見てて思ったんだけど、 a == b のような 条件式は成り立った時必ず 1 が返ると思っていいんですか?
530 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:12:18 ] うん
531 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:12:40 ] >>529 思ってちゃダメ, 0以外の何かだと思って対処するように
532 名前:デフォルトの名無しさん [2008/06/08(日) 00:14:22 ] プログラミング知識0の状態から 苦しんで覚えるC言語っていうサイトの内容を一通り覚えたんだけど 次何やればいい?
533 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:14:36 ] >>531 おい嘘書くな
534 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:14:58 ] >520 標準入力のバッファリングの方法に依存したはず stdinを読む関数を呼んだときにまるっとバッファリングするシステムなら 意図どおり未読の入力をクリアしてくれる もちろん入力リダイレクトのことはまったく考慮してないが わかってて使うぶんにはいいと思う >531 違う 論理演算の結果は必ず0か1になると規格で決まってる
535 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:17:45 ] >>529 宿題スレのあれはあんまり誉められた書き方じゃないけどな。 素直にifで分岐してったほうがいい。
536 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:21:58 ] >>532 たまにそういう疑問が書き込まれるが、 正直そういう疑問が何故起こるのかが分からない。 何か作りたい物があったからプログラム勉強してんじゃないの? それを作ればいいじゃないの。
537 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:22:52 ] >>534 ありがとうございました 参考にします
538 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:23:53 ] >>532 ・アルゴリズム系の本を読む ・ゲームでもエディタのようなツールでもなんでもいいけど、なにかひとつまとまったものを作ってみる (挫折してもいい) ・どう書く?.orgとか、2chの宿題スレの簡単なやつとか、短時間で組めるやつをたくさん書いてみる このあたりを同時に。
539 名前:529 mailto:sage [2008/06/08(日) 00:29:17 ] 条件式の返り値は規格で決まっていたんですね… これで安心して 条件式 == TRUE という書き方が出来ます ありがとうございました
540 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:29:59 ] TRUEが1とは限らないけどな
541 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:33:19 ] そもそもTRUEなんてw
542 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:34:30 ] TRUE は1だが、 BOOL を返す関数が真の時に1を返すとは限らない。 そもそも、何で条件式と TRUE を比較する必要性があるんだ? 訳が分からん。
543 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:35:07 ] 条件式で判定してるのにさらに比較が必要か? だったら(((条件式==TRUE)==TRUE)==TRUE))==TRUEとか書けよ
544 名前:529 mailto:sage [2008/06/08(日) 01:41:59 ] あんまり虐めないでくれ たまにif文の中の関数で混乱するから書いてみただけです
545 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:02:11 ] 関数の戻り値ならなおさら TRUE と比較してはいけない。 理由は >>542
546 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:07:28 ] 成功すると0を返す関数も多いしな
547 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:22:40 ] それは別問題。
548 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:24:14 ] 関数の戻り値は関数の仕様だ 条件式の結果云々はコンパイラの問題だろ
549 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:27:32 ] コンパイラw
550 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:56:00 ] 条件式の結果は規格で決められています
551 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:56:38 ] C99から導入された_Bool型って使ってる人いるのん?
552 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:01:30 ] C99って使ってる人いるのん?
553 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:09:52 ] まぁ関数が返す値は真偽を意味しているとは限らんしな。 真偽は比較、評価などで0か1かで、関数は0か0以外という概念もあるしね。
554 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:03:28 ] C言語で書かれたScket(linux)のプログラムコードで #define DB(x) x という、マクロがあり DB(fprintf(stderr,"InitSocket\n")); このような、使われ方をしていました 想像するに、DBにfprintf(stderr,"InitSocket\n")とい引数を持たせているのですが このような使い方をすることで何かメリットがあるのですか?意味が分かりません 目的と、どのように何がどのように作用するのか教えてくださいエロイヒト
555 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:04:42 ] スマン マチガエマスタ C言語で書かれたプログラムコードで #define DB(x) x という、マクロがあり DB(fprintf(stderr,"InitSocket\n")); このような、使われ方をしていました 想像するに、DBにfprintf(stderr,"InitSocket\n")とい引数を持たせているのですが このような使い方をすることで何かメリットがあるのですか?意味が分かりません 目的と、どのように何がどのように作用するのか教えてくださいエロイヒト
556 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:05:15 ] >>554 #define DB(x) とすると DB(fprintf(stderr,"InitSocket\n")); が ; になります
557 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:16:33 ] デバッグ文のつもりだと想像される。
558 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:20:39 ] >>556 う〜んよく分かりません、 fprintf関数は書式付の出力ですよね、単にInitSocket\nという文字列をstderrに対して、出力してるだけですよね? fprintf(stderr,"InitSocket\n")だけではいけないんでしょうか? kuwasikuオナガイシマス
559 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:23:34 ] >>556 元ネタはここです↓ ttp://www.ncad.co.jp/%7Ekomata/c-kouza10.htm
560 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:24:33 ] またまちがえた >>555 です >>556 >>557 thx 元ネタはここです↓ ttp://www.ncad.co.jp/%7Ekomata/c-kouza10.htm
561 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:47:49 ] >>560 次のコードの #define DEBUG の行の有無でコンパイルし直して実行してみれば? #include<stdio.h> #define DEBUG // 普通はコンパイルオプションで指定することが多い #ifdef DEBUG #define DB(x) x #else #define DB(x) #endif int main(void){ DB(fprintf(stderr,"InitSocket\n")); return 0; }
562 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 09:06:08 ] >>561 >>555 です あ!そっか、何となく分かったっぽいです コンパイルオプションスイッチの有無で、出力する、しないを設定するのですね
563 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:28:33 ] DBはわかりにくいな DEBUGにすればいいものを
564 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 12:21:55 ] >>553 概念つーか、関数作ったやつがどう仕様をきめるかって問題だろ。 仕様が「0かそれ以外」だったら、== TRUE で比較は間違ってるってだけの話だろ。
565 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 12:23:50 ] 何時間前のレスに反応してんだよw
566 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 12:25:38 ] まあ、お前みたいに2chに常駐してるわけじゃないからな。
567 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 12:26:38 ] >>565 ム板で何言ってるんだ
568 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:02:44 ] >>564 が必死な件について 自分で作ったものは自分で決める、そりゃそうだが 標準ライブラリをもっとよく見てみることをお勧めする。 あと >>546 みたいな意見が出たが、成功すると 0以外の値を返すものも普通にあるぞ。
569 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:11:35 ] おまいら、標準ヘッダーとか読んだりするのか?
570 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:23:05 ] is系関数なんかは0以外の値返す実装な場合があるな。
571 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:28:12 ] 関数によって違うから一概に言えないってことは、529以外みんなわかってるだろ
572 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:40:36 ] >>568 いやだから、仕様を読んで、そのとおりに使えばいいんじゃん。 仕様もよくわからん関数ならともかく、標準関数とか特に。
573 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:46:43 ] あと、XX_TRUE, XX_FALSE みたいな、その関数やライブラリ独自のあやしい定義があって、 仕様が、それを返すってことになってたら、 func() == XX_TRUE みたいに比較したほうが安全って 意見も見たことはある。
574 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:49:49 ] 戻り値が複数のエラーコードを持つ場合はともかく、成功か失敗かしかないならシンボル化する意味ないんじゃないですか って言ったら1とか0とかなんてそんなのわかんないだろ!人間はコンピューターじゃないんだよ!ってコボラーの先輩がキレた
575 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:00:48 ] >>572 真偽値を返す関数の戻り値はほぼ必ず0か非0を返すとドキュメントに書かれている。
576 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:01:58 ] えらく自信満々だな
577 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:04:45 ] 実際そうなんだから仕方が無い。 C++ なら bool 返す関数は true/false しか返さない(返せない)がな。
578 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:08:16 ] >>575 そこは論点になってませんよ。
579 名前:質問です mailto:sage [2008/06/08(日) 15:16:47 ] C言語でシリアル通信をするプログラムを作りたいのですが、難しいです。。 <内容> 自分のPCにRS232Cを2つ繋いで(クロスケーブル)何でもいいので、通信させたいのです。 win32APIを使うといいらしいのですが、プログラムを作った後の動かし方等もわかりません。。 開発ツール:VisualC++2008 どなたか、答えられる方いますか??
580 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:19:01 ] 可読性のためにTRUEと比較したいってことだから、TRUEが1だと仮定すれば 成功したら0を返す関数の場合 if(!func()==TRUE) 非0を返す関数の場合 if(!!func()==TRUE)って書けばおkじゃね?w
581 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:22:16 ] 手段と目的が入れ替わっちゃった感が
582 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:23:31 ] >>579 「rs232c windows」でググったら、最初にこのページが出てきたけど、これじゃいかんの? members.jcom.home.ne.jp/0434383301/vc10.htm
583 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:23:41 ] MFCだと戻り値が0か非0と書いてること多いから、常にいf文ではFALSEと比較してるな 基本的にTRUEは使わない
584 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:25:51 ] >>580 if には基本的に真偽値を渡すんだから 真偽値を返す関数はそのまま書けばいいだけ。 別にそれで可読性は落ちない。
585 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:26:30 ] == FALSE ならともかく != FALSE とか二重否定で余計分かりにくいと思うんだが。
586 名前:質問です mailto:sage [2008/06/08(日) 15:32:25 ] >>582 さん ありがとうございます。。。 ここを参考にやってみます><
587 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:33:35 ] それは比較対象に重点を置きすぎてるからじゃ そりゃあTRUEやFALSEが混在してる中でなら、分かりにくいとは思うが
588 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:36:55 ] まあ、比較で、bool値のリテラルは使わないのが普通だよな。
589 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:51:59 ] そもそもこの話題の発端の発言は、比較の結果がTRUEのときそれを整数の1だと扱おうと しているようだから、そんなのは規格で正しくても、規約では絶対認めない。
590 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:56:45 ] 絶対は言いすぎだが普通は認めないだろうな
591 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:32:00 ] ・比較演算や論理演算の結果は0か1 ・真偽は0以外か0 単純にコレだけのことじゃん。
592 名前:デフォルトの名無しさん [2008/06/08(日) 22:55:17 ] すいませ、うやむやなので、聞かせてください 等価演算子?の質問なんですが 例えばfor文で、 i <= 10 ってのは10までいったら終わるって事ですよね? if文だと、 i <= 10 、10以下の条件が満たされると思っていいのでしょうか?
593 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:58:56 ] 日本語でお願いします
594 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:00:42 ] >>592 > 例えばfor文で、 i <= 10 ってのは10までいったら終わるって事ですよね? 微妙に違う。「iが10以下の場合くりかえし」つまり「iが11になったら 終り(i++の場合)」 > if文だと、 i <= 10 、10以下の条件が満たされると思っていいのでしょうか? 文脈がわからん。何を聞いているんだろう?
595 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:00:44 ] 意味が分からん if文でもfor文でも i<=10 が成立している場合実行、だ
596 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:01:42 ] >>593 読むのもレスするのも日本人でおねがいします
597 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:02:09 ] こういうの、以上や未満を正しい意味で使ってないやつ多いから、ややこしい
598 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:03:43 ] というか正しい日本語でも正確にきまってないからどうしようもないよw
599 名前:デフォルトの名無しさん [2008/06/08(日) 23:04:24 ] だいなりしょうなり
600 名前:デフォルトの名無しさん [2008/06/08(日) 23:06:43 ] もっとわかりやすく質問しろ
601 名前:デフォルトの名無しさん [2008/06/08(日) 23:06:52 ] for( i=1 ; i <10 ; i++){ printf(" * ") って式だと, * は11個でるんでしょうか? それとも10個で終わるんでしょうか?
602 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:07:28 ] >>601 試せよ 36個だよ
603 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:07:51 ] >>601 9コだよ。
604 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:08:00 ] 9個だ
605 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:10:00 ] >>601 それだけだと分からない
606 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:10:01 ] >>601 i = 1; if (i < 10) printf i++ if (i < 10) printf i++ if (i < 10) printf i++ if (i < 10) printf i++ if (i < 10) printf i++ if (i < 10) printf i++ これで考えろ
607 名前:デフォルトの名無しさん [2008/06/08(日) 23:22:53 ] 試してみましたが10個でした・・・ 最初は ++しないで、下に下がるんですよね?
608 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:23:35 ] なん・・・だと・・・
609 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:27:13 ] じゃあもう10じゃなくて3くらいで数えてみろよ
610 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:29:21 ] >>607 もう一度良く数えてみるんだ。 printf("%0d",i);してみろ
611 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:32:58 ] >>607 もしかして for(i = 1; i < 10; i++) じゃなくて for(i = 1; i <= 10; i++) とかやってないだろうな・・・
612 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:34:02 ] >>592 for 構文は、最初に第1式を評価し、第2式の値が真である間、 続く一文またはブロックの処理と第3式の評価を繰り返す。 たとえば for(i=1; i<=10; i++) は、最初に i を 1 に初期化し、 i が 10 以下である間、続く文かブロックを実行してから i を 1 ずつ増やす。 これは結果として同じ処理が 10 回繰り返されることを意味する。 どうしても処理の流れが想像できないときは、まず文房具を用意して絵を描くこと。
613 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:34:20 ] ループする回数すらよく分からんならforなんざ使わず 全部 while で書け
614 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:34:32 ] 計算順序は>>606 のとおりだ
615 名前:デフォルトの名無しさん [2008/06/08(日) 23:40:44 ] <= は++せず1回下に戻って、 < はそのまま最初から++するんですか?
616 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:41:26 ] >>615 日本語でいうと < は未満 <=は以下
617 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:46:33 ] まず演算子の意味から勉強しなおせ
618 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:46:55 ] これはひどい
619 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:47:28 ] どう考えてもforうんぬん以前の問題です 本当にありがとうございました
620 名前:デフォルトの名無しさん [2008/06/08(日) 23:52:40 ] 何となくわかりました すっきりしましたのでありがとうございます
621 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:56:04 ] で、何回だったのかい
622 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:56:59 ] >>616 が言ってるのは>>601 のケースについてだろ? あってるんじゃね?日本語にした場合の説明は。
623 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:57:19 ] ちなみに for ( A; B; C) と A while(B) { 〜 C } は等価
624 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:59:17 ] >>622 流れが読めてないね
625 名前:デフォルトの名無しさん [2008/06/09(月) 00:10:40 ] >>492 ご丁寧に大変どうもありがとうございます! なるほど。s2やらをコピーした直後に表示しているから、壊れて出ないけど、 その後、s3がs2の領域を塗りつぶしちゃってるんですね!! ポインタ苦手すぎて、メモリ操作とか難しすぎて涙が出ます。。 memsetは不要なんですね。よく分からないけど、みんなやってるので、やってただけなんです。 ポインタだから不要ってことですね。大変助かります。ありがとうございます。 strncpy()という関数を教えてくださり、ありがとうございます! 決まった文字数以外は切り捨ててしまって構わないので、これで確実にできると思います。 大変ありがとうございます!! Cド初心者で、ポインタ操作が苦手なんですが、トークンの先頭を示すポインタの値を 記憶しておく場合、main()に戻ったときに、その値は消えてしまったりしないんでしょうか?? 変数の範囲とポインタ関係とかもよくわかってません・・泣 > そうやって切り出した一群のポインタの値を関数の外に持ち出すには、 > ポインタのポインタ(ポインタの配列)を使う必要があることに注意すること。 これが切ないほどによく分からないので、やはり、配列コピーで、 文字列はここにある!と、安心した状態でやりたいと思います。 大変に助かりました!感謝感激!助言くださった皆様も、どうもありがとうございました! お返事遅くなり、すみませんでした!!m(_ _)m
626 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:12:09 ] for(i = 1; i < 10; i++)printf("%d ",i); 1 2 3 4 5 6 7 8 9 :9回 for(i = 1; i <= 10; i++)printf("%d ",i); 1 2 3 4 5 6 7 8 9 10 :10回 for(i = 0; i < 10; i++)printf("%d ",i); 0 1 2 3 4 5 6 7 8 9 :10回 for(i = 0; i <= 10; i++)printf("%d ",i); 0 1 2 3 4 5 6 7 8 9 10 :11回
627 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:15:08 ] >>625 strncpyはヌル文字つけないことあるから注意しろよ s1[n]='\0', strncpy(s1, tp, n); みたいに使うんだ
628 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:17:01 ] >>625 全体的に知識不足っぽいから、本読むといいと思う。 実際プログラム組むのもいいんだけど、知識がないと、どうでもいい所でつまづく。
629 名前:デフォルトの名無しさん [2008/06/09(月) 00:28:58 ] >>627 ありがとうございます! たとえば5文字の文字列をコピーしたい場合、'\0'の分もとって、 s1[6]; で宣言するんでしょうか?それとも、s1[7]? >>628 はい、ひたすらに読みまくってみます。ありがとうございます!
630 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:42:50 ] >629 5文字ならs1[6]でいい 良く使われるのは、 #define LENGTH 15 char str[LENGTH+1]; みたいな手法
631 名前:デフォルトの名無しさん [2008/06/09(月) 01:12:52 ] >>630 ああ、なるほど! それはよく見かけるけど、+1 はそういう意味だったんですね! こういうの、本に載ってないですよね!為になります。 ありがとうございます!
632 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:16:54 ] 文字列には'\0'が必要だから文字数+1のサイズが必要ってのは大概の本に載ってると思うけど。
633 名前:デフォルトの名無しさん [2008/06/09(月) 01:27:49 ] i++ と ++i って何が違うの? 論争はやめてね。
634 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:28:57 ] 俺的にはfor文で、変数名iとか付けてほしくないな
635 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:32:40 ] >>633 それだけを1行に書いたら同じ機能。 if文なんかの中に組み込むと結果が違ってくる。
636 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:35:37 ] 変数名 i はfor文専用 それ以外で使うべきではないし、for文では積極的に使う。
637 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:36:58 ] >>636 専用と言い切ったらダメだろw あくまで慣習的に使われてるだけだし
638 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:38:32 ] >>635 どうかわるの?
639 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:41:33 ] 使いたきゃ使えばいいが、書いた全てのfor文のループカウンタに対して、どのような意味を持っているか説明できないようじゃダメだな for文といえばiだろ?とか言ってるようじゃ学生レベル
640 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:43:01 ] i, j, k, と増えていくのは文化でしょ?
641 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:43:32 ] i回目以上の意味がない場合多いだろw
642 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:44:22 ] 回数以外に意味がないからこそiが多用されてるんだしな
643 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:45:43 ] 回数って何の回数ですか?><
644 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:47:45 ] ループカウンタはi, ii, iii, iv, v,...
645 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:52:13 ] もともとはふぉーとらんだっけ?iカウンタ
646 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:53:29 ] >>638 教科書読め
647 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:58:00 ] fortranだとI J K L M N あたりが宣言なしで整数だったか 視野に納まる範囲のループカウンタは一文字で十分 広範囲に及ぶならなんか名前を付けたほうがいいかもしれないが、 そうならないように関数を分割するなどの努力をすべきだろう
648 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 02:01:30 ] DO文か、懐かしいな。
649 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 02:03:44 ] Linuxで作りたいんだけど、 プロジェクトとかって自分のディレクトリに置いてやってけばいいの? ディレクトリが沢山あってlinuxの正解というか常識がわからん
650 名前:デフォルトの名無しさん [2008/06/09(月) 02:13:56 ] 簡単な本は理解した 次に進みたいので何かいい本ある?
651 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 02:15:41 ] >>650 推薦図書/必読書のためのスレッド 40 pc11.2ch.net/test/read.cgi/tech/1209441159/
652 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 04:02:21 ] これを実行して一つ目の数値を入力すると 「問題が発生したためtest.exeを終了します」って出るんですが 何がいけないんでしょうか? #include <stdio.h> int main(void) { int array[10]; int i; for(i=0;i<10;i++){ printf("%d番目の数を入力してください:",i+1); scanf("%d",array[i]); } for(i=9;i<0;i--){ printf("%d\n",array[i]); } return 0; }
653 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 04:07:06 ] >>652 ヒント:scanfのarray[i]引き数があやすい scanfのマニュアルあるいは教科書を読み直す
654 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 04:09:10 ] >>652 釣りはやめようね
655 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 04:11:32 ] >>653 わかりました 「&」ですよね あとどうでもいいんですけど二つ目のfor文の条件式はi>=0にしないとなんもならないですね ありがとうございました! >>654 マジで気づかなかったです 自分の持ってる教本にも 初心者はscanf使う時に&忘れやすいから気をつけてって書いてたんで これからは忘れずちゃんと&つけたいと思います 簡単すぎる質問でスレ汚したかもしれないです すいませんでした
656 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 04:12:15 ] >>652 scanf("%d",array[i]); > scanf("%d",&array[i]); なんだかなぁ。
657 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 04:16:58 ] コンパイラによってはそれは忠告してくれるようにできるからしとけば?
658 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 05:48:39 ] C(hinko)++
659 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 07:38:27 ] 無料のVC2005使ってデバッカ使ってみれば?
660 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 11:39:13 ] 入門書にscanfが記載されているのは何でだろう?
661 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 11:59:02 ] たぶんこう 定数同士の計算じゃつまらないので何か入力させてその値に対して計算をさせたい でもまだ文字列の説明はしていない → scanf
662 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 12:01:15 ] おまじないでおk #include とか scanf printf みたいな可変長引数をとる関数とか 気にしてたら何もできない
663 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 12:07:58 ] 本の構成を変えればいいのに。。。。
664 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 13:54:00 ] >>663 無理だろwww プリプロセス単体の説明からはじめるのかよwwwww
665 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 14:04:43 ] 別にscanfから初めてもいいと思う 前置きで、あまり使うべきでない関数だと断った上で
666 名前:デフォルトの名無しさん [2008/06/09(月) 15:01:00 ] #include <stdio.h> int zel(int y, int m , int d) { if(m<=2) { y--; m+=12; } // 1,2月は前年の13,14月として扱う return ( y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + d) % 7; } int main(void) { int year,month,cnt; for (year=2001,cnt=0; year<=2100; year++) { for (month=1; month<=12; month++) { if( zel(year,month,13)==5 ) { cnt++; } } } printf("%d回\n",cnt); return 0; } このプログラムをmain関数のみで作ることって出来ますか? if文とfor文ぐらいしか習ってないんですが…
667 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 15:07:35 ] 出来ます。
668 名前:デフォルトの名無しさん [2008/06/09(月) 15:10:12 ] >>667 すみませんが、教えてもらえませんか??
669 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 15:27:04 ] #include <stdio.h> int main(void) { int year,month,cnt,zelAns,y,m,d; for (year=2001,cnt=0; year<=2100; year++) { for (month=1; month<=12; month++) { y = year; m = month; d = 13; if(m<=2) { y--; m+=12; } // 1,2月は前年の13,14月として扱う zelAns = ( y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + d) % 7; if (zelAns == 5) { //if( zel(year,month,13)==5 ) { cnt++; } } } printf("%d回\n",cnt); return 0; } これでOKかな・・・?間違ってたら指摘にょろ あと2chでインデント維持のためTAB1個を全角スペースx5に変換してるので コピーする場合はエディタなどで修正必要?
670 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 15:29:20 ] >>668 #include <stdio.h> int main(void) { int year,month,cnt, y, m; for (year=y=2001,cnt=0; year<=2100; year++) { y = year; for (month=1; month<=12; month++) { m = month; if (m <= 2) { y--; m+=12; } if (((y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + 13) % 7) == 5) { cnt++; } } } printf("%d回\n",cnt); return 0; } 適当なのであってるかしらんよ。 で、これ宿題?
671 名前:デフォルトの名無しさん [2008/06/09(月) 15:41:55 ] >>669 >>670 様 ありがとうございます。 これ宿題です。
672 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 15:45:03 ] >>671 今度から宿題はここで聞くといいよ。 ttp://pc11.2ch.net/test/read.cgi/tech/1212895856/
673 名前:デフォルトの名無しさん [2008/06/09(月) 16:43:53 ] リナックスの問題で 1+(1+2)+(1+2+3)+(1+2+3+・・・+n) 二重ループを用いて書いてください。 よろしくお願いします
674 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 16:47:24 ] 宿題は宿題スレへ
675 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 16:51:56 ] for(s=0, i=1; i<=n; i++) for(j=1; j<=i; j++) s+=j;
676 名前:デフォルトの名無しさん [2008/06/09(月) 16:59:58 ] ++習ってないw
677 名前:デフォルトの名無しさん [2008/06/09(月) 17:07:49 ] すみません教えてください・・・頭から湯気でた 入力文字を5文字制限に制限をして、あふれたら収まるまで警告を出すプログラム を考えているんですがめちゃくちゃになってしまいました・・・ #include <stdio.h> int main(void){ char namae[5]; do{ scanf("%s", namae); if(namae[5] > sizeof(namae)){ printf("文字数オーバーです。もう一度入力してください。"); } else if(namae[5] < sizeof(namae)){ break; } } while(namae[5] > sizeof(namae)); printf("%d", sizeof(namae)); } 文字数の比較でsizeof()を使ってます・・・上記のコードでやると、 namaeの中身がリセットされずに延々と増えていってしまいどうしたらいいのかわからなくなりました・・・ スマートなやり方はないでしょうか?どうかご教授ください・・
678 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 17:09:26 ] printf("%d", sizeof(namae)); ↑これ間違えました・・・・さっき実験してたやつです・・・ printf("%s", namae)でした・・・
679 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 17:18:52 ] namae[5] < sizeof(namae)) ↑ そもそも、これが(namae[5])何を指しているのか、良く考えた方がいい つstrlen()
680 名前:デフォルトの名無しさん [2008/06/09(月) 19:42:17 ] www.geocities.jp/ky_webid/algorithm/017.html こういうプログラムを実行したときに void型はnode型に変更できませんってなるのはなぜでしょうか
681 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:48:35 ] なんとなくだけど voidはmallocで確保した際の戻りアドレスで nodeは構造体 キャストがうまく出来てない?
682 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:59:05 ] エラーだそうと思ったらそのままコンパイル通ってしまって確認が出来ん >>681 の通りだと 111行目あたりの new_node = malloc( sizeof( struct node ) ); を new_node = (struct node*)malloc( sizeof( struct node ) ); に変えてみるとかどうだろうか
683 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:02:40 ] >>680 こういう・・・ということは自前で用意した物ってことか? うまく行かないソースとエラーになる行番号をせめて書いたほうがいいよ。
684 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:18:57 ] winapiとかdirectxとかそういうの使わないでGUIって作れるもんなの?
685 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:20:13 ] そういうのってのがどういうのを指してるのかは知らんが 標準Cだけじゃ無理
686 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:26:36 ] C言語そのものには画面という概念すらないからねぇ
687 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:29:36 ] 一応バックスペースとかラインフィードとかあるけど、 このあたりは画面というよりむしろプリンタを想定している所が大きいんだよな。
688 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:31:19 ] windowsのような環境は無理だろうな DOSとかのようなシングルタスクな環境だと VRAMのアドレスとかわかれば直接アクセスできたりするんだけど。
689 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:34:23 ] PC-98はDOS画面に壁紙貼ったりできたなぁ‥‥なつかしい。
690 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:37:05 ] CでOSから書けばいいじゃん。
691 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:43:40 ] >>690 一からOS作ってもwindowsのようなGUI形態とる場合は 結局同じようなAPIの道を歩むと思うので無駄。 素直にAPIたたけ。 それがいやなら、DOSでやれってことだな。 でもDOSでやるとなると今度はもっと大変なんだけどな。
692 名前:680 [2008/06/09(月) 20:49:49 ] >>681 >>682 >>683 実行時のエラーです、行数は同じです,お願いします > C:\borland\bcc55\Bin\make.exe -fDebug\test.mak -B TARGET MAKE Version 5.2 Copyright (c) 1987, 2000 Borland bcc32 -WC -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug -c C:\MyC\test\test.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland C:\MyC\test\test.cpp: エラー E2040 C:\MyC\test\test.cpp 15: 宣言が正しく終了していない エラー E2034 C:\MyC\test\test.cpp 24: 'void *' 型は 'node *' 型に変換できない(関数 main() ) エラー E2158 C:\MyC\test\test.cpp 50: 'delete' のオペランドは非 const ポインタでなければならない(関数 main() ) エラー E2034 C:\MyC\test\test.cpp 111: 'void *' 型は 'node *' 型に変換できない(関数 add(int) ) エラー E2040 C:\MyC\test\test.cpp 124: 宣言が正しく終了していない *** 5 errors in Compile *** ** error 1 ** deleting Debug\test.obj Build End !! (Elapsed time 0:00.871)
693 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:54:37 ] CのコードをC++としてコンパイルして上手くいくわけないだろ。違う言語だぞ。
694 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 20:55:07 ] >>689 おっ・・・オサー・・・ん?
695 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:00:10 ] E:\Test>bcc32 a.cpp Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland a.cpp: エラー E2040 a.cpp 15: 宣言が正しく終了していない エラー E2034 a.cpp 24: 'void *' 型は 'node *' 型に変換できない(関数 main() ) エラー E2158 a.cpp 50: 'delete' のオペランドは非 const ポインタでなければならない(関数 main() ) エラー E2034 a.cpp 111: 'void *' 型は 'node *' 型に変換できない(関数 add(int) ) エラー E2040 a.cpp 124: 宣言が正しく終了していない *** 5 errors in Compile *** E:\Test>ren a.cpp a.c E:Test>bcc32 a.c Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland a.c: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland こういうこったな
696 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:09:24 ] mallocで確保したメモリ領域のサイズの求め方について分からないので 教えてください。下記のコードでは、出力される結果はchar型へのポインタの サイズだと思いますが、メモリで確保した領域を取得する関数などは在りますか? 処理系はcygwin + gcc です。ウェブで検索するとmalloc.hにてmalloc_usable_size という関数が紹介されていたのですが、私の環境では関数がない様でした。 int main (void){ char *str; str = malloc(sizeof(char)*10); printf("sizeof(str)=%d\n", sizeof(str)); return 0; } また、こういった動的に確保した場合の処理は皆さんはどの様に処理していますか? やはり、自分でメモリ領域管理変数などを用意するのでしょうか?
697 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:10:29 ] >>692 C++ コンパイラ使うなら 15行目の delete は使えない(C++ のキーワードだから) 修正は次の通り delete() → del() とかにする。3箇所 15: int del(int); 50: if( del(data) != 0) 124: int(del int data) C++ ならキャストをしっかりと。2箇所 24: root = (node*) malloc(... 111: new_node = (node*)malloc(... >>693 この程度 C ソースなら少し気をつければ C++ で動くで。
698 名前:デフォルトの名無しさん [2008/06/09(月) 21:11:02 ] 初心者はSTL
699 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:14:55 ] sizeof(str) これだとポインターのサイズじゃねーの? sizeof(char)*10 これを確保してるんだから char型は1バイト、それを10個確保してるのが今回のサンプル でmallocの場合は確保するサイズは自分でわかってないと無理でしょ・・・ int main (void){ char *str; unsigned long malloc_size; malloc_size = sizeof(char)*10; str = malloc(malloc_size); printf("sizeof(str)=%d\n", sizeof(str)); return 0; }
700 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:15:39 ] printf("sizeof(str)=%d\n", sizeof(str)); じゃないや printf("sizeof(str)=%d\n", malloc_size);
701 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:22:21 ] >>696 自分が確保するときに指定したサイズを知る方法を教えてくれってw
702 名前:696 mailto:sage [2008/06/09(月) 21:31:51 ] >699 レスありがとうございます。 >sizeof(str) これだとポインターのサイズじゃねーの? この書き方だとポインタサイズになってしまうが、mallocした領域サイズを 自分でずっと管理するのは面倒だな・・・。もしかして、領域サイズを取得する関数や、 手法がないのかなと思い、サンプル的にそのコードを出しました。 かえって意図が伝わり難くなったようですいません。 >701 やはり、動的取得の場合は無理なのですね。自分で管理することにします。
703 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:31:57 ] >>696 free(); を忘れないでね
704 名前:680 [2008/06/09(月) 21:32:06 ] >>697 ありがとうございます エラーなく実行できました
705 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:34:25 ] >>696 sizeof(str) はあくまでも ポインタのサイズ。 ポインタの実態はアドレスの番地が管理されているため 環境にもよるが、アドレスを2^32まで割り当てられる環境では 変数の型がなんであれ、ポインタ自身のサイズは 4byte かと。
706 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:35:50 ] atoi(change)=="キムタクの頭"
707 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:47:46 ] すでに分かってる数字を改めて別のところから求めなおすのはムダ以外の何者でもない
708 名前:696 mailto:sage [2008/06/09(月) 21:59:30 ] >707 少数の変数を使用して、確保するので有ればその通りだと思います。 しかしながら、確保する領域が処理したいデータによって動的に、しかも多数 管理していく必要が出てきた場合、メモリ管理を自動化できるならば、 (この場合はメモリ確保領域をシステムに任せたいということですが)そうした方が 楽だと思います。また、そういったニーズは出てくるものではないでしょうか? ここの方ならば、そういったノウハウをもしかして持っているのではないかと思い、 質問した次第です。 それならC以外の言語を使えというのはもっともだと思いますが。
709 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 22:02:15 ] うん、そういうことを自分でやるのが嫌ならC以外を使えでイナフ
710 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 22:02:31 ] gccの独自拡張とかc99でよければこうすればsiseofできるようになるけどwwww int main() { int x; x = 10; char (*y)[x]; y = malloc(x); printf("%d\n", sizeof(*y)); return 0; }
711 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 22:03:35 ] typedef struct { int length; char *str; }VARCHAR; みたいにくっつけて扱え
712 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 22:04:56 ] >>710 意味ねぇー(笑
713 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 22:05:06 ] >>710 変更できねーじゃんw
714 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 22:05:08 ] できないこともないけど、取り扱い注意
715 名前:696 mailto:sage [2008/06/09(月) 22:09:35 ] >710 ありがとうございます。参考にさせていただきます。 >711 やはり、そのように管理するのがスマートですね。その様に実装していこうと 思います。 みなさん、変な質問に答えてください、ありがとうございました。
716 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:06:55 ] 文系大学生なんですが画像処理のためにC言語を覚えることにしました。 そこで今日書店に指南書を探しにいったのですがいまいちどれもとっつきにくく帰ってきました。 プログラムとはそもそも何かという概念的な事から始まり、揃えるべき環境(ツール)が細かく指定されてる超入門書ってないでしょうか?
717 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:09:20 ] 推薦図書/必読書のためのスレッド 40 pc11.2ch.net/test/read.cgi/tech/1209441159/
718 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:09:35 ] >>716 >>651
719 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:12:31 ] >>716 本いるか・・・? ネットで十分だろ。
720 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:13:29 ] さぁなぁ、それよりもまず 基本 仕組み を理解した方が良い。 いきなりコードを書いて、なんかで(・∀・)キターーじゃ話にならん。 どんな環境、プログラム言語も、動作させるコンピュータの仕組み 内面的な部分に命令を与えているわけだし、0と1の演算処理を 様々な変数、演算子、アルゴリズムで制御しているわけだ。 また、どんなコンピュータでもいえる事が、何かデータ、数値を与えて 与えられたデータを目的に応じて処理した結果を扱っているわけだ。 あとはそれを、人間が解釈できる形、例えば文字、色、画像、音声などで 表現できるコンピュータで都合よく見て理解しているわけだ。 画像だろうと音声データだろうと文字データだろうと、所詮は0と1の バイナリーで他の塊に過ぎんのさ。 必要に応じて物を用意する。それは他のことでも言えること。 ただ、何があって何が出来るか?それを多少なりと把握しておく必要はある。 さて、何を見れば良いか?それは、他の人に聞いてくれ。
721 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:14:41 ] すいません既出でしたか、そちらを見てみます。 >ネットで十分だろ。 どうも実体があると落ち着くもので・・・。
722 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:16:39 ] とっとと消えろカス
723 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 00:36:59 ] >>722
724 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 02:08:41 ] 何でも良いとは言えんが、とりあえずありきたりの内容が載っているものを。 って、何がありきたりか・・・配列、文字列、ポインタ、関数の自作、 素数、最大公約数、ソート、ファイルのダンプなど等、もちろんそれ以外でも あれこれ挙げたらキリがないが。結局、何が目的か?
725 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 02:12:17 ] 目的ありきだろ。 韓流スター見たさに、韓国語覚えたおばちゃんを見習え。 何もする予定無いのにC言語覚えても身につくわけない。
726 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 03:26:19 ] >>725 >>716 をもう一度読むんだ
727 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 03:42:29 ] 画像処理ったって、結局画像データを構成している実態は 0と1の組み合わせの塊を、必要に応じて展開、処理するわけでしょ? BMPだと分かりやすいが、SVGはおりはさっぱりでやんす。 一応、XMLで記述されているとのことで、テキストエディタでも可能とかなんとか。 まぁ、それは画像編集であって、そんな編集するプログラムを作れるかは別だが。
728 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 03:44:05 ] 画像処理ってのがかなり大きなくくりなんだよな・・・ 画像処理でもwindows上でUSBカメラからの映像を・・・とか マイコンで処理・・・とか でぜんぜん扱いも違うしな。
729 名前:デフォルトの名無しさん [2008/06/10(火) 05:10:54 ] GOTO文を使うなって学校教えられましたが、 実際の会社のプログラムとかでもやはり使わないのですか?
730 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 05:15:51 ] >>729 使わないね・・・ 使わないように組めるようになるよ。
731 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 07:39:19 ] エラー処理と多重ループから抜けるのとで使う。 それ以外では使わない。
732 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 07:45:30 ] 個人開発なら好きにしてもいいと思うが、仕事じゃ絶対ダメだな 俺は個人でも絶対使わないが
733 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 08:36:14 ] GOTO使わないからといってもプログラムがきれいになるわけでもないけどな。
734 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 09:45:50 ] なぜ使うなと言われるのかをちゃんと理解した上で それでもここでは使うべきだ!と思うなら使っていい
735 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 11:16:09 ] むしろ仕事では使うが個人では絶対使わない
736 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 11:19:31 ] うまく機能分割して関数化していくとreturnで GOTOの代わりのようにしちゃうこともあるな。
737 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 13:23:51 ] >>729 Cやその他の構造化言語を使うほぼ全ての人が、みだりに goto を使うことはよくないと考えている。 構造化プログラミングの恩恵は、コードの総体が構造的であるときに最もよく受けられるものだが、 goto はまったく構造的でないからである。特に複数の人間が長期に渡ってプロジェクトに関わるような プログラム開発の現場では、保守性を低下させるとの観点から絶対に認めないとする場合も多い。 goto を使いたくなる全ての場面は、goto を使わなくても構造的な手法によって解決することができる。 特に小さいけれど結構ややこしい処理を敢えて関数に分割することで解決することができる。 あるいはちょっと手間をかけてフラグ変数を配備したり、ブロックの構成を工夫することなどがある。 しかし、ある種の処理を行う場合には goto を使うことをためらうことはないと考えている人も少なくはない。 最たるものはエラー処理である。エラーというものはその性質上、予定していた処理を全て切り上げて 制御を呼び出し元に返すことになる場合がほとんどだが、プログラムが複雑なものになってくると、 特にメモリの動的な割り付けを噛ませている場合などは、率直に return する前のちょっとした後片付けが どうしても必要になってくることが多々ある。もちろんこれは構造的に解決することができるものであるが、 しかし構造が複雑化して却って可読性が低下したり、やたらと細かい関数分割になってしまう場合もある。 そういうことを嫌う人は、関数の末尾にだけジャンプして最低限の後始末だけを行うという限定つきで、 goto を使うことを容認していることがある。 構造化と効率は決してトレードオフの関係ではないが、どんな場合でも構造化を押し通そうとすると、 性能や保守性を低下させてしまうこともある。プログラムは常に構造的に書くことができるけれど、 プログラムで実際に解決しようとしている現実の諸問題、そして人間の思考方式そのものは、 必ずしも構造的でないからである。もちろん大抵は取るに足らない性能差で、コンパイラの最適化や プロセッサの能力で消されてしまうが、問題となることももちろんある。そのような場面に直面したとき、 ここは goto を使うべきだと信じるなら、そうすればよい。それ以外では思いとどまったほうが無難である。
738 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 13:37:11 ] ループが最後まで回ったときだけ実行されるものがあるとgoto使いたくなるな。 実際はフラグにして使わないけど。
739 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 13:56:51 ] 内容が長くなりすぎて削ってしまったが念のため書いておくと、 switch や break や continue や return も構造的でないジャンプ構文であり、 本質的には goto の同類である。これらの中から特に goto が取り上げられるのは、 そのジャンプする先を知ることが特別に難しいためだ。 だから goto を容認する人は、上の例でもあるように「関数の末尾にだけ飛ぶ」と言うような 処理の追跡を容易にするためのルールを作っていることがほとんどである。
740 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:08:15 ] ろ、longjmp・・・
741 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:10:10 ] >>737 >739だけ読んだ。
742 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 15:48:34 ] 構造化以前のBASIC、77より古いFORTRAN、85より古いCOBOL みんなGOTOで大きくなった。 そんななかでもGOTOの使い方にはマナーはあったのだ。
743 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 15:55:16 ] GOTOで戻ってループを作らないとかそんなんだろ
744 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 16:44:43 ] ifとgotoさえあればいいよね。
745 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 16:53:54 ] 宿題のスレで goto 使ってみるかな。 嫌がらせかな?
746 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 16:57:14 ] ECHO OFF :LOOP ECHO 続けますか? PAUSE GOTO LOOP
747 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 16:59:22 ] 続行するには何かキーを押してください . . .
748 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:02:34 ] ^C
749 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:08:57 ] >>745 gotoは習ってないので使わないでお願いします って言われるのがオチ
750 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:27:21 ] >>749 今の学校では習わないのかな?
751 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:27:59 ] おしえなくていいよ
752 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:33:38 ] だな〜 GOTOはどうしようも無いケースで使う最後の手段と思ってたほうがいいな。
753 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:48:37 ] ふむ、俺は教えて方が言いとおもうけどな。 まぁ、使うことが「滅多に」無いのは認めるがね。
754 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:58:29 ] GOTOスレあったけど、もう使い切ってたか。
755 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 19:02:45 ] 最初に教えると使っちゃうんだよ、決まった場所に飛ぶだけから超初心者には分かりやすいと感じるんだよ forなんか人によってはなかなかわかってくれないもの
756 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 19:39:34 ] goto文がスパゲッティーとよく言われるが、 俺的にはgoto文は適度に使う分には全く問題ない。むしろ見やすい 1関数に1個なら大丈夫だろ
757 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 19:42:26 ] >>756 スパゲッティってのは時間をおいて固まってからが本領発揮なんだぜ?
758 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 19:42:47 ] 自分で書いたソースだからじゃね?
759 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 19:52:05 ] そもそもスパゲッティはスパッゲティコードと呼ばれるような絡まり方はしない。
760 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 20:05:42 ] スパゲッティーミートクソース
761 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 20:06:21 ] ほそい麺でぺペロンつくると案外からまる
762 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 20:06:46 ] イヤホンコードが最強
763 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:06:09 ] 最強は素麺でしょ?
764 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:13:23 ] 物置にしまっといたロープ
765 名前:デフォルトの名無しさん [2008/06/10(火) 21:28:20 ] void main(void)と int main(void)の使い方の違いを教えて下さい main関数はint型で戻り値が0かどうかで正常かエラーか判断するから int main(void)の方が使い方としては正しいみたいだけどじゃあなぜ void main(void)なんて教えたりするんでしょう? return 0;を省略できるからでしょうか?
766 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:31:34 ] >>765 void main(void) は常に間違いである。 int main(void) または int main(int argc, char **argv) を使え。)
767 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:32:29 ] >void main(void)なんて教えたりするんでしょう? 教えてる人間がバカだから
768 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:32:34 ] 最強は釣り糸でしょ?
769 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:36:22 ] >>766 void main(void) は常に間違いである。は間違いである。
770 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:37:28 ] 11.14: void main()と宣言してうまくいかないわけがないと思う。なぜならmain()から戻る代わりに、exit()を呼んでいるから。だいたい今使っているOSはプログラムのexit値/戻り値を無視する。 A: main()から戻ってくるかどうかは関係ないし、そのステータスを見るかどうかも関係ない。問題はmain()の宣言がおかしいと、呼び出し側(実行時のスタートアップのコード)がmain()を正しく呼び出すことすらできないかもしれないことにある。 君が使っているOSは終了時のステータスを無視して、void main()でもうまく動くかもしれない。しかし、このやりかたは移植性が低いし、正しくもない。
771 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:37:47 ] Cなら、int main(void) か int main(int argc, char** argv) です。 それ以外は、間違いである。 (動くけどね)
772 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:38:33 ] 引数はもっとおおくてもいいんじゃねーの?
773 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:39:51 ] 処理系がもっと引数の多いエントリポイントを認めているなら、もっとおおくてもいい
774 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:42:33 ] 逆に言えば、処理系が文書で認めていればvoid main(void)もありだよ。 良しと書いてあるマニュアルなんて今まで見たことがないけど。
775 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:43:59 ] 取りあえず、void main(void) とか書いてある書籍は買うな。
776 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:45:49 ] 失礼ですが、この意味を教えていただけないでしょうか? まだC言語などを始めたばかりの初心者です。 エラーメッセージでこのような文章が出てきました。 undefine:n どなたかよろしくお願いします
777 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:46:31 ] まず辞書を引けカス naが定義されてないようです
778 名前:デフォルトの名無しさん [2008/06/10(火) 21:50:47 ] 分かりました。 void main(void)は使わないようにします
779 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:32:05 ] int main() じゃあかんの?
780 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:33:13 ] いいよ
781 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:34:39 ] 実験で書いたソース、ことごとくmain()でごめんなさい。
782 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:37:13 ] Cでは、明示的にvoid を書かないといけなかったはず。
783 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:37:51 ] じゃあ書かなかったらどうなるの?
784 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:38:23 ] たまには調べたら
785 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:39:12 ] 皮肉もわかんないんですか?w
786 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:42:25 ] >>782 嘘をつくな
787 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:42:57 ] かかないと、古い形の函数定義になる。 C89ではblessed。
788 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:46:15 ] おまいら、勉強不足だね
789 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:47:04 ] >>788 煽るだけですか?w
790 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:48:40 ] >>785 日本語、勉強しておいで
791 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:49:58 ] お前らいい加減にしろよ!
792 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:50:41 ] 今日は大漁ですな。
793 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:51:06 ] ここまで俺の自演
794 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:57:50 ] >>789 お前もだろw
795 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:36:11 ] int main (int argc, char *argv[], char *envp[])
796 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:47:49 ] またしょーもないことでのびてんんあ
797 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:52:53 ] こういう専門スレだと知識がない奴は揚げ足を取るぐらいしかレスできないからな…
798 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:00:45 ] 取りあえず、無視しましょう。
799 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:08:49 ] #if 0 aori(); #endif
800 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:10:40 ] 11.13: main関数の3番目の引数envpは。 A: これは(よく見かけるけれど)標準でない拡張である。標準で用意されているgetenv()関数が提供すること以上に環境の情報が必要ならば、グローバル変数environを使うほうがまだましな手段だろう(これも同 じように標準ではないが)。 References: ANSI Sec. F.5.1; ISO Sec. G.5.1; H&S Sec. 20.1 pp. 416-7.
801 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:12:41 ] C99って、広まってるの?
802 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:14:14 ] いいえ
803 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:19:48 ] VC++はシカトしてます C++と互換性のない部分はやる気なし
804 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:21:18 ] C++と分化しちゃってってなぁ・・・
805 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:29:14 ] VC++は%aとかintptr_tとかおいしい(?)とこだけかじっている。 ほかには__restrictや__pragmaなども。
806 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:39:37 ] >>766 ダウト。”常に”も”間違い”でもないよ。環境による。 とりわけ、ISO、ANSI 準拠では main は int 型の変数を返すことになっている。 環境にもよるということで、必ずしもそうとは言えないし、少なくとも 間違い ではない。
807 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:43:16 ] 日本語でおk。 void main(void) は移植性は悪いが その処理系で定義されているなら その処理系でしかそのプログラムをコンパイルできない可能性があってもいいのであれば 使っても構わない。 ただ、入門書で使うのはどうかしてるよね。 VC++ しかコンパイラ知らないんじゃないかと。
808 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:43:53 ] vcでこそ怒られるとおもうがw
809 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:00:43 ] 最近のVCは怒るのか
810 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:02:49 ] VCは、比較的厳しい方だと思うぞ gccの方が柔軟なイメージがある
811 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:05:30 ] void mainにしたところでどれくらい変わるか知らないけど、 わかりやすい説明ができるなら入門書の内容に移植性なんか必要無いと思う コンパイラとか環境までオマケでついてるような書籍なら。
812 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:08:33 ] 必要ありすぎる。 移植性の無いコードなんて初心者に見せるもんじゃない。
813 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:13:08 ] なにも知らない初心者のうちからint main(void)で叩き込んどけば 後からの余計な手間がかからないだろ。
814 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:23:27 ] gccはデフォルトはデレデレ。-Wall -pedantic-errorsでツンツンになるよ。
815 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:25:49 ] -ansi -pedantic-errors -Wall -std=c99 -pedantic-errors -Wall のどちらかは必ず付けるね。
816 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:26:03 ] -Wもつけないと
817 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:28:28 ] man gcc にはそんなの載ってないけど、バージョンによるのかな。
818 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:30:31 ] gccだと、enum定義でカンマの後ろに}を書いてもコンパイル通るんだっけ
819 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:31:30 ] >>818 c89だとだめで独自拡張でアリでc99だとアリだった気がする
820 名前:795 mailto:sage [2008/06/11(水) 01:31:51 ] >>800 >>774 ANSIにも参考情報として載るくらいメジャーな拡張を書いただけだが わざわざ補足ありがとうね
821 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:32:21 ] >>773 だったorz
822 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:00:15 ] >>806 「規格には反しているが処理系によっては動く」ということを間違いでないと断定することは、 ありとあらゆる規格に反する書き方が間違いでないことになる可能性があることに気付いているか。 文法が正しいか正しくないかは、プログラムが動くか動かないかとは本質的に別の問題である。 文法は守るべきものであり、仮に文法に反することが容認されるとしても、それは正しいからではない。
823 名前:デフォルトの名無しさん [2008/06/11(水) 02:03:26 ] >>822 > 処理系によっては動く ダウト。処理系ではなく開発環境。 ちゃんとある標準化に対して準拠する場合と、そうでなくても 問題のない開発環境についてとは話は別。よって、常にでも間違いでもない。 強いていうなら、ちゃんと補足しないと誤解を招くよ。知ったかだと。
824 名前:デフォルトの名無しさん [2008/06/11(水) 02:04:50 ] >>822 では、何で 間違い か、お答え頂こう。標準化機構はあくまでも標準的な スタイルについての話であって、そのもの自身が 間違い とは定めてはいない。
825 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:09:33 ] >処理系ではなく開発環境。 (゚д゚)エー
826 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:12:16 ] 処理系と開発環境って事実上同じものじゃないの? 少なくとも実装を問題にする場合の開発環境は。
827 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:13:06 ] >>822 >ありとあらゆる規格に反する書き方が間違いでないことになる可能性があることに気付いているか。 ありとあらゆる規格に反する書き方が間違いでないことになる可能性はあるのだが。 ただし、文書で示す必要はあるが。
828 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:16:16 ] おまえら本当にどうでもいいことで言い合うのが好きだな
829 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:18:37 ] むしろ、int main としておきながら return int型の数値; が無い方が間違いである。 というか、コンパイラで警告が出る。
830 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:20:21 ] >829 なぜ今そんな当たり前のことを
831 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:22:16 ] 処理系:ソースコードを実際に動かせるようにするもの。 開発環境:プログラムを作るためのツールの集合。処理系を含む。 コードの動作を問題にしてるならふつー同じものだと思いますね
832 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:22:25 ] >>829 C99 で省略時には末尾に return 0; があるのと同じとされるようになった。
833 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:28:43 ] まあ void main はないけどな
834 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:29:28 ] ISO、ANSI準拠だと、プログラムの開始はmain関数としている。 そういう環境ではとりわけ、mainはint型の変数を返すとしている。 が、誰もが必ずしもISO、ANSI準拠の環境を使っているわけではなく void mainでも間違いとは言えないんで、強いて間違いだの 不適切だの言うなら、条件をしてしないと通じんよ。 今度は、そのスタイルを間違いとしないコンパイラ叩きを始める奴もいるが そうなると何が問題点か?そもそも議題の根本、要点が何か? もう支離滅裂になるから困る。
835 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:40:18 ] それは逆だろう 特に条件を指定しないなら規格に沿った一般論の話で 強いて間違いでないと言うなら条件をつけるべきだろ
836 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:42:41 ] 特に条件を指定しないのに なんで規格に沿ったとか条件がつくのか理解できない。
837 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:43:46 ] >835 この人規格の意味とか認めない人だから何言っても無駄よ
838 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:44:37 ] 自演で大変だな・・・
839 名前:デフォルトの名無しさん [2008/06/11(水) 02:45:38 ] >>835 はぁ?特に条件を指定しないで 間違い なんて認められるわけねーじゃん 常に 間違い だよ?残念だが、事実上間違いではないんだよ、知ったか無知君w
840 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:45:42 ] C言語というものを一方は規格と考えて話してて一方は実装と考えて話してるんだからかみ合うはずがない
841 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:48:39 ] >>832 みたいに、結局固有の環境ではと、自分が知っていることだけで 話を始めようとする奴が出るだろ?だから先に 条件を指定して 話をしろつってんだよ。 だいたい、C99だって結局は固有の条件として挙げられてるじゃんか。 だったら、まずANSI、ISO準拠ではと、とりわけint mainについて 標準スタイルではと補足しておくべきでしょ。標準化機構が示した 環境以外だって普通にあるぞ?とりわけ、標準化スタイルにしておけば 幅広い環境で通用するって話にもなるが、void mainに関しては 間違い にはならない。 むしろ、int mainでint型の数値を返さない方が不適切である。
842 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:48:53 ] >>839 日本語でおk
843 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:49:02 ] またいつもの流れか
844 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:50:03 ] >>841 >>832 は規格の話であって環境の話じゃないだろw
845 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:51:07 ] 処理系じゃなくて開発環境 なんて言っちゃう人にもう何を言っても
846 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:51:11 ] ANSI、ISO準拠を言わないのであれば、処理系ではなく 開発環境によっては、プログラムの開始でさえ必ずしも main関数ではなくても良い環境もあれば、結局自作関数で void hoge(void)といった形式で通用するところから、 hogeをmainに置き換えた屁理屈だって通ってしまう。
847 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:51:44 ] VC++ はエントリポイントを変更できるよ。
848 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:52:45 ] >>846 Japanese please.
849 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:53:40 ] WinMain の出番ですね
850 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:56:30 ] 常識ってなんだろう そんなことを考える初夏の夜長
851 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 03:05:30 ] 間違いと否定するから悪い。そして知ったかぶるから余計に 他人を理解させられない。本当の意味で間違いじゃないから。 void mainなんて、かつては普通に使われていたが、今じゃ 標準スタイルに合わせることで、ソースコードをより幅広い 環境で通用するようにと、幅広い環境で通用するスタイルでは int mainが望ましい。 まぁ、路上で言えば、黄線は越えて対向車線に出てはいけないとだけ覚えて 追い越しではないのに、他の車が黄線を越えて停止中の車、あるいは 障害物を避けたのを見て違反だと騒ぐようなもんだな。そういうのみっともねーってw
852 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 03:09:56 ] もう寝ろよ
853 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 03:11:12 ] >852 オマエモナー オレモナー
854 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 05:32:05 ] intは6byteを返すから void main(void)で書き始めるのは間違い。 voidはmainだけにつく引数。 正しくはint main()
855 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 06:20:13 ] >>854 ??
856 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 07:11:42 ] チキガイホイホイだからこの話題は止めようぜ
857 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 07:13:04 ] 2byteや4byteはよくあるけど、int6byteは初耳だ
858 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 07:14:10 ] int 6byte はあり得ないね。
859 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 08:08:13 ] 2^n以外のバイト数はありえないでしょ
860 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 08:10:46 ] 上位2バイトは、固定値で埋められているんだよ!
861 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 08:13:00 ] UTF-8かよ