1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ] C言語の入門者向け解説スレです。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 35 pc11.2ch.net/test/read.cgi/tech/1219761846/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
357 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:24:28 ] 正しいと思う場所に入れてみたら?
358 名前:350 mailto:sage [2008/09/27(土) 14:38:05 ] 勉強になりました。ありがとうございます。
359 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:44:27 ] >>349 そのていどwebで十分
360 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 15:46:20 ] >>355-357 goto入れる場所変えたらどうにかなるもんでもないでそ。 >>355 のgoto文以外の並びじゃどうあがいても無理。
361 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 17:27:47 ] 皮肉もわからないのかお前は
362 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 20:19:29 ] か・・皮肉?
363 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 21:35:05 ] kuma-
364 名前:デフォルトの名無しさん [2008/09/27(土) 21:44:46 ] goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり
365 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:12:52 ] switch( !条件1 ){ case 0: 処理1; if( 条件2 ){ 処理2; break; } case 1: 処理3; }
366 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:17:12 ] しつこい
367 名前:デフォルトの名無しさん [2008/09/27(土) 22:57:13 ] Cに限らないかもしれないけど 0 < hoge みたいに比較演算子使うときに定数を左辺に持ってくる書き方は どのようなメリットがあるのですか?
368 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:09 ] 見た目が分かりやすくなるという人も居る
369 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:50 ] >>367 イメージとして数直線があるとき
370 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:01:03 ] 0 < hoge && hoge < 10 なんかだと数学の書き方にちょっと似る
371 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:08:13 ] もう何年も>演算子を使っていない
372 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:09:49 ] >>370 0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。
373 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:10:10 ] >>371 よう俺
374 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:12:44 ] >>368 自分は代入演算子と間違えないためかと思ってました >>369 なるほど〜 数直線なんて単語すっかり忘れてました >>370 そういう使い方もあるのですね とても参考になりました ありがとうございます
375 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:25:39 ] int配列で hoge[] = {1,2,3,4} みたいな物を 1234と連結させたint型に直したい時に なにか賢い方法ありますか?
376 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:27:34 ] >>375 1234と連結させたint型とはなんですか? 10進数の1234ですか。
377 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:28:14 ] ごめんなさい、そうです
378 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:34:06 ] for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];
379 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:17:06 ] 標準ライブラリの関数ってどのぐらい早いの?
380 名前:デフォルトの名無しさん [2008/09/28(日) 08:47:23 ] Windowsで、system("test.exe")と実行ファイルを呼び出したとき、 test.exeはどのパスにあるか調べる方法はありますか?
381 名前:デフォルトの名無しさん [2008/09/28(日) 08:50:53 ] もしくは、test.exeが利用可能か調べる方法でも良いです。
382 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:58:32 ] >>380 つmain
383 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:01:41 ] >>379 例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い
384 名前:デフォルトの名無しさん [2008/09/28(日) 09:02:59 ] >>382 もうちょい教えてください。やり方判りません
385 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:40:52 ] >>382 じゃないけどargc、argvを貰えと言ってるんだと思う
386 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:43:21 ] 二次元配列を別の関数へ渡す時 なぜこの方法で渡せるのかわかりません。 [2][2]で受け渡したいです。 void func(int array[][2]); //関数宣言 void mainf(){ int array[2][2]={1,2, 3,4}; func(array) } void func(int array[][2]){ }
387 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:01:23 ] [2][2]でも渡せる。 なぜ[][2]で渡せるかは配列の構造を調べてみるべし
388 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:05:12 ] >>387 配列は 最初のアドレスとデータ型さえわかれば 次の番地がわかるってことですか? そんでNULLまでが範囲ってことですか? 2次元だと添字情報がないと 次の番地がわからないので 書かなきゃいけないってことですね? 日本語でちゃんと説明できませんが なんとなくわかりました。
389 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:11:02 ] >>388 ただし、範囲のチェックはやってない。
390 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 11:49:54 BE:418780962-2BP(100)] >>380 環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ? なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。
391 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 11:57:31 ] >>390 カレントディレクトリは一番最初でしょう。
392 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 12:34:20 BE:1710022177-2BP(100)] 内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ の順番か。ごめんなさい><
393 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:42:25 ] 違うだろ
394 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:19:25 ] 環境による
395 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:21:16 ] windowsの話してるんだろ
396 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:44:40 ] というかC関係ないね
397 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 15:12:09 ] だよな
398 名前:くさかべ様 [2008/09/28(日) 16:44:19 ] まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。
399 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 16:48:57 ] 豆でも食ってろ
400 名前:デフォルトの名無しさん [2008/09/28(日) 18:18:09 ] すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても 使えるときいたのですが、本当ですか? 以前、ボーランドという会社のコンパイラを使おうと思ったのですが うまくいかなかったので。。 もし、なにも設定しなくてもいいなら、つかってみたいんですが。 よろしくお願いします。
401 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:21:46 ] Eclipseはコンパイラじゃないよ
402 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:23:06 ] >>400 なにも設定したくないならvisualstudioおすすめ
403 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:26:45 ] PCの基礎知識が無いのにプログラミングは早すぎる
404 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:38:19 ] パスも通せないでプログラムですか
405 名前:400 mailto:sage [2008/09/28(日) 18:40:10 ] みなさん、ありがとうございます。やはり、私には無理みたいですね。 一度プログラムというのをやってみたいと思っていたのです。 visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。 このいたの上にも情報があるみたいですね。ありがとうございました。
406 名前:デフォルトの名無しさん [2008/09/28(日) 19:24:39 ] >>405 がんがれノシ
407 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 19:31:03 ] >>405 まあ、これで覚えろ きっかけが無いと覚えれないしな。
408 名前:デフォルトの名無しさん [2008/09/28(日) 22:19:16 ] main関数の2番目の引数の char *argv[] って、argv[]っていう配列へのぽちんたという意味なのか、 ぽちんた変数配列argvっていう意味なのかどっちなの? 教えてエロイ人。
409 名前:408 [2008/09/28(日) 22:20:06 ] まちがえた。 ぽちんた変数配列argvっていう意味 ↓ ぽちんた変数の配列argvっていう意味
410 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:25:00 ] char *argv[]っていう書式的にはぽちんた変数の配列argv っていう意味で合ってる でも実際はchar **argvだけど
411 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:26:37 ] ぽちんた変数と呼ぶのが今の流行りなのか?
412 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:34:33 ] 幼稚な奴にあわせる必要は無い
413 名前:408 mailto:sage [2008/09/28(日) 22:56:14 ] みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。 細かいところがむずかしいね。ありがとう。よくわかったよ。
414 名前:デフォルトの名無しさん [2008/09/28(日) 23:05:44 ] ぽちんた言いたいだけやろ
415 名前:デフォルトの名無しさん [2008/09/28(日) 23:26:54 ] fgetsでstdinから文字を取得します。改行文字まで取得してしまうそうですが、 改行文字をなくしたいです。どうすればいいですか?
416 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 23:28:23 ] >>415 最後の改行文字をヌル文字に書き換える
417 名前:416 [2008/09/28(日) 23:39:06 ] なるほど、感涙。ありがとうございました。>>416
418 名前:デフォルトの名無しさん [2008/09/29(月) 01:29:14 ] ある本を本でいたら(1990年くらいの本)、文字列はこう表現しますなんて記述で *str = "abcde"; ってかいてあったんだ。でも今の本はたいてい char str[80] = "abcde"ってかいてある。 最初の本のことが頭にあったから、char *str1=""; *str2="";と宣言してそれにgetsで読み込ませたら str1のあとに必ずstr2の文字まで連結されて格納されてしまうんだけど、それはやっぱそういうことで stdinから読み込ませる文字列を格納するのは、ポインタでなく配列で宣言しなくちゃいけないわけなの? なんか、こないだ立ち読みしてた本でも文字列はポインタで表現みたいな事が強調してあったから 読み込ませる文字列もポインタに読み込ませればいいのかなとおもったんだけど。 すまそ。寝るのでお礼は明日になります。教えてくれる方、よろしくお願いします。
419 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:38:11 ] 結論から言うと全然違う おまえが無茶苦茶してるだけ 眠い上に長くなるから今説明しないけど
420 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:39:30 ] 結論だけ言うと、配列で宣言しなくちゃいけない
421 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:15:22 ] ファイルから13バイトのデータを読むために struct database { char boolen; long data[3]; }; このような構造体を作ってfreadで読み込んだのですが charのところで4バイト読み込み、最初の1バイトだけ変数に入れて3バイト破棄するという変な動作をします。 printf("%d\n",sizeof(struct database)); で表示させたところ16と表示されどうにもこうにもできません。 どうすればちゃんと1バイトだけ読み込むのか教えてください。お願いします。
422 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:42:34 ] >>421 構造体メンバのアライメント(バウンダリ)の問題だと思う。
423 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:45:07 ] そのコンパイラでは以下のようなアラインメントになっている *--- char boolean **** float data[1] **** float data[1] **** float data[2]
424 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:47:51 ] 1バイト読む->boolenに格納 4バイト読む->data[0]に格納 4バイト読む->data[1]に格納 4バイト読む->data[2]に格納 とすればおk
425 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 05:35:56 ] 1バイト読んでから再度freadで12バイト読まないとダメ
426 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 06:15:10 ] #pragma pack()とかパディングを無くす抜け道はある しかし>>424 ,425さんのように手間を惜しまない方が賢明
427 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 08:37:49 ] >>418 とりあえず、本は買って隅から隅まで読め
428 名前:421 mailto:sage [2008/09/29(月) 09:50:01 ] >>422-426 ありがとうございます。 コンパイラの仕様でそうなっているんですか。 やっぱり一気に読むより個別に読んだほうが確実ですね。
429 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 09:59:04 ] まあ個別に読むのもいいけど、アライメントについて調べておいたほうがいいよ。 書くときにも同じことやりそうだし。
430 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:05:10 ] >>421 union chinpo { char str1[13]; struct database { char boolen; long data[3]; }; ユニオン使って、srt1で一括読み込みすればいいですよ。
431 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:21:47 ] >>430 うそつくな
432 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:50:48 BE:556925928-2BP(40)] >>430 >>429
433 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:02:24 ] >>418 > でも今の本はたいてい char str[80] = "abcde"ってかいてある。 そんなことねーだろ。
434 名前:430 mailto:sage [2008/09/29(月) 22:28:12 ] カンで書いてみたけどやっぱダメかw ごめんねごめんね^^
435 名前:デフォルトの名無しさん [2008/09/29(月) 22:31:16 ] >>434 せめてやりとりぐらいは呼んでからレスしてね
436 名前:デフォルトの名無しさん [2008/09/29(月) 22:53:58 ] カタカナ表記のユニオンがいいな ユニックス的でいかすぜ
437 名前:418 mailto:sage [2008/09/30(火) 00:56:23 ] >>419-420 どうもありがとうございます。これからは、標準入力から入力する文字列は 必ず、配列で宣言するようにします><;ありがとうございました。
438 名前:デフォルトの名無しさん [2008/09/30(火) 00:57:38 ] すみません。グローバル変数とローカル変数を同じ名前にしてしまい、 printfで出力しようとおもったら、困りました。出力できませんかね?
439 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 00:58:06 ] 片方の名前を変えればおk
440 名前:438 mailto:sage [2008/09/30(火) 01:29:39 ] >>439 やはり無理みたいですね。ローカル変数の名前を変えます。ありがとうございました。
441 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 01:36:52 ] >>438 影響範囲が大きすぎて触るのが怖い場合は、グローバル変数にアクセスするための関数を作ればおk #include<stdio.h> int value=1234; char string[256]="this is global."; int *global_value(void){ return &value; } char *global_string(void){ return string; } int main(void) { int value=2345; char string[256]="this is local."; printf("value=%d\n", value); printf("string=%s\n", string); printf("value=%d\n", *global_value()); printf("string=%s\n", global_string()); return 0; }
442 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:42:43 ] グローバル変数ってあんま使わないほうがいいの? ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど
443 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:46:38 ] >>442 そのグローバル領域の使い方次第じゃないの? アクセス速度ばっかり追求しすぎて別ソースに書かれてる 領域へexternでアクセスしてればわかりにくいソースになるし。 速度は犠牲になるけど、別ソースで持ってる領域へアクセスする場合は アクセス用関数を用意して領域をいじるとかね。 あとは命名規則をしっかり作って、どこ管理の関数・領域かが 一目でわかるようにしてあればexternで触っても問題ないだろうし。
444 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:25:57 ] Insufficient memory(out of memory) in function cvalloc というエラーが出てプログラムがとまってしまいます。 これを防ぐにはどうしたらいいでしょうか。
445 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:31:17 ] >>444 メモリが足らない、と言ってる ・メモリを増やす ・メモリの使い方を見直して無駄遣いを減らすなり節約するなり
446 名前:デフォルトの名無しさん [2008/09/30(火) 17:25:04 ] >>442 そう思うなら、とことんやってみれ なんでダメなのかもわからん奴が教条主義的に嫌って書いたコードは おぬしのコードよりダメだぜ、きっと
447 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:50:35 ] void ChangeWtoM(char *malt, char *wide, int len_wide) { int i, j; for(i = 0, j = 0; i < len_wide*2; i++){ if(wide[i] != '\0') malt[j++] = wide[i]; } malt[j] = '\0'; } int main() { TCHAR wide[64] = L"testテストですtest"; char malt[64]; ChangeWtoM(malt, (char*)wide, lstrlen(wide)); printf("%s", malt); return 0; } ワイド文字文字列をマルチバイト文字列に変換する関数を作りたいのです。 いろいろ試してみたのですが上手く行きません。 これは何がいけないのでしょうか。
448 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:04:05 ] そもそもTCHAR型がなんなのか理解しているか
449 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:08:39 ] 突っ込みどころが多すぎる。 環境は?汎用的に作ると長くなるから特定したほうがいいかも。
450 名前:447 mailto:sage [2008/09/30(火) 18:10:13 ] 1文字に2バイト使うcharで1バイトしか要らない場合は'\0'が入ってる だと思っているんですけど
451 名前:447 mailto:sage [2008/09/30(火) 18:11:59 ] >>449 OSはWindowsXP、コンパイラはVisualC++2008です。
452 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:12:55 ] >>450 実際のワイド文字列とマルチバイト文字列を見比べてみ void p(char *p, int len) { int i; for (i = 0; i < len; i++) printf("%02x ", p[i] & 255); printf("\n"); } int main() { wchar_t *wide = L"testテストですtest"; char *mb = "testテストですtest"; p((char*) wide, wcslen(wide) * 2); p(mb, strlen(mb)); }
453 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:13:35 ] >>450 文字コードの種類を一度勉強したほうがいいよ。 どうせS-JIS、JIS,
454 名前:453 mailto:sage [2008/09/30(火) 18:14:21 ] 途中になった EUC,UTF系との相互変換とかくらいだろうし
455 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:17:02 ] Windowsなら、WideCharToMultiByte()APIがあるから、それ使うか、 VC++なら、CStringを使って、、、っとこれはC++だからスレ違いか。
456 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:21:52 ] >>452-455 ありがとうございます アドバイスを元にいろいろ調べてみます
457 名前:デフォルトの名無しさん [2008/09/30(火) 20:00:21 ] 関数ポインタの配列を使って、色々と作成してるんだけど、 たとえば int (*p[5])(int x, int y)っていう関数へのポインタ変数の配列pをつくったとする この配列に格納できる関数は戻り値がint型で、引数はint型を2つとる関数じゃないと だめみたいなんだけど、Cでは色んな型の戻り値や引数を持つ関数をたくさん収納できる 配列っていうのは、作成できないんですか?よくわからないけど、void型で宣言しておいてあとでキャストするとかしても 無理なんでしょうか?よろしくお願いしますm(_ _)m