- 1 名前:デフォルトの名無しさん [2018/08/16(木) 23:36:02.22 ID:fOCSKLtw.net]
- C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ 前 C言語なら俺に聞け 146 https://mevius.5ch.net/test/read.cgi/tech/1525031257/
- 515 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 16:25:44.03 ID:lAySnCDy.net]
- 本当は夏休み中の中高生じゃないのか?
何だか妙に精神年齢が幼く思える
- 516 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 16:27:03.18 ID:aDjvXB/e.net]
- 名前は半角カタカナで頼む
- 517 名前:デフォルトの名無しさん [2018/08/26(日) 16:29:48.93 ID:hANAm2gW.net]
- 図星でしっかり反応してるしな
やっぱりなこのスレは 駆除が必要な典型的な低学歴知恵遅れの クソニートとか底辺ドカタしかいないわ
- 518 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 17:09:28.74 ID:BwlGzYMc.net]
- 小馬鹿にした発言が頭悪そうな最高に痛いやつ
- 519 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 18:07:37.48 ID:ujNq2aVI.net]
- >>508
確かに夏休み始まった辺りから見かけるようになった気がする
- 520 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 06:20:27.93 ID:sdfxNc/O.net]
- >>499
このスレだけなら 35 だが、この板全体の数なんだ。 必死チェッカーもどきを見たら堂々の 2 位で笑った。 いや、彼の御高説をもっと見たかったんだ。 ちなみに「知恵遅れ」はその 23 とは別に単独で 16 回出てきたよ。
- 521 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 08:24:49.48 ID:4HBkx10J.net]
- 自称、俺最強君()は、昔からしばしば見かけるけど。
小学生にも苦笑されそうなレスばかりで、相手をする気にならないんだよね。 hissi.org/read.php/tech/20180825/MHI1aDYvbEw.html hissi.org/read.php/tech/20180826/aEFOQW0yZ1c.html 勝手に勝利宣言して逃亡するまで放置しておくのが吉。
- 522 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 08:45:35.65 ID:4ArgrBnx.net]
- 半角さんはこの板の唯一の良心
この板は腐ってる
- 523 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 11:56:02.39 ID:woJf6ZC9.net]
- >>413
if (条件) { … … ここで(ブロックから)抜けたい -(1) … -(2) } else { … } こういうこと? (1) はさらに if で条件付で分岐しないと意味がないけど… ※ (1)で分岐しないかぎり (2) 以降が無意味のコードになる if の外側を do { } while(0) で外を囲って break; したら?
- 524 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 12:18:18.46 ID:yF4/ft+h.net]
- >>515
これだな
- 525 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 12:18:56.82 ID:yF4/ft+h.net]
- おまえらはすぐにどうでもいいことに流される
- 526 名前:デフォルトの名無しさん [2018/08/27(月) 12:34:41.00 ID:ywsjsNTA.net]
- >>516
それだったら2を実行するための何らかの条件がある筈なのでそのためのifブロックの中に2を入れればよい。 そつではなく無条件に2を実行したくないならばソースから削除するかコメントにでもすればよい。
- 527 名前:デフォルトの名無しさん [2018/08/27(月) 12:36:44.69 ID:ywsjsNTA.net]
- すまん。スマホでフリック入力しててタイプミスした。
- 528 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 12:42:48.65 ID:woJf6ZC9.net]
- >>519 意図は伝わったぜー
確かにw if (条件1) { … if (条件2) { … -(1) } else { … -(2) }
- 529 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 12:48:15.12 ID:nj2QXsVo.net]
- >>519
そりゃ方法なんていくらでもあるよ そういう方法をとりたくないってことだろ 理由はしらんが たとえば(-2)が大きくてインデントを変えたくないとか
- 530 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 12:50:40.87 ID:vY3QDx2y.net]
- だから何でdo while(0)なんて変態コードに固執するんだよ
- 531 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 12:51:47.69 ID:YYT/vI56.net]
- >>522
>>521の方法を思い付かなかった、or 妥当な書き方であると知らない、だけだは?
- 532 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 12:54:54.13 ID:woJf6ZC9.net]
- 元質問者に聞くしかない 「goto は使いたくない」の条件で
- 533 名前:デフォルトの名無しさん [2018/08/27(月) 12:59:44.74 ID:ywsjsNTA.net]
- ブロックというものを中に入ったら出られないものと勘違いしているとか。
最初にforやwhileを覚えちゃって勘違いに繋がったとか。
- 534 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 13:22:18.19 ID:vY3QDx2y.net]
- 何人たりともforより先に関数のブロックを憶えるのにね
関数のブロックだけが何か特別なものと思い込んでるケースが多い
- 535 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 13:25:30.84 ID:Q5lEKL35.net]
- goto 便利だけどなぁ。
break するがためのフラグ作って何ブロックも break するとか goto を避けるがためのいびつな if を連続させるとかよりよほど可読性が高い。 もちろん意味を的確に表したフラグやifの構造にできるに越したことはないけどさ。
- 536 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 13:28:07.17 ID:aXwyVMA/.net]
- >>523
あえて固執して解決方法を編み出しておくと ひょんなときに役立つことがあるしな 準備なんてのは9割無駄で当たり前だよね
- 537 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 13:31:18.13 ID:vY3QDx2y.net]
- ジャクソン法やワーニエ法みたいに
データ構造とプログラム構造を一致させる構造化プログラミング()では データが損傷していた場合にはプログラム構造を一致させることができない よって構造化定理を諦めたアプローチをせざるを得ない こういうのがgotoやlongjmpの出番
- 538 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 13:32:12.14 ID:vY3QDx2y.net]
- >>529
その説明じゃ変態行為に固執する理由が説明できてないだろ ええ加減にせんか、この変態!
- 539 名前:デフォルトの名無しさん [2018/08/27(月) 13:35:23.06 ID:ywsjsNTA.net]
- ま、Cの場合は適切にgoto使った方が良いだろうな。後から作られた言語では break でラベル指定できるだの例外処理できるだのしてるから使わなくて済むようになってるわけで、それのないCはそれの代わりにgoto利用しちゃった方が分かりやすく書ける。
- 540 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 13:41:42.47 ID:vY3QDx2y.net]
- いやCのgotoは制限がキツすぎて
いざという時には役立たず だからlongjmpがある
- 541 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 14:22:47.97 ID:Q5lEKL35.net]
- そんな制限キツかったっけ?
longjump の方がキツいでしょ
- 542 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 14:23:38.81 ID:vY3QDx2y.net]
- 何がキツいって関数から出らんない
- 543 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 14:34:05.72 ID:J1p6Vf0T.net]
- setjump/longjumpは簡易タスクディスパッチャーをC言語だけで実現するためだけにあるのかと思ってたよ。
それ以外の用途はあんまり思い浮かばないなぁ。
- 544 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 14:40:44.92 ID:TsaU1TVW.net]
- 自分で対処不能なエラーが起きたときに、初期化してやり直す時に使ったな
だもんで通常の処理の流れで使うものだとは思わなかった
- 545 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 16:09:02.07 ID:vY3QDx2y.net]
- ディスパッチャとしてはダメダメじゃん
jmp_buf jb; void sig(int n) { longjmp(jb, 1); } int main(void) { signal(SIGINT, sig); if (setjmp(jb) == 0) for (;;) ; else puts("ok"); return 0; } 俺んとこではokが出ない おまいらんとこではどんな結果になる?
- 546 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 16:16:45.47 ID:J1p6Vf0T.net]
- 確かsignalとlongjmpは相性悪かったような?
よく覚えてないけど。
- 547 名前:デフォルトの名無しさん [2018/08/27(月) 16:27:43.33 ID:VuJs8kRo.net]
- >>538
こちらは Linux (CentOS7)だが、出たよ。
- 548 名前:デフォルトの名無しさん [2018/08/27(月) 16:29:13.02 ID:VuJs8kRo.net]
- >>539
sigsetjmp(), siglongjmp() ってのがあるので、そっち使った方が良さそうではあるな。
- 549 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 16:33:51.80 ID:J1p6Vf0T.net]
- Linuxとかならpthreadがあるのでわざわざ自分でディスパッチャ作ることはないと思うけど、組み込み用に簡易的に作ることはあるかもね。
俺は組み込みならprotothreadsのほうがシンプルで好き。
- 550 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 17:20:53.65 ID:cJbIVPPr.net]
- #include <signal.h>
void (*signal(int signum, void (*sighandler)(int signum)))(int signum); この宣言が読めない
- 551 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 17:30:35.88 ID:vY3QDx2y.net]
- signal 関数名
signum 第1仮引数名 sighandler 第2仮引数名 sighandler ポインタ *sighandler 関数 signum 第1仮引数名 signalの返却値はsighandlerと同じ型
- 552 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 18:31:36.73 ID:C1HpzEi0.net]
- >>524
思い浮かばないってのがなかなか考えられない ていうか、 for/while/do while 以外もbreakで抜けられたら良いと思ったことが私もある >>525 なぜgotoは使いたく無い? という質問の答えも聞いておかないと コーディング規約なのか宗教なのか gotoの使い方を知らないだけなのか
- 553 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 18:49:30.60 ID:C1HpzEi0.net]
- >>536
OSのタスク切り替え処理 ブートローダーからアプリケーションへのジャンプ リセット 例外処理
- 554 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 19:22:28.99 ID:FN2jn8ES.net]
- >>546
全て別の方法で実現しちゃうので、俺的にはlongjmpの必要性を感じないかな?
- 555 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 19:30:11.24 ID:m5aHtIH2.net]
- >>530
高度すぎてなに言ってるかわからん
- 556 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 19:46:09.70 ID:nZJhjhuf.net]
- まあデータの損傷をいきなりデータ構造そのものの破綻に結びつけるのは些か強引な論理展開ではあるな
- 557 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 19:55:16.65 ID:C1HpzEi0.net]
- >>547
関数ポインタ アセンブラ スタック書き換え このどれか?
- 558 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 20:08:36.09 ID:FN2jn8ES.net]
- >>550
こんな感じ。 OSのタスク切り替え処理 →普通にOSの機能を使う、カーネルなしで簡易ディスパッチャ実装はpthread ブートローダーからアプリケーションへのジャンプ →アドレス固定ならアドレスを関数ポインタにキャストしてジャンプ、またはインラインアセンブラ リセット →周辺機能やbssやdataセクションも初期化したいのでWDT等のCPUリセット機能を使う 例外処理 →密結合を避けるためオーソドックスに返り値で判定、最後にgoto使うかも? そういや例外処理longjmpで思い出したけど、一昔以上前のCマガジンにマクロでC++と同じようなtry〜catch構文実装方法の記事があったけど、確かにそのマクロ内ではsetjmp/longjmp使ってたわ。 マクロでカプセル化してれば例外処理で使うかも。
- 559 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 20:17:29.99 ID:C1HpzEi0.net]
- カーネルなしでpthreadの意味がわからん
- 560 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 20:21:53.00 ID:FN2jn8ES.net]
- >>552
あ、まちがえた。 pthreadじゃなくてprotothreadsね。
- 561 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 15:16:05.31 ID:wM2MhSxp.net]
- techtipshoge.blogspot.com/2011/02/blog-post.html
このサイトで、書いてることは正しいと思うしし、実際こうなるんだけど、俺の頭悪いせいでわからない。 駄目な例のsetStr(a)の a は、 &a[0] という”アドレス”を渡してる訳ではないんでしょうか? なんで駄目な例だと上手くいかないのかという理屈がわからない・・・
- 562 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 15:16:57.00 ID:wM2MhSxp.net]
- あ、レスして気づいたけどcoutがあるってことはc++なのかな?
まあこれはprintfってことにしといてくださいw 重複質問になりそうなのでこちらで処理したい。
- 563 名前:さまよえる蟻人間 mailto:sage [2018/08/28(火) 15:27:14.25 ID:cEEOiaf2.net]
- newもC++のキーワードなんだけど。。
関数に実引数のポインタを渡すとその値が、対応する仮引数に代入(コピー)され、以後、仮引数は変数のように使える。 仮引数の値を変えてもコピーが書き換えられるだけで元の実引数の値には影響しない。 書き換えられるようにするには、書き換えたい場所のアドレスを渡して、*演算子か、[]演算子を使わないといけない。
- 564 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 15:27:46.08 ID:10z9ufr/.net]
- 駄目な例のa = new char [8];はmainのaの複製への代入なのでmainのaはNULLのまま
良い例の*a = new char [8];はmainのaそのものへの代入なので期待した結果が得られる
- 565 名前:さまよえる蟻人間 mailto:sage [2018/08/28(火) 15:37:02.95 ID:cEEOiaf2.net]
- 関数呼び出しのとき、実引数がどこにコピーされるかというと、「スタック」という積み上げ式のメモリーブロックか、一時的なCPUレジスタが使われる。
インラインではない関数呼び出しにおいては、関数の戻り先のアドレスと、仮引数のデータがスタックに積み上げられる。 積み上げ式だから、自分自身の関数を呼び出しても動作する。これを「再帰呼び出し」という。
- 566 名前:さまよえる蟻人間 mailto:sage [2018/08/28(火) 15:39:32.69 ID:cEEOiaf2.net]
- スタックの積み上げには限度がある。限度を超えると、スタックサイズが拡張されたり、異常終了する。
スタックの積み上げが限度を超えて異常な状態になることを「スタックオーバーフロー」という。
- 567 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 15:52:37.71 ID:wM2MhSxp.net]
- すません。私の質問が曖昧だったので追加で
void setStr(int *a) { a[0] = 10; } int main() { int a[10]; setStr(&a[0]); cout << a[0] << endl; return 0; } 例えば、この場合は、setStr(&a[0])として、その後、関数内でa[0]=10;と値を代入すればちゃんと 10 が出力されます。 前のHPの失敗例も同じくsetStr(a)としてアドレスを渡し、受け取りはポインタ変数なのに値は変わらない。 単に数値か文字列かの違いなんでしょうか?
- 568 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 16:00:50.42 ID:Gzofmim2.net]
- とりあえず一度、配列とポインタに対する余計な先入観を捨てて素直に元サイトを読み込めば理解できると思うよ
一つの考え方に囚われ過ぎてると思う
- 569 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 16:05:47.55 ID:10z9ufr/.net]
- void setStr(char **a) これを
void setStr(int *a) こう読み替え char *a = NULL; setStr(&a); これを int a = 0; setStr(&a); こう読み替えてみそ つまり char* → int と読み替えるんだ ポインタ変数とアドレスは違うという話は 整数変数と整数は違うという話と同じだ
- 570 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 16:17:43.85 ID:LgBUyhOe.net]
- まあスタック使えとは規格に書いてないんだけどね
- 571 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 16:35:30.28 ID:wM2MhSxp.net]
- ああ分かった!
俺は自分で勝手に「char型のポインタ=文字列だ」と思い込んでて、そのせいで混乱してただけでした。 思い込み怖い・・・ void setStr(char *a) { a[0]='a'; } int main() { char a[] = "
- 572 名前:test";
setStr(a); cout << a << endl; return 0; } これで「aest」と表示されたからピンときた。確かに失敗例はポインタ変数を渡しているだけだw ありがとうございました。 [] - [ここ壊れてます]
- 573 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 18:19:39.20 ID:4ROMapnq.net]
- >>563
そりゃそうだよ、世の中にはスタックを持たないマシンもあるからな
- 574 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 18:33:43.92 ID:oY+WdDFv.net]
- ハードウェアスタックを持たなくて再帰呼び出し出来ないうんこ環境があるね
- 575 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 18:38:07.52 ID:h1lwFjom.net]
- そういうのは自分で値を積み上げるように作るしかないな
- 576 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 18:45:10.17 ID:Gzofmim2.net]
- そういえばずいぶん昔に昔ながらのBASIC言語でクイックソートを実装したときに当然サブルーチンの再起呼び出しなど使えないので
自分で似たようなことをやったなあ というか確か何かのプログラム認定試験の定番の出題テーマだった気がする 当時必死に勉強してたことを思い出した
- 577 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 18:45:55.20 ID:Gzofmim2.net]
- 再起ってなんだ再帰の誤変換
- 578 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 18:47:51.41 ID:h1lwFjom.net]
- 再帰 不能
- 579 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 19:51:12.99 ID:zI7irPVs.net]
- ぴゅう太なんてレジスタがなかった
- 580 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 19:56:09.59 ID:c8HqOUoV.net]
- >>571
そんなアホな… うわ、ホントだ。汎用レジスタは全て外部RAMにマッピングされてたのね。
- 581 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 20:04:33.36 ID:10z9ufr/.net]
- 制御記憶を主記憶とシェアするアーキテクチャはそんなに珍しくない
- 582 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 20:09:30.18 ID:c8HqOUoV.net]
- 普通にR0とかのレジスタ名ついてるんだけど実体は内蔵RAMにマッピングされてるアーキテクチャならよく見るけど、外部RAMってのは初めて見たわ。
今もこういうアーキテクチャのCPUあるのかな?
- 583 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 20:15:00.09 ID:Gymzh0gE.net]
- ない
- 584 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 20:25:08.96 ID:10z9ufr/.net]
- ぴゅうたって内蔵RAMなんだっけ
- 585 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 20:28:21.23 ID:c8HqOUoV.net]
- >>576
wikipediaによると ROM 内蔵20Kバイト RAM CPU内蔵256バイト/TMS9918用16Kバイト だそうだ。
- 586 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 20:53:39.14 ID:UQgP5OTn.net]
- >>573
制御記憶ってマイクロコードを入れるところなんだが… 主記憶と共用してる奴なんてあったか?
- 587 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 20:58:39.83 ID:10z9ufr/.net]
- >>578
必ずしもマイクロ【コード】を入れるところじゃないんだけどね たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ それやってるときはTestインジケーターが点灯することになってて
- 588 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 21:38:04.13 ID:UQgP5OTn.net]
- >>579
> たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ そんな特殊な例出されてもなぁ w そりゃ記憶装置だから他の物を入れることはできるよ だから何? って話だけどな > それやってるときはTestインジケーターが点灯することになってて で、主記憶と共用ってどこのアーキテクチャなんだ?
- 589 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 21:54:20.28 ID:d5vKjLdu.net]
- >>580
やめたれ w
- 590 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 22:02:06.14 ID:lp3F9A9k.net]
- それってセキュリティ上問題にならないのか?
- 591 名前:デフォルトの名無しさん mailto:sage [2018/08/28(火) 22:15:00.65 ID:d5vKjLdu.net]
- いまはやりのcore iのバグみたいな?
- 592 名前:デフォルトの名無しさん mailto:sage [2018/08/29(水) 23:07:37.73 ID:E6lvAa/y.net]
- メルトダウン事件移行もアップデートの度にどんどんコンパイルとか画像縮小なんかの処理が遅くなってる気がする
もう怖くて淫照は買えない
- 593 名前:デフォルトの名無しさん mailto:sage [2018/08/30(木) 05:50:33.67 ID:zs5ycFHj.net]
- ベンチマークしてる?
- 594 名前:デフォルトの名無しさん mailto:sage [2018/08/30(木) 08:20:17.62 ID:cD6Bz7+B.net]
- >>582
そりゃなるよ 命令の動作を書き換えるんだから何でもできちゃう なのでDiag関連の命令はCE(カスタマーエンジニア)モードでしか使えないとかなってたはず 今時のCPUでもエラッタ対策としてマイクロコードの書換えするけどコード自体は暗号化されてる この暗号化キーが漏れたらえらいことになると思う
- 595 名前:デフォルトの名無しさん mailto:sage [2018/08/30(木) 10:16:53.98 ID:zs5ycFHj.net]
- X'83は単に特権命令ってだけだぜ
- 596 名前:デフォルトの名無しさん mailto:sage [2018/08/30(木) 12:25:33.09 ID:cD6Bz7+B.net]
- マシンによって違うのか?
M-180HはCEモードでないと動作しなかったが
- 597 名前:デフォルトの名無しさん mailto:sage [2018/08/30(木) 12:43:00.44 ID:zs5ycFHj.net]
- そういうことだね
俺んとこではPWOFFするオウンコードとかできたし
- 598 名前:デフォルトの名無しさん mailto:sage [2018/08/30(木) 20:09:52.14 ID:cD6Bz7+B.net]
- それマイクロ関係ないだろ
- 599 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 06:31:31.30 ID:QWemr4wG.net]
- すみません思い切り初心者の質問です。
printf("%s: abc", str); ↑こういう文が abcのみが変わる形で(str変数は変更されません) 沢山登場するプログラムを作っており コピペが面倒だしバグの温床になりそうなので #defineマクロなどを使って引数にabcを指定すると上記の文がまるごと出力されるようにしたいと思いました。 そこで #define PR_POS(_pos) printf("%s: _pos", str) という定義を作ったのですが恐らく引用符の中身は変更されることはないので #include <stdio.h> #include <stdlib.h> #define PR_POS(_pos) printf("%s: _pos\n", str) int main(void) { char str[256] = "text"; //printf("%s: abc\n", str); PR_POS(abc); exit(EXIT_SUCCESS); } というプログラムを作っても実際コンパイルしたものを実行すると text: _pos という望んでいない出力が返ってくるだけです これを text: abc という出力にするにはどうすればいいでしょうか……。
- 600 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 06:43:34.91 ID:jQ6ZKbRR.net]
- >>591
#define PR_POS(_pos) printf("%s: " #_pos "\n", str) でいけるはず 詳しくは プリプロセッサ 文字列化演算子 とかでぐぐれ
- 601 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 06:44:40.48 ID:Df6BGOL7.net]
- #define PR_POS(_pos) printf("%s: " #_pos, str)
- 602 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 06:45:58.45 ID:Df6BGOL7.net]
- かぶった
しかもまちがった >>593は無視して
- 603 名前:591 mailto:sage [2018/08/31(金) 07:04:03.05 ID:QWemr4wG.net]
- >>592
うわあああ! ありがとうございます。 正直 検索しても検索しても一向にそれらしき答えが見付からなかったんで もう方法がないのかなとか思ってました……。 文字列化演算子なるものがあるのですね。用語まで教えていただいてほんとうに感謝しています。 しかもC99でも定められてるっぽい? (gcc -std=c99 -Wall -Werror -pedanticで警告がなかった) 嬉しいです。これで随分すっきりしたソースコードになりそうです! >>593さまもありがとうございます。
- 604 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 07:18:20.44 ID:4o8e5lPA.net]
- #include <stdio.h>
#define DEBUG(fmt, ...) \ fprintf(stdout, "%s:%d #%s " fmt "\n", \ __FILE__, __LINE__, __func__, ##__VA_ARGS__); 初心者ならこのマクロを覚えておくと良いぞ。誰もが一度は使うはず。
- 605 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 07:26:18.95 ID:jQ6ZKbRR.net]
- >>595
> しかもC99でも定められてるっぽい? X 3010:2003 (ISO/IEC 9899:1999) 6.10.3.2 #演算子 制約 関数形式マクロの置換要素並びの中にある各#前処理字句の次の前処理字句は,仮引数でなければならない。 意味
- 606 名前:K則
置換要素並びの中で,仮引数の直前に#前処理字句がある場合,対応する実引数の前処理字句列のつづりを含んだ一つの単純文字列リテラル前処理字句によって,#前処理字句と仮引数を置き換える。(後略) http://kikakurui.com/x3/X3010-2003-01.html [] - [ここ壊れてます]
- 607 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 07:48:00.90 ID:QWemr4wG.net]
- >>596
すいません。初心者なのにめちゃめちゃ上から目線みたいになってしまうんですが assert()を使わないのはなぜですかね。 POSIX C99でも定義されているので ほとんどどのコンパイラでも処理できると思うんです。
- 608 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 08:16:53.54 ID:4o8e5lPA.net]
- >>598
マクロの紹介だけだから。 デバッグ方法としてならassertを多用したほうが良いぞ。
- 609 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 08:23:18.46 ID:LcHwdHfr.net]
- フィールドのエラーログ用に>>596みたいなコードをリリースバイナリにも埋めることがあるけど
その場合はassertじゃ役に立たないんだよな。
- 610 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 08:31:20.23 ID:uM5wy4o0.net]
- 斜め読みだけど、abcが変わってstrが変更されないならabcの方を文字列変数にしてprintfすれば良いんじゃね?
- 611 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 08:33:49.15 ID:CKe+Ima+.net]
- >>596
可変長引数マクロはgccだけって記憶があったけどC99規格で使えるんだね。 「可変部の実引数が0個の場合に……」のgcc拡張とゴッチャになってた模様。 >>598 警告を表示しても動作を止めたくない場合には重宝するよ。 デバッグ中に「ここまでは処理が通過した」と確認する時とか。
- 612 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 08:40:41.19 ID:QWemr4wG.net]
- >>602
なるほど。 assert()関数だと引数の結果が0の場合問答無用で停止してしまいますもんね。
- 613 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 09:08:12.10 ID:9zTxkh/J.net]
- 本番のコードと差が出て邪魔なのでassertはあまり使いませんね。
どうせデバッガ使うというのもあるし。
- 614 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 09:17:03.63 ID:QWemr4wG.net]
- >>604
本業の方の意見はほんとありがたいです。 コンパイルエラーと違ってassert(3)は実行時にエラーを吐くので同じ「実行するときに診断する」プログラムでassert(3)より高機能なデバッガ(GDBとか)を使うということですか? --- >>591の処理ですが以下のように書き直したところ望み通りに動きました。 みなさまありがとうございます。感謝します。 #include <stdio.h> #include <stdlib.h> #define PR_POS(_pos) printf("%s:" #_pos "\n", str) int main(void) { char str[256] = "text"; //printf("%s: abc\n", str); PR_POS(abc); exit(EXIT_SUCCESS); }
- 615 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 10:04:04.85 ID:Qsv+Vg4k.net]
- assertの使い道って「ここでは必ずhogeになる!」という意志をコードに残すという意味はあるかな。
言ってるとおりで動かすときはgdb使うし、開発中は単体テストで同等以上の確認するしで、実用性は今はあまり無いと思いますね。
|

|