1 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 16:45:25 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 9 pc11.2ch.net/test/read.cgi/tech/1173284217/ 過去スレ Part 1 pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 pc11.2ch.net/test/read.cgi/tech/1171946674/ 関連スレ C/C++の宿題を片付けます 84代目 pc11.2ch.net/test/read.cgi/tech/1172981618/ くだすれC言語(初心者用) Part.2 pc11.2ch.net/test/read.cgi/tech/1172099763/ 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 pc11.2ch.net/test/read.cgi/tech/1170338926/ 【初心者歓迎】C/C++室 Ver.35【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1171888583/ 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html
2 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 16:51:46 ] manよりMSDNの方がいいぜ!!ワンワン
3 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 16:52:17 ] それはジョークで言ってるんだよな?
4 名前:C言語 [2007/03/19(月) 16:56:18 ] 見てみて! 僕が作ったプログラムアップロードした★ ttp://www.geocities.jp/loginconfing_68793045/short.zip パスワードは[cgengo] ダウンドーロしてちょ?
5 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 16:56:35 ] ↑ ウイルス
6 名前:C言語 [2007/03/19(月) 16:57:26 ] 今まで黙っててごめん。 今日の午前中中学校の卒業式だったんだ…。 だから暇で暇でしょうがなくてつくちゃた。 ttp://www.geocities.jp/loginconfing_68793045/short.zip パスワードは[cgengo]
7 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 16:58:02 ] ↑ ウイルス
8 名前:C言語 [2007/03/19(月) 16:59:38 ] >>5 ごめんね。 今度君の狂った脳みそのためのアンチウイルスソフト作ってあげるから許して。
9 名前:デフォルトの名無しさん [2007/03/19(月) 17:40:32 ] c言語を始めたいと思っていますが 無料でc言語をコンパイルして実際に ゲームとかできる環境になるのでしょうか? できるのならソフトとかのURLはってください 今は無料で手に入れたソフトを使っていますが 使い勝手が悪いのでいいやつをおしえてください。
10 名前:9 [2007/03/19(月) 17:45:34 ] 自己解決しました スルーしてください。
11 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 17:47:04 ] >>9 お前には無理だ あきらめて学業に専念するか働きに出なさい
12 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 19:56:15 ] Cでゲームを簡単に作れると思ってるなら辞めとけ。 多分、>>9 が考えてるようなゲームを1人で作るには10年かかる。 せめてVC++,C#とかなら・・・スレ違いだけど。
13 名前:デフォルトの名無しさん [2007/03/19(月) 20:20:35 ] C言語を触りだけしかやったことのない初心者ですが これから本格的にC言語を学びたいと思っています 使用用途はロボット等を制御する事です 何かお勧めの入門書はありますか?
14 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 20:54:25 ] シミュレーションで学ぶ自動制御技術入門
15 名前:13 mailto:sage [2007/03/19(月) 21:06:02 ] >>14 ありがとうございます 明日本屋で探してみます
16 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 21:22:47 ] test
17 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 21:29:48 ] どっちかっていうとC言語そのものより 開発環境の作り方とか制御の仕方とかの方がしんどいと思うよ
18 名前:13 mailto:sage [2007/03/19(月) 23:34:55 ] あのー僕が13なのですが・・・ でも15と言いたい事は同じですw なんか影の自分が暗躍してるのかと思ったw
19 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 23:37:11 ] なんか前スレから乗り替わる奴いるから、大事な質問ならトリップつけた方がいいかもね
20 名前: ◆auEy42rRqA mailto:sage [2007/03/19(月) 23:47:03 ] てす #うんこちんちん
21 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:06:14 ] #include <stdio.h> int main () { char c; scanf("%c", &c); if (c == 'a'); { printf("入力値はaです。"); }/*警::コードは関数をもたない*/ else if (c == 'b') { printf("入力値はbです。"); }/*エラー:elseの位置が間違ってる*/ else if (c == 'c') { printf("入力値はcです。"); } else { printf("入力値はa,b,c以外です。") n; }/*エラー:ステートメントにセミコロン(;)がない*/ return 0; } と出るのですが、どうしてなのでしょうか? if else構文の最後のelse文の「どれにもあてはまらなかった場合に行う処理」の正しい書き方がよくわからないです。
22 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:08:41 ] >if (c == 'a'); { printf("入力値はaです。"); }/*警::コードは関数をもたない*/ セミコロンが余計。
23 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:09:14 ] >>21 >if (c == 'a'); { セミコロンがあるので、そこに空文があると見なされている。
24 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:09:15 ] 他にもTypoがあるな。
25 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:09:42 ] /*標準入力とswitch構文sample19.c*/ #include <stdio.h> int main () { char c; scanf("%c", &c); switch (c) { case 'a': printf("入力値はaです。"); break; case 'b': printf("入力値はbです。"); break; case 'c': printf("入力値はcです。"); break; default: printf("入力値はa,b,c以外です。"); break; } return 0; } 21は22をif else構文の形に書き換えてみようと思ってやったものです。 どなたか詳しい方ご教授ください。 コメント部分の箇所にエラーや警告文を書きました。
26 名前:デフォルトの名無しさん [2007/03/20(火) 13:10:20 ] printf("入力値はa,b,c以外です。") n; nがこんなところに!?
27 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:10:21 ] 素早いレスどうもです。 ちょっとやってきます。
28 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:10:52 ] 22として書く前にソッコーでレスが付いたなw
29 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:26:31 ] 21ですがおかげさまでできました。 参考書の例文に「else{ 処理n;}」と書かれてたので↑でやってたのですが、 どうやらnはn番目という表記だったようですね。勘違いしてたみたいです。 ありがとうございました。 また聞きに来るとは思うのですが、その時はよろしくおねがいします。
30 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:40:44 ] 1行にいろいろ詰め込むと、どのエラーかわかりにくくなるぞ。
31 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 17:15:05 ] for(;;;) printf("\a"); と、ビープ音鳴らしまくったら、 ハードの方とかおかしくなったりします?
32 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 17:17:49 ] 音波振動によるダメージがあるかも
33 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 17:28:01 ] ねーよ。
34 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 17:29:11 ] >>31 デバッガで実行するなら兎も角、環境によってはかなり止めにくくなるからやめた方がいいよ。
35 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 20:05:15 ] >>31 ビープ音を聞き続ける人間というハードがおかしくなるかもしれない。
36 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 20:24:25 ] VisualStudio2005にしたけどVS2002の時のソース、コンパイル普通に通るんだね。。 (全て_s付きの物に変えないといけないかと思った。 けど唯一、経過時間のところでtime_tがどうとか言われて通らない・・
37 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 20:44:34 ] >>36 で、何が聞きたい? 解決策が知りたいならエラーメッセージをコピペしてちょ
38 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 20:55:31 ] VC++ 2005のtime_tは通常64ビットになったが、 _USE_32BIT_TIME_Tを定義しておくと今までどおり32ビットになる。 試しにプロジェクトオプションでそれを追加してみたらどう? でもこうすると当然2038年問題の影響を受けることになるから、 それで動くようになったとしても早めに直せよ。
39 名前:36 mailto:sage [2007/03/20(火) 21:06:26 ] >>37 すまそ、>>38 の言うとおりにしたらコンパイルできたよ。。 ただの実行日時(JST)と経過秒数が出るだけの、 2038年まで使う予定もないテストプログラムだから別に今はいいや・・orz
40 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:19:32 ] /*sample49.c*/ #include <stdio.h> int main (void) { printf("%s %d %d\n", str, &str, &(*str)); str = "日本語"; printf("%s %d %d\n", str, &str, &(*str)); return 0; } strが未定義のシンボルと判断されてしまうのですが、どこがいけないのでしょうか? ポインタ変数を使ってアドレスをを表示させるというのをやっています。
41 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:22:38 ] char* str; がなくね?
42 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:22:47 ] /*sample49.c*/ #include <stdio.h> int main (void) { char *str = "abc"; printf("%s %d %d\n", str, &str, &(*str)); str = "日本語"; printf("%s %d %d\n", str, &str, &(*str)); return 0; }
43 名前:デフォルトの名無しさん [2007/03/21(水) 21:24:03 ] >>40 strを宣言してください char *str;
44 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:28:37 ] 3人も同時にレスありがとうございます。 「char* str」を書いたら大丈夫でした。 参考書通りにやったのに駄目だったのでほんと助かりました。
45 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:31:47 ] さあ、その参考書名・著者をさらすんだ。
46 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:32:54 ] 普通に1文わすれてただけっぽ〜い
47 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:34:32 ] 実は図書館で借りた本で、既に次版で修正されてるとか正誤表に載ってるとか そうじゃなかったら その参考書名・著者をさらすんだ。
48 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 21:36:55 ] 「次のプログラムの空欄に適切なコードを入れなさい」って穴埋め問題の宿題なんじゃないか? (と、かんぐってみる)
49 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 22:00:48 ] なんかレスいっぱいついちゃってますね。 著者が坂下夕里さんの「これならわかるC 入門の入門」ってやつの194Pです。 2006年7月5日の初版第3版だそうです。 値段は1,600+税。
50 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 22:14:39 ] ttp://www.seshop.com/book/qa/Default.asp?mode=list&pid=6007 ミスみたいだな 著者が答えてる部分が>>42 そのままなんだけど
51 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 22:17:17 ] 入門書なんて書くと BCCがインスコできませんとか パスが通せませんとか VC++で実行したらいきなり画面が閉じましたとか 見るだけで嫌になるFAQがいっぱい来るんだろうな・・・
52 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 23:14:00 ] C99以前の規格で質問です 変数の宣言はブロックの最初でなければならないとのことですが、 void hoge(void) { int i; //なんだかの処理 for(i = 0; i < 10; i++) { int value;//←ここで変数宣言 //なんだかの処理 } } 上記のvalueの変数宣言はOKでしょうか? 関数の最初に変数が宣言できることは覚えているのですが、ブロックの中でもfor文などの中の先頭で宣言できるのか忘れて島しました 手元にあるコンパイラだと、独自拡張されているのか、処理中の変数宣言もOKになってしまいます。 よろしくお願いいたします。
53 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 23:16:01 ] ブロック先頭での変数宣言はOKです
54 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 23:24:28 ] for文の{}もブロックっていうんじゃないのか?
55 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 23:26:01 ] 途中に { } 入れて宣言してたこともあったなあ
56 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 23:30:46 ] まだ初心者だった頃caseの後でなぜ宣言できないのが不思議だった。
57 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 23:59:41 ] 特定のcaseだけでしか使わないローカル変数を定義したくて case xxx: { } なんてすることもあるかもしれない。 とりあえず52はブロックという言葉の意味を正しく知るべき。
58 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 07:53:00 ] レガシーCでは通るがC++では通らない(かも知れない)コード。 switch (0) { int i; case 0: printf("foo\n"); case 1: for (i = 0; i < 10; ++i) { printf("%d\n", i); } }
59 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 16:56:55 ] /************************************************************************/ /* ぬるぽ */ /************************************************************************/ ↑こういうコメントをVisualStudio2003を使って楽に入力する方法ってありませんか? /*********************************************************************/ って部分はIMEに登録(60文字超えるんで前半部分と後半部分に分けて)したりしてるんですが、 二行目の/*の自動挿入とか文字列の中央ぞろえとか終端の*/の入力の仕方がわかりません
60 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:05:14 ] 文字列の中央揃えや終端の*/の位置調節などといった 無駄なことはやめた方がいい
61 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:10:23 ] 確かに 考えるだけ時間の無駄
62 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:20:56 ] エディタをvimを使うようにしてmapで登録すればいいIDEのエディタは総じてくそ
63 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:22:12 ] Sakura等のマクロ使えば一発なのに・・・
64 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:25:16 ] IDEのエディタは総じてくそ
65 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:32:22 ] vimのcindentのオプション使ってると、勝手にコメントの * を揃えてくれるから /***************************** . * コメント . *****************************/ . ↑ここを揃えてくれる こんな書き方してるけど、これって一般的な書き方なのかな? コメントの書き方で定番みたいなものはあるんかな…
66 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:32:45 ] >>59 GreatCode でディレクトリ内のソースコードを一括変換すると楽 表記の揺らぎもなくなるし
67 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 18:04:04 ] >>65 次のようなコメントを見かける。 #等幅に見せるために2バイト文字に変換済み。 /*******/ /*□ぷげら□*/ /*□もげら□*/ /*******/ /******* □*□ぷげら□* □*□もげら□* □*******/ /*******\ *□□ぷげら□□* *□□もげら□□* \*******/ /******* □*□ぷげら □*□もげら □*******/ /******* □*□ぷげら □*□もげら □******* □*/ /* □******* □*□ぷげら □*□もげら □******* □*/
68 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 18:33:45 ] 先ほどCを始めたのですが,いきなり行き詰ってしまいました. 逆斜線ってどうやるのでしょうか? \で代用すればいいのでしょうか? お願いします
69 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 18:36:03 ] いいです。半角でな
70 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 18:37:52 ] >>69 ありがとうございます!!
71 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 18:57:17 ] >>65 定番のコメント記法をただ探すんじゃなくて、 定番のドキュメント生成ツールを探して それが要求するコメント記述方式に従うのがいいと思う。 勝手に*を揃えてくれるのだって、 ドキュメント生成ツールを意識した動作だろうし。
72 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 20:20:22 ] >>65 そういうコメントは、ファイルの先頭で使うくらいだな。 いっぱい使ってると、かなり素人くさい。
73 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 21:38:30 ] 玄人好みのコメントplz
74 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 21:40:54 ] /* You are not expected to understand this */
75 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 21:44:06 ] コメントに罫線やら装飾の多いヤツは素人。
76 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 21:45:05 ] >>74 訳するとこんな感じ? /* あなたがこれを理解できるなんて期待してないです */ /* これ見ても分からないっしょ? */ /* 分かるかな〜? 分かんね〜だろ〜な〜 */
77 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 21:56:24 ] VC++ って VBA マクロ使えなかったっけ?
78 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 22:04:57 ] */の位置を気にして半角スペースを駆使するような奴は負け 端的に言えば>>59 なわけだが
79 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 22:08:29 ] 40カラム〜80カラムは問答無用でコメント、という規約のプロジェクトがあった。
80 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 23:25:36 ] カラムなんて言葉を聞くと FORTRAN を思い出して嫌になる
81 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 23:58:35 ] >>79 某大手が未だにそんな規約を持っている。 極悪なのは、関数内の最初のインデントと二段目のインデントの量が違うと言う……
82 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 00:16:15 ] つ c-set-offset
83 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 01:23:11 ] /******************************* * 俺はよくこれを目にするんだが * たぶんずれるからポップうp * >>83 */
84 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 01:27:09 ] >>83 を使え。
85 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 13:01:51 ] 俺も>83形式だなー 但し一行目の * の数は5個固定で、その右にコメントの頭を入れるんだが。
86 名前:65 mailto:sage [2007/03/23(金) 20:15:44 ] コメントにも色々あるんもんですね >定番のドキュメント生成ツール これってDoxygenみたいなやつですか?
87 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 20:32:55 ] doxygenは /** で始まり */ で終わるコメントにも対応しているな。 俺は大抵/*! 〜 */を使うが。
88 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 20:41:15 ] javadoc形式に対応してるんだっけか
89 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 00:38:26 ] どうして構造体はmain外のグローバルなところに書くのが多いのでしょうか
90 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 00:39:14 ] main の外で使うから
91 名前:・∀・)っ-○◎● mailto:sage [2007/03/24(土) 00:40:34 ] 関数内で定義したら関数内でしか使えないから
92 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 01:35:21 ] doxygenは///や//!にも対応しているからC99なら///で書ける。
93 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 12:08:14 ] xmlコメントにも対応してるんでしょうか?>doxygen
94 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 13:17:26 ] //コメントを/*コメントに変換するツールないかなぁ。 // printf("///"); // return 0; /* ぬるぽ */ こんな行のこと考えると結構面倒だ。
95 名前:・∀・)っ-○◎● mailto:sage [2007/03/24(土) 13:30:53 ] つPerl
96 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 13:35:01 ] >>95 Perlで書いても面倒だと思うんだけど。 そもそも今時規格に乗っ取ってないという理由で//コメントを禁止する某芝の某氏が阿呆だと思うのだが。 つーか、人には禁止しておいて自分では使ってるしおまけにprintf()で"%lf"なんか使うし……
97 名前:・∀・)っ-○◎● mailto:sage [2007/03/24(土) 13:37:51 ] そこでJIS-X 3010:2003ですよ
98 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 13:39:17 ] エディッタなりIDEなりの機能使ってマクロ組めばいいよ エンター押した瞬間にその行の文字列評価して置き換えるようにすりゃ手軽
99 名前:・∀・)っ-○◎● mailto:sage [2007/03/24(土) 13:41:26 ] 他人の書いたコードの整形を自分好みに直すためだけにxyzzy使ってる
100 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 13:48:54 ] 取り敢えず、//→/*と$→*/を変換して>94に挙げたような怪しげな行をリポートするスクリプトをawkで作った。 リポート行を(コンパイラのエラーと同じように)xyzzyで取り込んでタグジャンプすれば後は手作業で何とか、かな。 >>97 kwsk >>98 30ファイル30000行もあるとやってられない。 >>99 私も普段使っているのがWin2kなのでWinSCPのエディタをxyzzycliにしてLinuxのファイルも整形して読んでる。 #編集はvimですることが多いけど。
101 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 13:52:50 ] //コメント禁止って酷いよね・・・
102 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 14:01:15 ] /* */ 使われてるから、全体的に広くコメントアウトしたい場合、#if 0 〜 #endif を使うが そんな環境に限って VC6.0 だったりするから色が変わってくれない
103 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 14:11:53 ] そういうスクリプトや小物ツールを自前でサッと組めるようになりたい・・・
104 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 15:04:29 ] >>103 生の//を変換するだけで、/* // */ とか "//" を考慮しなくていいならawkでこれだけ。 一応、/* *//* */は大丈夫。 awk '/[^*]\/\// || /^\/\// {sub("// *", "/* "); sub(" *$", " */");} {print;}' 実際には他にも、3個以上の/の連続ををどうするとか、//で終わる行をどうするとか、 行頭//が複数行続いたらどうするとか、考え始めると切りがない罠。
105 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 15:26:10 ] /**********************************/ はまだいいとして、 右側をそろえて */ するのって意味あるんかいな? 本当に重要な内容を書きにくくするだけなんだが。 100歩譲っても /********************************** * ほげほげ **********************************/ あるいは /////////////////////////////////// // ほげほげ /////////////////////////////////// って社内で言ったら「右をそろえたほうが見やすい」といわれた。
106 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 15:29:47 ] 社内にはプロポーショナルフォントで組んでる変態とかいるから、 行頭のインデント以外は桁をそろえるようなことはしないなあ。
107 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 15:41:32 ] 右端を揃える奴はキモイ どれぐらいキモイかっていうと GNUのコーディング規約の中括弧の1000分の1くらい
108 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 15:47:44 ] 入門編にいる僕にはわかりません><
109 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 16:04:10 ] 最近のエディタならコメント部分の色が変わるのが普通なんだからわざわざ /********************************** * ほげほげ **********************************/ とかやってコメントを目立たせる必要はないんじゃまいか。 /* * ほげほげ */ で充分ですよ。解ってくださいよ。
110 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 16:06:19 ] >>105 漏れのところでは、「右側を揃えたいなら揃えてもいいから、間違ったコメントを書くな」という方針にした。 で、実際に不適切なコメントをリリース版に残した香具師には右側揃え禁止措置を取った。 ……そして誰も右側を揃えなく(揃えられなく)なった。
111 名前:・∀・)っ-○◎● mailto:sage [2007/03/24(土) 16:17:29 ] >>100 ISO C 1999のJIS版 //コメントは仕様に入ってるし%lfも全力でおk
112 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:36:53 ] >>109 色がついてなくても、下ので十分だよ。 行頭になんか印がついてれば、すぐわかるだろ。
113 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:38:19 ] /* これでもいいかゐ? */
114 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:40:30 ] それで十分
115 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:42:56 ] >>113 それはだめ。
116 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:45:32 ] なんで?(^ω^;)
117 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:49:15 ] /* * じゃあこれからコメントの標準はこれで。 */
118 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 03:33:32 ] >>116 grep で引っかかったときにコメントかどうかが判らないから。 とはいえ、1行でも全部みれば判るけどね。
119 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 04:25:36 ] おまえら楽しそうだなw おれも楽しいけどw
120 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 05:17:34 ] #ifdef _DEBUG #define DEBUG_ONLY #else #define Paste(a, b) a##b #define DEBUG_ONLY(fn) Paste(/, *) fn Paste(*, /) #endif こんなマクロを作ったんだが、これって邪道?
121 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 05:26:30 ] >>120 自己レスだがどう考えてもこっちの方がいいです。 本当にありがとうございました。 #ifdef _DEBUG #define DEBUG_ONLY #else #define DEBUG_ONLY(fn) #endif
122 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 07:55:21 ] 漏れはこんなの作ってみた。 #ifdef DEBUG #define IF_DEBUG 1 && /**< 常に有効 */ #else #define IF_DEBUG 0 && /**< 常に無効(このマクロの右辺は生成されない) */ #endif 警告は出ちゃうけどね。
123 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 12:59:08 ] 俺はいつもこれ使ってる。 release 時は最適化で消えるはず。 #ifdef NDEBUG #define DEBUG if(1); else #else #define DEBUG if(0); else #endif
124 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 13:00:58 ] 俺は C で書く時は // は使わんな。 -ansi -pedantic -Wall で警告すら出ないように ガチガチに書くようにしてるから、 // 使うとエラーになる。
125 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 13:12:05 ] そこで-std=c99ですよ
126 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 13:48:50 ] わざわざCで書く理由ってのは移植性やpoorな環境の問題、レガシーコードの 保守などがメインだと思うんだが…… C99なんて使う機会あるか? C99使えるぐらいならC++が使えないか?
127 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 13:57:34 ] int (*f(int argc, char* argv[]))(int argc, char* argv[]), (main); ↑ こういう変態な書き方ってどうやったら読めるんすか? っていうか何やってるんすかこれ?
128 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 16:49:49 ] >>127 mainの再宣言のようだけど
129 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:23:21 ] Filename_ni_comment_wo_kakeba_iijyo.c
130 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:48:45 ] /* 読み込んだ実数値と0.1との和・差・積・商を表示 */ #include<stdio.h> int main(void) { double num; printf("実数を入力してください:"); scanf("%1f",&num); printf("0.1を加えると%fです。\n",num+0.1); printf("0.1を減じると%fです。\n",num-0.1); printf("0.1を乗じると%fです。\n",num*0.1); printf("0.1を除すと%fです。\n",num/0.1); return(0); } なぜかどんな実数を入力しても0を入力された扱いになってしまいます。 どこが悪いのでしょうか?
131 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:49:58 ] >>130 www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html %lf
132 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:50:07 ] %1f %lf
133 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:50:17 ] %1f
134 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:52:01 ] >>131-133 ありがとうございます!!! ってか0とOを間違えるくらい恥ずかしい…orz
135 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 23:28:41 ] なんだ、floatで精度指定してんのかと思ったらdoubleだったんだ。
136 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 13:22:37 ] C言語ゲームを作成中です。他スレから移動です。 6つのファイル公開中しています(読みやすくしたつもりです。>_<;) ここならCの意見を・・・記述スタイル、変数名など・・・ 一通り完成しましたが、大幅に改修している初期の段階の内容です。 現段階は自機が動いて弾を撃つまでです。その他の内容はReadme.txtより コンソールシューティングゲーム gamdev.org/up/img/9215.lzh
137 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 13:28:35 ] >6つのファイル公開中しています(読みやすくしたつもりです。>_<;) 先ず、日本語の勉強をすべきかと。
138 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 14:19:18 ] C++ じゃん・・・と思ったら、中身はほとんど C だな。 グローバル変数使い過ぎというのが先ず目につく。クラス化汁。 Console みたいに内部変数にすると不便だというなら、 Singleton パターンを使えば、そのクラスのインスタンスを1つに保証できる。 関数でデータ処理させる際のオーバーヘッドが気になるなら inline 関数にすればいい。 (って、C のスレの回答じゃないな、これじゃ) 名前のローマ字はまあいいとして、player のメンバ名が気になる。 px, py, pspd の p は player の、 ptx, pty, ptflg の pt は player の tama の略だと思うけど、 プレイヤーの情報と弾の情報が同じレベルで混在してるのはどうなのかと思う。 struct tama { float x, y; char fHassha; }; struct player { float x, y, spd; struct tama tama; }; という風に切り分けた方がいいんじゃないかな。 x, y も、座標構造体やらクラスやらにした方がいいと思う。 GetRandom は、もうちょい double でキャストしないと、オーバーフローが怖い。 (eny + ei)->ex は eny[ei].ex じゃダメなのか? まあ、このあたりは趣味も関わってくる話かもしれんが。 SYori は Syori だよね? 0, 1 のフラグは、char じゃなくて bool にしようぜ(って、これも C じゃないな)。 InitFunc の中身は全部機能別に関数化した方が読みやすいかもと思った。 まあ、関数化してない部分は短いから、別にいいかもしれんが。
139 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 14:31:39 ] ゲームの場合、綺麗に書く必要はそれほど無いので、 とにかくゲームとして仕上げることが大事。 一本完成すると自信になる
140 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 15:24:54 ] >>136 ヘッダファイルの読み込み順を意識しないといけないのは嫌いだ
141 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 15:56:31 ] レス有り難うございます^^ >>137 すまそ >_<; >>138 C言語は一定のレベルになると、まったくわかっていない!調べます。 構造体、double、(eny + ei)->ex は eny[ei].ex とか・・・あと変数名も検討する 自機と自機弾は分けようかとしたが・・・現在は暫定ような感じです。t は弾の略です^^ PlayerSYoriですよね!直しました。気づかんかった… 機能別関数化は大きくなった時など考えていきます。 クラス、インスタンス、Singleton パターンinline 関数この辺は Cの後に挑戦したいと思っています! >>139 確かに…結構挫折が多かったのでよくわかりますorz 一つ完成させるのが大事! 一応一通り形はできたのですが・・・(そのほうが質問しやすいと思ったから) しかし、理解せずに進んだため信じられんほど、時間が かかり過ぎた >_<;毎日泣きそだった。ぐぐりまくってもわからんし… >>140 見直してみます>< まずは、グローバル、構造体、ヘッダーをみてみます。
142 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 17:06:35 ] >>136 向こうのスレを見ている者だが、最初に比べると随分上達したな。 個人的にはローマ字命名はちょっと…だが。
143 名前:デフォルトの名無しさん mailto:sage [2007/03/27(火) 17:44:57 ] >>141 どのスレから来たんだい?
144 名前:デフォルトの名無しさん [2007/03/28(水) 18:50:32 ] ある人が書いたソース見ていたら、ヘッダファイルに以下のような部分を 見つけました。 #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifdef _MSC_VER #include "resource.h" #endif 私の疑問は、 "resource.h" というファイルを探したのですが、 見当たらなかったのですが、エラーなくコンパイルできます。 その理由がわかりません。教えて下さい。
145 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 18:58:55 ] 必要とされてないからでしょう
146 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 19:50:41 ] >>144 #ifdef _MSC_VER #include "resource.h" #endif もし _MSC_VER が定義されていたら resource.h をインクルードする _MSC_VER が定義されていないならインクルードしない 君の環境では_MSC_VER が定義されていないので resource.h がなくても問題ない
147 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 20:08:08 ] K&RのP270に 「宣言中の最初の添え字は配列が消費するメモリ量を決めるのには役立つが、 添え字の計算には関係しないということである。」 という文があるのですが int array[2][4][6]; と宣言した場合の2,4,6はそれぞれ配列の要素数を決めているだけで *(array[2][4]+6)のシンタックスシュガーな訳ではないってことですか?
148 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 20:14:08 ] 「最初の添え字」つまり、その例では2のこと。4,6は関係する。
149 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 20:35:08 ] arrayの各要素のメモリ内での位置を計算するのに2は必要ないというだけの意味。
150 名前:147 mailto:sage [2007/03/28(水) 20:36:24 ] >>148 添え字の計算には関係しない、の意味がよくわからないんですが array[1][2][3]は*(array[1][2]+3)に読み替えられて、array[1][2]は配列だから (array[0]+1)[2]になるんですよね?
151 名前:147 mailto:sage [2007/03/28(水) 20:39:32 ] すいません更新してませんでした >>149 どういう風に必要ないのかいまいちよく分からないです…
152 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 20:41:33 ] たとえばarray[1][3][5]のアドレスはarrayの先頭要素から、 (1)*4*6+(3)*6+(5)要素サイズ分だけ離れていると計算できるから、 最初の添え字のサイズである2は計算に必要とされない。 array全体のサイズを決めるためには2も必要。
153 名前:152 mailto:sage [2007/03/28(水) 20:49:36 ] 152の説明だと正確ではないか。 array全体が一塊で割り当てられているときは152の計算でいける。 まあ、そうでなくて、 array = (int***)malloc(2*sizeof(int**)) array[.] = (int**)malloc(4*sizeof(int*)) array[.][.] = (int*)malloc(6*sizeof(int)) みたいになっていたとしても、やはり最初の添え字サイズは必要ない。
154 名前:147 mailto:sage [2007/03/28(水) 20:50:43 ] >>152 あ、最初の添え字の数-1までしか必要とされないって意味ですか
155 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 20:54:15 ] >>153 たいていのコンパイラはint array[2][4][6];って宣言してたらまとまった領域を割り当てると思うがな
156 名前:デフォルトの名無しさん [2007/03/28(水) 20:57:33 ] 147 の質問に対して153のメモリ確保の説明は、関係ないんじゃあないのか? 147は int array[2][4][6]; と宣言した場合の質問をしているんだよな。
157 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 20:59:30 ] >>154 「添え字の計算」というのは例えばarray[0][1][2]みたいにindexが与えられた時に それはメモリ上のどこにあるのかを計算するって意味だ その計算には配列の最初の次元の大きさは必要ないよってK&Rは言っている
158 名前:152 mailto:sage [2007/03/28(水) 21:02:03 ] >>155-156 うん、そうだね。いらないことを気にしすぎて余計なことを書いた。
159 名前:147 mailto:sage [2007/03/28(水) 21:06:46 ] >>157 あ、array[1][3][5]の添え字計算だと(1)*4*6+(3)*6+(5)みたいに 当然(式の中の)最初の添え字の1も含めて1,3,5は当然使うし 元の宣言にある4と6も使うけれど、同じく元の宣言の中にある2は使わないってことですね ようやく分かりました、皆さんどうもありがとうございます
160 名前:デフォルトの名無しさん mailto:sage [2007/03/28(水) 21:10:18 ] 要するにint a[5];でa[x]とアクセスするのに、 5という情報は要らない(要るのはintという型情報)、ってだけ。
161 名前:デフォルトの名無しさん [2007/03/30(金) 01:20:50 ] ↓のようなことって技術的に可能ですか? 何分↓スレに専門知識を持った人間がおらず、真偽が分からなかったので ここで質問させていただきました 558 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:06:29 ID:ENSP49sq そうだ 一応書いておくわ CとかJavaとか言語でわけてる現状がそもそもおかしいから ソースコード翻訳機作ってやってるよ おまえも参加しろwww 役に立たない下っ端を使えるようにする秘策だぞwwww 561 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:12:11 ID:ENSP49sq 意味分からないのか?? コンパイラじゃなく ソースコードをそれぞれに変換するってことだぞ 意味分からないかな?? 564 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:14:33 ID:ENSP49sq たとえば Cで書いたコード100万行を 自動変換で Javaコードに変換するって奴だwwwwww 分かるかな??? ttp://human6.2ch.net/test/read.cgi/dame/1174933496/l50
162 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 01:26:14 ] >>161 多少手作業部分やなんらかの制限等は生まれるだろうが、 いったいどこに本質的に不可能だとされる可能性があるんだ?
163 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 01:26:47 ] しまった。マルチにマジレスしちまった。orz
164 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 01:31:45 ] 実例の1つとしてあげておくけど、初期のC++コンパイラは、 まずCへ翻訳してからコンパイルしていた。
165 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 01:47:21 ] 言語的には難しくない、100万行のlibcのみ依存のソフトなら自動変換できる。 でも、たとえば、Win32とか、BarkleySocketに依存していたら、 ライブラリの流儀をJavaに直すのは難しすぎる。 ましてやハードを叩いてたりすると。
166 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 01:49:53 ] >>164-165 お前らなにマルチにマジレスしてんだ?
167 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 17:38:14 ] ちゃんと動いたプログラムのソースに、大きな配列を追加してBCCでコンパイルしたら、 全く関係ない所でアプリケーションエラーで終了するようになったのですが、 メモリ不足でしょうか。mallocとか面倒だけどしないとだめでしょうか。 ><わかんないんです。おしえてください。
168 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 17:41:38 ] >>167 エラー貼ってみて
169 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 17:44:12 ] >>167 ソースplz
170 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:07:21 ] >>167 アプリケーション エラー エラーが発生したため、(ファイル名).exeを終了します。プログラムをもう一度開始する必要があります。 エラーログを作成しています。 >>169 3000行超えちゃうので無理です>< とりあえずグローバル変数宣言だけで50行で、 int型の要素が100個ぐらいの配列と、 char型で256文字入る配列を4個ほど宣言してあります。
171 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:09:22 ] どこかにアップロード汁
172 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:09:57 ] グローバル変数多過ぎだろ。
173 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:15:31 ] >>172 グローバル変数にしないと各関数の引数に変数や配列のポインタを 10個ぐらい渡さないといけなくなっちゃうんで… 大小まとめて数えて関数を30個ほど作ってあるので大変です…。
174 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:17:28 ] >>170 10分の1くらいにおさえたら、どうか?
175 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:17:42 ] >>173 釣りうぜえ さっさとソース&エラーうpしろやクズが
176 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:19:13 ] 構造体作ってポインタ渡せばいいじゃん。馬鹿?
177 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:20:56 ] あっ、すいません、変数名がかぶってたのが原因みたいです>< お騒がせいたしました
178 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:25:53 ] 同じ名前で大きさが違う配列に無理やり値を詰め込んだのが原因でした>< 皆さん、本当にありがとうございました
179 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:32:16 ] >>175 キレすぎだろw
180 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:43:32 ] >>178 結果的に「釣りだった」という見解が・・・
181 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 18:45:46 ] 作り方が下手糞だと、ちょっとした間違いにも 気づきにくいという典型例だな。
182 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:06:36 ] ><ほんとうにすいませんでした
183 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:13:30 ] 特定の関数を特定の関数からしか呼び出せないようにすることって可能ですか?
184 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:21:42 ] >>176 次からはよくつかう変数を 構造体に詰め込むことにします>< 苦手意識のせいで気付かなかったです アドバイスありがとうございました
185 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:28:48 ] >>182 もしマジレスだったなら、謝る必要はないよ
186 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:29:58 ] >>184 続けることが大事だから頑張って!^_^;マジレスならね・・・
187 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:33:40 ] ところで>>170 のいうように3000行を越えてるのに、 >>173 でいうように関数が30個って少なすぎね? もうすこし論理的意味単位で分割した方がいいと思うよ。
188 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:38:02 ] >>183 呼ぶ側と呼ばれる側の関数だけからなるファイルを作って、 呼ばれる方はstaticにする。
189 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:38:30 ] もう一つ質問しても良いでしょうか? lccで行数の多い関数が入ったファイルをコンパイルすると out of memory とエラーが出るのですが 関数を短くしないといけないのでしょうか?><
190 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:41:50 ] つーか、データの依存関係が強すぎだろ。
191 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 19:43:11 ] >>189 LSICを使っているのなら、窓から投げ捨てろ。 あれは、関数を評価する為のコンパイラが使用するメモリ空間をたった32KBだか64KBだかに抑えている。
192 名前:183 mailto:sage [2007/03/30(金) 19:46:08 ] >>188 関数に付けるstaticってこういう時に使うんですね、ありがとうございました
193 名前:デフォルトの名無しさん [2007/03/30(金) 19:54:31 ] s03.2log.net/home/programmer/archives/blog38.html
194 名前:183 mailto:sage [2007/03/30(金) 20:02:13 ] ついでで申し訳ないんですが、関数は何も指定しないと自動的にextern指定されるということでいいんでしょうか?
195 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 20:03:36 ] そうでs
196 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 20:04:24 ] >>194 いえす。 関数はファイルの外部から見える(extern)か見えない(static)かの2通りで 省略時はextern扱いされる。 外部に見せる必要がない関数は積極的にstaticを付けておくのはよい習慣。
197 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 20:05:10 ] >>194 staticをつけない限り、そうなる。 従って、ソースファイル外から使いたい関数以外は無条件にstaticをつけた方がいい。 #最近のコンパイラはstaticな関数は積極的にインライン展開しようとすることだし。
198 名前:183 mailto:sage [2007/03/30(金) 20:08:08 ] >>195-197 ありがとうございます、これからは習慣付けるようにします
199 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 20:11:46 ] windowsから消しておきました><
200 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 21:16:58 ] 質問です if( a[7] != 0 ) { cnt = 16 ; while( (a[0] & 0x0f) == 0 && cnt != 0 ) { for( ct = 0 ; ct != 8 ; ct++ ) { ((struct ST4bit *)&a[0+ct]->4bit_0 = ((struct ST4bit *)&a[0+ct])->4bit_1 ; ((struct ST4bit *)&a[0+ct]->4bit_1 = ((struct ST4bit *)&a[1+ct])->4bit_0 ; } ((struct ST4bit *)&a[7])->4bit_1 = 0 ; cont-- ; } } struct ST4bitはunsigned型で{4bit_0 ; 4bit_1}がメンバ(各4bit) この時、このプログラムの意味することは、 a[0]〜a[7]で後ろ詰めに格納されているものを 前詰めにしている、というのでいいでしょうか? またこうすればもっと簡単にできるというのがありましたら、ご教授お願いします。
201 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 21:29:41 ] printfってプリントフって読むの?それともプリントエフって読むの?
202 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 21:42:20 ] プリントエフがデフォ
203 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 22:36:15 ] >200 forループの中でa[8]にアクセスしてるみたいだけど、いいの?
204 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 22:43:08 ] >202 THX
205 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 22:48:21 ] >>200 C言語じゃないよね?
206 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 22:48:25 ] 正式には プリント ウィズ フォーマット だっけ?
207 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 22:56:32 ] はあ?
208 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 22:57:10 ] >>200 鼻からなんか出る前に消してしまえ
209 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 22:58:29 ] 識別子の先頭に数字はないだろ・・・ 常識的に考えて・・・
210 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 23:18:47 ] 常識というか、それが通るコンパイラがあったら是非私に知らせて欲しい。 頼んだぞ。
211 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 23:38:47 ] 識別子をプレゼントつ「unko_program」
212 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 23:41:37 ] >>200 データサイズが膨大 or 組み込み用途 or 学習目的 のいずれでも無いならビットフィールド使うのをやめるのが吉 long long に対応しているコンパイラならシフト演算一回で終わる ※但し、データの並び順が変わるのに注意
213 名前:212 mailto:sage [2007/03/30(金) 23:47:05 ] データの並び順が変わる ↓ コンピュータのバイトオーダによってはデータの並び順が変わる
214 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 23:49:18 ] 標準入力のフラッシュは非標準らしいですが、 これをサポートしてない環境の例ってあります? たとえば組み込み用の一部ではサポートしてないとかそういうのでしょうか?
215 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 23:52:04 ] >>214 バッファリングしない環境では実装されてないってことは普通にあるかもね。
216 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 00:00:20 ] ファイルをリダイレクトされた標準入力をフラッシュされたらどうなるんだって話があるしな。
217 名前:212 mailto:sage [2007/03/31(土) 00:02:43 ] >>214 linux のターミナルだと使えなかったよ
218 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 13:00:19 ] >>214 fflush(stdin)のことを言ってるならWINXPでできなかった記憶がある
219 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 16:29:09 ] >>191 LSI-C の用途があなたの想定する用途と違うだけ
220 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 16:39:06 ] >>219 MS-DOS用コンパイラをWindowsで動かす積極的な理由は何かある? まさか、製品版のLSI-C80の話をしているわけじゃないよね?
221 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 16:56:08 ] >>220 そんな理由はあるかどうか分からない ただ DOS で動くプログラムがごく稀に必要になることはある 元になったレスは lcc って書いてあるから lsic86 とは関係ないっぽい
222 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 16:59:36 ] 制御系なら DOS の方が楽 リアルタイムOS として DOS を使う場合もある 再起動も早いし
223 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 18:50:53 ] int ascii_to_integer(char *ascii) { int i; int integer; for (i = 0; *(ascii+i) >= '0' && *(ascii+i) <= '9'; ++i) integer = 10 * integer + (*(ascii+i) - '0'); return integer; } これってasciiをポインタと配列のどっちで書いたほうがいい? それともどっちでもいい?
224 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 18:51:40 ] >>223 atoi 使うのがイイ
225 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 18:53:53 ] >>223 ついでに変数 integer の初期化が必要
226 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 19:00:45 ] >>223 そのasciiは、「『関数の仮引数』だから」 char *asciiと書いてもchar ascii[]と書いても、同じ。 char *asciiと書いたかのようにcharへのポインタ型として扱われる。 kmaebashi.com/programmer/pointer.html www.kouno.jp/home/c_faq/c6.html あと、'0'から'9'までの文字かどうかの判定にはisdigitが使える、というより使え。 そして勉強ならいいが、実用なら>>224 。
227 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 19:04:34 ] >>221 、>>222 で、元質が制御系だとかDOSプログラムを作ってるだとか言う根拠は? ちなみに、LSI-C86ならコンパイラの実行モジュール名がlccだな。 他にもlccはあるが、ちょっとした関数で音を上げることから察すればLSI-Cだろう。
228 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 19:20:05 ] >>227 根拠も何も無い DOS が好きなだけなんだ だから DOS で使えるコンパイラが貶められるのが嫌だった それだけ 好きなものは好きなんだ、理屈じゃないんだ! そういうもんだろ?
229 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 19:21:00 ] だったら、窓(Windows)だけ投げ捨てろ?w
230 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 19:43:33 ] ここといい宿題スレといい争いが絶えませんね
231 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 19:56:23 ] テキトーなことを言う奴が後を絶たないせい
232 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:11:57 ] /* 期待する出力は ababababab */ #include<stdio.h> /* こんな時 func_t はどんな型で typedef すればいいのしょうか? */ typedef void *(*func_t)(void); func_t a(void); func_t b(void); func_t a(void){putchar('a');return b;} func_t b(void){putchar('b');return a;} int main(void){ func_t func=a; int i; for(i=0;i<10;i++) func=func(); return 0; }
233 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:20:15 ] どう見ても入門者の質問じゃありません。適切なスレへどうぞ。
234 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:24:41 ] 期待する出力はあばばばばぶ >>232 typedef func_tA; typedef func_tA (*func_t)(void); func_tA a(void); func_tA b(void); func_tA a(void){putchar('a');return (func_tA)b;} func_tA b(void){putchar('b');return (func_tA)a;} int main(void){ func_t func=a; int i; for(i=0;i<10;i++) func=(func_t)func(); return 0; } これでうまくいったけど たぶん改善の余地ありだろうな
235 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:29:44 ] 再帰みたいになるのか。
236 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:31:36 ] いや戻りとして相手の関数ポインタを返してるだけだから再帰とは違うでしょ 自分が相手を呼び出してるわけじゃないし
237 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:34:55 ] ポインタpに対して p[2]が使えたんだけど これは文法的にok?
238 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:38:42 ] >>237 文法的にはok 論理的(規格の用件に合致する、正常に実行できるなど)な観点からは okかどうかそれだけではわからない。
239 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:40:55 ] func_t a(void); void b(void); func_t a(void) { putchar('a'); return b; } これで、ここまで、ならば通る。 func_t b(void); に変えると typedef func_t (*func2_t)(void); func2_t a(void); にしなければならなくなる。 すると今度は・・・ 難しいね。
240 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:41:08 ] >>237 p[2] の領域が確保されていればおk 例. int a[10]={0}, *p; p=&a[3]; p[2]=0x1234; // p[2] == a[5] なので O.K. p=&a[9]; p[2]=0x5678; // p[2] == a[11] なので N.G.
241 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:43:24 ] 大学でC言語を習った人がプログラマになってからよくやってしまう間違いや 効率の悪いプログラムの書き方とかあれば教えて下さい(-_-;)
242 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:45:58 ] >>232 下でキャスト無しでいけるけど、関数の型が変わったらダメ? typedef void *(*func_t)(void); void *a(void){putchar('a');return b;} void *b(void){putchar('b');return a;}
243 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:50:53 ] しかし質問者が無反応なのが恐ろしい
244 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:50:57 ] >>241 よくある失敗はバッファオーバーラン 効率の悪いプログラムの書き方は標準関数を自作してしまう
245 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:51:13 ] strcpyの代わりにsprintfをよく使っちゃうけど問題ない?
246 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:52:55 ] >>245 無いよ。
247 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:55:22 ] >>244 よく自作しようとしてしまう関数って どんなものがあるんでしょうか(-_-;)
248 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:59:44 ] >>241 局所変数のポインタを返すとか。 値を受け取るための引数に未初期化ポインタを渡すとか。 てか、大学関係ない単なるC言語初心者か。
249 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 20:59:50 ] >>245 sprintfはstrcpy並に問題ある。 バッファオーバーラン防止のため、snprintf使え。
250 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:00:51 ] >>232 です >>234 すみません。 キャストしなくても警告の出ない方法があればと思い質問しました。 >>239 そうなんです。ループしてしまうので宣言の仕方がわからないんです。 >>242 void * にすると代入する時の型チェックが無くなってしまうので できれば関数の型を残したいです
251 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:05:28 ] char a[]="1,2,3"; int i; のとき sscanf(a,"%d,%s",&i,a); とか sscanf(a,"%s,%d",a,&i); って大丈夫?
252 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:11:24 ] >>241 エラーチェックをしてないのも多い気がする fopen が失敗したかどうかチェックしてないとか
253 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:15:17 ] >>252 あぁ…確かにソケット通信のプログラムで 関数のエラーの戻り値を知らずに大変なことがありました(-_-;)
254 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:19:29 ] >>247 文字列操作する時に多いと思う str??? 関係 (strrchr strcat とか) is??? 関係 (isdigit isalpha とか) あと scanf 系の書式指定で対応できるところを自作するとか printf の %*d 書式相当のものとか
255 名前:251 mailto:sage [2007/03/31(土) 21:23:45 ] あと sprintf(a,"%d,%s",i,a); とか sprintf(a,"%s,%d",a,i); みたいに上書きしても大丈夫ですか?
256 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:26:15 ] >>255 大丈夫じゃないです
257 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:32:25 ] >>250 ん〜 無理じゃないかなぁそれは typedef func_t (*func_t)(void); こういう宣言が許されない以上キャストするかvoid *使うかしかないと思う それ以前に関数ポインタを戻りとして返さないとダメかな? つまりこういうのじゃダメ? typedef void (*func_t)(void); void a(void); void b(void); void a(void){printf("a");} void b(void){printf("b");} int main(void){ func_t func[]={a,b}; int i; for(i=0;i<10;i++) func[i%2](); return 0; }
258 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 21:38:07 ] >>257 無理なようですね。 書き方を変えることにします。 >>回答を下さった皆さん どうもありがとうございました。
259 名前:255 mailto:sage [2007/03/31(土) 22:51:37 ] >>256 sscanf(a,"%d,%s",&i,b); sscanf(b,"%s",a); とか sscanf(a,"%s,%d",b,&i); sscanf(b,"%s", a); とか sprintf(b,"%d,%s",i,a); sprintf(a,"%s",b); とか sprintf(b,"%s,%d",a,i); sprintf(a,"%s",b); でやればいいんですかね?
260 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 22:58:07 ] >>259 まあそうだが、 信頼できない入力に対して%sを使うのはバッファオーバーランの 危険があるから、やめといたほうがいいとはおもう
261 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 23:21:16 ] >>260 %100.100sとか書けばええだけちゃうの?
262 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 23:28:14 ] %as
263 名前:デフォルトの名無しさん mailto:sage [2007/03/31(土) 23:37:43 ] じゃこうだね まあ練習用のプログラムだから int ascii_to_integer(char *ascii) { int i; int integer; integer = 0; for (i = 0; *(ascii+i) >= '0' && *(ascii+i) <= '9'; ++i) integer = 10 * integer + (*(ascii+i) - '0'); return integer; } *(ascii+i)とascii[i]ってどっちが普通? 括弧が少ない分, ascii[i]がよく使われるのかな?
264 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 00:48:55 ] ascii[i]; の方が俺としては読みやすい
265 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 01:09:46 ] C FAQを読んで 配列 = ポインタ + 書き換え可能なメモリー じゃないことが分かった さっきまでの自分が恥ずかしい
266 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 01:30:58 ] 行列の積を解くプログラム教えてください
267 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 01:37:56 ] ttp://www.google.co.jp/search?q=%8Ds%97%F1%82%CC%90%CF+%83v%83%8D%83O%83%89%83%80&lr 別に煽ったりとかではないが こんくらい、そのまんま検索ひっかかるよ。。。
268 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 01:41:10 ] ヘッダの中にヘッダをインクルードするのは、 通常どういう見解ですか?Cソースだけにしたほうが良いですか?
269 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 01:47:31 ] どういう見解も何も、必要だからインクルードしているんだろう。 インクルードガードはちゃんと付けとけよ。
270 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 01:53:27 ] #ifndef _INCLUDE_ADD_ #define _INCLUDE_ADD_ //内容 #endif >>269 おそらく、こうゆガードですね。有り難うございました。
271 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 02:26:34 ] >>270 _INCLUDE_ADD_は予約済み識別子なので使わないほうがいい 使用すると未定義動作になる
272 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 02:57:15 ] >>271 忠告どうもです。予約語意外にします。
273 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 03:00:38 ] _で始まって大文字や_が続く識別子は全部予約されているので念の為
274 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 03:28:59 ] >>257 i%2 -> i&1 のほうが速いかも
275 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 03:35:29 ] >>272 最近は"予想外"が流行りらしいぞ。
276 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 07:17:25 ] srand()の存在意義が分かりません。rand()にseedを渡す設計にすれば 済みそうなのに、何故わざわざ別の関数にしたのでしょう?
277 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 07:25:53 ] アフォ rand()呼ぶたびにいちいちseed渡さにゃならんかったらめんどくさいだろうが
278 名前:276 mailto:sage [2007/04/01(日) 08:16:45 ] 仮に rand(seed); とするすると、()の中を毎回書くのが面倒ってこと ですかね? そんなに面倒かなぁ
279 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 08:25:51 ] じゃなくて毎回同じseedを渡していたら、 randから返ってくる値がおなじになるじゃないか。
280 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 08:28:23 ] rand(&seed) とすれば seed は変わる。 ただ、こういう実装にすると、 rand のアルゴリズムに制限がかかる。 あるいは、結局 srand みたいなものが必要になる。
281 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 08:37:30 ] int my_rand(int seed) { srand(seed); return rand(); } で別れていれば自分で実装できるじゃん。なのでやりたければどうぞ。 おれはsrandとrandに別れている方がいいので、 my_randしかなければ困ったことになる。
282 名前:276 mailto:sage [2007/04/01(日) 08:52:16 ] >>280 の回答が親切で比較的納得しやすいと思った。 >>281 の回答は疑問に対する答えになっていないのでは…… rand(time(NULL)); とでもすればseedは毎回変わるし、これで良いので は? と思ったのが疑問の出発です。レス見て分かったような分からな いような気分だけど、そのうち実感できるときが来るかもしれない。回 答ありがとうございました。
283 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 09:09:18 ] >>282 それだと、時間が立たない限り 何度読んでも同じ値しか返ってこないよ
284 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 09:23:58 ] 同じ種で始めれば同じ乱数列が得られるというのも疑似乱数列の 性質としては重要(再現性)なので、基本となるライブラリにある 関数が毎回勝手に裏で種を変えるような造りだと不便な気がする。 必要なら自分でそこにある素材から作れるわけだし。
285 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 09:25:57 ] >>282 ん。そうか? 別れていれば ・別れている方がいいよ派 ・毎回seedを渡したいよ派 の両方の要求を満たせるということをかいたつもりなんだが、 わかりづらかったかな…
286 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 10:31:11 ] 配列でできることってすべてポインタでできるなら配列はいらないと思うんだけど そこんとこどうよエロイ人
287 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 10:31:54 ] だから、毎回seedを設定してたら乱数にならないんだってば。
288 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 10:49:49 ] >>286 配列で出来ることでポインタで出来ないことがあります。 なので配列は必要です。同様にポインタも必要です。
289 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 11:32:58 ] >>287 「一連の乱数を得る」という単位での「毎回」と読むのであろう。
290 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 11:52:23 ] 毎回seed渡すrandって単なるハッシュ関数だな
291 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 11:53:25 ] >>289 一連の乱数を、どうやって一回の関数呼び出しで実現するんだ? 一連の乱数を必要な回数の関数呼び出しで実現するのなら、どうやって連の先頭でのみseedを渡すんだ? それに対する真っ当な回答が、連の先頭でのみsrand()を呼び、以降rand()のみを呼ぶことなんだが。
292 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 11:56:01 ] >>291 君、読解力ないね。
293 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 12:04:14 ] >>288 具体的にはどんなことがあるの?
294 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 12:33:58 ] int a[10]; これをポインタで実現できる?
295 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 12:37:10 ] >>294 ポインタだけじゃないけど struct linked_list { struct linked_list *next; ... }; を定義してmallocで動的にメモリーを割り当てればおkじゃない?
296 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 12:40:16 ] >>295 せめて a = malloc(sizeof(int) * 10) を使おうよ。 # より配列らしく使うならallocaにしたいが。
297 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 13:51:19 ] >>296 alloca? int a[10];がどういう文脈で使われてるか分からんし、 スタックに割り付けることが配列らしく使うことになるとは思えんのだが。 callocなら分からんでもないけど。
298 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 14:08:51 ] どういう文脈で使われるかわからんのにcalloc()ならなんで「わからんでもない」なんだろ。
299 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 14:20:04 ] allocaのほうがfreeせずに済む分配列っぽいということか。 ただし、ローカル変数なら。
300 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 14:28:18 ] callocなら要素サイズと要素個数を別個に指定して割り付けるから配列宣言っぽい、という意味で分からんでもない。 使いどころが限られているallocaよりも、int a[10];がどういう文脈で使われていても、とりあえずcallocはヒープに取れるし。
301 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 14:32:14 ] >>299 ああ、納得。確かにfreeが不要っていう点ではallocaは配列と共通点を持ってるね。
302 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 15:43:45 ] >>281 これは seed が更新できないから使い物にならない
303 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 15:46:04 ] >>294 の意図しているところがワカランのが困る。 どこまで再現して欲しいのか。
304 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 15:56:33 ] [ ]のオーバーr(ry
305 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 16:02:24 ] int b[10],*a=b;
306 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 16:03:08 ] []もオーバーライドできるのか…
307 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 16:49:53 ] int (*a)[10] = malloc(sizeof (int) * 10); こういう事がやりたいのか?
308 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 17:09:33 ] calloc()は0クリアされるという仕様である時点で、ローカル配列とは似ても似つかないのだが。
309 名前:デフォルトの名無しさん mailto:sage [2007/04/01(日) 17:26:43 ] それ以前に「要素のサイズと、数を別々に指定できるから、alloca()より配列に近い」ってのも、あれじゃね?
310 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 02:59:18 ] エイプリルフールも終ったね ネタは乱数の種と配列をポインタで実現だけか つまらん
311 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 03:14:05 ] ネタスレじゃないし
312 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 11:43:43 ] 今年は偽RFC来なかったの?
313 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 13:13:23 ] 4824
314 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 14:15:30 ] 手旗信号かワロタ。アブストしか読んでないけど。
315 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 16:10:23 ] VCExpressでCW_USEDEFAULTが定数として呼び出せないのはなぜなんだぜ? : error C2664: 'CreateWindowExA' : 4 番目の引数を 'LPCSTR' から 'DWORD' に変換できません。(新しい機能 ; ヘルプを参照) 教えてください。お願いします。
316 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 16:17:00 ] HWND CreateWindowExA( DWORD dwExStyle, PCTSTR pszClassName, PCTSTR pszWindowName, DWORD dwStyle, int x, (ry
317 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 17:00:15 ] >>316 ズレてたわけですか。 hWnd = CreateWindow(szClassName, "猫でもわかるWindowsプログラミング", //タイトルバーにこの名前が表示されます (LPCSTR)WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); 引用スマソ。EXAではないのですが、EXにして第一引数を加えると : warning C4002: マクロ 'CreateWindowA' に指定された実引数の数が多すぎます。 : error C2664: 'CreateWindowExA' : 2 番目の引数を 'long' から 'LPCSTR' に変換できません。(新しい機能 ; ヘルプを参照) と出ます。ウィンドウクラスはEXなんですが、なぜでしょうか? お願いします。
318 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 17:03:01 ] CreateWindowEX': 識別子が見つかりませんでした 違った。こっちがエラーだ
319 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 17:22:31 ] 解決しました。誤字があったようで ありがとうございました。
320 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 17:39:03 ] 質問文を作るだけで疑問が解決する事も結構あるのね…
321 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 17:40:40 ] 質問しようとして疑問点を整理していくと何が問題なのかわかっちゃうことって結構あるよね
322 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 17:42:39 ] それがデバッグじゃね?
323 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 17:54:59 ] デバッグというより洗い出しというか整理というか
324 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 21:40:54 ] 何か格言ぽいのなかったっけ 「人に聞く前に目の前のクマさん人形に説明してみろ」 とかなんとか
325 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 21:48:39 ] うんk
326 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 21:55:25 ] コンピュータ系の演習室か何かにゴムのアヒルちゃんがおいてあって、 常駐してる相談員に質問する前にはそのアヒルちゃんに質問してから、 というルールがあるという話をどっかで読んだ。
327 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 21:59:54 ] 「ゴムのアヒルに質問する」という設定だけなら 「達人プログラマー(The Pragmatic Programmer)」 にあった。 なんでアヒル?
328 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 22:04:39 ] 「ゴムのアヒル」ってのが小さな子供が遊ぶおもちゃの象徴だからじゃないか? 幼児に馴染みのある人形って日本だと何だろう? アンパンマンとか?
329 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 22:05:32 ] その辺に置いてあったからじゃね? 別にダースベイダーのボトルキャップでもいいわけで
330 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 22:43:13 ] ビット列の上位から下位までを逆順にしたい。 例えば、 01100111 -> 11100110 というように。 (0bit目が7bit目に、1bit目が6bit目に…) 何かスマートなやり方はありますか?
331 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:02:34 ] >>330 LUT
332 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:32:00 ] これでよくね? int y = 0; if(x & 1) y |= 128; if(x & 2) y |= 64; if(x & 4) y |= 32; if(x & 8) y |= 16; if(x & 16) y |= 8; if(x & 32) y |= 4; if(x & 64) y |= 2; if(x & 128) y |= 1;
333 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:41:31 ] 全然スマートじゃないけどな
334 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:48:09 ] 10 進法で考えたら分かりやすくね? int a = 1365; int b = 0; while (a>0) { b *= 10; b += a % 10; a /= 10; } これを応用して int a = 1365; int b = 0; while (a>0) { b << 1; b |= a & 1; a >> 1; }
335 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:50:36 ] スマートって結局主観だろ。 他人のことなんてわからん。 余計なことして気分的にスマートって思いたいだけだろ。
336 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:56:24 ] それに加え「速いのが良ければ実測しろ」だしな。
337 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:56:28 ] int test8bit(int x) { static BYTE table[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; int y = table[x>>4 ] | (table[x&15]<<4); return y; } int test16bit(int x) { int y = test8bit(x>>8 ) | (test8bit(x&255)<<8); return y; } intは32ビット以上前提で
338 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:57:12 ] そんな言い訳ばかり並べて逃げるやつからは何も生まれてこないと思うんだ。
339 名前:330 mailto:sage [2007/04/02(月) 23:57:19 ] LUT作りました。 皆さん、ありがとう。
340 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 00:01:40 ] まあ>>332 をスマートだと思う奴なんていないだろうけどな
341 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 00:06:38 ] そんなことに時間かけるくらいなら 可読性も速度も無難なのがいい。
342 名前:330 mailto:sage [2007/04/03(火) 00:12:13 ] 可読性と速度を考えてLUT。 実測はしてないですが。
343 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 00:13:58 ] まあ、速すぎて調べても誤差程度にしかならんけどね。
344 名前:デフォルトの名無しさん [2007/04/03(火) 23:57:14 ] 文字列を戻り値に指定するときに char ch[] = " "; return ch; だとエラーが出て char ch[] = " "; return &ch[0]; だと通ったんですが、戻り値に配列を指定するときは return ch; のように省略して書いてはいけないのでしょうか?
345 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:01:54 ] 関数内で宣言した変数は静的変数(static付けた奴)以外、 関数を抜けると同時に破棄される。 呼出元に戻ったらもうそんな変数を指すポインタは無意味と化している。 だから前者ではそのことを警告されただけだと思う。 無論後者の書き方をしたところで問題の解決にはなっていない。
346 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:20:51 ] >>344 エラーがでるでないはともかく関数内で宣言したローカル変数を戻り値にしちゃだめだよぉ return で戻ったときにはchar ch[] はもう亡くなっているだろうから
347 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:32:46 ] 結論、Cでは文字列を単純には戻り値にはできない。
348 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:34:15 ] なんでそういう結論になるのか
349 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:43:41 ] >>348 他の結論になるとでも?
350 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:45:26 ] 後者は&リテラル返してるじゃん
351 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:50:12 ] 呼び出し元で確保しておけと。
352 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:51:02 ] >>344 C言語で関数から文字列を返却したいときは、戻り値にしないで引数で返す つまり、呼び側関数内で配列の領域を確保し、呼ばれる関数に渡す
353 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 00:51:35 ] 被ったorz
354 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 01:30:59 ] 超初心者で申し訳ないんですけど、 コンパイルしようとしたときに、cant open: stdio.hっていうエラーが出るんです。 解説お願いします。
355 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 02:15:58 ] すいません、自己解決しました。
356 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 03:58:31 ] >>347 は要するにC言語では配列そのものをreturn文で返すことはできない、 ってことだろ。 自動的にポインタに変換されてしまうから。
357 名前:デフォルトの名無しさん [2007/04/04(水) 04:33:37 ] BinarySearchTreeの勉強をしてるんですが 階層の数はどんな感じで出せばいいですか?
358 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 12:04:32 ] 350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26 後者は&リテラル返してるじゃん
359 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 12:05:34 ] 356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31 自動的にポインタに変換されてしまうから。
360 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 12:07:33 ] 358 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:04:32 350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26 後者は&リテラル返してるじゃん 359 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:05:34 356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31 自動的にポインタに変換されてしまうから。
361 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 12:16:40 ] 自分で考えろ
362 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 12:36:27 ] ソケット通信ってchar型以外のデータを送信できるのでしょうか? 構造体でデータをまとめて通信したいんですけど…
363 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 12:40:33 ] 送信する関数のポインタの型を良く見ろ
364 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 13:28:03 ] >>362 「ネットワークバイトオーダー」でググるよろし。
365 名前:344 [2007/04/04(水) 16:54:10 ] ローカル変数だってことすっかり忘れてました… staticにするか引数に渡すかしないといけなかったんですね。。 皆さん分かりやすい説明ありがとうございました。
366 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:19:44 ] 前者がリテラルへの参照、後者がリテラルの先頭アドレスを返してる。 char* moji(){ char ch[] = "a"; return ch;//もしくはreturn &ch[0]; } int main(){ char* b=moji(); return 0; } これで、各所にブレークポイント置いて、メモリとレジスタを見てみりゃわかる。 ローカル変数はベースポインタ(EBPレジスタ)からのオフセットで決まるから、 moji()からmain()に戻ってくりゃ、ベースポインタが変わるから、リテラルへの参照chは意味を成さなくなる。 ただし、戻り値(EAPレジスタ)の残骸が残っている場合、一見何事もなく済んでしまう場合もある。 ch[0]というのは、リテラルそのもの、文字がメモリにセメダインで張り付いてるようなもので、値を変えようとすると AccessViolationでOSから怒られる。&ch[0]は参照じゃなく直接リテラルのアドレスを返している。
367 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:31:18 ] >>366 >リテラル 何か混乱しているようですが、そのコード中の文字列リテラルは "a" のみです。 ch はリテラルではなく、単なる char[2] のローカル変数です。
368 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:31:47 ] 真っ赤な間違い乙
369 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:32:18 ] 真っ赤な間違いは>366ね。
370 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:43:37 ] >>367 だから、chは文字リテラル"a"への参照だよ。 chは、単なるch[2]のローカル変数? だから違うよ、ch[2]の先頭を参照するローカル変数。 参照ってなに?
371 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:51:02 ] >>367 左辺値と右辺値の区別くらいつけろや
372 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:56:47 ] >>366 Cならいついかなる場合でも配列chに対して、chと&ch[0]は同じ。 どちらも配列の先頭要素を指すポインタが式の結果として得られる。
373 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:57:01 ] 安価間違ってない?
374 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:58:42 ] vipperはカエレ
375 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:00:17 ] 安価とか言うのは高確率で おっさん
376 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:06:40 ] >配列ch だからchはアドレス参照だと それと、結果は同じでも過程は違うとはよくいったもんで
377 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:06:57 ] なんか恥ずかしいやつが混じっているなぁ。 char ch[2] = "a"; char foo[2] = {'a', '\0'}; printf("%p, %p\n", ch, foo); を実際にコンパイルして(アセンブル出力を見るか)実行してみれば直ぐに判ることだろうに。
378 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:08:43 ] 行火
379 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:16:00 ] >>377 そのプログラムを実行して結果を見たところで何がわかるのやら
380 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:19:42 ] 何も判らないならプログラミングは止めたほうがいい。
381 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:25:49 ] >>366 ちなみに文字列リテラルそのもの(の先頭要素)を指すポインタを返したければこうする どちらも結果的には同じこと char* moji() { return "a"; } char* moji() { char* ch = "a" return ch; }
382 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:27:26 ] >>380 当然過ぎる結果が返ってきたということだw 上の方のレスはカオス過ぎて読んでいない。
383 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:27:45 ] どうせなら char *p = "a"; も付け足しとけ。
384 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:30:53 ] 「配列とポインタは同じ」 って罪な言葉だな…
385 名前:344 [2007/04/04(水) 18:31:09 ] つまり ch → "a"の先頭アドレスを参照 ch[0] → 'a'を参照 &ch[0] → 'a'のアドレスを指す と言うことで、これらは全部 'a' '\0' を参照しているからアドレスは同じってことですか?
386 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:32:37 ] >>366 のアホさに久々にワロタ
387 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:33:17 ] >>385 違う。
388 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:34:01 ] なんつーか、参照って言葉をむやみに使わないほうがいいと思うんだ。
389 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:35:43 ] 配列の初期化子に使う場合でも文字列リテラルって言うの?
390 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:39:39 ] >>389 e-words.jp/w/E383AAE38386E383A9E383AB.html
391 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:40:44 ] >>389 そう言う。 規格上、charの配列を文字列リテラルで初期化できるという規則になっているから。
392 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:42:09 ] ch → 配列の先頭を指すポインタとして見なされる ch[0] → char型の値 &ch[0] → ch[0]のアドレス
393 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 18:44:38 ] >>390 いやリテラルであることに疑問の余地はないんだけど、文字列リテラルってなんか微妙に違和感あったもんで… >>391 規格じゃあしょうがないね
394 名前:344 [2007/04/04(水) 18:56:51 ] >>388 少し調べたんですが、 参照ってC++だと特別な意味があったんですね。。 これから気をつけます。 >>392 ありがとうございます。 自分が考えていたことと全然違いますね…
395 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:00:32 ] kmaebashi.com/programmer/pointer.html より引用 " で囲まれた文字列を、文字列リテラルと呼ぶ。 通常は、文字列リテラルは、「char の配列」を意味する。 よって、式の中では「charへのポインタ」に読み換えられる。 しかし、char の配列を初期化する場合は例外である。 (こちらを参照のこと) この場合の文字列リテラルは、中括弧内に文字を区切って書く初期化子の 省略形として、コンパイラに特別に解釈される。 char str[] = "abc"; /* この宣言は、下の宣言と同義 */ char str[] = {'a', 'b', 'c', '\0'}; /* 配列の最外周なので、要素数は省略できる */ …だそうだ
396 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:12:16 ] コード上で"で囲まれてれば全部文字列リテラルなのねー 感覚としてはあたかも文字列リテラルのように書くことが許されてるって感じだった
397 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:15:40 ] でも現実的には初めそう教えておくほうがいいと俺は思う。
398 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:31:04 ] >>366 がアホなのは解った。
399 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:39:27 ] オレはC言語はきちんと理解できていないが ゲームなんかのクラックをして変な知識だけはある しかもアセンブラの意味も分かっているわけではなく シンボルを見て分かった気になっているだけの スクリプトキディみたいなもんだ 言っとくがオレは >>366 でも代弁者でもないぞ
400 名前:デフォルトの名無しさん [2007/04/04(水) 19:44:49 ] >>399 どういう流れでその書き込みなのか頭の悪い俺に教えてください。
401 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:47:48 ] >>399 いったい、誰に対して何の主張をしてるんだ?
402 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 20:02:08 ] それをこれから書くところなんじゃないか
403 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 20:02:45 ] スレ違いはスルー汁
404 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 20:28:28 ] とりあえず>>370 の char ch[] = "a"; は文字リテラル"a"への参照だよ。 ってのはおかしいよね・・・?
405 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 20:37:08 ] argv[1][2]って*(p+2)みたいに表現できないの? > エロイ人(愛を込めて)
406 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 20:43:08 ] >>405 *(argv[1] + 2)
407 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 20:50:32 ] >>405 もしくは *(*(argv+1)+2)
408 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 20:52:20 ] argv[ i ][ k ] = *(*(argv+i)+k) と等価って意味ね
409 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:05:21 ] 2[1[argv]]
410 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:13:52 ] argv[i][k] == *(*(argv+i)+k) == k[i[argv]]
411 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:22:45 ] >>406-410 サンクス なるほど *を2回使うのね
412 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:53:54 ] a[b]におけるaとbの可換則だけは釈然としない こんなの使って可読性が上がる場合なんてあんの?
413 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:57:04 ] >>412 その仕様は初期のコンパイラの都合によるものと思われる でも、できるからといって使う必要はないじゃないか
414 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:35:53 ] char *argv[]に対して *(argv+i)って言うのはargv[i] *(*(argv+i))って言うのはargv[i][] と同じと考えておk?
415 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:37:44 ] 下は *(*(argv+i)) == *(*(argv+i)+0) == argv[i][0] ?
416 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:45:43 ] うん。 *p == p[0]
417 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:48:02 ] 構造体ってのは最初に宣言しないといけないの? #include <stdio.h> int main(void){ struct person{ char *sei; int age; }taro; taro.age=13; taro.sei="山田"; struct person hanako; printf("太郎の姓は%s、年齢は%dです\n",taro.sei,taro.age); return 0; } これコンパイルできないんだけど
418 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:50:09 ] struct person hanako; を削ってみ。
419 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:51:59 ] >>417 Cの場合宣言(struct person hanako; )は関数スコープの最初に taro.age=13; taro.sei="山田"; の後で宣言はダメ
420 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:52:17 ] >>417 コンパイルできるよ。
421 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:57:13 ] あれがコンパイルできるC99は残念ながら普及していないのさ
422 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 23:59:18 ] gccが普及してないとでも?
423 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 00:10:03 ] GCCは普及しているものの、社会がC99を使う風潮になっていない。 見たことあるか?C99で書かれたプログラム。
424 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 00:17:24 ] FreeBSDのソースがC99でかかれてたなー。
425 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 00:23:08 ] 拡張子をcppにすればいい
426 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 00:44:47 ] >>423 コメントが//のCのソースコードをよく見るんだが
427 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 03:02:41 ] C99で書かれたものは、C89でも書ける。 極端な事言えば、C++でusing namespace std; をグローバルで宣言して、あとはCの様に書けば 事足りる。 なんだよ、_BOOLって (w
428 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 03:09:55 ] 極端な事言えば、 で書かれたものは機械語でも書ける。
429 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 07:05:03 ] ふつうにboolにしてくれた方が使いやすい
430 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 07:51:37 ] >>423 毎日飽きるほど見てますが、何か。
431 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 08:04:55 ] >>427 >>429 <stdbool.h>
432 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:49:55 ] int *a; ってやったら aにはたとえば0x123456ff みたいなアドレスが入ってるんだよね? だから、a=12みたいなことはできないってことはわかったんだけど char *c c="abcdef"; みたいなことができるのはなんで? char *cって指定した時点で cには0x12345678みたいなアドレスが入ってんじゃないの?
433 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:54:00 ] "abcdef"は、文字列abcdefのアドレスの意味
434 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:54:04 ] int *aもchar *cも宣言した時点では(有効な)アドレスは入ってない。
435 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:59:11 ] あれ? アドレス表示しても6桁なんだけど… なんで?
436 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:59:55 ] a=12だってできる。
437 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:00:32 ] >>435 上が0なんだろ・・・
438 名前:435 mailto:sage [2007/04/05(木) 13:02:00 ] #include <stdio.h> int main() { int a = 1 ; printf ( "%x" , &a ) ; return 0 ; } で実行すると 12fed4 どういうこと?
439 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:02:42 ] >>437 なるほど^^ お騒がせしました
440 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:04:32 ] >>432 そういうC言語の仕様。 「char型の配列はダブルクォーテーションで囲む文字列(これを文字列リテラルと言う)で初期化できる」 っていうルールがあるの。ただおまいはその書き込みから色々誤解してそうなフシがあるから注記しとくと ・初期化が無い宣言の時点ではその変数の値は決まってない。 その変数を格納するためのメモリ領域に元々入ってるデータがそのまま値になる。 ・文字列リテラルで出来るのはあくまで初期化であり、代入は出来ない。 つまり、char c[] = "unko";はできるけどchar c[20]; c = "unko";はダメ。 ・ポインタに対しても同じ事が出来るけどそれはchar *cのに対して静的なリテラルのアドレスが代入されたのであって ↑のルールとは無関係。だから厳密に言えば↑のレスは的外れになる。
441 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:14:58 ] >>438 0x12fed4 16進表記だよ
442 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:22:39 ] %p ならなんとかしてくれるかもしんない。 あ。 ゼロサプレスしてたっけか?
443 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:45:42 ] なるほどー。 char c[20]; ってやって、初期化しなかった場合に代入したいときは scanfとかstrcpy使わないとだめなのかな? c="asdf"はできなくてstrcpy(c,"asdf")はできるんだよね。。。 なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか
444 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:54:28 ] >>443 char c[20]; char *p=c; cのアドレスをpにコピー コピーしたのは「アドレス」であってデータそのもの("ABCDE")ではない このときpには c のアドレスが入っている 次に p="ABCDE"; を実行すると p は"ABCDE"というリテラルの「アドレス」が代入され cに"ABCDE"がコピーされるわけではない c(=p)にコピーしたいのなら strcpy(p,"ABCDE"); としなければいけない
445 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:54:41 ] >>443 > なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか c="asdf"は、char型の20個の領域にアドレス(="asdf")を代入しているからだめ strcpyは、char型の20個の領域に文字列asdfをコピーしているから良い
446 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:56:06 ] >>443 Cでは配列間での代入はできない。また、"asdf"は'a'を指すポインタと解釈される。 従って、c = "asdf"は配列へのポインタの代入と言うことになり、当然できない。 どうしても代入したければ、要素を一つずつ代入すればよい。 #そしてそれを、ナル終端文字列専用にしたのがstrcpy()だ。
447 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:58:01 ] c="asdf" ← というか、そもそも、c = で使えない。(cは配列の先頭を表してるってだけ) strcpy(c,"asdf") ← c(配列の先頭のアドレス)とリテラルのアドレスを渡して、 'a','s'・・・を順次入れているだけ。
448 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 14:06:51 ] >>443 "asdf" は文字列が格納されている先頭メモリ番地 c="asdf" はアドレス値をコピーしようとしている strcpy(c,"asdf") はアドレスが指すデータをコピーしようとしている
449 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:45:32 ] for (i = 0; i < THREAD_COUNT; i++) { /* スレッド生成 */ if (pthread_create(&thread_id, NULL, threadFunc, (void *)thread_arg) == 0) { thread_count++; } } とやって、THREAD_COUNTの数をいろいろ変えているのですが ある一定の数以上は、必ず失敗するようになります。 自分の環境では303個めまでのスレッドは作成できますが それ以上は作成できません。 どこかでスレッドの上限というのは決められているのでしょうか?
450 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 16:32:12 ] /* 1000以下の素数を求める(第1版) */ #include <stdio.h> int main(void) { int i, no; unsigned long counter = 0; for (no = 2; no <= 1000; no++) { for (i = 2; i < no; i++) { counter++; if (no % i == 0) /* 割り切れると素数ではない */ break; /* それ以上の繰返しは不要 */ } if (no == i) /* 最後まで割り切れなかった */ printf("%d\n", no); } printf("乗除を行った回数:%lu\n", counter); return (0); } これでnoが3の時二個目のfor分のところのiが<演算子なのに3になるんですか? 3にならなければ3素数なのにprintfで表示されないですよね
451 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 16:42:23 ] no = 3, i = 2 → 割り切れない no = 3, i = 3 → i < noを満たさないのでループ終了 no == i なので3は素数
452 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 16:44:38 ] <これでも 3<3までいくんだ? <=じゃなくても
453 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 16:45:38 ] 3になったからループを抜けるわけで
454 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 16:47:32 ] ループの流れ i = 2 i < no の判定 処理 i++ i < no の判定 処理 i++ i < no の判定 処理 i++ ・ ・ ・
455 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 16:48:36 ] >>450 =452 ...か? 妥当なインデント付けて、最初のforループの中を一行ずつ追っていけば 何となく分かるかもね。
456 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:04:32 ] >>452 そうじゃなくて no=3 のとき iのループは3になったら抜けるわけでループ内では2までしか処理されない ループを抜けているのはiが3だからループのあとiは3になっている
457 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:46:40 ] printf()が負値を返すのはエラーが発生した場合とのことですが 具体的にエラーが発生するのってどんな状況のときなんですかね?
458 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:59:47 ] >>457 厳密には、printf()は出力に失敗するとEOFを返す。 リダイレクト先の出力がなんらかの制限のあるデバイスにでも振り向けられていなければ、 一般的には出力は必ず成功する。
459 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 18:44:50 ] てか画面以外は失敗する可能性あるよね。
460 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 18:58:02 ] >>459 画面って何? /dev/consoleのこと? 必ずしも画面とは限らないのだけど……
461 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 19:03:19 ] 要は、下位のwriteが失敗するかどうかが大体のキモだね。 printf(NULL)みたいなどうしようもないようなものをのぞけば。
462 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 19:32:07 ] >>457 普通にファイルに書いてたって空き領域がなくなることはあるだろうし リムーバブルなメディアなら途中で引っこ抜かれるかも試練。
463 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 19:40:07 ] 実は、バッファリングされているから必ずしもエラーにならない罠。
464 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 19:46:53 ] 必ずしもの使い方が間違っている希ガス
465 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 19:47:44 ] 463ではないが、必ずしもエラーになるとは限らない、かな?
466 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 19:50:25 ] 容量オーバーした瞬間にエラーにならない可能性はあるが、 失敗する可能性は十分あり得るということでFA?
467 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 21:26:44 ] すみません。前回はありがとうございます。 また質問させていただきます。 ttp://www.uploda.org/uporg763897.zip.html スパゲティですみません。 game3.hの構造体sceneDataなんですが変数dFFがメンバじゃないと出るんですが、 何ででしょうか? 要素が多すぎるんでしょうか? pはsageです。
468 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 21:31:37 ] >>467 grep で検索しても dFF はどこにも宣言されて無いようだ
469 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 21:38:51 ] 整数mからnまでの和を、公式n(n+1)/2を使わずに求めるプログラム作ったんですけど #include <stdio.h> int main(void){ int m,n,i,ans=0; printf("数値入力>");scanf("%d",&m); printf("数値入力>");scanf("%d",&n); if(m<=n){ for(i=m;i<=n;i++){ ans=ans+i; } printf("%d",ans); } else { for(i=n;i<=m;i++){ ans=ans+i; } printf("%d",ans); } return 0; } このプログラムって、答えをansという変数に代入してるんですが ansを使わずに求めるにはどうしたらいいんですかね
470 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 21:42:29 ] mかnに加算していけば?
471 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 22:01:58 ] >>469 再帰処理で #include <stdio.h> int mysum(int a,int max) { if(max<=a) return a; return mysum(a+1,max)+a; } int main(void){ int m; printf("数値入力>");scanf("%d",&m); printf("数値入力>");scanf("%d",&n); if(m<=n){ printf("m=%d\n",mysum(m,n)); } else { printf("n=%d\n",mysum(n,m)); } return 0; }
472 名前:471 mailto:sage [2007/04/05(木) 22:03:22 ] あっ printf("m=%d\n",mysum(m,n)); printf("n=%d\n",mysum(n,m)); m= と n= 消しといて
473 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 22:17:13 ] >>469 ansを思いっきり使ってるので無視してくれて構わないが簡略した int MtoN_Add(int m, int n) { int i = (m>n)?n:m, ans = 0; while( (m>n)?m:n >= i ) ans += i++; return ans; }
474 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 22:38:02 ] #include <stdio.h> int main(void){ int m,n,i; printf("数値入力>");scanf("%d",&m); printf("数値入力>");scanf("%d",&n); if(m>n) m^=n,n^=m,m^=n; for(i=m+1;i<=n;i++) m+=i; printf("%d",m); return 0; }
475 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:07:24 ] ハッカーの楽しみに載ってるやつかww
476 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:15:05 ] m^=n,n^=m,m^=n これでスワップが出来るとは知らなんだ。勉強になったぜ
477 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:20:22 ] 勉強するのはいいが、実用性はないに等しいから使わないようにね。
478 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:21:15 ] www.dd.iij4u.or.jp/~okuyamak/Information/xor_fixed_swapping.html ja.wikipedia.org/wiki/XOR%E4%BA%A4%E6%8F%9B%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
479 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:42:01 ] do while文ってつかわないほうがいいの?
480 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:49:01 ] while文よりは利用機会は少ないと思うけど、 使わないほうがいいってことはない。 ただし、do while文の最後を } while (条件); のようにwhileが先頭に来るように改行するのは好ましくない。 こう書いてしまうと、一軒、新たに while文が始まったように見 えてしまう。 } while (条件); とするのがよい。
481 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 00:20:44 ] サイズの指定たとえば#define BUF 256とかを 複数のファイルで共有するにはどうすればいいの? ヘッダに書いちゃっていいものなの? 優しく教えてくれる東ちづる似のお姉さん回答お願いします。
482 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 00:49:06 ] 共用するヘッダに書いて#includeする。
483 名前:481 mailto:sage [2007/04/06(金) 09:21:17 ] >>482 すみません それは新しくヘッダのみのファイルを作っておくって事でしょうか?
484 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 10:15:23 ] common.hみたいな名前のヘッダファイル作って、そこに#define全部書いて 定数使うソースに#include "common.h"書けばおkって話。
485 名前:481 mailto:sage [2007/04/06(金) 10:50:30 ] >>484 そうしたいと思います。 回答ありがとおおおおおおおおおおおおおおおおおおお。
486 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 11:33:21 ] >common.hみたいな名前のヘッダファイル作って、そこに#define全部書いて 勘弁してくれ。
487 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 11:38:40 ] 今の時代、ヘッダ直しただけで毎回フルビルドになってもOKダヨー
488 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 11:51:49 ] 本当に時代は進化したなぁ
489 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 11:53:22 ] >>486 へ?何が勘弁してなの?煽りじゃなくてマジで・・
490 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 11:54:08 ] >>487 それが理由じゃない。俺様マクロが氾濫する原因になるから 利用したいソース群ごとにインクルードファイルは分けて欲しいだけだ。
491 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 11:55:15 ] つーか、>484の方針だとプロトタイプ宣言も全ソース共通のインクルードファイルでやってそうだな…
492 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 11:56:40 ] プロトタイプ宣言は普通全ソース共通のインクルードファイルに書くだろ prototype.hとか作って
493 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 12:02:45 ] 普通にモジュール化してたらそうはならないだろ
494 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 12:05:38 ] なるだろ
495 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 12:25:58 ] で結局どうやるのが正解なわけ?
496 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 12:27:57 ] >>492 勘弁してくれ。 その方針じゃ、必要のないインクルードファイルまで全部インクルードする羽目になる。 標準インクルードも片端からインクルードすることになるジャマイカ。 例えば20本くらいのソースのうち、時間(time_t)を取り扱う関数がソースAにあるとする。 それを利用するのは、ソースBとソースCだけだとする。 ソースD以下はtime_tなど全く頓着する必要はないのだが、プロトタイプが全部共通だと 全てのソースでtime.hをインクルードすることになるということだ。 time_tならそんな心配はないだろうが、環境によっては他とぶつかる可能性のある マクロを定義しているインクルードファイルもあるだろう。 #たとえばBoolという定数マクロと関数マクロがぶつかることがあるOSの標準インクルードで実際にあった。 >493が言うように、きちんとモジュール化していたらそんなことになるはずないんだがな。 #つーか、C++でクラス設計していたら有り得ないだろ。
497 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 12:38:37 ] >>496 なんとなく共通のヘッダファイルは、さけてきたけど・・・ では、そうゆう方向で >_<;
498 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 13:00:14 ] >>496 >>492 はプロトタイプ宣言だけの話じゃないの?
499 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 13:02:09 ] >>498 プロトタイプ宣言を纏めるためには、引き数や戻り値で使う型の情報が必要になる。 それらをインクルードすれば同じこと。
500 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 14:00:47 ] ポインタ型はすべてchar*に変換すればいい というか業務だとそうしてるよな?普通 そうしないとくだらない依存関係で悩むことになる
501 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 14:20:45 ] >>500 勘弁してくれ。
502 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 14:24:21 ] 16進を2進に変えるのって ただ単に桁ごとの数字を二進法にかえればいいだけですか? たとえば0x65なら6を二進にした0110と5を二進にした0101を並べて 01100101ってやりゃいいの? どんな数でもこの法則成り立ちますか?
503 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 14:30:52 ] 4進数なら 00 00 8進数なら 000 000 16進数なら 0000 0000
504 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 14:31:02 ] >>500 何の為に型が存在してるんだ
505 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 14:40:24 ] >500は釣りだろ。いくらなんでも業務で型無しプログラミングなんて有り得ない。
506 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 15:27:40 ] インターフェイスをchar *で統一するとデータ型に依存しないから、 仕様変更があった場合、修正個所少なくなる。というのはあるかもね。 作業が進んでから「データ型変更されますた」とかあるしw
507 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 15:32:15 ] そして、仕様変更でデータ型が変わってもその事実が伝達されずにそのままビルドされて納品される罠。
508 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 16:33:40 ] >>506 なんと愚かな・・・。
509 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 16:35:25 ] >>508 どこが愚かが具体的に言わないと反論になってない さらに自分の改善案も出さないとただの愚痴
510 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 16:42:29 ] >>509 >507 >504 >496 >493
511 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 16:43:06 ] >>502 2進数を3桁で区切ってその3桁を1桁づつにすると8進数、4桁で区切って1桁づつに すると16進数。というのは、2進数3桁だと8種類の重みを表現可能だからで、これを 一桁で表せば8進数ということになる。2進数4桁で16進数というのも同じこと。
512 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 16:48:26 ] >>509 反論ではありません。あまりの愚かさに衝撃を受けて出た一言です。 外人がよく言う "Oh My GOD!" に近いものです。 ああ。あなたに神の許しがありますように。
513 名前: ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ mailto:sage [2007/04/06(金) 16:49:42 ] _____ /::::::::::::::::::::::::::\ _ /::::::::::::::::::::::::::::::::::::::\ /  ̄  ̄ \ |:::::::::::::::::|_|_|_|_| /、 ヽ |;;;;;;;;;;ノ \,, ,,/ ヽ |・ |―-、 | きみ頭だいじょうぶ? |::( 6 ー─◎─◎ ) q -´ 二 ヽ | |ノ (∵∴ ( o o)∴) ノ_ ー | | /| < ∵ 3 ∵> \. ̄` | / ::::::\ ヽ ノ\ O===== | :::::::::::::\_____ノ:::::::::::\ / |
514 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 16:50:32 ] >>500 何社か渡り歩いたけど、そうやってる会社もあった 大手電機メーカーでした
515 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 16:55:28 ] >>514 恐ろしいな。
516 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 18:08:42 ] >>506 せめてvoid* 何も事態は改善しないけど
517 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 18:30:31 ] >>516 うん。まーーーったく変わらない。
518 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 18:45:30 ] え?悪化してるような気がする。 char*ってことは、一旦シリアライザ・デシリアライザを挟もう、って意図じゃないの? いまどきのIPCがみんなXML使ってるみたいに、関数の引数もXMLにしよう、みたいな話ではないの?
519 名前: ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ mailto:sage [2007/04/06(金) 19:39:54 ] _____ /::::::::::::::::::::::::::\ _ /::::::::::::::::::::::::::::::::::::::\ /  ̄  ̄ \ |:::::::::::::::::|_|_|_|_| /、 ヽ |;;;;;;;;;;ノ \,, ,,/ ヽ |・ |―-、 | きみ頭だいじょうぶ? |::( 6 ー─◎─◎ ) q -´ 二 ヽ | |ノ (∵∴ ( o o)∴) ノ_ ー | | /| < ∵ 3 ∵> \. ̄` | / ::::::\ ヽ ノ\ O===== | :::::::::::::\_____ノ:::::::::::\ / |
520 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 19:49:00 ] >>468 ありがとう。どうやらIDEが別の似たファイルを参照していたらしいです。 解決しました。
521 名前:デフォルトの名無しさん [2007/04/06(金) 20:05:31 ] >>476 XOR使ったスワップは、同一だとちゃんと機能せんから せめて a +=b, b = a - b, a -= b とか使うようにしましょう。
522 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 20:08:53 ] 一方俺はバッファを使った…
523 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 20:12:42 ] >>521 おいおいw
524 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 20:28:42 ] 叔母風呂
525 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 20:30:47 ] 同一( &a==&b )の場合は >>521 の方法でも 0 になってしまうよ
526 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 21:24:42 ] for文の途中に return 0などがあると 関数に0を返したあとに、関数の処理は終わってしまいますか?
527 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 21:26:28 ] もちろん
528 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 21:54:44 ] #include <stdio.h> #include <math.h> int sosu(int); int main(void){ int i,m; printf("数値入力>");scanf("%d",&m); if(m<=0) return 0; printf("2 "); for(i=3;i<=m;i+=2){ if (sosu(i)==1) printf("%d ",i); } return 0; } int sosu(int n){ int i; if(n==2)return 1; if(n%2==0) return 0; else{ for(i=3;i*i<=n;i=i+2){ if(n%i==0){ return 0; } } } return 1; } 入力した数までの全ての素数を表示するプログラム作ってみたんだけど これだと横一列に表示されて見づらいので、5個ずつ表示して改行\nつけたいんだけどどうしたらいいですかね 2 3 5 7 11 13 17 19 23 29 31 37・・・といった感じです
529 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 21:59:24 ] >>528 これでどう? if (sosu(i)==1) printf("%d ",i); ↓ if (sosu(i)==1){ static int sosu_count=1; sosu_count++; printf("%d ",i); if(sosu_count%5==0) printf("\n"); }
530 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 22:00:27 ] void MyPrint(int i) { static cnt; printf("%d ", i); cnt++; if(cnt == 5) {printf("\n");cnt=0;} return; } こんな関数をprintfの代わりに使うのはどう?
531 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 22:03:25 ] できたー ありがとうございます
532 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:02:53 ] int main(void) って int main() と C言語は略しちゃいけないんだよね?
533 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:07:14 ] >>532 int main();はお勧めできませんが、 int main()ならどうでもいいと思います。
534 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:08:47 ] 規格をあたってみたところ、関数の定義なら問題ないと読めた。 参照したのがはJIS X3010:2003 (C99翻訳)なんで、C89とかだとどうなのかは知らんが。
535 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:12:11 ] C89でも同じ事です。
536 名前:デフォルトの名無しさん [2007/04/07(土) 03:51:54 ] 素数そっすうそっすうーーー #include <stdio.h> #include <stdlib.h> #include <string.h> void sieve(char *p,int d); int main() { int d = 0,i,k; char buff[256] = {'\0'}; char *p = NULL; fgets(buff,sizeof(buff),stdin); sscanf(buff,"%d",&d); if (d <= 0) {fprintf(stderr,"input positive number and less than INT_MAX number.\n");exit(1);} if ((p = malloc(d))==NULL) {fprintf(stderr,"failed to allocate %d bytes of memory.\n", d);exit(1);} memset(p, '\0', d); sieve(p,d); printf("primes up to %d\n", d); for (i = 0, k = 1; i < d; i++){ if(p[i] == 2){i++;} if (p[i]==0){printf("%-4d ", i+1); k++;} if(!(k%5)){ putchar('\n');k++;} } return 0; } void sieve(char *p,int d) { int i, j; p[0] = 2; for (i=2; i <= d/2; i++) for (j=2; j <= d/i; j++) p[i*j-1]=1; }
537 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 04:10:22 ] インデント無いとこれほどまでに読みにくくなるんだな…
538 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 12:46:42 ] C言語で駄目文字ってどういう時に発生するの?
539 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 12:50:03 ] 駄目文字って何?
540 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 12:53:25 ] Shift_JISで表したときに2バイトめに 0x5c が来る文字を俗に 駄目文字と呼ぶらしい。
541 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 13:21:08 ] 表とか?
542 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 15:21:56 ] カタカナの「ソ」とかな。 >>538 への答えとしては、扱うエンコーディングにShift_JIS(CP932など 類似品も含む)があるときは常にその必要があると思え、くらいか。
543 名前:デフォルトの名無しさん [2007/04/07(土) 15:33:49 ] sizeof演算子 の意味がわかりません。教えてください。
544 名前:デフォルトの名無しさん [2007/04/07(土) 15:54:25 ] 意味ってw 変数の使用バイトを調べる為にあるんだよ マロックとかで変数渡すときに、4って書くよりsizeof(int)って書いた方が分かりやすいからだよw
545 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 15:55:06 ] sizeof(int) : int型のサイズ(4バイトとかそんな感じ) sizeof(hoge) : 変数hogeのサイズ(char hoge[260]なら260) 前者は型のサイズが違っても対応できるように、後者はmalloc(sizeof(hoge))みたいな感じに使う
546 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 16:52:02 ] 典型的な応用例: int array[10]; for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) array[ic] = 0;
547 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 16:59:42 ] 質問者のレベルだと *arrayのところは、array[0]と書いた方が分かりやすいだろう。
548 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 17:30:20 ] 構造体でもパッキングの値に対応した本当のサイズが出るので sizeof は不可欠
549 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 17:54:23 ] sizeofはエロイ
550 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 18:36:20 ] inlineよかまし
551 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 18:59:45 ] >>548 いや、詰め物なくてもsizeofは使うだろ。 メンバ変数のサイズを個別に求めて、合計するわけ?
552 名前:デフォルトの名無しさん [2007/04/07(土) 19:55:09 ] 4って書くよりsizeof(int)って書いた方が分かりやすいからだよw ?intは2バイトじゃないのですか???
553 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 19:59:47 ] >>552 なんで2バイトだと思ってるの?
554 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:00:36 ] 釣りだろうけどマジレスするとintサイズは環境依存、一般的には 8bit, 16bit cpu では2の 32bit cpuでは4 64bit cpuでは4, 8 に分かれる。
555 名前:デフォルトの名無しさん [2007/04/07(土) 20:03:30 ] コンパイラが決めてるってことですか? どーやって決めてるんですかね?
556 名前:デフォルトの名無しさん [2007/04/07(土) 20:06:58 ] 釣りじゃないです。 勉強し始めて、一ヶ月。 わからないことばかりです。 本には、intは2バイトって書かれてるから。 環境依存? むつかしい。前途多難です。
557 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:08:58 ] >>556 すごい古い本つかってないか?
558 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:12:22 ] Javaだと身動き取れないくらいカッチリとサイズが決められてるけど、 Cのintは最低2バイトでshort以上long以下のCPUに都合の良い(が扱いや すい)幅。以上/以下とあるから、どちらかと同じであってもよい。
559 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:15:49 ] C99だと「最低でも32bit以上で、一番速い型」とか指定できるからいいな。
560 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:16:10 ] intが最低2バイトと書いてしまったが、ちゃんと書くと、 1. short: 最低2バイト、longよりは小 2. long: 最低4バイト、shortよりは大 3. short <= int <= long 1.2.からshortとlongの幅が同じになることはないので、3.の等号は 成り立つとしても片方しか成り立たない。
561 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:16:22 ] longとintでサイズ同じなら二つも作って紛らわしくさせんじゃねーよ! とか憤ってた学びたての頃の俺をDQNといわないで下さい
562 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:17:20 ] >>555 実行環境のCPUその他アーキテクチャにとって都合の良い大きさに決まる
563 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:19:24 ] CPUが64ビットだとややこしいな。 int=64ビット long=64ビット int=32ビット long=64ビット int=32ビット long=32ビット long long=64ビット
564 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:19:31 ] >>558 のカッコのなかの「が」は CPUに都合がよい、しかし扱いやすい じゃなくて(逆接になる意味がない)、 CPUに都合がよい(CPUが扱いやすい) の意です……
565 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:20:39 ] >>560 それ間違ってないか? 手元の本にはそんなことは書いてないが。
566 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:27:01 ] shortはshort int、longはlong intの略記であり、 無印intはshort intかlong intのどちらか処理系に都合がよいほうと同じ、 だっけ?
567 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:30:01 ] 手元の本って何だよ。JISのプリントアウトか? まぁ、もちろん規格にも>>560 のような最低hogeバイトとは書いていないけどな。
568 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:38:20 ] >>560 > 1.2.からshortとlongの幅が同じになることはないので、3.の等号は > 成り立つとしても片方しか成り立たない。 実際に sizeof(short) == sizeof(int) == siezeof(long) == 4 な処理系は実在する。
569 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:39:54 ] >>566 intがshort intとlong intのどちらかと 同じ大きさである必要があると定められてはいなかったと思う。 >>567 しかし<limits.h>の定数は少なくともxxx以上・以下でないといけないという規定があり、 そこから必然的にshortとintが16ビット、longが32ビットなければならないということが導かれる。 1バイトが8ビットである環境なら当然2バイトと4バイトになる。 「3.の等号は成り立つとしても片方しか成り立たない」は違うような気がするけど。
570 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:42:07 ] 知っているつもりのことでも、きちんと知らないことってあるんだなあ。
571 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:42:24 ] >>567 新ANSI C言語辞典って本だけど。
572 名前:デフォルトの名無しさん [2007/04/07(土) 20:52:41 ] すごい細かいんですね。 大丈夫かな?? 無理かな??不安になってきた。
573 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:54:37 ] 「どこでも同じとは限らない」ということだけ知ってればOK。
574 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:07:34 ] つまり sizeof(short)=2 sizeof(int)=3 sizeof(long)=4 な処理系があればいいんだ、過去の俺を納得させるだけの為に
575 名前:デフォルトの名無しさん [2007/04/07(土) 21:13:02 ] だからどーやってCPUがバイト割り当ててんだよ その仕組みを教えればいいだろ
576 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:14:09 ] 説明しきれないんだろ? 少なくとも俺はわからん
577 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:16:23 ] CPU < short形が2バイトだの、charが8ビットだのってのは、俺が決めてるわけじゃねーよ。
578 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:17:21 ] 誰がきめてんだよ
579 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:19:28 ] 設計者じゃねーの?
580 名前:デフォルトの名無しさん [2007/04/07(土) 21:20:05 ] 何になるの?? こんな質問方法では、だめか・・。
581 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:21:16 ] 設計者なわけないだろ あたらしいCPUがでたら また設計者があたらしく定義しなおすのか?
582 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:21:50 ] >>575 CPUを設計する人が「これは32ビットCPUだ(1バイト=8ビット)」と言えば、 コンパイラを設計する人はそのCPUで動くコードを出力するコンパイラはintを4バイトにするという具合。
583 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:24:49 ] コンパイラを設計するひとは CPUが新しくできるたびに設計しなおさないといけないってこと?
584 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:25:31 ] CPUのレジスタサイズと、コンパイラの整数型は必ずしも一致してないんだな。 32bitCPUでも、int8のコンパイラがあったり、int64のコンパイラがあったり。
585 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:25:33 ] すんげぇめんどくさいんですね 出来たばっかりのCPUだとプログラミングできないんじゃん
586 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:26:58 ] 毎度新しく決める必要はない。 たとえば80386から続くIntelの32ビットCPUシリーズはIA-32と一括りにされるという具合。
587 名前:デフォルトの名無しさん [2007/04/07(土) 21:27:27 ] なるほど
588 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:33:17 ] もちろんCPUが全てではない。 x86-64では、WindowsはMSがWindows APIをLLP64にすると言い、 VC++もLLP64(long longとポインタが64ビット、intとlongは32ビット)になった。 しかしUnix系では一般的にLP64(longとポインタが64ビット)が採用されていると言う具合。
589 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:14:09 ] 入門者には難しい >_<;
590 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:18:22 ] >>574 そんな環境はないだろうけど、 short = 2 int = 4 long = 8 なら、普通にあるだろ。
591 名前:デフォルトの名無しさん [2007/04/07(土) 23:12:07 ] char K1[]="abcde"; は、 sizeof は、何になるのですか?? 6??なぜ??
592 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:14:31 ] >>591 配列はその全体のサイズになるから。 文字列の場合は最後に0がつくから、みかけのサイズより+1の大きさになる。
593 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:14:32 ] 規格でそう決まっているから
594 名前:デフォルトの名無しさん [2007/04/07(土) 23:21:50 ] 591 \0 じゃなくてですか?
595 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:23:54 ] NULLぽ
596 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:30:20 ] >>595 ガッ
597 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:51:36 ] >>591 暇だったんで俺が決めといたんだ
598 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:09:58 ] >>594 '¥0'なら
599 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:32:27 ] 配列の平均値を求める関数aveを作ってみたんですが これで表示が1としか表示されないんだけどなんでですかね・・・ #include <stdio.h> void ave(int array[]); int main(void){ int a[5]={1,2,3,4,5},i; ave(a); return 0; } void ave(int array[]){ int sum=0,i,m; m=sizeof(array)/sizeof(int); for(i=0;i<m;i++){ sum+=array[i]; } printf("平均=%d\n",sum/m); } 調べてみたら、ave関数のm=sizeof(array)/sizeof(int) がおかしくて、mに1が入ってみるみたいなんです。 配列aの要素数は5だから、mに5を入れたいんだけどどうすりゃいいんですかね?
600 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:39:08 ] >>599 Cでは配列を関数に渡すことはできない。素直に個数も渡すしかない。 cf. void ave(int * array, int nOfArray) { ...; }
601 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:42:02 ] >>599 void ave(int array[]){ これはダメだな int *array と同じでポインタのサイズしか渡さない int *array のポインタサイズ(4バイト) / int のサイズ(4バイト)=1 void ave(int array[],int size) { int sum=0,i,m; m=size/sizeof(int); ・・・・・ } int main() { ・・・・ ave(a,sizeof(a)); とするとか
602 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:13:19 ] you! c++でいっChinaよ
603 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:21:58 ] C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。 main関数で要素数を入れなきゃダメなんですねどうもありがとうでした
604 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:38:01 ] 出来ん事も無いけど STLとか使ったら一瞬で出来ることをなんで悩まないといけないのか って鬱になるから普通はしない
605 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:39:41 ] 課題でeggx(C言語)てので正五角形を作って来いって言われたのですが途方にくれてます。 多角形を描く関数(fillpoly)もあるようですが、頂点の座標がわからないと描けないようで困っています。
606 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:54:27 ] 頂点の座標なら 円の式と、直線の式の交点を求めるとか sin、cosを使うとか
607 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:57:04 ] プログラムと何の関係があるのか分からんが、 正五角形の頂点なら、 k=0, 1, 2, 3, 4 として x = cos(2π/5 * k) y = sin(2π/5 * k) で求まるだろう
608 名前:デフォルトの名無しさん [2007/04/08(日) 08:32:47 ] Cのライブラリ全てが説明されている本って無いですか? 言われて分かる人なら X680x0 libc みたいな本を探している、と言えば早いですかね。 使用する関数名が分かっていれば、man して使い方を知る事は出来るものの、 どんな関数があるのかが分からずで困ってます。 対象は Linux / FreeBSD で、ソツ無く使える本を。
609 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 09:10:47 ] man2とかman3のディレクトリをlsしちゃだめなのか?
610 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 09:41:14 ] 標準Cの範囲なら規格書で充分だろ。
611 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 09:46:47 ] セクション2はCの規格じゃないけどな。
612 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 10:13:48 ] >>604 興味本位でやってみたいからヒント頼む
613 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 11:32:32 ] >>612 C++をやれ
614 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:02:01 ] 以後、配列を扱う場合はかならず構造体の単一メンバにすること。
615 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:02:46 ] オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ
616 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:46:15 ] >>608 は、Unixのシステムコールも含んで、載ってるやつがほしいんじゃないか?
617 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:58:11 ] >>608 あんまりない無い。 www.linux.or.jp/JM/index.html 結局これが一番いいんじゃないかと思う。 入門書としては、UNIX-Cプログラミングを唱っているもので、プロセス・スレッド、 mmap、socletなんかを扱っているものもあるが、中途半端なものばかり。 最終的にはmanみろってことなのかもしれない。 UNIX共通に通用するベース技術・仕様の本といったら、POSIXの規格書とか 解説書あたりがお望みのものに近いか? BSD系はソースが公開されているんだからそれを読んでコミニュティで 解決しろというスタンスが濃い。 Linuxはアプリケーションソフトばかりがとりだたされる傾向にあって、 コアなライブラリ解説なんて皆無に等しい。 オライリーのカーネル本とか、デバドラ本くらいか。
618 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 13:11:02 ] 「ふつうのLinuxプログラミング」あたりでファイルシステムとかストリーム とかシグナルとか、考え方から理解しておいて、あとはmanなんだろうなぁ。
619 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 14:09:16 ] >>613 Cではできないのですか?
620 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 14:15:22 ] >>619 STL は C++ 標準ライブラリ
621 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 14:55:09 ] スティーヴンス本も知らんのか君達は
622 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 15:17:13 ] (´・ω・`)知らんがな
623 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 15:26:18 ] C言語500の極意(うろおぼえ)みたいな本で十分だろ。
624 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:35:41 ] 608です。 皆様からのレスは本屋で携帯から読めて大変参考になりました。 >>615 >オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ C Desktop Reference なる本は見掛けたのですが、これの事? 内容は本の厚さに比例してそこそこと言う感じでした。 初めてCを使う人には良いかも。 >>623 >C言語500の極意(うろおぼえ)みたいな本で十分だろ。 これを見掛けた時は「これか!?」と思ったのですが、内容が・・・ 参考になる点も多かったのですが、今求めている物とは大きくずれてました。 いざ探してみると満足の行く物は確かに無いですね。 みんなどうやってプログラミングしているんだろう?と不思議になってきました。 今にして思うと X680x0 libc は偉業と感じます。 これには標準的な関数ならバッチリ載っているので、残りは >>617 を参考にするのがベターの様です。 本屋で探した感じでは C言語大辞典 がわりとイイ線行ってたので 今度は神保町あたりでじっくり探してみたいと思います。 レスしてくれた方々、有難う御座いました。
625 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:36:11 ] 配列って、絶対アドレス順にしかできないの? a[0]とa[1]はメモリ上となりあわせで a[0]アドレスが100ならa[1]は99といった感じで使いづらい・・・ malloc関数を使ったら、a[0]〜a[それまで]のものが全部初期化されちゃって使いづらい。 今までの配列の要素を変化させずに動的に配列の要素数を変化させることはできないですか? scanf関数を使うたびに配列の要素をひとつずつ増加させるのを作りたいんだけど。 int ct=0,m,*data; data=(int*)malloc(100*sizeof(int)); while(1){ scanf("%d",&m); if(m==0)break; data[ct]=m; ct++; } たとえばこれだと100個以上の入力されるとエラー起こすし、 5個しか入力しないと残りの95個もったいない どうすりゃいいですかね?
626 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:39:05 ] そのための線形リストだ。
627 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:42:26 ] >>625 ・realloc ・std::vector (C++ 限定)
628 名前:デフォルトの名無しさん [2007/04/08(日) 22:09:43 ] ビット演算の意味がわからない。
629 名前:デフォルトの名無しさん [2007/04/08(日) 22:11:34 ] #include<stdio.h> void main(void){ int x,y; scanf("%d,%d",&x,&y); printf("%d",x/y); } 5行目:0で割っています と出るんですが、何故なんでしょうか? x,yには0以外の数字を入力しています
630 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:15:11 ] "%d,%d"のフォーマット通りに入力してる?
631 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:15:15 ] >>620 >>603 の >C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。 に対して >>604 が >出来ん事も無いけど って答えているので、STLってかテンプレート使わずにC言語の機能だけでできるのかなぁと思って聞いてみたわけです。 なんか粘着みたいですいません。
632 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:19:44 ] >>624 いや"C Pocket Reference" もれは英語版を使ってるけど一応ISBNは 0-596-00436-2
633 名前:629 [2007/04/08(日) 22:22:42 ] >>630 すいません、フォーマット通りとはどういうことでしょうか?
634 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:26:52 ] >>630 じゃないが たとえば $ 4,2 にように入力してるかってこと
635 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:27:11 ] 10,2 とか
636 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:29:00 ] 123,456もだな
637 名前:629 [2007/04/08(日) 22:29:46 ] >>634-635 やってませんでした。今やったらできました。ありがとうございます!
638 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:36:36 ] >>636 いやwwwそれいったらintの範囲のその範囲乗までレスがつくぞ
639 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 07:17:09 ] scanfの戻り値みろよ…
640 名前:デフォルトの名無しさん [2007/04/09(月) 10:18:00 ] すいません、どなたかわかる方がいれば回答お願いします C言語のコマンドラインから引数を渡すプログラムで ちゃんと動いてくれませんorz #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ FILE*fin,*fout; char ss[256]; if(argc!=3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL) { printf("入力ファイルをオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("入力ファイルをオープンできません\n"); exit(1); } while (fgets(ss,256,fin) !=NULL){ fputs(ss,fout); } fclose(fin); fclose(fout); return 0; }
641 名前:デフォルトの名無しさん [2007/04/09(月) 10:21:03 ] これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、 としか表示されなくて・・・ 色々調べて試行錯誤したのですが結局一晩かけてもわかりませんっでした こんな自分は問題解決能力がないからPGむいてないのでしょうか(´Д`;)
642 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:24:50 ] >>641 俺の環境ではちゃんと動いたけど?
643 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:25:15 ] >>641 問題無いように見えるけど・・・
644 名前:もしかして、コマンドライン引き数を知らないと言う落ち? mailto:sage [2007/04/09(月) 10:38:51 ] >>640 >これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、 >としか表示されなくて・・・ 漏れの環境では、引き数を指定しないで実行したらそうなった。 期待通りの動作じゃないのか?
645 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:45:37 ] 学びたての頃一日かけてやっとセミコロンが一つ足りないことに気付いたことがある俺の勝ち
646 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:50:17 ] セミコロンが一つって思うだろうがたかが1日じゃないか 3日悩むよりずっといい まだまだだな
647 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:00:17 ] >>640 のfinの宣言部で FILEと*finがくっついて1つの単語になってるように見えるのはオレだけ?
648 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:04:53 ] 俺の三倍とはこやつやりおるわ… hoge.exe piyo.txt のようにコマンドプロンプトに入力すればファイルの中身を表示できるはずです。 くらい書いとけばいいのに、不親切なテキスト(かどうか知らんが)だなぁ
649 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:09:22 ] 漏れなんて、ソースファイル末尾の改行がないためにNULLポン消えなくて一週間悩んだぜ。 #コンパイラが生成するアセンブリ出力の改行が足りなくなると言う素敵なバグの所為だったんだけど。
650 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:18:17 ] >>641 >これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、 ってことは printf("引数の数が違います\n"); が実行されて表示されてるってことで それが実行される条件はプログラムに与えられた引数の数 だからtest.exe a.txt b.txtのようにプログラムに与える引数を変えればいいんじゃない 問題解決能力じゃないと思う たとえばできるだけ客観的に説明する能力とか不足を補う理解力とか 誰もが通る道だけどな向き不向きなんてすぐにはわからん
651 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:21:31 ] >>650 お前は日本語で説明する能力を養え
652 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:26:54 ] PGに不向きな奴は1年持たない 1年持てば問題なす
653 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 12:42:16 ] もれなんて一切コメントがないという芸能人の浮気疑惑のようなプロジェクトを引き継いで マイプライベートタア〜イムを返上して解読&コメントつけていったのに 1ヵ月後に会社が清算を迎えたo... rz
654 名前:デフォルトの名無しさん [2007/04/09(月) 15:35:11 ] >>640 ちゃんと動くんだが?
655 名前:デフォルトの名無しさん [2007/04/09(月) 20:53:17 ] フリーウェアの秀丸のサイトを教えてください
656 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 20:54:50 ] は?
657 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 20:55:17 ] ttp://www5.ocn.ne.jp/~hidemaru/
658 名前:デフォルトの名無しさん [2007/04/09(月) 21:15:23 ] #include <stdio.h> int main(void) { /*文*/ return 0; } 入門書では上のように学んだんですが、コンパイルできれば次のような形式でも 問題ないのでしょうか? #include <stdio.h> main(){ /*文*/ }
659 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:22:17 ] >>658 コンパイルできても上の方が望ましい。
660 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:25:08 ] いや、下のでも問題ないよ。
661 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:30:00 ] 戻り値の書かれていない関数定義はintを返すと見なされる(Cではだっけ?) ので、いいっちゃいい。(許容されるという意味で)
662 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:31:27 ] return 0のほうか。 戻り値を使う予定がないならなんでもいいよ。 型は>>661 にあるようにintになるがどんな値になるかは不明。
663 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 22:46:13 ] >>659->>662 レスありがとうございます。他の人のプログラム見せてもらったとき たまたま見つけて疑問に思った程度なんです。とりあえず、 自分で書くときは習ったやりかたでやっていこうと思います。
664 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 22:58:14 ] >>663 たぶん書き忘れじゃないかと思ふ
665 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 22:58:37 ] >>662 >intになるがどんな値になるかは不明。 あれ?return書かない場合は0返すんじゃなかったか?
666 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:06:02 ] クラスのstaticで宣言したメンバー関数の関数ポインタを持つ事って可能ですか?
667 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:10:06 ] >>665 C++では前からそうだが、CではC99から >>666 C++はスレ違いだが、静的メンバ関数は、非メンバ関数同様に扱える。 ようするに静的メンバ関数へのポインタはただの関数へのポインタで扱える。
668 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:11:14 ] >>666 可能 VCで試した メンバーへのポインタじゃなくてC言語のように普通の関数へのポインタ
669 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:18:43 ] 参考書とかネットの記事とか見てるとmain()内の最後で、 return 0; return (0); って2種類の書き方見るんだけどこれらに明確な違いってあるのか? 低レベルな質問ですまん ><
670 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:24:11 ] >>669 括弧いらない あっても結果は変わらない
671 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:25:28 ] 違いはない。ただし括弧を付けない書き方が一般的。 昔はreturnに括弧を付けなければならなかった。 現在、括弧は不要になったが、あっても式の一部として扱われるのでコンパイルは通る。
672 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:26:01 ] >>670 レスありがとう。やたら気になってたんだ
673 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:28:21 ] >>669 returnは関数じゃなくてステートメントだから付けないてよい。 付けてもエラーにはならないが a = b + c を a = (b) + (c) などと書くのと同じことで冗長。 お作法的な話で言えば、綴りを間違って retrn 0 と書けば即コンパイルエラーだが、 retrn(0) と書いてしまうとそういう関数があるものと仮定されリンク時までエラーが発覚しない。
674 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:29:06 ] >>671 いつの話だ。
675 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 01:48:13 ] sizeof expr はつけなくてよいと分かっていても括弧つけてしまうな…
676 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 02:36:33 ] これは確かに使い分けに迷う。 sizeof(型); sizeof 変数;
677 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 02:42:05 ] 演算子もいってみりゃ関数みたいなもんじゃん ってことで()付けてるけどいいのか?
678 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 03:55:13 ] >>676 変数ではなく式
679 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 04:01:44 ] >>677 別に構いませんよ。 ++(*(&(i)));
680 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 05:33:50 ] 激しくうっとうしいわw
681 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 06:05:28 ] 式だったら尚更()つけないとね
682 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 10:55:06 ] sizeof は、長い行の中に入ることもあって () なしだと見づらくなる場合があるからな でもsizeof() じゃなくて、sizeof () にしてるな。 >>671 return に括弧が必要なときってあったか?
683 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 13:59:08 ] mem = malloc(len * sizeof * mem);
684 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 15:55:00 ] arrayという2次元配列にintの数値が入っています for(i=0;i<array[0][j];i++)という風for文の条件式にしようとしても出来ませんでした こういう場合はどうすればいいのですか
685 名前:640 [2007/04/10(火) 16:10:53 ] やはりちゃんと動いてくれません(´Д`;) >>650 さんの意味がよくわからないのですが >>if((fin=fopen(argv[1],"r"))==NULL) の所のargv[]を1ではなくて他 の数値を渡せということでしょうか??
686 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 16:15:25 ] ちゃんと動かないって…もうちょっと他人にわかるように説明しろよ。 * どういう方法で起動していて、 * どういう挙動をして欲しいのか、 * そして実際はどういう結果になっているのか
687 名前:362 mailto:sage [2007/04/10(火) 16:38:24 ] >>363 型を見てみたらsignedcharでした。 この型しかソケット通信では送れないのでしょうか? >>364 ぐぐってもデータの転送順がかわることしかわかんなかったです>< 多くのデータを一度にsendで送るいい方法はないのですか><
688 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 17:06:16 ] bcpadから直接起動してるから引数渡せてないと予想
689 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 18:53:39 ] 趣味で麻雀をやってるんだけど、自分の打ち方がどれぐらい強いのか試そうと思ってC++のコンパイラさえあればあとは言語が書ければ代打ちソフトが作れるってdllを見たんでCをしてみようと思うんですけど。 これを読めばとりあえず素人はなんとかなるとか、このコンパイラが素人向けでわかりやすいなどありましたら教えてください。 一応Delphiは触るだけ触ったことはあるので言語そのものにアレルギー反応なんかは起こしませんけど、実用的なソフトを作ったことがないのでアルゴリズムなどちんぷんかんぷんです。
690 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:00:07 ] にh
691 名前::: [2007/04/10(火) 19:00:55 ] C言語習ったばかりなんですが、システムを組んでみたいと思ってます。 システムを組むための参考書や問題集は売ってますかね?自分で一から システムを作るのはやはり難しいですか?
692 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:01:30 ] システムの定義を教えてくれ
693 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:03:29 ] >>690 わかりにくかったなら省きますけど要は、素人におすすめできるコンパイラ(いつまでも使えるのならなおいいけどわかりやすさ優先。)と素人向けの参考書を教えてくださいってことです。 OKですか? 眠いのでちょっと日本語がおかしかったのは見逃してください。
694 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:41:38 ] >>693 おまいは、>>690 を見て >にほんg(ry って分かったのかよw だったらなぜ、そもそも改行が出来ないんだ WindowsならBCCでおk
695 名前:687 mailto:sage [2007/04/10(火) 19:58:19 ] キャストしてもデータが途中までしか送れません>< どうすればいいんですか
696 名前:デフォルトの名無しさん [2007/04/10(火) 23:22:31 ] C言語で、char型の配列を確保する時に 領域を指定しないで宣言する方法ってありますか? char *s[]; ←のように宣言してもsのサイズが不明、もしくはゼロとか出て うまくいかないんですが、何かいい方法ありますか? 因みにこの問題ではmallocを使わないでやるという事が前提になってます。
697 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:24:37 ] callocもしくはreallocを使えばいい
698 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:28:27 ] >>695 じゃあ二回に分けて送れば
699 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:35:21 ] 質問です AまたはBならCをする if( A || B ) { C ; } という条件文をA、Bわけて記述した時に、 if( A ) { C ; } else { if( B ) { C ; } } こう記述できると思いますが、Cを1回だけ使うような記述の方法はあるでしょうか?
700 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:39:14 ] 最近、こんなトンチみたいな問題だす学校、多いのかね?
701 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:41:08 ] >>689 それはつまり1人用の麻雀ゲームを作ろうというわけですね それなら簡単なGUIと思考ルーチンが必要です 思考ルーチンは現在の状況, つまり引いた牌と持ち牌(っていうのか?もれは麻雀やらないから言い方違うかも) と相手の打った牌などから次にどの牌を打つかを決める一連の思考の手順のことです これは一般的に一種類あるいは数種類の思考パターンを用意し, これらのような決まった処理のことを アルゴリズムと言う アルゴリズム(思考手順)そのものは言語に依存しないので(もちろん言語によって書き方は異なるかもしれないけど) すでに知っている言語があったら新たにCとかC++を勉強しなくてもOK 思考手順そのものを研究するのが目的ならVBやJavaなどの簡単にGUIが作れる言語が(個人的には)おすすめ これを足がかりにほかのゲームや実用ソフトを作りたいなら将来にわたって使っていけるような言語を選ぶのもあり(CとかC++) もしLinuxなどのUNIX系OSや, プラットフォーム非依存をターゲットとするならJavaが一番手っ取り早い GTKやwxWidgetなどのクロスプラットフォームのツールキットを使うこともできる (こういったツールキットは大抵複数の言語に対応している) あるいはPythonなどのスクリプト言語を使ってみるのもあり でも, ひとこと言わせてもらうと > 自分の打ち方がどれぐらい強いのか試そうと思って の意図はいまいちよくわからないが 作ったプログラムと自分で対戦すると言うなら それは一人二役でゲームをするのと同じだからちょっと無意味っぽいと(個人的に)思う また自分の思考をプログラミングしてほかの人やプログラムと戦わせたいのなら相当の覚悟が必要 人の思考は想像以上に複雑で, 無意識や勘なども作用してくるから 完全に自分の思考回路をプログラミングすることは(現実には)不可能に近い したがって出来上がったプログラムは君自身より弱い また, 何手か先を読むような(ありふれた)機能を盛り込む場合でも 計算しなければいけない手数は爆発的に増えるから(計算量とメモリーの増加), それをいかにして押さえるかとか いろいろとテクニックも必要になってくる ここまで考えるとかなり手間がかかる もれは大学の卒論がチェスのゲーム理論だったからよくわかる
702 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:44:16 ] >>699 do { if( !A ) { if( !B ) { break ; } } C ; }while(0);
703 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:48:24 ] >>699 なぜそうするのかはわからんが 単純にフラグをつけるのもいいんじゃない? Aが真ならflag = TRUE;してBのところでflag == TRUE;ならCを実行しないとか?
704 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:49:25 ] >>699 if( A ) { C ; } else if( B ) { C ; } これじゃダメなのか?
705 名前:704 mailto:sage [2007/04/10(火) 23:52:50 ] >>699 あー1回だけの記述か
706 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:54:18 ] >>699 if(A) { goto l; } else if(B) { l: C; }
707 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:01:42 ] >>699 if(A) goto label1; if(B) goto label1; goto label2; label1: C; label2: ;
708 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:18:16 ] >>699 人気だなww
709 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:30:03 ] で、本当にこれ宿題なのか? だとしたらこんな腐った問題を出す教師ってどんなやつなんだ。
710 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:35:24 ] Q.腐った問題を出す教師自体が腐ってる確率を求めるプログラムを作りなさい
711 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:40:44 ] >>710 int main() { printf("腐った問題を出す教師自体が腐ってる確率=%d%%",100); return 0; }
712 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 01:01:48 ] >>701 えっとですね、あんまり必要ないかと思って省いてしまったんですけど。 東風荘っていうネット雀荘みたいなものがあるんですけど、そのゲームの画面の状況から変数を作るdllを見つけてですね。 上がりや聴牌の判断もそのdllの関数がやってくれるので私はその変数の扱いを設定するだけで麻雀の代うちソフトが作れるようになるわけなんです。 だから、相手は人だし麻雀というゲームを遊ぶための土台の部分は配布されているので単純にアルゴリズムを考えるだけでOKってことなんですよね。 テクニックとしては、プログラムのテクニックよりは麻雀のテクニックのほうが重要だとおもうので簡単という言葉を使わせてもらってます。
713 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 03:44:18 ] そんな面白そうなものがあるのか。 ちょっと探してこよう……と思ったら一発で見つかった。
714 名前:701 mailto:sage [2007/04/11(水) 05:22:28 ] >>712 ほほー便利だなー それなら自分がどんな風に思考しているのかと どうやってそれをアルゴリズムにするのかを悩むだけでいいのかw
715 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 07:56:24 ] if (A) { if (B) { C; } }
716 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:00:29 ] >>715 っ A==1 B==0
717 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:07:36 ] >>715 おちつけ それは、A||Bは(又は)ではなくてA&&B(喝)だ
718 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:07:36 ] 実際こういう場合はどうしたらいいの? 素直に判別式に論理演算使えってこと?
719 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:17:18 ] switch (x) { case A: case B: C; }
720 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:22:28 ] 逆に論理演算を使いたくない理由ってのがわからない
721 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:22:53 ] というかその為に論理演算子があるんだから使ってやれよ… 論理演算子が泣いてるぞ。
722 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:23:43 ] >>719 なんじゃそりゃーーー!(松田優作風に
723 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:23:56 ] AまたはBならCをする。 => AでないかつBでないならCはしない。 というド・モルガンの法則を理解するための課題であった。 なわけはないか。
724 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:22:50 ] >>719 caseは定数しかとらないので A, Bのような式はだめ
725 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:23:38 ] >>699 void f(void){ C; } int main(void){ if(A){ f(); }else if(B){ f(); } }
726 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:28:07 ] #define SHE C void main(void){ if(A){ SHE; }else if(B){ SHE; } }
727 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:29:03 ] ↑訂正 ×void main(void){ ○int main(void){
728 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:52:06 ] >>723 setjmp&longjmp関数の有用性を教えるための課題
729 名前:デフォルトの名無しさん [2007/04/11(水) 10:08:09 ] invalid digit "8" in octal constant invalid digit "9" in octal constant このコンパイルエラーって何ですか?教えてください!
730 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:15:07 ] >>729 8進数なんだから0〜7までで表せよ、 8や9なんてねーよバーカ っていうエラー。整数の頭に0をつけてるだろ。
731 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:15:55 ] >>729 #include<stdio.h> int main(void){ printf("%d\n", 012); /* 数値の頭に 0 が付くと 8進数 */ printf("%d\n", 12); return 0; }
732 名前:729 [2007/04/11(水) 10:22:40 ] >730さん >731さん ありがとうございます! 参考になりました。
733 名前:695 mailto:sage [2007/04/11(水) 10:35:06 ] 整数やら文字列が入った構造体を、ひとつの文字列にするいい方法はないですか?><
734 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:44:08 ] >>733 関数を作る
735 名前:733 mailto:sage [2007/04/11(水) 10:48:45 ] 整数やら文字列が入った構造体を、ひとつの文字列にする関数を作りたいのですが、いい方法はないですか?><
736 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:51:23 ] >>735 構造体晒せ
737 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:52:16 ] いつまでこのアホタレを甘やかす気ですか?><
738 名前:735 mailto:sage [2007/04/11(水) 11:02:14 ] struct test { int i; char c[10]; struct kouzoutai { int seisuu; double kazu; int suu; char moji[10]; }kou; };
739 名前:デフォルトの名無しさん [2007/04/11(水) 11:04:39 ] >>738 釣り乙 死ね
740 名前:735 mailto:sage [2007/04/11(水) 11:04:41 ] 全部snprintfとかstrcatで繋ぐのはめんどくさいです 要するにバイト列と文字列を相互変換できる方法が知りたいのです><
741 名前:735 mailto:sage [2007/04/11(水) 11:05:18 ] 自己解決しました><
742 名前:753 mailto:sage [2007/04/11(水) 11:06:53 ] 爆釣ありがとうございました><
743 名前:740 mailto:sage [2007/04/11(水) 11:07:14 ] >>741 してないです>< とりあえず16進数でずらずらと数字を並べてみることにするです><
744 名前:743 mailto:sage [2007/04/11(水) 11:08:48 ] できました><
745 名前:743 mailto:sage [2007/04/11(水) 11:21:14 ] >>744 まだやってません>< ところで、 sprintf(text, "ABC"); と sscanf("ABC", "%s", text); って strcpy(text, "ABC"); と同じですか?
746 名前:743 mailto:sage [2007/04/11(水) 11:39:57 ] 隣の後輩が教えてくれました>< ありがとうございました><
747 名前:745 mailto:sage [2007/04/11(水) 11:44:37 ] >>746 >< なんとか自分でやってみます。ありがとうございませんでした><
748 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:20:11 ] カオスすぎです><
749 名前:747 mailto:sage [2007/04/11(水) 12:26:13 ] 初心者なのですいません><
750 名前:749 mailto:sage [2007/04/11(水) 14:57:11 ] 構造体へのポインタをunsigned char*型にキャストして 1バイトずつ2桁の16進数に直したら 構造体と文字列の相互変換ができました>< unsigned char *p; unsigned char text[1024], buf[1024]; strcmp(text, ""); p = (char *)&test1.kou; for(i=0; i<sizeof(test1.kou); i++) { sprintf(buf, "%02x", (unsigned char)p[i]); strncat(text, buf, 2); }
751 名前:749 mailto:sage [2007/04/11(水) 14:59:26 ] p = (char *)&test2.kou; for(i=0; i<sizeof(test2.kou); i++) { strncpy(buf, &text[i*2], 2); sscanf(buf, "%02x", &((unsigned char)p[i])); }
752 名前:749 [2007/04/11(水) 15:00:31 ] 以上オナニーでしたありがとうございました><
753 名前:749 mailto:sage [2007/04/11(水) 15:01:26 ] また初心者を装った釣りに来ますのでよろしくです><
754 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 15:02:25 ] もうこなくていいよ
755 名前:751 mailto:sage [2007/04/11(水) 15:04:22 ] >>752-754 ほんとに初心者なのにひどいです><
756 名前:735 mailto:sage [2007/04/11(水) 15:06:39 ] すみませんなんか偽物がレスして話進んでるんですけど>< >>738 から全部偽物です><
757 名前:755 mailto:sage [2007/04/11(水) 15:09:48 ] なら>>756 も偽者ですね><
758 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:04:36 ] >>735 1バイトづつ16進2桁の文字列にしてしまうとか、あるいはコントロールコード などの表示不能な文字はエスケープして表示可能な文字にして、表示可能な 文字はそのままにするとか、あるいは表示する必要が全くないのなら気にせず 全部 write() や fwrite() で出力してしまうとか、方法は色々あります。
759 名前:757 mailto:sage [2007/04/11(水) 17:43:19 ] >>758 >表示不能な文字をエスケープして表示可能な文字にして 文字列←→構造体で相互に変換したいので、文字列から戻す時に もともと表示可能な文字だったのかエスケープして表示可能になった文字なのか 分からなくなってしまうと思うのでこの場合は使えないです><すいません ソケットプログラムでsendするときunsigned char型を使うので、 構造体を文字列にしたかったのですが後は何とか自分でがんばってみるです><
760 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:01:36 ] バイナリを可視なASCII列にするにゃ Base64 エンコが手っ取り早いような気がしないでもない が、構造体の中身をそのまんまエンコして送るのも抵抗があるな。 受け側のアライメントとエンディアン、基本型のサイズの全てが一致してないといけないしね。
761 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:01:41 ] >>759 エンコードした文字列は当然、デコードできる。 例えば不可読文字に遭遇したら%に引き続く二文字を16進の文字コードになるようエンコードする。 デコードするときは当然、その逆をやればいい。注意すべきは、%に遭遇した場合もエンコードしておく必要があることだけだ。 Ex. source: SOH "abc%" LF "def" ETX 20(4バイト整数) EOT encoded: %01abc%25%0adef%03%00%00%00%14%04
762 名前:759 mailto:sage [2007/04/11(水) 18:06:10 ] >>760-761 ありがとうございます><すごく勉強になります %をつける方法だと文字列の長さが一定にならないから送受信のとき大変そうですけど なんとか考えてやってみます
763 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:11:31 ] >>762 ソケットの送受信は長さ決め打ちして読むと泣きを見るわけだが… プロトコルを自前で規定してるか? # fgets 等を使わずに fread と fwrite で同じことを記述できるようにしてから、 # ソケットへ移行したほうが良いと思うぞ。
764 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:12:28 ] バイナリ値主体なら>760、テキスト主体なら>761だな。 #どちらも定番だね。
765 名前:762 mailto:sage [2007/04/11(水) 18:43:32 ] つい最近ソケットプログラムとかを勉強し始めたばかりなのでわからないことばかりで…。 とりあえずBase64というのをやってみることにします><;すいませんでした。
766 名前:765 mailto:sage [2007/04/11(水) 18:58:09 ] 今は文字列と数値を全部snprintfでそのまま繋げてやっていますが 構造体内の変数名とかを全部書かないといけないので ソースが汚いうえ無駄が多いです><
767 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:59:58 ] どういう風にやっているのかは知らないが、 そうやって単なる文字列にするのも一般的だと思うぞ。
768 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 19:03:30 ] 構造体のシリアライズは一大テーマで、 ここで扱うには余白が狭すぎるとは思うんだよなあw
769 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 20:11:51 ] >>713-714 亀ですけど、もし興味わいたなら最強の麻雀のアルゴリズム作ろうぜスレで一緒に最強のアルゴリズムつくりませんか?
770 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:12:05 ] 亀がしゃべった!
771 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:34:43 ] C始めて3日目の俺がきましたよ。 研修でダンプ出力するPGを作成する課題やってるんだけど、 ファイル開く→開いたファイルから16バイト読み込む →読み込んだデータの16進数変換を行いHEXに格納する までは出来たんだが、その後の置換処理がさっぱり分からん('A`) 置換処理はHEXに格納されたデータの表示できないコードを ピリオドに置換してCHARに格納するんだが、検討もつかないし_| ̄|○ 助けてくだしあ
772 名前:デフォルトの名無しさん [2007/04/11(水) 21:40:26 ] >>771 isprint関数を使う isprint(c)? c: '.';
773 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:43:06 ] >>770 亀レスって言葉をご存知?
774 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:44:03 ] >HEXに格納された 意味が不明すぎる char配列に16進数の文字を入れてるって事?数値?
775 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:50:02 ] >>773 く、くまー ネタにマジレ(ry
776 名前:771 mailto:sage [2007/04/11(水) 22:20:05 ] 参考書片手に悩んでた。 >>772 レストンクス ちと考えてみるわ。 >>774 HEXには sprintf(HEX,"%X",ss) でss内の文字列を16進表示で入れたんだが。 おそらく数値?
777 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:25:04 ] >>768 浮動小数点数を有効桁いっぱいいっぱいまで伝達しようとすると悩ましいね
778 名前:714 mailto:sage [2007/04/11(水) 23:14:51 ] >>769 いやオレはもうチェスで懲り懲りだよww プログラム部はだいたい解決策が決まってるけど 思考の部分は定石と言えるような方法がない (まあ思考とプログラムも明確に分けれるもんじゃないけどね) これ以上はスレ違いなんでそのスレの住民と一緒にがんばれ!
779 名前:771 mailto:sage [2007/04/11(水) 23:39:22 ] >>774 自分でも問題の意味を分かってなかったらしい。すまぬ。 HEXDATA CHARADATA | ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄| *|54|45|53|54| | | | | *|T|E|S|T|. |. |. |. |  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄ 見づらくてスマヌ('A`) こんな感じで格納したいわけで。 置換処理でisprint使うっていうのは大体分かったけど、for文で回してなにかしろ みたいなことを講師が言っていた希ガス。何回したらいいの(;´Д`)??
780 名前:771 mailto:sage [2007/04/11(水) 23:40:09 ] なんてこったい。 ステキにずれてらっしゃる_| ̄|○
781 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:43:15 ] 数値をCHARADATAにそのまま書けばいいじゃん
782 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:52:39 ] 回すものといえば皿ぐらいしか
783 名前:771 mailto:sage [2007/04/12(木) 00:06:20 ] レストンクス。 >>781 CHARADATAに書き込むってisprint使ってですかい? >>782 俺の頭の中で星が回ってるよ。
784 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:10:22 ] >>783 isprintで表示できないコードを判別して表示できないのならピリオドを、 表示できるのなら、そのコードを代入
785 名前:771 mailto:sage [2007/04/12(木) 00:15:09 ] >>783 なるほど分かってきた。 isprintで表示できるって判断したときに返す値って何? 表示できないってときは多分0返してくるんだよね?
786 名前:771 mailto:sage [2007/04/12(木) 00:17:48 ] 784の安価ミス
787 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:42:50 ] >>785 そこまでヒントもらってるんだからマニュアルみなよ。ぐぐってもいいしさ。
788 名前:771 mailto:sage [2007/04/12(木) 00:49:03 ] ある程度分かったから参考書片手に頑張ってみるわ。 おまいらありがとう
789 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:32:40 ] >>785 Cの真偽値の基本は、0でない=真、0=偽 真の場合、0でない値として必ず1を返すケースがいくつか定義されているが、 明言されていない場合は、0でないことだけが保証される。
790 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:41:47 ] なんで*(s+1)とs[1]の二つの書き方をつくったのよ>K&R *s++は*にしかできない書き方だし *(*(s+1)+2)は読みにくいからs[1][2]と書くんだけど なんか一貫性に欠けてるぞオイ なんでアメ人は人工言語にこんな汚い要素を持たせるのよ 完璧主義で潔癖症なオレはポインタと配列を使うとき、毎回迷うじゃん
791 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:53:05 ] >>790 *を使わなければいい。 *s++なんてロジックは却って最適化を阻害しかねない。 s[offset++]でいいジャマイカ。
792 名前:デフォルトの名無しさん [2007/04/12(木) 11:56:03 ] 読み込むファイルにひらがなあったら駄目だけどね #include <stdio.h> #include <string.h> #include <ctype.h> #define BUF_SIZE 16 int main() { FILE *fp; char filename[1024] = {'\0'}; char buff[BUF_SIZE] = {'\0'}; char *temp = NULL; size_t len = BUF_SIZE; fgets(filename,sizeof(filename),stdin); if(temp = strchr(filename, '\n')) *temp = '\0'; fp = fopen(filename, "r+b"); while(len == BUF_SIZE){ unsigned int i; len = fread(buff, 1,BUF_SIZE , fp); for(i = 0; i < len; i++) printf("%02x ",(unsigned char)buff[i]); for(; i < BUF_SIZE; i++) printf("-- "); for(i = 0; i < len; i++){ int c = buff[i]; if(isspace(c)) c = ' '; putchar(c); } putchar('\n'); } fclose(fp); return 0; }
793 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:47:04 ] >>791 そうなんだけど *s++ = *t++みたいな記述は確かに便利だし s[i]は添え字の分のメモリーも必要だし ちと読みにくくなるけど *(*(s+1)+2)でいくか
794 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:01:03 ] >>793 >s[i]は添え字の分のメモリーも必要だし ダウト。 今時のコンパイラはどっちで書いても同じコードを吐いてくれる(ことが期待できる)。
795 名前:さいきち [2007/04/12(木) 13:05:57 ] 教えてください。C言語を勉強し始めたひよっこです。 Cコンパイラ(Borland C++)をPCにインストールして、コンパイルしようとしたら 以下のようなエラーがでてウマく行きません。何が原因なのでしょうか? エラー E2209 sample1.c 5: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample1.c 10: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) 10日でおぼえるC言語入門 という本を見て勉強を始めたのですが勉強を進めきれず 困っています。 どなたか教えてください。
796 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:06:10 ] * は直接参照する時しか使わないな。 インデックスを使うときは必ず [ ] を使う。 その方が読みやすい。 全てのループは if と goto で書けるが そう書かないのと同じ事だ。 分かりやすく書くのが至上。 後の事は最近のカシコイコンパイラが最適化してくれる。
797 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:11:11 ] >>795 このあたりから setbcc とかを参考にしてみるといいかもしれない。 ttp://lacc.biz/cpp/cpp01.html
798 名前:さいきち [2007/04/12(木) 13:17:18 ] 大変申し訳ありません。795で質問しました さいきち です。 わたくしはルール違反をしてしまいました。過去ログを調べていません。調べて見ます。 795の質問は『無視』でお願いいたします。
799 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 15:49:17 ] >>798 つい最近まったく同じ質問があって、インストールしたbccがアップデート版だった というのがあったな。
800 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:20:45 ] argv[1]とargv[1][0]ってどう違うのですか? どちらも一つ目のオプションを指してると思うんですが printf( "%p %p\n", argv[1], argv[1][0] ); で表示させると違う値になります
801 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:24:04 ] >>791 >>794 >>796 コンパイラがちゃんと最適化してくれるのか 知らなかった これからは[]で統一する やっぱ*(*(s+1)+2)なんて書かれたらウザいよねw
802 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:25:44 ] >>800 argv[1] はchar* argv[1][0] は char
803 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:27:14 ] argv[0]は&argv[0][0]と同じってことですね
804 名前:766 mailto:sage [2007/04/12(木) 16:36:19 ] 構造体のなかのintをcharに全部変えたらbase64の文字列が短くなって通信ができるようになりました >>760 さんありがとうございました。><
805 名前:デフォルトの名無しさん [2007/04/12(木) 18:42:57 ] 入力した数字が0ではない間ループするってやつで int aho[100]; int i=0; while(aho[i]!=0){ scanf("%d",&aho[i]); i++;} ってやると0入力してもおわらんのだけどなんでじゃ?
806 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 18:51:52 ] >>805 標準入力からaho[0]に数値が入力されてるのに、while文の判定ではaho[1] 見てるからじゃね?
807 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 18:54:45 ] >>805 「入力した数字」なのだから、入力前に検査しちゃダメだろう。 do { scanf("%d", & aho[i]); ++i; } while (aho[i - 1] != 0); or int tmp = 0; do { scanf("%d", & tmp); aho[i] = tmp; ++i; } while (tmp != 0); いずれにしても、scanf()をそのまま使うのはお勧めできないが。
808 名前:デフォルトの名無しさん [2007/04/12(木) 20:37:29 ] >>806 〜>>807 ほんとだw ありがとう
809 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 21:05:32 ] >>800 別に配列にしたからって、より最適化してくれるってわけでもないがな。