- 1 名前:デフォルトの名無しさん (ワッチョイ 0f63-sFbk) mailto:sage [2023/04/21(金) 14:05:20.18 ID:rqj2HSDF0.net]
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C23 最新ドラフト https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.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言語なら俺に聞け 160 https://mevius.5ch.net/test/read.cgi/tech/1672191630/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 2 名前:デフォルトの名無しさん (ワッチョイ a702-em59) mailto:sage [2023/04/21(金) 16:20:56.29 ID:cgpIrgwq0.net]
- >>1
大儀である
- 3 名前:デフォルトの名無しさん (ワッチョイ 87da-S3w6) mailto:sage [2023/04/21(金) 16:21:57.14 ID:5coQdqNr0.net]
- 久々に麻呂のクソースを見たいでおじゃるか?
- 4 名前:デフォルトの名無しさん (ワッチョイ 87da-S3w6) mailto:sage [2023/04/21(金) 22:04:31.33 ID:euEROcVR0.net]
- 久々に来たけど、C言語はもう人気が無いんかね・・・
- 5 名前:デフォルトの名無しさん (ワッチョイ 5fad-soEM) mailto:sage [2023/04/21(金) 22:53:09.84 ID:kZ6jl2XB0.net]
- 人気って
C言語で作れなんて非効率的なことする人はそういないのでは? C言語じゃないとダメな環境を除いて
- 6 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-S3w6) mailto:sage [2023/04/21(金) 23:38:19.84 ID:Ro9IllZr0.net]
- 各分野に適したものがあるならそれを使うに越したことは無い。
C が本当に「適している」と言える分野ってそんなに広くないじゃろ……。 どういう言語が適しているのかよくわからんかちょうどよい言語なければ長い物にまかれることになるわけだけど、 様々な分野でそれぞれのよりよい言語が生まれて「長い物」の価値が薄れるならそれは喜ばしいことだと思う。
- 7 名前:デフォルトの名無しさん (ワッチョイ 6dda-ASru) mailto:sage [2023/04/22(土) 00:24:12.00 ID:PKFQM5A+0.net]
- プログラムをする人が、コンピュータの基本的な知識が無いまましてしまうから
簡単な記述で出来る言語が登場したからかね? 単純に同じ演算を繰り返して比較すると、C言語は処理速度が一番速いとのこと データを処理するには適しているかと
- 8 名前:デフォルトの名無しさん (ワッチョイ 6663-RykB) mailto:sage [2023/04/22(土) 01:13:10.92 ID:pp00Xtk80.net]
- FFTやらせたら、どの言語が一番速いだろうか
- 9 名前:デフォルトの名無しさん (テテンテンテン MM3e-HodF) mailto:sage [2023/04/22(土) 01:14:00.87 ID:BwPMbYSuM.net]
- Cの知識はC++をする時に当然必要になる
CはTIOBE言語ランキングで2位で、C++は4位だ 逆に使えない奴はモグリだろw
- 10 名前:デフォルトの名無しさん (ワッチョイ 7502-PEO9) mailto:sage [2023/04/22(土) 03:04:47.05 ID:WcjcWdD/0.net]
- Cを知り、アセンブラを知って、ハードアーキテクチャが分かる
- 11 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/22(土) 07:44:16.17 ID:rMU69DRU0.net]
- ハードの入り口に立つというだけ
Cより遙かに深い世界の
- 12 名前:デフォルトの名無しさん (ワッチョイ 6663-RykB) mailto:sage [2023/04/22(土) 12:23:54.03 ID:pp00Xtk80.net]
- それにしても、ネットは広大だわ。
- 13 名前:デフォルトの名無しさん (ワッチョイ 1146-0EuI) [2023/04/22(土) 16:05:32.27 ID:QfqbbaWF0.net]
- Cの奥地が広いと言うならネットはなお広いではないか。
- 14 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/22(土) 16:39:16.87 ID:rMU69DRU0.net]
- デジタル3年
アナログ5年 高周波10年 なんて言うね で、おまえらCはどのくらいでおぼえた? 仕事で使えるレベルになるまでに
- 15 名前:◆QZaw55cn4c (ワッチョイ 5eba-gzP0) mailto:sage [2023/04/22(土) 18:14:06.16 ID:ZOFRvMNu0.net]
- >>14
高周波は、あの分布定数の立体回路が謎に満ちていましたよね、あれ、どうやって設計するんだろう?
- 16 名前:デフォルトの名無しさん (ワッチョイ 5d2d-YWDm) mailto:sage [2023/04/22(土) 18:24:03.40 ID:RQNj/O5w0.net]
- この世にはプログラミング言語はPHPとJavascriptしか無いと思ってるエンジニア()がたくさんいるから
Pythonの存在も知ってるけどあれはオシャレな感じがしないしオタクがやるものだと思ってる
- 17 名前:デフォルトの名無しさん (スッププ Sd0a-kSx0) mailto:sage [2023/04/22(土) 19:05:57.81 ID:Ul/bNVNnd.net]
- >>14
蟹飯の本は事前に読んでたけど、半年かかった 周りが旧帝工学系院卒ばっかだったから勉強したわ おれ、旧帝数学だったからポインタとか分からんかった でも、今ではわしの方が崇められる 日々「チャラい関数、マクロで被せろ」を軸に頑張っとる
- 18 名前:デフォルトの名無しさん (アウウィフ FF21-1cZQ) [2023/04/23(日) 18:42:16.06 ID:y593Lq73F.net]
- PHPはホントごみ
- 19 名前:デフォルトの名無しさん (ワッチョイ aa97-+JPf) mailto:sage [2023/04/24(月) 12:59:52.39 ID:6nEVjUPW0.net]
- 親を殺されたのか
かわいそうに
- 20 名前:デフォルトの名無しさん (スププ Sd0a-hOeP) mailto:sage [2023/04/24(月) 14:15:55.03 ID:U9n/COjud.net]
- https://mevius.5ch.net/test/read.cgi/tech/1672191630/436-
>>436 >>499 https://mevius.5ch.net/test/read.cgi/tech/1681777958/14
- 21 名前:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip) [2023/04/24(月) 18:03:05.84 ID:IXNCOIDlM.net]
- int (func) (int n)
みたいに関数に()付けるのって何の意味(機能)ですか?
- 22 名前:デフォルトの名無しさん (スプッッ Sd6d-LN7w) mailto:sage [2023/04/24(月) 18:08:06.16 ID:MExTF0xDd.net]
- 関数ポインタ
- 23 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/24(月) 20:21:25.09 ID:TGYcq0jn0.net]
- 違う! 関数そのもの
#define func(x) (func)(x) マクロではない「本物の」funcを呼び出すのに使う
- 24 名前:デフォルトの名無しさん (ワッチョイ c55f-ASru) mailto:sage [2023/04/24(月) 21:25:50.42 ID:4M8+MweU0.net]
- int (func) (int n) となると宣言の文脈だからそれも違うだろう。
>>21 その記述だけでは a*b+c を (a*b)+c と書いたのと同じで、少なくともその括弧自体には何の効果もない。 何か意味があると思うなら書いた人に聞くしかない。
- 25 名前:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip) mailto:sage [2023/04/24(月) 21:43:56.47 ID:IXNCOIDlM.net]
- いやまあ愚痴なんだけど教科書や入門書ってなんでか知らんけど関数ポインタもったいつけて教えたがらないよね…
- 26 名前:デフォルトの名無しさん (ワッチョイ 7502-kSx0) mailto:sage [2023/04/24(月) 23:20:26.15 ID:MovxHIrx0.net]
- 素人さんには関数ポインタはむずいだろ
関数のポインタをベクトル化してジャンプテーブル代わりになるんもん つまりスイッチケースが要らない、言う事
- 27 名前:デフォルトの名無しさん (ワッチョイ 6663-RykB) mailto:sage [2023/04/24(月) 23:23:14.11 ID:CIhFKz1G0.net]
- ジャンプテーブル使うのと、switch case と、
どちらが高速でしょうね?
- 28 名前:デフォルトの名無しさん (テテンテンテン MM3e-HodF) mailto:sage [2023/04/24(月) 23:32:25.83 ID:RQPVcVj5M.net]
- >>23
それが上手く行くのは、マクロが再帰呼び出しされないような処理が入ってるからだろ
- 29 名前:デフォルトの名無しさん (テテンテンテン MM3e-HodF) mailto:sage [2023/04/24(月) 23:45:11.28 ID:RQPVcVj5M.net]
- ジャンプテーブルを使うと、変数の引き渡しに手間が掛かる
構造体のポインタを渡すとか、引数を沢山渡すとかグローバル変数を使うとか なので、switch文にして最適化でテーブルジャンプになるのを確認するのがベストかなと
- 30 名前:デフォルトの名無しさん (スプッッ Sdea-8Xzj) mailto:sage [2023/04/25(火) 08:47:58.80 ID:2JpsSRmdd.net]
- gcc拡張機能のラベルのジャンプテーブルが速かった思い出
あれは規格に取り込むべきだと思う
- 31 名前:デフォルトの名無しさん (ワッチョイ 5e5f-RykB) mailto:sage [2023/04/25(火) 10:23:58.24 ID:dvdIAVRA0.net]
- それってどんなのだっけか
関数を配列にぶっこんだの?
- 32 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/25(火) 10:35:38.43 ID:VJ90Sqw80.net]
- FORTRANの算術GOTOみたいなもんかな
- 33 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/25(火) 10:36:32.19 ID:VJ90Sqw80.net]
- switch caseを最適化させるとジャンプテーブルになっていることはよくあるね
- 34 名前:デフォルトの名無しさん (ワッチョイ 11c9-+rDk) mailto:sage [2023/04/25(火) 11:21:54.95 ID:RcvlMMml0.net]
- 開発環境の都合で C言語しか選択できず
C++ の virtual に相当する機構をなんとか捏造しようと 構造体に関数のポインタをメンバに持つ あと qsort のまねっこ (具体的な比較は外に丸投げして そういう関数がある前提でコードを書く
- 35 名前:デフォルトの名無しさん (スフッ Sd0a-8Xzj) mailto:sage [2023/04/25(火) 11:33:32.92 ID:Y1VsObgtd.net]
- >>31
関数内のラベルをローカル配列の初期化て入れられて goto labelarray[status]; 見たいに飛べるやつ
- 36 名前:デフォルトの名無しさん (ワッチョイ c55f-ASru) mailto:sage [2023/04/25(火) 12:02:12.18 ID:zIgvDwJV0.net]
- >>28 (func)(x) に対して関数型マクロ func(x) の展開は起こらないよ。
- 37 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/25(火) 12:24:03.71 ID:VJ90Sqw80.net]
- 調べてみた
Computed gotoってやつね int main(void) { void *table[] = { &&L1, &&L2 }; goto *table[1]; L1: ; L2: ; }
- 38 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/25(火) 12:27:03.54 ID:VJ90Sqw80.net]
- 参考
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
- 39 名前:デフォルトの名無しさん (スップ Sdea-kSx0) mailto:sage [2023/04/25(火) 12:52:44.87 ID:HIwqDhB5d.net]
- お、そんなん出来るんか
- 40 名前:デフォルトの名無しさん (スプッッ Sdea-i/u1) [2023/04/25(火) 14:07:55.49 ID:xfobd0gld.net]
- 話の流れからして
#define func(arg) hoge(arg) みたいな関数形式マクロがいた場合、 単に void func(int a){} と書くと void hoge(int a){}に置換されて死ぬ。 回避策で void (func)(int a){} としとけば展開されないよ ってことじゃないの?
- 41 名前:デフォルトの名無しさん (ワッチョイ c55f-ASru) mailto:sage [2023/04/25(火) 14:18:02.95 ID:zIgvDwJV0.net]
- 確かに、そういう効果はあるね。
それが必要になる状況は思い浮かばないけども。
- 42 名前:デフォルトの名無しさん (スップ Sd0a-cnX/) mailto:sage [2023/04/25(火) 18:35:24.79 ID:uZ/SnCfyd.net]
- 関数と同名のマクロがわざわざ定義されてるとしたらなんか事情がありそうだが
#undef func したほうが早くね
- 43 名前:デフォルトの名無しさん (ワッチョイ 7d01-+rDk) mailto:sage [2023/04/25(火) 18:49:03.51 ID:xUlKX7o40.net]
- #undef の後に undef する前へリカバーできるようにする機構ってコンパイラの環境依存だよね
(リカバーのための仕込み) #undef func : void func() { } : undefのリカバー (以下 func はマクロ側) :
- 44 名前:デフォルトの名無しさん (スップ Sd0a-cnX/) mailto:sage [2023/04/25(火) 19:09:41.44 ID:uZ/SnCfyd.net]
- ひょっとして>>21って
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); みたいな書き方のこと? この場合はカッコなし int *compar(const void *, const void *) だとintへのポインタを返す関数の実体ということになり 引数宣言内に関数の実体を書くなと言われてしまうだろう
- 45 名前:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip) mailto:sage [2023/04/25(火) 21:38:43.47 ID:ZKj27A06M.net]
- >>26
そうやって教えないでいて唐突になんの前触れもなく使われて「これ何ですか?」って質問したら「関数ポインタも知らねえのかよ」 テック系あるある
- 46 名前:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip) mailto:sage [2023/04/25(火) 21:43:41.07 ID:ZKj27A06M.net]
- >>44
いや int (*compar)(const void); みたいな単独のやつだよ てか引数に関数入れるのも教えたがらないよねえ😅 ほんと勿体つけるの大好き
- 47 名前:デフォルトの名無しさん (ワッチョイ 66cf-/HYv) mailto:sage [2023/04/25(火) 22:14:03.47 ID:OJFKrU7J0.net]
- 要は関数ポインタ知らなくてバカにされただけのおじさんか
const voidだもんな
- 48 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/25(火) 22:18:12.16 ID:VJ90Sqw80.net]
- アホすぎて笑う価値もないな
- 49 名前:デフォルトの名無しさん (スップ Sd0a-cnX/) mailto:sage [2023/04/25(火) 22:25:14.13 ID:T6e/oFBcd.net]
- >>46
それじゃエラーにならない? 具体的にどんな場面で使われてるのかわからんことには説明できないな 混乱する書き方だというのは同意するが
- 50 名前:デフォルトの名無しさん (スップ Sd0a-cnX/) mailto:sage [2023/04/25(火) 22:37:41.81 ID:T6e/oFBcd.net]
- ああ、それで「関数」ではなく「関数へのポインタ」が定義できるのか
関数の型をtypedefしてからやったほうがわかりやすくない? WindowsAPIでは大体そんな形になってるから真似してるけど 宣言 typedef int COMP_FUNC(const void *, const void *); COMP_FUNC comp_A; COMP_FUNC comp_B; COMP_FUNC *comp_func = comp_A; 切り替える時 comp_func = comp_B; 呼び出す時 comp_func(...);
- 51 名前:デフォルトの名無しさん (ワッチョイ 66cf-/HYv) mailto:sage [2023/04/25(火) 22:50:45.68 ID:OJFKrU7J0.net]
- typedefがめっちゃ気持ち悪い宣言だな
普通はアスタリスクつけてポインタとしてtypedefするもんだと思うよ sizeof(COMP_FUNC)がいくつになるのか見当がつかない不気味なオブジェクトだ
- 52 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-ASru) mailto:sage [2023/04/25(火) 23:29:28.69 ID:ug7UW9j70.net]
- sizeof は関数型の式に対して適用してはならないと制約されているから
関数だったときの結果は未定義で、常識的に考えればコンパイラはエラー扱いにするべきだと思うんだけど gcc や clang だと何故かエラーにならず 1 を返すんだよな。 (警告は出るけど。) 検出が難しいはずもない (実際に警告は出せてるわけだし) のになんでこうなってんだろ。 1 でなんか便利なことある?
- 53 名前:デフォルトの名無しさん (ワッチョイ c55f-uFYM) mailto:sage [2023/04/26(水) 02:32:17.99 ID:2SSTMM1B0.net]
- まあ、入門書は比較的難しいことを書かないほうが売れそうだけどな
でもそれを勿体つけるというのは違うかと
- 54 名前:デフォルトの名無しさん (ワッチョイ eaad-WJN6) mailto:sage [2023/04/26(水) 03:51:37.33 ID:5gh45PFo0.net]
- >>50
WINAPIの書き方はこうじゃない? typedef int (WINAPI *COMP_FUNC)(const void *, const void *); int WINAPI comp_A(const void *, const void *); COMP_FUNC comp_func = comp_A;
- 55 名前:デフォルトの名無しさん (ワッチョイ a5cf-aV8w) [2023/04/26(水) 07:41:17.76 ID:wJGIaQxR0.net]
- >>51
C++だとポインタじゃない方は関数メンバの宣言にも使えて便利だったりする。
- 56 名前:デフォルトの名無しさん (ワッチョイ 11c9-+rDk) mailto:sage [2023/04/26(水) 08:44:09.62 ID:dG3YoJcz0.net]
- >>54
ポイントされた関数の呼び出しで comp_func(ptr1, ptr2); も (*comp_func)(ptr1, ptr2); も両方通るのは何でやろね 歴史的な都合?
- 57 名前:デフォルトの名無しさん (ワッチョイ 5d2d-YWDm) mailto:sage [2023/04/26(水) 08:54:20.40 ID:v/InlOgJ0.net]
- 前者は関数名そのものをポインタとして使い、後者はポインタを明示的に指定することで関数ポインタとして扱う
- 58 名前:デフォルトの名無しさん (ワッチョイ 5963-YWDm) [2023/04/26(水) 09:12:09.71 ID:UWqGaqQz0.net]
- >>50
定義は? COMP_FUNC comp_A { //ここどうやって書くんだ }
- 59 名前:デフォルトの名無しさん (ワッチョイ c55f-ASru) mailto:sage [2023/04/26(水) 09:27:27.18 ID:mF8gxL160.net]
- >>58
残念ながら定義には関数型 typedef は使えない。 先に typedef を使った宣言だけ書いとけば定義の不整合を検出することはできるようになる。
- 60 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/26(水) 09:46:45.42 ID:UWqGaqQz0.net]
- COMP_FUNC comp_A;
COMP_FUNC comp_B; こう書かれても仮引数や返却値の型が見えないので 可読性を落としているな
- 61 名前:デフォルトの名無しさん (アウアウウー Sa21-YWDm) [2023/04/26(水) 09:48:32.91 ID:N7+hGpB4a.net]
- >>48
ほんそれ
- 62 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-ASru) mailto:sage [2023/04/26(水) 10:33:18.60 ID:NF11/Xrv0.net]
- >>56
* をいくつ付けても通るのは有名なネタだな。 #include <stdio.h> int main(void) { (**********printf)("hello, world\n"); } 関数指示子 (結果が関数型であるような式) は sizeof や & の オペランドであるときを除いて関数ポインタに (暗黙に) 型変換されるという規則があって、 普通に printf("hello, world\n"); とか書いてあるときでもこの printf は関数ポインタに変換されてる。 関数呼出しは関数に対してではなく関数ポインタに対して行われる。 関数ポインタに * を付けると関数指示子になるけどそれもやっぱり関数ポインタに変換されるので * をいくつつけても結果は関数ポインタという変なことになる。
- 63 名前:デフォルトの名無しさん (アウアウウー Sa21-YWDm) mailto:sage [2023/04/26(水) 11:39:43.86 ID:N7+hGpB4a.net]
- そもそもポインタに代入するときも
int a(int b) { return b + 1; } int (*f)(int) = &a; じゃなくて int (*f)(int) = a; で通るからな
- 64 名前:デフォルトの名無しさん (ワッチョイ 5963-/Rus) mailto:sage [2023/04/26(水) 13:38:42.38 ID:UWqGaqQz0.net]
- f(0); //こうできるしな
- 65 名前:デフォルトの名無しさん mailto:sage [2023/04/26(水) 14:31:03.82 ID:dG3YoJcz0.net]
- >>57
comp_func は 関数のポインタとして宣言されてる変数っすよ まぁ >>62 だということで納得
- 66 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-ASru) mailto:sage [2023/04/26(水) 17:00:12.69 ID:NF11/Xrv0.net]
- 余談だが >>62 はあくまでも C の場合の話で、
C++ では名前解決の話が合わさって複雑になってる。 関数呼出しのときに関数名を括弧で囲むかどうかで結果が変わってしまう場合がある。 https://wandbox.org/permlink/MO8NWeVmjoLTLly6 C のコードを C++ に持っていくことはそれなりにあることなので 変な書き方をしてると組み合わせの妙で引っかかることもあるかもね。
- 67 名前:デフォルトの名無しさん (スップ Sd0a-cnX/) mailto:sage [2023/04/26(水) 20:23:11.35 ID:WMGk7nvid.net]
- 正直どうでもいい
遠い昔Z80のニモニックでJP (HL)と書くけど本来はJP HLとなるはずじゃないかなと思ってたけどそれと同じw
- 68 名前:デフォルトの名無しさん (ワッチョイ 2a4b-ywdm) [2023/04/26(水) 20:32:10.51 ID:XZbLdYRG0.net]
- まぁ普通は関数名をカッコで括ったりしないし
- 69 名前:デフォルトの名無しさん (ワッチョイ ea79-lTfL) mailto:sage [2023/04/26(水) 21:13:49.50 ID:zbbRZmOB0.net]
- Cで関数のポインタガーとかやってる暇あったらC#のデレゲートとかラムダとか覚えた方がいいとおもった午後
- 70 名前:デフォルトの名無しさん (ワッチョイ 0afb-i/u1) [2023/04/26(水) 21:41:13.75 ID:tw2MKSIb0.net]
- 「min」と「max」の関数形式マクロをわざわざ定義する.hがあるらしい
- 71 名前:デフォルトの名無しさん (ワッチョイ 5d2d-YWDm) mailto:sage [2023/04/27(木) 00:02:52.04 ID:6BBE08oV0.net]
- stdbool.hでも覗いてみればいい
- 72 名前:デフォルトの名無しさん (ワッチョイ 7502-kSx0) mailto:sage [2023/04/27(木) 05:12:28.80 ID:sEk/rgYZ0.net]
- >>67
コンバイラ、甘やかしてはイカン 最初から攻める気持ちが大切
- 73 名前:デフォルトの名無しさん (ワッチョイ a902-V++f) mailto:sage [2023/04/27(木) 08:37:39.22 ID:OthllRbe0.net]
- コンバイラ?
- 74 名前:デフォルトの名無しさん (テテンテンテン MM3e-HodF) mailto:sage [2023/04/27(木) 09:03:22.20 ID:AVBMGEcwM.net]
- コンバトラーV
- 75 名前:デフォルトの名無しさん (ワッチョイ 2a7c-fzJl) mailto:sage [2023/04/27(木) 13:43:25.58 ID:kFL/uqTX0.net]
- JP (HL)って8080だとPCHLだっけ
アセンブラがとことん楽するようなニモニックだったな…
- 76 名前:デフォルトの名無しさん (テテンテンテン MM8f-HoNx) mailto:sage [2023/05/01(月) 16:24:43.62 ID:8iWiof/XM.net]
- 関数の引数リストの中で新たな構造体を定義するってことってできないの?
void func(struct X{int a;} b){ ... something ... } みたいに? 構文上は可能だと思うんだけどどうなんですか?
- 77 名前:デフォルトの名無しさん (スフッ Sdbf-oZQI) mailto:sage [2023/05/01(月) 18:21:57.14 ID:sEB4u3D3d.net]
- 構造体が使われる場所より前で定義する必要がある
- 78 名前:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9) mailto:sage [2023/05/01(月) 19:09:18.47 ID:Cn3LrXy/M.net]
- >>47
いみもなく勿体つけるオジサン 「関数ポインタは難しいから後でやろうね~オマジナイだよ~」
- 79 名前:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9) mailto:sage [2023/05/01(月) 19:15:34.08 ID:Cn3LrXy/M.net]
- >>53
それで後々になって質問すると >>47,48みたいのが湧くでしょ
- 80 名前:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9) mailto:sage [2023/05/01(月) 19:29:42.98 ID:Cn3LrXy/M.net]
- 未だに初っ端からコンソールにハローワールド表示させるとこから教えてるんだろうね勿体つけオジサンたちは
- 81 名前:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9) mailto:sage [2023/05/01(月) 19:36:49.71 ID:Cn3LrXy/M.net]
- 勿体つけオジサンたちはChatGTPで「C言語で関数名に()付けるのって何ですか?」って聞いてみればいいよ
機械以下のゴミw
- 82 名前:デフォルトの名無しさん (ワッチョイ 3702-ITaW) mailto:sage [2023/05/01(月) 19:44:56.10 ID:cY285a3R0.net]
- 医者から処方された薬は指示通り飲まないとだめだぞ
- 83 名前:デフォルトの名無しさん (ワッチョイ ff63-fitb) mailto:sage [2023/05/01(月) 20:12:14.98 ID:kp1qtDVi0.net]
- 配列に対してポインタでアクセスするとか、単純な者だと絵に描けば大体理解出来るが
構造体内のポインタ変数やら、さらに配列かして行くと、記述もすんなりとできなくなるし ましてや別人が書いたソースで、それらが一体何をアクセスしているのか理解するのは大変だ
- 84 名前:デフォルトの名無しさん (スプッッ Sd3f-rFN3) [2023/05/01(月) 20:21:43.22 ID:RHMPP4K9d.net]
- >>76
返り値のほうならなぜかgccでいけた まあ型推論がないC言語じゃあ役に立たないんだけど // main.c struct {int a;} func(); int main(){ printf("%d\n", func()); } // other.c int func(){ return 42;}
- 85 名前:デフォルトの名無しさん (ワッチョイ 572d-wHlW) mailto:sage [2023/05/02(火) 02:30:44.97 ID:FbQbKVUa0.net]
- void func(struct {int a;} b){
b.a = 10; printf("%d\n", b.a); } tccでもこれ通るな
- 86 名前:はちみつ餃子 mailto:sage [2023/05/02(火) 11:04:32.32 ID:HpVmkNB+0.net]
- >>76
私が知る限りにおいて文法上は正しい。 しかし X の有効範囲 (スコープ) は関数内だけなので 関数の外で struct X に対応する値を生成できず、 まともな方法では適切な実引数を与えることができない。 内容が同じ構造体は「適合」するし引数が適合する関数も適合するはずなので 強引にキャストして呼出しても言語仕様に反しないと思うのだけど 適合の概念をちゃんと理解できてる自信はない…… void func(struct X{int a;} b){} int main(void) { struct X{int a;} b = {1}; // このキャストはたぶんアリだと思うけど自信はない void (*f)(struct X) = (void(*)(struct X))func; f(b); }
- 87 名前:デフォルトの名無しさん (スップ Sdbf-s2+g) mailto:sage [2023/05/02(火) 20:11:42.15 ID:ovfmjnkKd.net]
- >>76
素直に最初に構造体をtypedef しとけば楽だと思うんですが 文法上で言えばstruct Xとだけ書いといて後でstruct Xの中身を定義しても正しい もちろんそれでは関数スタックのサイズを計算できないのでエラーになるだろうが
- 88 名前:デフォルトの名無しさん (アウアウウー Sa1b-wHlW) mailto:sage [2023/05/03(水) 14:42:04.19 ID:wz1HqF7Da.net]
- Cは
struct Hoge {int a;} b; と struct {int a;} b; を区別しない
- 89 名前:デフォルトの名無しさん (ワッチョイ 975f-By2c) mailto:sage [2023/05/03(水) 15:45:19.73 ID:1ndhLr9O0.net]
- >>88
名前の有無が違うし、変数名を変えて並べれば違う型になるし、明らかに違うと思うんだけど 何をもって「区別しない」なんて言うのか。
- 90 名前:デフォルトの名無しさん (ワッチョイ 975f-By2c) mailto:sage [2023/05/03(水) 18:10:57.61 ID:1ndhLr9O0.net]
- >>86
「内容が同じ構造体は「適合」する」について確認すると策定中の C23 から 内容に加えてタグ名まで同じ場合に限り適合する(compatible になる)ように変更されるようで、 現時点では正しくない模様。 https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3037.pdf
- 91 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-By2c) mailto:sage [2023/05/04(木) 00:37:13.28 ID:zfmlH8qj0.net]
- >>90
厳格な方向に改定してんのね。 今までが緩すぎたからしょうがないね。
- 92 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 01:26:39.82 ID:KJPnL+/P0.net]
- >>91
あ、ごめん書き方が悪かった。 これまではタグ及び内容が同じでも適合しなかったところ、 C23 から適合するようになるという話。 有効になるプログラムが増えるので、どちらかというと緩くなる変更。
- 93 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 04:12:02.40 ID:W+5O3yqN0.net]
- 急に凄くレベル低い話して申し訳ないんだけど
#include <stdio.h> int main() { int a[101] = {}; a[0] = 2; a[1] = 3; for (int i = 4; i < 1000; i++) { int r = 1, j; for (j = 0; j <= 100 && a[j] != 0; j++) { if ((i % a[j]) == 0) { r = 0; break; } } printf("%d %d %d %d %d \n", i, j, a[j], i % a[j], r); if (r) a[j + 1] = i; } for (int i = 0; i < 100; i++) printf("%d ", a[i]); } なんでこれ上手く動かないんだろう
- 94 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 05:17:57.46 ID:P5ZkmciJ0.net]
- このスレいつもレベル低いから大丈夫でしょ
上手く動かない?そもそもそのコードはどう動いて欲しいのか読み取れないんだよな 日頃から入出力を意識して書けって言われてない?まるで実践できてないからダメか
- 95 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 07:37:53.19 ID:6SJC1K3b0.net]
- >>93
二つ目の for ループから抜ける条件の一つが「a[j]がゼロ」なのに、そのループから抜けた直後で i % a[j] とかやってて、jが2のときにa[2]が0でループから抜けるから、ゼロ除算で落ちる それとこっちは直接の原因ではないけど、int a[101]と宣言すると a[0]~a[100]までしかアクセスできないのにa[102]までアクセスする可能性があるようなコードになってるのもダメだな
- 96 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 08:36:39.17 ID:Hj8mrajJd.net]
- とりあえず初期化するとき
int a[101] = {0,1,2}; と書いたほうが楽じゃん ちなみに初期値がない部分は0になる 後はめんどくさいから明日読むわ
- 97 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 08:46:33.13 ID:Hj8mrajJd.net]
- 間違えた
int a[101] = {1,2}; か ちなみに int a[101] = {}; ではまったく初期化されないからこのプログラムでは[0][1]以外のところには0ではなく不定値が入ってるのでうまく動かないのはそれなんじゃね int a[101] = {0}; と書いておけば省略した部分もすべての要素が0で初期化されるよ
- 98 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 09:36:07.29 ID:GmhF7zKn0.net]
- >>93
i と j ってわかりづらいから j は k に置き換えて言うけど i=4 のとき k=0 で 4%2 となり割り切れるため、何もせずに次 i=5 のとき k=2 で a[k]==0 なので k のループを抜ける(このときk==2でa[2]) 抜けた後のif (r) a[k + 1] = i; で a[3] = 5 になっていて a[2] は 0 のまま で0除算でドボン まずはif (r) a[k + 1] = i; ではなく if (r) a[k] = i; だね
- 99 名前:デフォルトの名無しさん mailto:sage [2023/05/04(木) 09:58:25.07 ID:GmhF7zKn0.net]
- >>93
それとこれって素数を見つけるプログラムと思うけど、 1000までの間に163個あるっぽい a の要素数はそれ以上必要 (0除算している部分のprintfがデバッグ用のように、デバッグで100までに制限しているのかもしれないけど) 一応言っておくと0除算でドボンは本質とはちょっと違うからね if (r) a[j] = i; printf("%d %d %d %d %d \n", i, j, a[j], i % a[j], r); とa[j] への代入とデバッグ用のprintfの位置を入れ替えれば0除算は起きないから
- 100 名前:デフォルトの名無しさん (ワッチョイ 572d-wHlW) mailto:sage [2023/05/04(木) 10:19:34.63 ID:W+5O3yqN0.net]
- >>95-99
丁寧な解説、ありがとうございます。 >>95,99 printfの中で0で割ってる可能性に気づいてなかったです。 a[k + 1]に代入しておかしくなってたので、原因を突き止めようとしたら 新しいバグを作ってしまっていました。 >>97 私の使ってるコンパイラだとどれでも int a[101] = {}; でなぜか全部0が入ります。そんなものかと思って通してました。
|

|