1read 100read
2012年08月プログラム13: C言語なら俺に聞け(入門編)Part 110 (939)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
Cygwin + MinGW + GCC 相談室 Part 6 (953)
推薦図書/必読書のためのスレッド 69 (278)
VBプログラマ質問スレ(Ver.6.0 まで) part60 (631)
DarkBASIC (456)
【RAD統合環境】 Qt 総合スレ 14 【Win/Mac/Linux】 (397)
【O3D】HTML5用 3D API WebGL 【Canvas:3D】 (479)
C言語なら俺に聞け(入門編)Part 110
1 :2012/11/17 〜 最終レス :2012/12/08 C言語の入門者向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 109 http://toro.2ch.net/test/read.cgi/tech/1350461655/ ★過去スレ http://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 ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 159代目 http://toro.2ch.net/test/read.cgi/tech/1342966104/ ★C++言語については避けてください。C++対応明記スレへどうぞ。 ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。 # サイズが大きい場合はアップローダ等を利用してください。 http://codepad.org/ http://ideone.com/ ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2 : < `∀´> ニダー
3 : /* NOTREACHED */
4 : /* FALLTHROUGH */
5 : ここまでテンプレ
6 : >>http://toro.2ch.net/test/read.cgi/tech/1350461655/989 前スレの変数定義を含むヘッダファイルのincludeだけど、ヘッダの内容を変更してもいいならこれで通るんじゃない? @DEV.hの内容を変更して上書きするプログラムを作成、DEV.h更新毎に実行する。処理内容は、 int data[] = {0, 1, 2}; みたいな行を、以下に展開する(#if追加、externの分岐)。 #ifndef DEV_H_INCLUDED int data[] = {0, 1, 2}; #else extern int data[]; #endif AA〜C.cのいずれか1つ #include "DEV.h" Bそれ以外 #define DEV_H_INCLUDED #include "DEV.h"
7 : >>6 毎度毎度やってらんねって話だからどうだろう
8 : ヘッダいじっていいなら削除すればいいだろ
9 : そりゃヘッダ直して良いならなんでもありだろ ビルドスクリプトに組み込むもよし
10 : >>7-8 いやさ、これだと差分探してBにもCにもコピペするっていう手間は省けるじゃん。 DEV.hが更新されたら置換exeをダブルクリックするだけよくて、A〜Cが毎回の変更されることもないし。 ヘッダ内での定義を削除するだけだと、ヘッダ内の変数名はそのままdataで初期値がこっそり変更されてた場合、 A〜Cのいずれかに変更後のdataの定義を反映させないといけなくなるし見落とすかもだし。 >>9 989!どうなんやコラ!! 変更してもいい感じですか?
11 : 正しい対応は前スレの921 ↓とても邪道な対応法(ネタ) #ifdef DEFINE_DATA static int data_[]; #define data *data = data_; static int data_ #else #define data *data; static int data_ #endif #include "DEV.h" #undef data Qzはレス禁止。再利用も禁止。アイデアの盗用禁止。
12 : × 正しい対応は前スレの921 ● 正しい対応は前スレの991
13 : C言語でプリコンパイルチューナーを作っているんですが ()の付け忘れとかに;が付け忘れていたら自動的に付けてくれるように したいのですがどうすればいいでしょうか? for()と printf()の場合 for()の後ろには;はつけないですがprintf()の後ろには;を付けます。
14 : hogehoge() + 1 みたいな数式で発狂しそうだな。
15 : 皆様アドバイスありがとうございます。 DEV.hの修正は問題ありませんが、 頻繁に変更されのるのでその都度、DEV.hに修正を加えるのではあれば、 コピペが面倒という目的からずれてしまうので・・・ 990様のアドバイス通り、ラッパを作成して一つのファイルのみしか インクルードしない様に修正したいと思います。 メーカに文句も言いますがいつ修正されるか分かりませんので。 ありがとうございました。
16 : >>14 ツールとして無いですかね? 制御式の所を丸括弧にしたり、配列の括弧を波括弧にしたり する間違いが多くて.... デバッグメントしてると時間がかかりすぎて
17 : >>16 補完機能やスニペット、フォーマッタのあるIDE使えばいいよ。eclipseとかVC++とか。
18 : C言語というよりプログラミングの話なのですが良いでしょか。 よく似た処理を行う関数が2つあります。処理の8割は同じコードになります。 しかし2つの関数の引数は一部違っています。例えばこのように。 FuncA( int a, char *s); FuncB( int a, int b , int c); この場合どうコーディングするのがベターでしょうか。理由も教えて下さい。 (1)処理の同じ部分は無視して、全く別々に関数をふたつ作る。 (2)処理の同じ部分を切り出してみっつめの関数を作り、ふたつの関数から呼び出すようにする。 (3)ひとつの関数を作って、引数にフラグを追加して、関数の内部で処理を分ける。 (4)その他に良い案があれば
19 : c言語でオーバーロード的な事を実装したらいいんじゃないか?
20 : >>18 2か3で
21 : そもそもヘッダファイルに実体を吐く時点でツール側の設計が おかしいんだけど、組み込みの世界は割とそういうのがある。
22 : ハード屋が書いてる?
23 : C言語で3次元配列ってどうしたらいい?
24 : 1次元配列が3重になってるだけだから。 int a[10][10][10]; とかすればいい。
25 : ハード屋ソフト屋は関係ないんじゃね? 能力が低いとか別の理由だよ
26 : もしかしたら使うほうがヘボなだけで 何かマクロ定義すりゃいいだけになってる可能性もある
27 : 結論としては>>25 だけど、ツール作ってるのがソフト専業ではない ハード屋だからっていうのは確かにありそうな話。 多数のファイルから参照するヘッダをどう作るべきかという基本を 知らないんでしょう。
28 : ヘッダファイルの利点がよく分からない
29 : c#のsystem.diagnostics.debug.writeline()に相当する関数はありますか?
30 : fprintf(stderr,"msg");
31 : int *p; int* p; これってアスタリスクの位置が違うだけで、意味同じですよね どっちに書くかは人の好みってことで
32 : ハード屋がドライバを書き ソフト屋がドライバから逃げ回りwww
33 : ハード屋の設計ミスなのにソフト屋が尻拭いさせられる
34 : このコードって安全 かつ ポインタの使い方は正しいですか? int *memoryPointer; int MEMORY_SIZE = 1024; memoryPointer = (int*)calloc(MEMORY_SIZE, sizeof(int)); for (int i = 0; i < MEMORY_SIZE; i++) { *(memoryPointer + i) = i; } for (int i = 0; i < MEMORY_SIZE; i++) { std::cout << "アドレス:" << memoryPointer << " 値:" << *memoryPointer << std::endl; memoryPointer++; }
35 : >>34 スレ違い。それC++でしょ。
36 : >>34 malloc とかで確保したアドレスは大事に取っておいたほうが free するときに困らない
37 : >>31 はい
38 : C++つかうなら、メモリはnew, delete
39 : >>36 http://toro.2ch.net/test/read.cgi/tech/1352812333/
40 : >>39 あなたはおバカさんですよね?
41 : >>34 個人的には > for (int i = 0; i < MEMORY_SIZE; i++) { > *(memoryPointer + i) = i; > } ↓ for (int i = 0; i < MEMORY_SIZE; i++) { memoryPointer[i] = i; } の方がしっくり来る。
42 : >38 mallocでも良い 必要に応じて使い分ける
43 : >>34 個人的には > for (int i = 0; i < MEMORY_SIZE; i++) { > *(memoryPointer + i) = i; > } ↓ for (int i = 0; i < MEMORY_SIZE; i++) { *memoryPointer++ = i; } memoryPointer -= MEMORY_SIZE; の方がしっくり来る。 あと全領域どっちみち初期化するならcallocは時間の無駄じゃないかな。
44 : テキストファイル内の各単語の出現回数を出力するプログラムを組みたいんですが codepad.org/S50sUd2z 出現する単語を縦に書き並べてアルファベット順にソートして、出力するプログラムです この隣り合った行の単語同士でstrcmpして、値が0になれば頻度数wrdfreqを加算、そうでなければ前の単語wrdを一旦出力、頻度数の加算を最後にしてwrd, wrdfreqを初期化、という方針を考えています (忍法帖リセット食らったみたいでリンクできません)
45 : ポインタにインデックスつけてアクセスするのとポインタ自体を インクリメントするのは結果は同じでも意味は全然違うぞ。
46 : 続/き/で/す さ/く/ら/が/咲/い/て/ま/す/よ/。/食/ら/う/の/で/対/策/し/て/ま/す 2/つ/目/の/p/r/i/n/t/f/ま/で/大/丈/夫/で/すが/、/そ/の/先/S/e/g/m/e/n/t/a/t/i/o/n f/a/u/l/t/に/な/っ/て/い/ま/す ポ/イ/ン/タ/は/ま/だ勉/強/途/中で/す こ/の/場/合/は/ど/う/す/れ/ばい/いで/すか テ/キ/ス/ト/は/こ/れ/を/標/準/入/力/し/て/く/だ/さ/い d/b/./t/t//Y/r/A/0/M/8/C/Y
47 : >>45 意味が違っても結果が同じならいいじゃないか。 プログラマは詩人ではない。工作屋だ。
48 : >>45 >>47 実行速度も変わるケースが多いから 速度が影響するシステムなら 書き方にも意識してプログラミングすべき
49 : お前らレスありがとう >>35 , >>38 std::cout使っているけど、めっちゃC言語の勉強してる
50 : C言語初心者にオススメの書籍を教えてください
51 : 神の誕生
52 : はじめてのC
53 : 関数ポインタの配列の長さを知りたいんですが、C#だとこんな感じです var l = new List<Action<string>>(); l.Add(new Action<string>(m => {})); System.Diagnostics.Debug.WriteLine(l.Count); Cだとこれでいいんですか? void (*func[])(const char*) = {printMsg, printMsg2}; int size = sizeof(func) / sizeof(printMsg);
54 : char msg[] = "msg"; msgの値は変更することが出来ないんですよね? だから、msg++とかが出来ない。 const char *msg = "msg"; こっちは、msg++;ができます。これは、msg = hellw;は出来ないけど、msgに保持しているアドレスは 上書き可能ってことですか?
55 : >>17 Sublime Text 2 も結構いい。
56 : >>54 配列として宣言されたmsgはリテラル(アドレス値)だから 変更できない。msgのアドレスから保持している文字列は 変更可能だけど。 ポインタ変数として宣言された*msgはmsgというポインタ変数に "msg"という「コンパイラがどこかに定義した文字列」のアドレス を代入している。msgがポインタ変数だから増減もできる。 msg[]の場合 msg 'm' msg+1 's' msg+2 'g' *msgの場合 msg = 0x???????? 0x???????? 'm' 0x????????+1 's' 0x????????+2 'g' ということ。
57 : >>56 あとconstと配列とポインタに関する認識が根本的に間違ってる。 エキスパートCプログラミングを買って100回読破せよ。
58 : >53 int size = sizeof(func) / sizeof(func[0]);
59 : C言語に限らずかもしれないですけど、コンパイルされてCPUが分かる命令コード 01のならびに変換されると言いますよね。もちろんターゲットCPUが違えば変換コード も違うのでx86系とPowerPC系のコードが違うのは分かるんですが、じゃ、同じx86系 で動くWindowsとLinuxの場合、なんでプログラムが互換じゃないんでしょうか。 このときOSは何の役割をやっているのですか?
60 : >>59 OSはABI(レジスタに積む/スタックに積む)やファンクションコール(int 21h/int 0x80h)やバイナリフォーマット(COFF/ELF)を規定する。 OSによってABIやファンクションコールやバイナリフォーマットが違う。 アプリケーションって命令コードだけでできてるんじゃないんだよ。
61 : >>60 そうすると、OS+CPUの組を指定して生成されるコードは OSのAPIのコード+ターゲットCPUのコードということなんでしょうか。
62 : OSつうかローダだろ
63 : OSっていうのはフレームワークを提供するだけだから たとえマシンコードが同じでも違うフレームワーク用の プログラムは動かない。 そういうこと。
64 : >>61 Cに関して言えばライブラリである程度隠蔽されるから直接ファンクションコールを叩くようなコードを生成することはまずない。 バイナリフォーマットとABIの問題が大きい。 しかし、バイナリレベルでの互換性を確保したところで 次は利用できるライブラリやデバイスの差異という壁が立ちはだかることになる。 directxやwinapiはwindowsでしか使えないみたいな。
65 : >>59 OSが許せば システムコールやWinXXAPI使わなければ 互換ですよ VMとかで試せば判る
66 : codepadでファイル入出力がしたい場合どうすれば?
67 : http://codepad.org/about Paranoia When your app is remote code execution, you have to expect security problems. Rather than rely on just the chroot and ptrace supervisor, I've taken some additional precautions: The supervisor processes run on virtual machines, which are firewalled such that they are incapable of making outgoing connections. The machines that run the virtual machines are also heavily firewalled, and restored from their source images periodically.
68 : あるところでnewしたポインタに後にアクセスすると、中身が変わっていたりセグフォが起きます こういう現象は何が問題なんでしょうか? newでなくmallocでも同じです クラスメンバ float* p; クラスメンバ関数 void fun1(){ p=new float[num] //略 } void fun2(){ //pの要素にアクセスすると中身が変わってる //pの先頭アドレスも変わってる }
69 : 内容が変わるのはどこかで書き換えるようなことしてるから アドレスが変わるのはreallocなりしたからだろ
70 : >>68 これだけではわからん 症状が再現する最小のコードをcodepadに上げて実行してみてくれ
71 : スタックぶっ壊してpが書き換わってるに一票
72 : 書かれてない部分のコードに問題があるな
73 : static float*p0,**p1; void fun2(){ flaot*p; *p1=&p; p=p0=malloc(x); … ポインタ操作; assert(*p0==**p1); …}
74 : バグは本人が関係無いと思っている場所にこそ在る
75 : static関数はprivateなので、ヘッダファイルに書かないのが一般的なのでしょうか?
76 : うん、一般的だよ
77 : >>76 thx
78 : ポインタ/配列は色々とコードを書かないとよくわかない事が分かった。 高級言語では気にしなくていいメモリ管理がここまで面倒だとは... とりあえず、色々とメモリ破壊してC言語覚えていくしかないのかー
79 : >>73 > flaot*p; > *p1=&p; p=p0=malloc(x); ↓ > float*p; > p=p0=malloc(x); *p1=&p; 順序が逆では?
80 : 失敬。勘違いしたorz >>79 は間違い
81 : 68です レスしてくださった方々ありがとうございました これから見直してみます
82 : >>78 うん。本をパラパラめくって見ているだけではわからない。 実践的な意味のあるコードを書き、動作を確認して初めてわかる。 よく入門書にある、下のようなコードはダメだ。 これを見てふーんとわかるのなら既に入門者ではない。 int a, *b; a = 10; b = &a; printf("%d\n",*b);
83 : ダメな理由がわからないorz
84 : ではそのコードを入門者にも分かるように説明してください 入門編に相応しいような解説を付けてください
85 : 自分で紙に書きながらCPUの動作をトレースしないと ポインタはわかんないよ。
86 : >>83 この例題で納得しているようではダメということだろう
87 : そういうことか・・・日本語勉強してきます
88 : >>83 ,84 誤解しないで欲しい。 ダメというのは、これはアプリとして無意味なコードであるということだ。 上級者は無意味であるとわかるから、ふーんで済ませられる。 しかし入門者はこのコードに深い意味があるものと思い、理解しようと試みる。 ところが意味のないコードだから、「こんな面倒くさいことせずに そのままaを使えばいいじゃないか」という疑念が湧き、理解にならない。 これでは入門書としてダメだ。 ポインタには、ポインタが活躍できる場面というものがある。 それを示す有用なコードを見せて、ポインタはこういう動作をするから こんな用途に使えるんですよ、と教えるのが入門書の役目だろう。
89 : で、入門書に最適、つまり有用でそれなりに短く しかも入門者に理解させる用をも兼ね備えた そのコードの実例は
90 : swap だろうな
91 : >>88 >アプリとして無意味なコード そんなこと言ったらテキストにのってるコードすべてがそうだわ。 とりあえず、>>82 で使い方覚えて、さらっとCの文法を終わらせて 文字列と配列とポインタとか、リスト構造とかそういうのでだんだん 深くなれていけばいい。
92 : ポインタの活躍例 ttp://ideone.com/soUTSo
93 : >>88 正論 >>89 構造体でlinkedlist
94 : >92 躁鬱
95 : 個人的にはデータ構造やらアルゴリズムやらよりも前に、原始的なアセンブラでも使って、 動いてるプログラムのイメージを持つことがけっこう大事だと思う。Cをやるなら。 もっと高級な言語なら今時そんなイメージはいらんと思うけど。
96 : >>95 CASLとかやればいい。シミュレータもあるし。ワードマシンというところは 目をつむって。ただ、CPUとかレジスタとメモリのやり取りとかわかったところ でポインタとかがわかるかとか言えば別。概念的にわかっても表記がgdgd だから。
97 : K&Rにあった void strcpy ( char *s, char *t ) { while ( *s++ = *t++ ) ; } の書き方とかいまだに推奨されてんの?
98 : http://9cguide.appspot.com/c_kandr.html どっかで見たと思ったらここだった
99 : そもそもstrcpyはオワコン strncpyかstrncpy_s という話はともかく >97 は書き方としてはアリだよ
100read 1read
1read 100read TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
★初心者にVisual C++を教えるスレ★ Part38 (690)
C言語なら俺に聞け(入門編)Part 110 (939)
【GUI】wxWidgets(旧wxWindows) その5【サイザー】 (507)
VBプログラマ質問スレ(Ver.6.0 まで) part60 (631)
Borland Developer Studio 2006 No.13 (270)
【モダン推奨】Perlについての質問箱 50箱目 (398)
--log9.info------------------
dream【3人時代】松室麻衣、長谷部優、橘佳奈 3 (637)
ザ・ベストテンとザ・トップテンについて語るスレ (639)
ヤッパシ…浅香唯!part5 (232)
Johnny(横浜銀蠅) (233)
☆☆☆渡辺美奈代☆☆☆ Part.2 (388)
◇ぽつり ぽつり◆浅野ゆう子 Vol.6 (545)
松田聖子 この曲のここがツボ (269)
小林麻美が好きだ (808)
♪この歌を○○さんにCoverしてほしい♪ (256)
【あずさ2号】狩人 Part5【カルチェラタンの空】 (253)
【1984〜】TM NETWORK〜TMN 26【〜1994】 (202)
【異邦人】久保田早紀を語ろうよ Part-4 (459)
中森明菜 好きな曲 TOP4 (587)
楠瀬誠志郎のスレまだかい (442)
☆ 竹本孝之応援スレ☆ (476)
おまいらものすごい勢いでLOOKを語って下さい・4 (933)
--log55.com------------------
【g.idin.jp】銭金クイズ【37問目】
トラフィックエクスチェンジ総合スレッド9
フレッツ光メンバーズクラブ part4
Pointier ポインティア 1
【Pontaタイム】ポンタイム part 14
悪質サイトにダメージを与える方法。
【ローソン】お試し引換券5枚目【アフィ禁止】
【ローソン】お試し引換券98枚目【Ponta&dポイント】