C言語なら俺に聞け 161

■ このスレッドは過去ログ倉庫に格納されています
2023/04/21(金) 14:05:20.18ID:rqj2HSDF0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

C11
http://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
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://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
2023/04/21(金) 16:20:56.29ID:cgpIrgwq0
>>1
大儀である
2023/04/21(金) 16:21:57.14ID:5coQdqNr0
久々に麻呂のクソースを見たいでおじゃるか?
2023/04/21(金) 22:04:31.33ID:euEROcVR0
久々に来たけど、C言語はもう人気が無いんかね・・・
2023/04/21(金) 22:53:09.84ID:kZ6jl2XB0
人気って
C言語で作れなんて非効率的なことする人はそういないのでは?
C言語じゃないとダメな環境を除いて
2023/04/21(金) 23:38:19.84ID:Ro9IllZr0
各分野に適したものがあるならそれを使うに越したことは無い。
C が本当に「適している」と言える分野ってそんなに広くないじゃろ……。

どういう言語が適しているのかよくわからんかちょうどよい言語なければ長い物にまかれることになるわけだけど、
様々な分野でそれぞれのよりよい言語が生まれて「長い物」の価値が薄れるならそれは喜ばしいことだと思う。
2023/04/22(土) 00:24:12.00ID:PKFQM5A+0
プログラムをする人が、コンピュータの基本的な知識が無いまましてしまうから
簡単な記述で出来る言語が登場したからかね?
単純に同じ演算を繰り返して比較すると、C言語は処理速度が一番速いとのこと
データを処理するには適しているかと
2023/04/22(土) 01:13:10.92ID:pp00Xtk80
FFTやらせたら、どの言語が一番速いだろうか
2023/04/22(土) 01:14:00.87ID:BwPMbYSuM
Cの知識はC++をする時に当然必要になる
CはTIOBE言語ランキングで2位で、C++は4位だ
逆に使えない奴はモグリだろw
2023/04/22(土) 03:04:47.05ID:WcjcWdD/0
Cを知り、アセンブラを知って、ハードアーキテクチャが分かる
2023/04/22(土) 07:44:16.17ID:rMU69DRU0
ハードの入り口に立つというだけ
Cより遙かに深い世界の
2023/04/22(土) 12:23:54.03ID:pp00Xtk80
それにしても、ネットは広大だわ。
13デフォルトの名無しさん (ワッチョイ 1146-0EuI)
垢版 |
2023/04/22(土) 16:05:32.27ID:QfqbbaWF0
Cの奥地が広いと言うならネットはなお広いではないか。
2023/04/22(土) 16:39:16.87ID:rMU69DRU0
デジタル3年
アナログ5年
高周波10年
なんて言うね

で、おまえらCはどのくらいでおぼえた?
仕事で使えるレベルになるまでに
2023/04/22(土) 18:14:06.16ID:ZOFRvMNu0
>>14
高周波は、あの分布定数の立体回路が謎に満ちていましたよね、あれ、どうやって設計するんだろう?
2023/04/22(土) 18:24:03.40ID:RQNj/O5w0
この世にはプログラミング言語はPHPとJavascriptしか無いと思ってるエンジニア()がたくさんいるから
Pythonの存在も知ってるけどあれはオシャレな感じがしないしオタクがやるものだと思ってる
2023/04/22(土) 19:05:57.81ID:Ul/bNVNnd
>>14
蟹飯の本は事前に読んでたけど、半年かかった
周りが旧帝工学系院卒ばっかだったから勉強したわ
おれ、旧帝数学だったからポインタとか分からんかった
でも、今ではわしの方が崇められる
日々「チャラい関数、マクロで被せろ」を軸に頑張っとる
18デフォルトの名無しさん (アウウィフ FF21-1cZQ)
垢版 |
2023/04/23(日) 18:42:16.06ID:y593Lq73F
PHPはホントごみ
2023/04/24(月) 12:59:52.39ID:6nEVjUPW0
親を殺されたのか
かわいそうに
2023/04/24(月) 14:15:55.03ID:U9n/COjud
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.84ID:IXNCOIDlM
int (func) (int n)
みたいに関数に()付けるのって何の意味(機能)ですか?
2023/04/24(月) 18:08:06.16ID:MExTF0xDd
関数ポインタ
2023/04/24(月) 20:21:25.09ID:TGYcq0jn0
違う! 関数そのもの
#define func(x) (func)(x)
マクロではない「本物の」funcを呼び出すのに使う
2023/04/24(月) 21:25:50.42ID:4M8+MweU0
int (func) (int n) となると宣言の文脈だからそれも違うだろう。

>>21 その記述だけでは a*b+c を (a*b)+c と書いたのと同じで、少なくともその括弧自体には何の効果もない。
何か意味があると思うなら書いた人に聞くしかない。
2023/04/24(月) 21:43:56.47ID:IXNCOIDlM
いやまあ愚痴なんだけど教科書や入門書ってなんでか知らんけど関数ポインタもったいつけて教えたがらないよね…
2023/04/24(月) 23:20:26.15ID:MovxHIrx0
素人さんには関数ポインタはむずいだろ
関数のポインタをベクトル化してジャンプテーブル代わりになるんもん
つまりスイッチケースが要らない、言う事
2023/04/24(月) 23:23:14.11ID:CIhFKz1G0
ジャンプテーブル使うのと、switch case と、
どちらが高速でしょうね?
2023/04/24(月) 23:32:25.83ID:RQPVcVj5M
>>23
それが上手く行くのは、マクロが再帰呼び出しされないような処理が入ってるからだろ
2023/04/24(月) 23:45:11.28ID:RQPVcVj5M
ジャンプテーブルを使うと、変数の引き渡しに手間が掛かる
構造体のポインタを渡すとか、引数を沢山渡すとかグローバル変数を使うとか
なので、switch文にして最適化でテーブルジャンプになるのを確認するのがベストかなと
2023/04/25(火) 08:47:58.80ID:2JpsSRmdd
gcc拡張機能のラベルのジャンプテーブルが速かった思い出
あれは規格に取り込むべきだと思う
2023/04/25(火) 10:23:58.24ID:dvdIAVRA0
それってどんなのだっけか
関数を配列にぶっこんだの?
2023/04/25(火) 10:35:38.43ID:VJ90Sqw80
FORTRANの算術GOTOみたいなもんかな
2023/04/25(火) 10:36:32.19ID:VJ90Sqw80
switch caseを最適化させるとジャンプテーブルになっていることはよくあるね
2023/04/25(火) 11:21:54.95ID:RcvlMMml0
開発環境の都合で C言語しか選択できず
C++ の virtual に相当する機構をなんとか捏造しようと
構造体に関数のポインタをメンバに持つ

あと qsort のまねっこ
(具体的な比較は外に丸投げして そういう関数がある前提でコードを書く
2023/04/25(火) 11:33:32.92ID:Y1VsObgtd
>>31
関数内のラベルをローカル配列の初期化て入れられて
goto labelarray[status];
見たいに飛べるやつ
2023/04/25(火) 12:02:12.18ID:zIgvDwJV0
>>28 (func)(x) に対して関数型マクロ func(x) の展開は起こらないよ。
2023/04/25(火) 12:24:03.71ID:VJ90Sqw80
調べてみた
Computed gotoってやつね

int main(void)
{
void *table[] = { &&L1, &&L2 };
goto *table[1];
L1: ;
L2: ;
}
2023/04/25(火) 12:27:03.54ID:VJ90Sqw80
参考
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
2023/04/25(火) 12:52:44.87ID:HIwqDhB5d
お、そんなん出来るんか
40デフォルトの名無しさん (スプッッ Sdea-i/u1)
垢版 |
2023/04/25(火) 14:07:55.49ID:xfobd0gld
話の流れからして

#define func(arg) hoge(arg)
みたいな関数形式マクロがいた場合、
単に void func(int a){} と書くと void hoge(int a){}に置換されて死ぬ。
回避策で void (func)(int a){} としとけば展開されないよ

ってことじゃないの?
2023/04/25(火) 14:18:02.95ID:zIgvDwJV0
確かに、そういう効果はあるね。
それが必要になる状況は思い浮かばないけども。
2023/04/25(火) 18:35:24.79ID:uZ/SnCfyd
関数と同名のマクロがわざわざ定義されてるとしたらなんか事情がありそうだが

#undef func
したほうが早くね
2023/04/25(火) 18:49:03.51ID:xUlKX7o40
#undef の後に undef する前へリカバーできるようにする機構ってコンパイラの環境依存だよね

(リカバーのための仕込み)
#undef func
 :
void func()
{
}
 :
undefのリカバー (以下 func はマクロ側)
 :
2023/04/25(火) 19:09:41.44ID:uZ/SnCfyd
ひょっとして>>21って

void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));

みたいな書き方のこと?
この場合はカッコなし int *compar(const void *, const void *)
だとintへのポインタを返す関数の実体ということになり
引数宣言内に関数の実体を書くなと言われてしまうだろう
2023/04/25(火) 21:38:43.47ID:ZKj27A06M
>>26
そうやって教えないでいて唐突になんの前触れもなく使われて「これ何ですか?」って質問したら「関数ポインタも知らねえのかよ」
テック系あるある
2023/04/25(火) 21:43:41.07ID:ZKj27A06M
>>44
いや
int (*compar)(const void);
みたいな単独のやつだよ
てか引数に関数入れるのも教えたがらないよねえ😅
ほんと勿体つけるの大好き
2023/04/25(火) 22:14:03.47ID:OJFKrU7J0
要は関数ポインタ知らなくてバカにされただけのおじさんか
const voidだもんな
2023/04/25(火) 22:18:12.16ID:VJ90Sqw80
アホすぎて笑う価値もないな
2023/04/25(火) 22:25:14.13ID:T6e/oFBcd
>>46
それじゃエラーにならない?
具体的にどんな場面で使われてるのかわからんことには説明できないな
混乱する書き方だというのは同意するが
2023/04/25(火) 22:37:41.81ID:T6e/oFBcd
ああ、それで「関数」ではなく「関数へのポインタ」が定義できるのか
関数の型を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(...);
2023/04/25(火) 22:50:45.68ID:OJFKrU7J0
typedefがめっちゃ気持ち悪い宣言だな
普通はアスタリスクつけてポインタとしてtypedefするもんだと思うよ
sizeof(COMP_FUNC)がいくつになるのか見当がつかない不気味なオブジェクトだ
2023/04/25(火) 23:29:28.69ID:ug7UW9j70
sizeof は関数型の式に対して適用してはならないと制約されているから
関数だったときの結果は未定義で、常識的に考えればコンパイラはエラー扱いにするべきだと思うんだけど
gcc や clang だと何故かエラーにならず 1 を返すんだよな。
(警告は出るけど。)

検出が難しいはずもない (実際に警告は出せてるわけだし) のになんでこうなってんだろ。
1 でなんか便利なことある?
2023/04/26(水) 02:32:17.99ID:2SSTMM1B0
まあ、入門書は比較的難しいことを書かないほうが売れそうだけどな
でもそれを勿体つけるというのは違うかと
2023/04/26(水) 03:51:37.33ID:5gh45PFo0
>>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;
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況