[過去ログ] C言語なら俺に聞け 162 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
354: はちみつ餃子◆8X2XSCHEME (ワッチョイ 823e-slPv) 2024/01/06(土)16:27 ID:iX+vez910(1) AAS
設定ファイルのデータ構造が key/value の組だけ、 value は単なる文字列という程度なら
パーサジェネレータはかえって邪魔じゃないのかな。
355: (ワッチョイ 651a-R/a6) 2024/01/06(土)21:36 ID:8zwGVkiA0(1/5) AAS
lex/yaccは使った事ない人にはハードル高いだろうね。逆に、使い方が分かると何でもそれでやりたがる時期が来る。どんなツールや言語でもそうだろうけど
356: (ワッチョイ b2c2-dhuT) 2024/01/06(土)21:39 ID:YhaQaYGw0(1) AAS
BNF書いても大した量にならないだろうし俺ならフルスクラッチで書いちゃうな
357: (ワッチョイ 651a-R/a6) 2024/01/06(土)21:45 ID:8zwGVkiA0(2/5) AAS
で、設定ファイル、shで環境変数を設定すりゃ済む、という案に誰も反応してもらえないんだが、どうだい? windows ならcmdだろうけど

設定項目ってのは、パス文字列とか、メモリサイズとか、ほぼ固定だけどあとから変えたい場合もあろう、っていう定数だよね。環境変数ってまさにその目的だと思ってる。

ドル記号で一時値の展開もできる。Cからも簡単に読める。
358: (ワッチョイ 651a-R/a6) 2024/01/06(土)21:56 ID:8zwGVkiA0(3/5) AAS
shで、設定ファイル兼、実行ファイル起動ラッパを書いて、利用者には直接実行ファイルじゃなくラッパを起動せよと説明して

export XXX_ROOT=/var/xxx
export XXX_INPUT_DIR=${XXX_ROOT}/in
export XXX_OUTPUT_DIR=${XXX_ROOT}/out
export XXX_READBUF_SIZE=32768

exec ${XXX_ROOT}/bin/xxx

Cで読む処理は

get_conf_str(...) //文字列項目用
get_conf_i64(...) //整数項目用
省3
359: (ワッチョイ 651a-R/a6) 2024/01/06(土)22:02 ID:8zwGVkiA0(4/5) AAS
get_conf_str() と get_conf_i64() の中身は
getenv() を使って簡単に実装できる、のは分かるよね?
360: (ワッチョイ e1f0-P53C) 2024/01/06(土)22:09 ID:LvNnK4+W0(1) AAS
単なる文字列だけなら正規表現の置換でいいだろ
361: (ワッチョイ 651a-R/a6) 2024/01/06(土)22:20 ID:8zwGVkiA0(5/5) AAS
struct conf_t {
char* input_dir
char* output_dir;
int64_t readbuf_size;
} g_conf;

文字列項目はC++だとstd::string にする所だが、Cだとstrdup(的なもの)で実装しても良いんじゃないかい。

g_conf.inputdir = get_conf_str(
"XXX_INPUT_DIR", "/var/xxx/in");
g_conf.outputdir = get_conf_str(
"XXX_OUTPUT_DIR", "/var/xxx/out");
省3
362: (ワッチョイ 627a-JKp6) 2024/01/06(土)23:25 ID:4fq2Cpkf0(1) AAS
まあ落ち着けよ 質問者はそんなこと聞いとらんだろうよ
363
(1): (ワッチョイ ff7a-dvWY) 2024/01/07(日)00:35 ID:yw4Ulg6E0(1) AAS
for(;;){
if((result = fgets(line, MAX_LEN, stream)) != NULL){
p1=result;
p3=p1+strlen(line);
p2=strtok(p1, "=");
}
}

これで、p1とp2から左辺、p2とp3から右辺が取り出せる。
$の展開は、マクロ展開処理の要領で
右辺に$があるかチェックして、あったら定義値に置き換えるという
省1
364: (ワッチョイ 7fb5-j9I8) 2024/01/07(日)08:57 ID:4P3NNejl0(1) AAS
>>335
>Cから読み込む場合は、自分で展開する必要があると思ってます
その通りです

>それをやってくれるライブラリや関数等、ありますでしょうか
ありません
自作する必要があります

>>363
p2=strtok(p1, "=");
スペースやタブの処理が必要
365: (ワッチョイ 7f79-e2pS) 2024/01/07(日)10:17 ID:gAwkeLQQ0(1) AAS
せめて既存の気の利いた言語のstring型のメソッドやらを参考にしろよ
ここで再発明しても誰も使わんだろ
366: (ワッチョイ 5f1a-nsdu) 2024/01/07(日)10:25 ID:TVg93ufA0(1) AAS
質問者、もういない
367: (ワッチョイ df01-6482) 2024/01/07(日)11:15 ID:SfiTOIyR0(1) AAS
>>335
>それをやってくれるライブラリや関数等、ありますでしょうか
perlはCで書かれてるけどね
368: (ワッチョイ 5f63-vNrU) 2024/01/07(日)11:23 ID:XrTF2oph0(1) AAS
動かすCプログラムをperlに書き直す方が簡単そう
369: (ワッチョイ 7fad-ipwt) 2024/01/07(日)16:24 ID:tTa6vFrs0(1) AAS
こんな方法もある。しかし $ の変数展開しかしないなら無駄な感じはするね。それだけのためにここまでするのかという。

perlembed - C プログラムへの Perl の埋め込み方
外部リンク[pod]:perldoc.jp
370
(1): (ワッチョイ 5f63-vNrU) 2024/01/10(水)16:11 ID:PVZRGcug0(1/2) AAS
$がリテラルとして入ってた時はどうするかとか、結構面倒そう
371
(2): (ワッチョイ 5f1f-nsdu) 2024/01/10(水)17:49 ID:C4OEbwTl0(1/4) AAS
>>370
そうなんだよー、真面目にやるとバカみたいに面倒なのよ

文字列リテラルの中に $ やコメント開始終了記号が入る事もあるし
コメントの中に $ や文字列開始終了記号が入る事もある

# "#"
$aaa = /* $コメント " */ "文字列/**/値";

なので、頭から読み始めて、状態を追いながら(現在の場所が 文を書く所か、コメント内か、文字列内か)読まないと、正しいファイルを正しく読めない

んで、つまんないバグを作り込んだりするの。その、もういない誰かが作り込んだつまんないバグを、別の誰かが直すはめになる。そんなの嫌じゃね?
372: (ワッチョイ 5f1f-nsdu) 2024/01/10(水)17:57 ID:C4OEbwTl0(2/4) AAS
でも本当に、質問者はもうトンズラしたと思うよ。次の話をしよう
373: (ワッチョイ 5f63-vNrU) 2024/01/10(水)18:00 ID:PVZRGcug0(2/2) AAS
次の患者さん、どうぞ
374: (ワッチョイ ffcf-mfjK) 2024/01/10(水)21:56 ID:Qa3z5jue0(1) AAS
>>327
どっちにしろ質問者のためにやってるわけじゃないからいいんだよ
375
(1): (ワッチョイ 5ff5-j9I8) 2024/01/10(水)22:25 ID:Gs+Ha8Nh0(1) AAS
>>371
そこまでのコメント機能はいらんやろ
シェルスクリプトの設定ファイル程度のことができればいいんだろうから
#が来たら改行までをコメントとするぐらいで
376: (ワッチョイ 7fd9-EKXI) 2024/01/10(水)23:20 ID:ZQ7M3ZpB0(1) AAS
ちなみにCの識別子に$を使える
少なくともgcc, clang, msvcで使える
int $val = 0;
とか
377
(1): (ワッチョイ 5f1f-nsdu) 2024/01/10(水)23:20 ID:C4OEbwTl0(3/4) AAS
>>375
環境変数設定で「十分」どころか、それがかなりきちんと対応している。

シェルは(shもcmdも)「改行までコメントとみなす」なんていういい加減な実装じゃないよ
378: (ワッチョイ 5f1f-nsdu) 2024/01/10(水)23:36 ID:C4OEbwTl0(4/4) AAS
パーサー実装の現実的な話がまともにできるニキはここにはいないねw
379
(1): (ワッチョイ 5f1f-nsdu) 2024/01/11(木)02:31 ID:uSDU2aBB0(1) AAS
ほらな、はちみつも黙るやろ
規格は詳しいけどな
380: (ワッチョイ 5fbb-EKXI) 2024/01/11(木)02:42 ID:WTkhFxto0(1) AAS
パーサーなんて大して難しくないよ
テスト書けば
381: (ワッチョイ 5fa6-j9I8) 2024/01/11(木)06:03 ID:ZajpDUJL0(1) AAS
>>377
いやだからそんな本格的に作る必要ないって話
労力の投入場所を選定するのもプログラマの能力
382: (ワッチョイ ffcf-mfjK) 2024/01/11(木)07:51 ID:7oF58mtI0(1) AAS
>>371みたいなので悩むならさくっと正規表現ライブラリやパーサージェネレータ使うな。
学習のために自分でパーサー書いてみたいってんなら別だが。
383: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f3e-Cx9t) 2024/01/11(木)09:41 ID:NL5Kg7pj0(1) AAS
>>379
仕様が曖昧なのに実装の話をしても無意味だろ。
新しい情報が提示されないなら回答すべきこともない。
384: (ワッチョイ 5f63-vNrU) 2024/01/11(木)09:42 ID:ZxeGb/wD0(1) AAS
誰か、作ってやれよ
385
(1): (ワッチョイ df09-dvWY) 2024/01/12(金)10:13 ID:Umd8uX9b0(1) AAS
strcat() はダメなの?
386: (ワッチョイ ff5f-03E5) 2024/01/13(土)00:25 ID:suyQO94R0(1/2) AAS
sscanfで十分だよ
387: (スッップ Sd9f-j9I8) 2024/01/13(土)09:14 ID:mB7BPAPVd(1) AAS
>>385
参加したかったの?
388: (ワッチョイ 5f63-vNrU) 2024/01/13(土)09:41 ID:fMrSPcrk0(1) AAS
ここに書けば参加したことになるよ
389: (ワッチョイ 5f59-P7l0) 2024/01/13(土)13:22 ID:kmNIHanh0(1) AAS
参加することに意義がある
390: (スッップ Sd9f-+zra) 2024/01/13(土)16:53 ID:8Ttuq2mzd(1) AAS
C言語からJSON読み書きにオススメのライブラリやDLL教えてくれさい。
UTF-8↔ANSI変換はAPIでやれそうです。
391: (ワッチョイ ff5f-03E5) 2024/01/13(土)19:04 ID:suyQO94R0(2/2) AAS
yyjsonで十分だよ
392
(7): (ワントンキン MM16-l2AN) 2024/01/17(水)13:51 ID:MxPcwzaVM(1) AAS
以下はmalloc()で割り当てた領域を開放してポインタをヌルポインタにするマクロである

#define MYFREE(p) do {free(p); p = 0;} while(0)

このマクロに不備があるかないか、ある場合はどんな不備か答えよ
ただし処理系はANCI C準拠とし、stdlib.hがインクルードされていることとpが左辺値かつmallocで割り当てた領域を指す有効なポインタであることの2点は呼び出し側によって保障されているものとする
393: (ワッチョイ 427c-kX52) 2024/01/17(水)16:32 ID:sbbnyjB/0(1) AAS
宿題は他所でやれ
394
(3): (ワッチョイ f901-LNAd) 2024/01/17(水)19:42 ID:bWv2IYcS0(1/2) AAS
do-while文で回す意味ってあるの?
395: (ワッチョイ c563-LNAd) 2024/01/17(水)19:44 ID:UA2B8Wur0(1) AAS
使った人に聞きなさい
396
(1): (ブーイモ MM22-Nr/L) 2024/01/17(水)19:49 ID:dYqrLAA4M(1) AAS
>>394
セミコロンをつけさせるため
397: (ワッチョイ 25bb-ggGG) 2024/01/17(水)21:11 ID:DTNbW1I/0(1) AAS
>>392
答えわかったけど教えない
398
(1): (ワッチョイ 72cd-Qz6p) 2024/01/17(水)21:21 ID:Am4HUjmg0(1) AAS
>>394
2つ以上の文をマクロ関数の形にするときに、C言語の仕様において最も合法安全とされるイディオムだよ
399
(1): (スッップ Sd22-aNQv) 2024/01/17(水)21:47 ID:i5GqHIkod(1) AAS
>>394
たとえば
#define MYFREE(p) free(p); p = 0
と定義すると

if( 条件 ) MYFREE( p );
と書くと

if( 条件 ) free(p); p = 0;
と展開されてしまいp = 0;は条件に関わらず実行されてしまう
またこの後にelse節が続くとエラーになってしまうなど不具合の原因になる
400
(1): (ワッチョイ f901-LNAd) 2024/01/17(水)23:38 ID:bWv2IYcS0(2/2) AAS
>>396,398,399
全然知らなかった
アリガト
401: (ワッチョイ 2214-HXAs) 2024/01/18(木)11:04 ID:0zoYvNSM0(1/2) AAS
>>392
その条件下ならない
でもpが左辺値という前提がなかったら変なコトになるコードが書けるね
402
(2): (ワッチョイ 2214-HXAs) 2024/01/18(木)11:04 ID:0zoYvNSM0(2/2) AAS
>>400
396はゼンゼン関係ないんだけどホントに分かってんのか?w
403: 400ではないが (ワッチョイ 6e46-Y4mw) 2024/01/18(木)12:19 ID:5g03qqC30(1) AAS
>>402
396 と 399 は異口同音と読んでいたが、主旨違うの?
404: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/18(木)12:27 ID:LtdZIRKJ0(1/2) AAS
>>402
ブロックではなく do / while にする理由としては関係がある。
405: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/18(木)12:41 ID:LtdZIRKJ0(2/2) AAS
二つの文が分かれてしまわないようにするだけならブロックで包めばよくて

#define MYFREE(p) {free(p); p = 0;}

と定義しておけば

if( 条件 ) MYFREE( p );

というような使い方で意図通り動作する。 問題になるのは else が付くときで、
省7
406: (ワッチョイ 118f-tUOA) 2024/01/18(木)13:15 ID:hXSenRUz0(1) AAS
はちみつ餃子はいい加減改名しろよ、はちみつ先生によ
どんだけタメになる話すりゃ気が済むんだ
目からウロボロスだぜまったく
407: (ワッチョイ 02ad-6zsj) 2024/01/18(木)13:17 ID:opxINJAy0(1) AAS
>>392
「せよ」ってなんだよ。何様のつもりだ?
408: (スッップ Sd22-aNQv) 2024/01/18(木)20:39 ID:r48d/DyKd(1) AAS
#define MYFREE(p) (free(p), p = 0)

のほうが単純
409
(1): (ワッチョイ 427c-kX52) 2024/01/18(木)22:45 ID:twAiz/ys0(1) AAS
今どきのCならマクロじゃないといけない場合以外はinline使え。
410
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)08:59 ID:vjpbBz8R0(1/9) AAS
>>409
C の関数は多相化できない。
void* と他のポインタは相互に変換可能なんだが
void* 自体の表現や境界調整要求は環境依存なので

#include <stddef.h>
#include <stdlib.h>
inline void my_free(void** x) {
free(*x);
*x=NULL;
}
省6
411
(1): (ワッチョイ 463f-ggGG) 2024/01/19(金)11:12 ID:Wkz3Ctqj0(1/5) AAS
mallocが返すのはvoid*だし、freeが受け取るのもvoid*なのに??
保証が無かったら俺達はこれからどうすればいいんだw
412: (ワッチョイ c563-LNAd) 2024/01/19(金)11:13 ID:76FyHnUv0(1) AAS
printf("Hello, work!");
413: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)11:18 ID:vjpbBz8R0(2/9) AAS
>>411
void* の話じゃなくて void** の話をしてる。
414: (ワッチョイ 6e2a-Y4mw) 2024/01/19(金)11:42 ID:THNGxTXR0(1) AAS
printf("Konyanyachiwa, Sekai no Kuni kara!");
415: (ワッチョイ 463f-ggGG) 2024/01/19(金)12:11 ID:Wkz3Ctqj0(2/5) AAS
void**とvoid*は相互に変換可能じゃないのか?
416: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)12:19 ID:vjpbBz8R0(3/9) AAS
変換が可能だということと同じ表現を持つことは別という話。
int* から void* への変換は変換に関するルールだが
int** から void** への変換によって int* を void* として読もうとするのは type punning の問題。
417
(1): (ワッチョイ 463f-ggGG) 2024/01/19(金)12:20 ID:Wkz3Ctqj0(3/5) AAS
そうなると、
int** a = malloc(sizeof(int*) * 3);
は、保証無いことになるな
俺達はどうすればいいんだw
418: (ワッチョイ 463f-ggGG) 2024/01/19(金)12:25 ID:Wkz3Ctqj0(4/5) AAS
void** a = malloc(sizeof(void*) * 3);
の方が適切だったか
これで、a[0]の読み書きが保証されないのは困るよ
419: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)12:27 ID:vjpbBz8R0(4/9) AAS
>>417
繰り返すが変換の話と表現の話は異なる。
void* は全てのオブジェクトを指すポインタと相互に変は可能であることは保証され、
「malloc が返すポインタに限っては」いかなる型とも適合するように境界調整されていることが保証される。
420: (ワッチョイ 313a-xGnM) 2024/01/19(金)12:34 ID:3hcnICbb0(1) AAS
【AI】Googleの医療面接特化AI「AMIE」は人間よりも正確な診断が可能&患者への印象に優れるという研究結果 [すらいむ★]
2chスレ:scienceplus
【AI】Google DeepMindが数学オリンピックレベルの幾何学問題を解けるAIを発表、人間の金メダリストに近い性能を発揮 [すらいむ★]
2chスレ:scienceplus
【AI】大学入試共通テスト、3つのチャットAIに解かせてみたら? GPT-4はバケモノだった [すらいむ★]
2chスレ:scienceplus
【ナゾロジー】「株価の変動を粒子の振動として理解」量子力学で株式市場の法則を読む! [すらいむ★]
2chスレ:scienceplus
【AI】NTT、自分の分身AIを低コストで作る技術。自分の合成音声を簡単に作れる技術も [すらいむ★]
2chスレ:scienceplus
省1
421
(1): (スッップ Sd22-aNQv) 2024/01/19(金)12:39 ID:S8ovIeWid(1/3) AAS
何を言ってるんだお前は案件

ポインタの中身は指す対象によってアラインが変わるが
ポインタ自体のアラインは原則一種類しかない
422
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)12:51 ID:vjpbBz8R0(5/9) AAS
>>421
ポインタは型ごとに異なる表現・境界調整要求を持つ可能性がある。
適合する型へのポインタ同士の場合など同じ表現・境界調整要求を持つ条件が定められているが
最後に「これ以外の型へのポインタは、同じ表現又は同じ境界調整要求をもつ必要はない」と仕様に明記されてる。

具体的な部分は処理系定義なので全部が同じ表現であることをあてにしていい環境ならそうすることは否定しなけど、
常にあてにできるわけでもない。
423: (ワッチョイ 463f-ggGG) 2024/01/19(金)13:18 ID:Wkz3Ctqj0(5/5) AAS
そうは言っても、
void* p = 0;
と直接生成出来るわけで、void*は値としての意味もちゃんとある
それがvoid**にすると元に戻せる保証が無いのは仕様の不備だろw
424
(1): (スッップ Sd22-aNQv) 2024/01/19(金)13:22 ID:S8ovIeWid(2/3) AAS
>>422
それは「ポインタが指す対象」についての記述で
ポインタ自体にはどんな適当な値を書き込むことも可能(そのポインタを使ってアクセスすると何が起こるかわからないというだけ)
ただポインタにNULLを書き込むだけの関数になんの危険もない
425
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)13:35 ID:vjpbBz8R0(6/9) AAS
>>424
> それは「ポインタが指す対象」についての記述で

この (>>410) 場合はポインタが指す対象に書き込もうとしている話だが。
426
(1): (スッップ Sd22-aNQv) 2024/01/19(金)15:18 ID:S8ovIeWid(3/3) AAS
>>425
そのポインタは関数への引数であり
すでにvoid*を表すものだと型は決まってるではないか

それとは別に
インライン関数で書いた場合はその場で展開されるから
void* p = 0;と書いた場合と同様にコンパイラが適切な0を書き込んでくれるんじゃないの
つまり(void**)をつけると逆に危険
my_free(&x);
でよい
427
(1): (ラクッペペ MM66-Fks1) 2024/01/19(金)16:04 ID:dJaf/W/GM(1) AAS
ポインタで0リテラルだけは特殊でNULLと同義だったのではなかったっけ
428: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)16:16 ID:vjpbBz8R0(7/9) AAS
>>426
> (void**)をつけると逆に危険

これは暗黙に型変換されることが保証される文脈ではないので付けなければコンパイルが通らないだけ。
(コンパイラによっては黙って通すことはあるのかもしれない。)

> インライン関数で書いた場合はその場で展開されるから

言語の意味論としてはインライン関数は
・ 同じ定義なら (翻訳単位を跨いだ場合でも) 複数回定義してもよい (定義が一回の場合と同じ挙動)
・ なるべく高速に呼び出して欲しいことを期待するヒントである (実現方法は規定しない)

ということになってる。
インライン関数がインライン関数ではない関数と異なる動作にはならない。
429
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)16:39 ID:vjpbBz8R0(8/9) AAS
>>427
せやで。
厳密に言えばリテラルだけじゃなくて「整数の 0 であるような定数 (定数式) をポインタに型変換したときは空ポインタ」というルール。

これも変換に関するルールであって表現に関するルールではないよね。
実際に空ポインタの内部表現が整数の 0 というわけではない環境は存在するが、
型が正しければ適切に変換される。
430
(1): (ワッチョイ 25bb-ggGG) 2024/01/19(金)16:53 ID:CCGmGKuQ0(1/2) AAS
>>429
それ規格書に書いてあんの?知らんかったわ
でも

if (!ptr)

みたいなポインタがゼロであることを期待するような式は処理系依存になるでしょ?
431
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/19(金)17:02 ID:vjpbBz8R0(9/9) AAS
>>430
いや、それがよく出来てて、ポインタをそういう形で条件に使うのは問題ない。
単項演算子 ! について「式!Eは,(0==E)と等価とする」というルールになっていて
等価演算子 (==) はポインタと空ポインタ定数を比較したときの結果を規定してる。
空ポインタ定数のほうをもう一方のオペランドの型に合う空ポインタに型変換するルール。
432: (ワッチョイ 25bb-0zjl) 2024/01/19(金)17:32 ID:CCGmGKuQ0(2/2) AAS
>>431
規格書読んできたけど
6.3.2.3 値0をもつ整数定数式は空ポインタになる
6.5.3.1 式!Eは,(0==E)と等価
6.5.9 ==は空ポインタ定数をポインタの型へ型変換する
ってことか
なるほど、規格を解釈すれば!ptrは空ポインタと比較されることになるから問題ないのか
勉強になったわ
433
(1): (ワッチョイ 21d6-ggGG) 2024/01/19(金)18:55 ID:EWHtqHW90(1) AAS
NULLは処理系定義だしこの辺はややこしいよね
434
(1): (ワッチョイ 463f-ggGG) 2024/01/20(土)00:57 ID:QcwVnceA0(1/6) AAS
void*の値は作成出来るけど、表現や境界調整要求は未定義とか、おかしいだろ
Cは現実に則した言語だと思ってたけど、妙な未定義だな
ちなみに、インタープリター型言語を作ったら、オブジェクトはみんなvoid*になる
void*の配列を作成したりとか普通に行われる
もはや規格とか無意味
実装がどうなってるかだけが重要だ
435: (ワッチョイ c2c3-IYsG) 2024/01/20(土)10:29 ID:ZDCHWjSD0(1) AAS
>>433
全然ややこしくないでしょ
436: (ワッチョイ 02ad-L3s4) 2024/01/20(土)10:30 ID:UfD1Ji0o0(1/3) AAS
> 実装がどうなってるかだけが重要だ
もちろんその通りだけど規格上未定義なわけだから実装がすべて統一されているとは限らないわけで
その実装における「限らない」が問題なわけでしょ
437
(1): (ワッチョイ cd59-lxZL) 2024/01/20(土)12:47 ID:Ttk7tIdd0(1) AAS
実際に使用する環境に合わせれば良いだけ
438
(2): (ワッチョイ 463f-ggGG) 2024/01/20(土)13:33 ID:QcwVnceA0(2/6) AAS
各OS毎にABI(Application Binary Interface)が定義されてて、Cの規格で定義されてないところが明確に定義されてる
2つを合わせて現実のC言語なんだよな
だから、JIS X 3010だけを取り上げてどうこう言っても混乱させるだけ
439: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/YAw) 2024/01/20(土)14:51 ID:k6CjZuQW0(1/2) AAS
>>434
実際には void* と int* (などのポインタ) が同じ表現なことは多いので
あまり問題 (type punning) にならないと考えるならそうかも。

ただ、表現が同じである環境ならかまわないのかというとそうでもない。
aliasing rules が絡んでくる。
言語仕様上で適合するとされる以外の読み書きをプログラマはやらない (やったら未定義だから) という仮定の元に最適化されることがある。

>>438
ABI はその名の通りインターフェイスを一貫させるための規定であって、
外部に公開しない (外部リンケージを持たない) 部分ではコンパイラは最適化するし、オブジェクトを除去することもある。

私は >>422 で「あてにしていい環境ならそうすることは否定しない」と述べたが、
省3
440: (ワッチョイ 02ad-L3s4) 2024/01/20(土)14:57 ID:UfD1Ji0o0(2/3) AAS
だから、その環境が不明瞭なこういう場所で問題になるわけでしょ?
実際>>392では「処理系はANCI C準拠」としか言っていないわけだし
441: (ワッチョイ 02ad-L3s4) 2024/01/20(土)14:57 ID:UfD1Ji0o0(3/3) AAS
おっと440は>>437-438アテネ
442: (ワッチョイ 463f-ggGG) 2024/01/20(土)15:58 ID:QcwVnceA0(3/6) AAS
未定義とは規格遊びには便利な言葉だなw
正解はconfigureスクリプトがやってるように、事前に環境を調査して前提にしていい事を明確にして最適な実装をする事だな
なので、言語仕様のみで判断を下す事は不正解と言える
その為にconfigureスクリプトがある
他の言語ではあまり必要ない
Rustとか最近の言語は言語仕様に不明瞭な点は残さないのがトレンドだろう
じゃなきゃそこが脆弱性を生んでしまう
443: (ワッチョイ 463f-ggGG) 2024/01/20(土)16:03 ID:QcwVnceA0(4/6) AAS
>>392のマクロは、副作用のある式を渡したりするとおかしな事が起きる
全くもって脆弱なものだ
そのままで良いのか?
マクロのままにしておくとか、そっちの方が脆弱性を生む事になる
ちゃんと関数化すべきだろ
その為にすべき事は何だ?
それを議論することが正解と言っている
444: (ワッチョイ 2205-l2AN) 2024/01/20(土)16:33 ID:7OBiWfZx0(1/2) AAS
副作用のある式とは例えば?
445
(2): (ワッチョイ 82d4-niQV) 2024/01/20(土)19:48 ID:31IXtECu0(1) AAS
p++じゃない?
446
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-B+Bj) 2024/01/20(土)19:54 ID:k6CjZuQW0(2/2) AAS
関数で書いたら問題を避けられるわけ?
447: (ワッチョイ 0279-5stn) 2024/01/20(土)21:49 ID:VgpxxxtV0(1) AAS
C言語で今更議論することなんてないよ
気に入る要らないはモダン言語とかでやってなさい
448: (ワッチョイ 450a-rpIY) 2024/01/20(土)22:17 ID:DXZ/M+lB0(1) AAS
使用済みのポインタ変数を変なやり方でクリアするとかクソどうでもいい
449: (ワッチョイ 22ec-HXAs) 2024/01/20(土)22:21 ID:7OBiWfZx0(2/2) AAS
>>445
それは考えなくていいでしょ
450
(1): (ワッチョイ 463f-ggGG) 2024/01/20(土)22:34 ID:QcwVnceA0(5/6) AAS
>>446
え?本気でいってんの?
関数で書けば副作用(例えば++p)は1回で済む
当然副作用がある式を書くのはアホだと思うが、少なくとも書いた通りには動く
451: (ワッチョイ 463f-ggGG) 2024/01/20(土)22:44 ID:QcwVnceA0(6/6) AAS
例えば、(uint8_t)malloc(...) + sizeof(int)を返す関数もあり得る
これは前の方にデータを隠すテクニックだ
実はC++のコンパイラで普通に使われている
これを解放する時は、free(p -= sizeof(int))とやらない事もない
まぁ普通はp - sizeof(int)だろうから屁理屈だけどねw
452: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5f3e-3Dea) 2024/01/21(日)00:53 ID:4rk7TZPC0(1/2) AAS
>>450
解決したい問題はそれだけでいいのか。
それなら意図はわかる。
ただ現実に C の関数を多相化できないのは変えられない前提としてある。
異なる型で扱う必要があるんだから異なる関数を用意するしかないのはどうしようもなくない?
453: (ワッチョイ e785-6dvo) 2024/01/21(日)11:37 ID:yYf7aVwb0(1) AAS
多相?
仮にポインタ変数のアドレス を引数で渡したい場合であってもvoid ** じゃなくvoid * を使って、
人間同士がドキュメントだろうが喫煙所だろうがで問題解決しろよってのが規画と整合する答えなんじゃないの

どうせキャストするんでしょうに
バカですか
1-
あと 549 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.040s