- 1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 57 pc12.2ch.net/test/read.cgi/tech/1260020924/ ★過去スレ 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++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
- 339 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:30:05 ]
- >309
それは可読性を考えたらこっちがよくないか? (( a > shift) ? (a-shift) : 2)
- 340 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:34:36 ]
- >328
そのコードで&xの値が毎回同じになることを期待してはいけない。 自分でメモリ管理するのでなければ、変数やmallocの具体的な 値については、知らなくてイイし、依存するようなコードを書くべきではない。
- 341 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:45:17 ]
- 関数外でxを宣言してみたら
- 342 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:53:36 ]
- せっかくCをやるんだからメモリのことは熟知したい
- 343 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:37:24 ]
- 初心者です。文字列のコピーについてです。
char a[10]; strcpy_s(a, "こんにちわ"); ・・・・・・・ これは正常に動きます。 a = "こんにちわ" ・・・・・・・ これはエラーになります。なぜでしょう。 a は配列の先頭アドレスです。"こんにちわ"も配列の先頭アドレスです。 a = "こんにちわ"は、アドレスをコピーするだけなので正常に動く気がしてしまうのです。 エラーメッセージは、「const char [11]' から 'char [20]' に変換できません。」です。 変換?「=」は代入を行っているわけではないのでしょうか?
- 344 名前:343 mailto:sage [2009/12/20(日) 02:38:14 ]
- char a[10]; は char a[20]; にしてください。
- 345 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:45:40 ]
- 配列の場合、変数なのは中身であって、配列を示す a 自体は変えられない。
- 346 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:49:45 ]
- "こんにちは"
- 347 名前:343 mailto:sage [2009/12/20(日) 02:58:26 ]
- >>345
ありがとうございます。ですが難しく、頭の中で理解ができていません。 もう少し優しく教えていただけると助かるのですが・・・。
- 348 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:04:01 ]
- char *a;
a = "こんにちわ";
- 349 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:17:27 ]
- エラーメッセージをよく読みませう
- 350 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:19:20 ]
- >>343
これを試してみ char a[11]; a = "こんにちわ"; VBとかJavaに慣れてると、Cの配列や文字列は扱いづらいよね 最初のうちは参考書をちゃんと見た方がいいよ
- 351 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:26:34 ]
- a[10]が '\0' ってこと?
- 352 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:42:52 ]
- >>347
配列と文字列リテラルは一緒じゃないよ。 文字列リテラル"こんにちは"は、その時点でメモリのどこかに確保されてるわけじゃない。 確保されてない領域のアドレスを代入しても意味が無い。 配列がポインタに成り下がるのは"右辺"のみ。配列の内容はあくまで[20]の部分。 アドレスじゃなくて配列の内容を書き換えたいのだから、単純な代入ではできない。
- 353 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:06:47 ]
- char a[20] = "こんにちわ";
と char *p = "こんにちわ"; は全くの別物。
- 354 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:12:26 ]
- 将来的に
char a[20]="因習文法"; は禁止される予定 SJISとして char a[20]={ 0["一貫文法"],1["一貫文法"],2["一貫文法"],3["一貫文法"], 4["一貫文法"],5["一貫文法"],}; てな感じしか許されなくなる可能性も示唆
- 355 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:13:32 ]
- >>350
バカ?
- 356 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 05:08:58 ]
- >>350は>>355の1.1倍バカだね
- 357 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:20:56 ]
- >>343
配列とポインタ、アドレスの理解がごちゃごちゃになってるからそうなる。
- 358 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:40:45 ]
- だそうです!
- 359 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:41:09 ]
- モンスターが勝手に穴掘って落石連鎖に巻き込まれてる雰囲気
もちろん特点加算無し
- 360 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:59:15 ]
- 残機も無し
- 361 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 08:02:19 ]
- あと数十年後
メモリが100GB、CPUの処理速度も今の数百倍とかになったら C言語も変わるかなぁ
- 362 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 08:57:45 ]
- >>350の言うようにしても>>343と同じ結果になるだけ。
>>350は文字列と配列をなんにも分かってない。
- 363 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:29:34 ]
- >>361
そりゃスタイルは多少変化するだろうけど コンピュータの仕様が根本的に変わらない限りCに望まれる働きも変わらないはず 新しい環境に合わせたプログラミングモデルを作るのはむしろ派生言語の役目だと思う
- 364 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:45:20 ]
- >>363
お前には言ってないからw
- 365 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:46:16 ]
- >343
とりあえず、「配列には代入できないから」と思ってください。 正確には、配列は式の中では、「その先頭要素を指すポインタ」 として評価されるが、それは「代入できない左辺値」であるから。 ついでに(初期化付き)宣言と式では文法が別物になっている。 char a[20] = "hello"; はOK char a[20]; a = "hello"; はNG
- 366 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:52:41 ]
- >343
疑問の主旨とは変わるけど strcpy_sだったら、そのコードコンパイル通らないんじゃないの? CRT-Cだと思うから、こんなコードじゃね? strcpy_s(a, sizeof(a), "hello");
- 367 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:55:14 ]
- 初期化付き宣言でややこしくなってるのだなぁ
と思う
- 368 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:02:38 ]
- まあちょっと、誰もが一度は通る道だよな。
そして、だれもが曖昧な理解だけで通り過ぎていく箇所だわな。
- 369 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:05:55 ]
- >352
ちょっと説明が怪しいぞ。 Cの文法のイヤらしいところでわかりにくいのだけれどさ。 文字列リテラルの型はconst char[文字列長]で、普通は 書込不能な静的メモリ領域に置かれる。これは>343 でエラーになることとは直接関係ない。 「配列がポインタに成り下がるのは"右辺"のみ。」 はそんな感覚でよいと思うけど、正確には 「配列を評価すると代入できない左辺値となる」 char a[10]; a[0] = 1; は左辺だけど、ポインタとして評価されている。
- 370 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:19:19 ]
- メモリ管理は、いっぺん自分でやってみたほうがいい。
最近は大学でさえ教えないからな 俺のときはやったのに
- 371 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:29:46 ]
- メモリ管理って?
Z80を使ったアセンブラ演習はした。 テンキーでマシン語入力して実行させるんだよな。 ステップ実行でメモリを観察しながら。
- 372 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:31:34 ]
- 言ってみれば、自分でOSを構築するってことだな
メモリ管理に留まらず、スレッディングやマネジメントも含まれる。 聞いたら、そういうの今の大学じゃやってねえっちゅう話じゃねえか なもんで、リバースエンジニアリングすらも満足に出来ないと。 それできないとウィルスのリバースエンジニアリングも出来ない=検知できない だからセキュリティ業界は人材の確保が大変だとよ
- 373 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:39:35 ]
- アセンブラのみでBIOSを構築したり、OS作ったり
とにかくありとあらゆる既存のライブラリやミドルウェアなどを使わずに 自分で何もかも構成した。売り物には、かなわないにしろな HDDの制御やファイルシステムなども自分で考えて構成したりした。 普通大学つったらそういうことやるだろ が、今は何かねむたいことを言ってやらないと。
- 374 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:53:00 ]
- だから独り言なら他所でやれよ
- 375 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:20:43 ]
- やだやだー
- 376 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:31:25 ]
- char a[10]; の a の部分はラベルだとでも考えたら良い。
- 377 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 15:50:09 ]
- ツェーの仕様上、アドレスの受け渡しは
明白に誰が何に使っているか分かってないものは渡せません! っていうお約束がある。 「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」 状態である。そのソースを呼んだ感じで言えば。 「文字列は連続したアドレスに入れられるよ」って言うのは人間だから分かっているだけで、 コンピュータ内部では「まだどこにもンなもんあらへんやん」という未知の物体なのである。 それと、アドレスだけでは「どこからどこまでか」が分からないので これも単純にやりとりするわけには行かんのである。 配列は長さが明白に分かってるポインタのようなものだから、 それが分からないポインタには単純に代入できない。
- 378 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 15:52:46 ]
- ___
ξ _ ヽ  ̄ ├-┤ / ̄ ̄ ̄\)〆 | | \ | ‐∩∩―┐ || |・ ・ | |│ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ┗ ^ ┛ | | | < ツェー!!! /777^l | || \ ) ̄ ̄_ノ__| lヽl|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,―  ̄ ̄_η_|/V^ | l  ̄ ̄|_Ξ)/ | `‐―┬┘\/ | | | | 〇 | | | |__∧___| | | | ∩ | |__|_ __ ∫ ) | \ ̄ ノ `―┬‐―┬‐┘ ̄ / / / / / / ,〜^⌒\__/
- 379 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:47:46 ]
- byte* p=malloc(10000);
free(p); これを行うと何がおこる? mallocで確保した10000個の領域が全部開放されるの?
- 380 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:54:26 ]
- 連続したbyte10000個分の領域1つが解放される
- 381 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:59:09 ]
- だよね。
じゃあbyte* p=malloc(10000); ってのは悪いやりかた?
- 382 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:11:59 ]
- 何でそう思うの?
byteのサイズがいくつになるかわからんから、 sizeof (byte) * 10000 で
- 383 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:12:43 ]
- つ「メモリリーク」
一般的なOS上で動く寿命の短いソフトなら起こっても大した問題は起きない デーモンとかサービスみたいな起動しっぱなしのソフトや低レベルなソフトとかだと死亡
- 384 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:12:46 ]
- って可変にしたけりゃrealloc使えばいい
- 385 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:15:48 ]
- >>379-384
これこそ、なにがしたいのかわからん質問。
- 386 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:51:20 ]
- >>371
Z80 にステップ実行させる機能(内部割込み)はない。それはZ80 ではないのでは?
- 387 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:57:18 ]
- >>384
過去にmalloc()/realloc() したときに取得したサイズを、現在 get できればいいのですが。 やっぱりどこかに覚えとくしかないか。
- 388 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:57:58 ]
- Z80 のエミュレータかもしれない
- 389 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:01:12 ]
- 疑問の全てに実用性を求めることの意味を問いたい
- 390 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:10:15 ]
- >>389
答えられない質問には、その質問自体が無意味であることを主張した方が 自分の優位性を保てるから
- 391 名前:デフォルトの名無しさん [2009/12/20(日) 18:25:15 ]
- すいません。流れをぶった切って質問します。
今、10日くらいでhelloから始まり今if文とかの入門書に書いてある 関数の基礎を一回ずつコンパイルしました。 それから配列についてちょこっとやってます。 それで今 実行の引数やポインタに進んでいます。 そこで、勉強法としてそのまま先に進めていっていいのでしょうか? それとも変数や配列を極めたほうがいいでしょうか? ちなみに自分はあんまり関係ない機械関係の運用の仕事をしていてすぐに実務に使用するわけではありません。 目的は、プログラミングの勉強をしてゲームプログラムを自分で作れるようになりたいです。
- 392 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:27:43 ]
- >>387
内部的には持ってるだろうけど、通常の方法では無いね。 まあ最後のメンバーが可変長の構造体作って管理する手もある。
- 393 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:28:19 ]
- >>391
訳分からなくてもとりあえず最後までやる 同じ本を何度かやってりゃ分かるようになる クズ本じゃなければの話だけど
- 394 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:29:52 ]
- まあ先に進んでも、いずれどこが理解してないのかが分かってくるんじゃね?
途中の部分を極めるって考えはどうなのかね
- 395 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:37:39 ]
- いいんじゃないかな。どうでも
- 396 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:38:16 ]
- 一回だけしかコンパイルしないんじゃ、理解しないまま先に進んでないか?
- 397 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:09:23 ]
- >>386
ICEとかエミュとか上位互換のカスタムチップとかクロックそのものを止めるとか、 いくらでもステップ実行させる方法はある。 今は学習用だとWin上でエミュが主流だから、テンキー入力するのはちょっと前の世代か ハンダ付けの実習も兼ねてるか。
- 398 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:14:16 ]
- じゃあここをこう変えたらどうなるんだ?という疑問が沸く。
↓ ↑ コンパイル&検証orエラー このプロセスを経ずして理解できたなどと、おこがましいとは思わんかね?
- 399 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:34:15 ]
- ⊂⌒~⊃。Д。)⊃ ピクピク
- 400 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:39:28 ]
- >380
まちがい。なぜわざわざ嘘を教えるの?それともマジ? C++のnew、deleteと勘違いしていないか? >379, >381 >380は間違い。 >379自体は問題ない。 ただし1000がsizeof(byte)の倍数になっていないと、 pを使うときに問題が起こるかも。>382はそのことを言っている。
- 401 名前:デフォルトの名無しさん [2009/12/20(日) 20:43:49 ]
- setupファイルが簡単に作れるC++の統合開発環境を教えてください.net以外で
- 402 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:47:26 ]
- 教えてくれるといいですね
- 403 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:02:37 ]
- 質問です。コマンドラインで-Dと指定したときに条件付けしようとしています。
次のように書くと動作するのですが while(--argc > 0 && (*++argv)[0] == '-') if((*argv)[1] == 'D') debug = 1; while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D') と書くと動作しません。 2個目の条件(*++argv)[0]でargvが1進み、3個目の条件では+1されたargvが参照されると期待しているのですが、 こうはいかないのでしょうか。 ちなみに、 while(--argc > 0 && (*++argv)[0] == '-' && (*++argv)[1] == 'D') とした場合segmentation errorとなります。 また3番目の条件をargv[0][1]=='D'などと指定してもうまくいきません。 whileの条件中だけで全て条件付けることはできないのでしょうか。
- 404 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:05:18 ]
- >>403
目的を達するために getopt を使うとか strcmp で比較するのはどう?
- 405 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:06:48 ]
- 3つ並べた時の短絡評価って保障されてんの?
- 406 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:10:58 ]
- >377
ネタにマジレスするのは、どうかと思うが、つっこんでみる。 怪しい知識をたとえ話にするから、よくわからんぞ。 知らない人は理解できないだろうから、誤解しようも無いが・・・・・・。 >明白に誰が何に使っているか分かってないものは渡せません!っていうお約束がある。 そんな約束はない。Cのポリシーは、明示的にせよ、暗黙にせよソースにかかれたものは その通り実行する、である。だからポインタにどんな値がセットされていようが、その通り動作しようとする。 >「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」 状態である。 リテラルはコードの中に埋め込まれている。メモリ上に置かれているからポインタも取れる。 >配列は長さが明白に分かってるポインタのようなものだから 配列とポインタは別物。
- 407 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:12:54 ]
- クラックするのにC言語使ってる人っているの?
- 408 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:13:57 ]
- >>403
debug=1 はどこにあるの?
- 409 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:15:57 ]
- >>403
最初の引数が -D じゃなかったらwhileループから抜けてしまって2個め以降の引数を見ないのでは?
- 410 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:28:53 ]
- >403
とりあえず while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D') でも問題なさそうだけど。どういう動作を期待しているの? ちなみに次のように、[]演算子を使って書く方がわかりやすいと思う。 while(--argc > 0 && argv[argc][0] == '-' && argv[argc][1] == 'D')
- 411 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:33:09 ]
- 値が0のint型変数2つどうしで引算をすると
すごくでかいint型限界値の値が出ますけど これって値が0同士の変数で計算はするなということでしょうか? int table[UCHAR_MAX+1]; char *text = "nanntokakanntoka"; int shift; int i; 問題の演算: (BMWCT[(UINT)text[i]]-shift) 演算時のそれぞれの値 BMWCT[(UINT)text[i]] ==0; shift==0; iは任意
- 412 名前:403 mailto:sage [2009/12/20(日) 21:35:01 ]
- >>404
getopt調べてみました。かなり便利そうですね。ありがとうございます。 >>409 それでした。この行以前に違うコマンドで認識させている部分があって、-Dは2番目の引数になっていたためでした。 こんな1種類の引数を検出する方法はそもそも汎用性がなさそうですね。 実際に使う時はcaseで場合分けなどしようと思います。 ただ条件文の評価の仕方は疑問が取れてすっきりしました。ありがとうございました。
- 413 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:35:21 ]
- 自分で0を代入してないなら、その変数は0じゃないぞ
- 414 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:35:44 ]
- >>411
意味が分からないので動作するソースを貼ってちょ
- 415 名前:403 mailto:sage [2009/12/20(日) 21:39:06 ]
- >>410
その方がシンプルですね。参考にします。
- 416 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:39:14 ]
- bool型を返す関数foo(), bar()があるとき、
foo()&&bar() と foo()&&bar() の違いを教えてください。
- 417 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:42:24 ]
- >>416
同じじゃね? bool の表現が 0 1 だけじゃないかもしれないし
- 418 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:44:15 ]
- foo() && bar()
と bar() && foo() は違うけどな。
- 419 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:46:56 ]
- >>416
てか、上と下が同じに見えるんだけど。
- 420 名前:416 mailto:sage [2009/12/20(日) 21:52:18 ]
- 申し訳ございません。
foo()&&bar() と foo()&bar() の違いでございました。。。
- 421 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:56:37 ]
- >>415
ごめん解決したわ unsigned int とint で演算やってたんだがintのみでやったら変な値でなくなった
- 422 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:57:21 ]
- >>414 ○
>>415 × ごめんなさい間違えました
- 423 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 22:09:51 ]
- >>421
え。それじゃ、 (unsigned int)0 - 0 が、0 にならなかったってこと?
- 424 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:12:09 ]
- 配列はポインタじゃねえ!というのに
なんで **argv と *argv[]は 同じに見てくれるのですか。コンパイラは。(倒置法)
- 425 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:16:08 ]
- 因襲というもんです
立ち入らないで下さい。
- 426 名前:421,411 mailto:sage [2009/12/20(日) 23:19:54 ]
- 例
UINT shift shift==0 (UINT)text[i]==110 正常 BMWCT[(UINT)text[i]]==0 正常 (BMWCT[(UINT)text[i]]-shift)==4294967289 異常 >>423 こんな感じ BMWCTとshiftとかをUINTにしたりintにしたりと変えてみた結果int同士だとうまくいった UINT同士だとだめだった
- 427 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:22:08 ]
- >>424
配列もポインタも、アドレスを表現しているという意味で同じだから。
- 428 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:29:32 ]
- 配列ってポインタよりも高級な構造という扱いなんでしょ?
- 429 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:29:54 ]
- 否、シンタックスシュガーという名の因襲と
理解するのが一番。深入りしない。苦労して 覚えない。その為にコンパイラにシンタックスチェッカーが 付いているんだからさw エラーを指摘せず勝手に内部でコード作って実行しちゃう JavaScriptとかと違ってCは良心的。但し生産性が高い 言語では無くなってるけどね。
- 430 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:43:19 ]
- もともと場当たり的に作られた言語だし
- 431 名前:デフォルトの名無しさん [2009/12/20(日) 23:45:31 ]
- >>427
という説明が char argv[][] という有名な落とし穴へ子羊を蹴落とす
- 432 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:02:58 ]
- *(hoge + i) と hoge[i] は等価。つまり配列とはアドレス演算である。
なお、後者は前者のシンタックスシュガー、C言語規格によるただの"親切"である。 i はインデックスではなく、hoge が示すアドレスからのオフセットである。 これでいいですか?
- 433 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:06:59 ]
- >424
「関数のプロトタイプ宣言の中では」配列とポインタは同じ。 Cでは関数に配列を渡すことはできない。 しかし使う場合は実引数として配列名を書くことが多く、それは配列の 先頭を指すポインタとして評価され、ポインタを渡していることになる。 以下の3つは全て同じ意味。 void func(int *a); void func(int a[]); void func(int a[N]);
- 434 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:07:55 ]
- >>397
上位互換チップはありだと思いますが、一般にICE ではどうやって実行を一命令ごとに停止させるのでしょうか? やっぱりCPU のステップ実行割り込みを利用してそうなんですが。
- 435 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:12:37 ]
- 色々あるけど、ROMやRAMを乗っ取って1命令後に停止させる命令を埋め込むのは、力技だなと感心したことがある
- 436 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:14:28 ]
- >>419
ショートカットの有無かな?&& で前の式が偽だったら、後の式は評価すらされない、という。
- 437 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:15:35 ]
- >427
君大間違い。配列とポインタは全く別物。 >432 「つまり配列とはアドレス演算である。」 この一文が致命的な誤り。その他の部分はあっている。 1番目のポイント 宣言と式では文法が別物になっている 2番目のポイント &, *のオペランドになったとき以外は配列名のみを書くと、 配列の先頭要素を指すポインタとして評価される。 二項演算子[]はポインタと整数型をオペランドとし以下のように定義する。 *(p + i) ≡ p[i]
- 438 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:25:17 ]
- >>437
オメー 何書いてあるかわかんねネーンダy
- 439 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:57:14 ]
- ポインタはアドレスを指している場合が多いが、アドレスはポインタではない
|

|