!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
C2x ドラフト
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.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言語なら俺に聞け 158
https://mevius.5ch.net/test/read.cgi/tech/1640401906/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
C言語なら俺に聞け 159
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワンミングク MMa2-RRwJ)
2022/08/04(木) 23:32:27.83ID:yWVViPyIM135デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 21:11:00.47ID:nFqp2Ghc0 >>134
いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。
いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。
136デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 22:08:19.73ID:nFqp2Ghc0 FILE *fp;
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。
137デフォルトの名無しさん (ワッチョイ e710-q8Yd)
2022/09/07(水) 22:22:19.78ID:gjYyI5to0 ポインタに入ってる数値を書き換えるからそうじゃなきゃ変えられないでしょ
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
138ハノン ◆QZaw55cn4c (US 0Hff-KcK1)
2022/09/07(水) 22:26:00.67ID:9LeLCbkKH もっとも、私は pascal から入ったから、ポインタなくして参照を理解していた人なのではありますが‥‥うーむ
139デフォルトの名無しさん (ワッチョイ e710-q8Yd)
2022/09/07(水) 22:31:50.29ID:gjYyI5to0 ポインタのアドレス取ったときとかポインタのポインタでごちゃごちゃになる人は
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
140デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:04:25.54ID:nFqp2Ghc0 >>137
なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。
なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。
141デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/07(水) 23:32:06.28ID:zeO2o007M int hoge(int *a) { *a = 1; }
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
142デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:35:11.50ID:nFqp2Ghc0143デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:39:24.34ID:nFqp2Ghc0 何回も質問しているものです。
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
https://ideone.com/rPlXWX
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
https://ideone.com/rPlXWX
144はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/07(水) 23:39:37.84ID:51dNe1to0145デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:41:02.70ID:nFqp2Ghc0 最初の付近はうまくエンコードされているんですが、途中でごみの値が入ってくる
ようでずれてきます。どこにゴミが入っているのかわかりません。
ようでずれてきます。どこにゴミが入っているのかわかりません。
146デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 00:50:34.87ID:0dKPxAYF0 tmpfile()で作られる作業ファイルはどこに作られますか?
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint
147はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 01:00:19.58ID:MG9wnc1h0148143 (ワッチョイ c710-CzlZ)
2022/09/08(木) 02:30:52.24ID:MgWIrRAL0 コードの構造が自分でもわかり難かったので、フルスクラッチで書き直しました。
https://ideone.com/ddQPJy
でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。
https://ideone.com/ddQPJy
でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。
149デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/08(木) 02:56:32.93ID:m+If4M0FM >>148
上から下までスクロールしたら一瞬で分かったw
上から下までスクロールしたら一瞬で分かったw
150デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 08:55:08.15ID:0dKPxAYF0 >>147
サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな
サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな
151はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 09:15:06.66ID:MG9wnc1h0152デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
2022/09/08(木) 09:25:12.09ID:JEMfdspaa153デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/08(木) 09:54:46.94ID:NWgtv/6U0 8bit目が立ってるデータだと char を size_t にキャストするとよろしくない可能性
あと末尾のパディング処理
最新は rfc4648 か
あと末尾のパディング処理
最新は rfc4648 か
154デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/08(木) 10:12:47.05ID:dSUuwrfW0 >>148
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
155デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/08(木) 10:22:53.70ID:dSUuwrfW0 >>150
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
https://sonic
64.com/2004-12-07.html
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
https://sonic
64.com/2004-12-07.html
156はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 10:30:42.77ID:MG9wnc1h0 >>148
主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。
主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。
157デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 10:34:35.91ID:0dKPxAYF0158デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 10:35:11.25ID:0dKPxAYF0159デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/08(木) 23:34:00.51ID:QimgDhZ1M160デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/09(金) 00:38:56.32ID:eFldOldK0 >>159
ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
161148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:45:37.54ID:eFldOldK0 読み込むデータによってゴミデータが入ったり入らなかったりすることがわかった。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
https://ideone.com/HRogms
読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
https://ideone.com/HRogms
読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。
162148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:56:18.41ID:eFldOldK0 わかった。日本語部分が処理できてなかったことが原因だ。
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?
163148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:57:45.15ID:eFldOldK0 1バイトで読み込んでるから2バイト文字がうまく読み込めないということかな?
164148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:04:19.38ID:eFldOldK0 1バイトづつバイナリデータを読み込みしたかったので、fread(buf,...)の
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
https://ideone.com/GvpcAm
010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
https://ideone.com/GvpcAm
010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?
165デフォルトの名無しさん (ワッチョイ 7f46-bBdM)
2022/09/09(金) 02:19:22.29ID:V/M3y8c30 >>153が正しい
size_t stack = (size_t)(unsigned char)c;
size_t stack = (size_t)(unsigned char)c;
166デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:52:44.78ID:eFldOldK0 >>165
スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
167148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:53:47.99ID:eFldOldK0168デフォルトの名無しさん (ワッチョイ 0701-+tyw)
2022/09/09(金) 03:37:48.54ID:JkEyHRIQ0 >>166
>unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要
>unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要
169デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/09(金) 06:49:36.79ID:Cx7xgzBv0 >>168
char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
https://www.jpcert.or.jp/sc-rules/c-str04-c.html
char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
https://www.jpcert.or.jp/sc-rules/c-str04-c.html
170デフォルトの名無しさん (ワッチョイ bfad-Am0N)
2022/09/09(金) 10:32:00.65ID:PQbAFFlG0 数値と文字コードの認識の違いはどこらへんに出てくるのでしょうか?
171デフォルトの名無しさん (ワッチョイ c701-tE3/)
2022/09/09(金) 16:58:25.15ID:ZqL3j+SP0 環境依存によるとこが多すぎて、その都度環境に応じて調べるしかない
プログラム全般に言える事
プログラム全般に言える事
172デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/09(金) 20:26:03.68ID:wh55t5+tM 文字はutf-8でも一文字が数バイト必要な事があるので、charはもはや要らない子と言える
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
173デフォルトの名無しさん (ラクッペペ MM8f-eA8r)
2022/09/09(金) 20:34:47.77ID:AfgZ2PrAM なお中国や日本、韓国などに限る
174デフォルトの名無しさん (ワッチョイ 7fbb-Hxh8)
2022/09/09(金) 21:21:58.31ID:CwUslwUl0 wchar_tこそ要らない子やん
お前一体何バイトなんだよ
お前一体何バイトなんだよ
175デフォルトの名無しさん (ワッチョイ 0701-+tyw)
2022/09/09(金) 23:02:27.43ID:JkEyHRIQ0176デフォルトの名無しさん (ワッチョイ 87ad-8Iqg)
2022/09/09(金) 23:22:11.84ID:qKP12tcq0 自分はvb→C言語→機械語だけど
機械語知らないとダメだよなって思ったわ
大体CPUの仕様と合わせるんだよな
8bitも昔のCPUの慣習出しさ
だからプレステのCPU大好きとかライゼンサイコー、いやいややはりインテルだろう
なんて言う自作オタがやり始めるとかなり速いんだよな
自作PCの構造はCPUの中身に似てるから
機械語知らないとダメだよなって思ったわ
大体CPUの仕様と合わせるんだよな
8bitも昔のCPUの慣習出しさ
だからプレステのCPU大好きとかライゼンサイコー、いやいややはりインテルだろう
なんて言う自作オタがやり始めるとかなり速いんだよな
自作PCの構造はCPUの中身に似てるから
177デフォルトの名無しさん (テテンテンテン MM3e-tdss)
2022/09/10(土) 00:37:03.60ID:d6i83HiwM178148 (ワッチョイ 5d10-V+uT)
2022/09/10(土) 02:16:33.70ID:bSy2C3T30 文字化けのところは手に負えないですが、おかげさまでbase64エンコーディングプログラムが完成しました。
ここで言われたことは全部含めてみました。
構造体のタグ、enum型、charじゃなくてuint8_t、終端処理など。
https://ideone.com/7wolLZ
コードが汚いなど直すところありましたらどしどしご意見ください。
とりあえず、最初に使ってみる言語はbase64エンコーディングプログラムを組んでみて
なれてみようという方針なので。
次はVBAで組んでみるか、sha256プログラムをC言語で組んでみようか考えてます。
ここで言われたことは全部含めてみました。
構造体のタグ、enum型、charじゃなくてuint8_t、終端処理など。
https://ideone.com/7wolLZ
コードが汚いなど直すところありましたらどしどしご意見ください。
とりあえず、最初に使ってみる言語はbase64エンコーディングプログラムを組んでみて
なれてみようという方針なので。
次はVBAで組んでみるか、sha256プログラムをC言語で組んでみようか考えてます。
179デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/11(日) 09:33:54.88ID:LP1WepGR0 struct tmって、冗長な設計になってるよね
たとえば tm_mon == 1 && tm_mday == 1 なら tm_yday == 0 のはずだけど tm_yday >= 1 にもなれる
こういう矛盾がある場合の扱いって規格票のどっかに書いてあったっけ?
たとえば tm_mon == 1 && tm_mday == 1 なら tm_yday == 0 のはずだけど tm_yday >= 1 にもなれる
こういう矛盾がある場合の扱いって規格票のどっかに書いてあったっけ?
180デフォルトの名無しさん (ブーイモ MM3e-0gnx)
2022/09/11(日) 14:26:36.00ID:Y1sYJFelM たとえば規格書のmktimeにはカレンダー時間で表現できなければ-1を返すって書いてあるかそう実装するのが正しそうだけども
181はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7d3e-OdF3)
2022/09/11(日) 14:31:15.93ID:D/VbhUuk0 >>180
tm_yday は無視するとも書いてあるぞ。
tm_yday は無視するとも書いてあるぞ。
182デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/11(日) 14:32:58.51ID:LP1WepGR0 レス㌧x
カレンダー時間で表現できるか否かということは
tm_year, tm_mon, tm_mdayのことで、tm_ydayには該当しない議論だよね
逆にtm_ydayに合わせるように補正はしないとなると
ここに優先順位があるのかな
カレンダー時間で表現できるか否かということは
tm_year, tm_mon, tm_mdayのことで、tm_ydayには該当しない議論だよね
逆にtm_ydayに合わせるように補正はしないとなると
ここに優先順位があるのかな
183デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/11(日) 14:34:54.92ID:LP1WepGR0 すまん、ちょっと外出する
夜には戻る
夜には戻る
184デフォルトの名無しさん (ブーイモ MM3e-0gnx)
2022/09/11(日) 14:37:22.22ID:Y1sYJFelM あらほんとだ。戻り値の説明しか見てなかったわ
185デフォルトの名無しさん (ワッチョイ ea01-FaWt)
2022/09/11(日) 15:00:19.15ID:hGIJSvzu0 >>182
そもそもtm_wdayとtm_ydayは更新されるって書いてあるし
関係ないけど
・tm_mday: 1 から 31 の範囲の日付。
・tm_mon: 1 月からの月数 (0 から 11 の範囲)。
なのは毎回もやるわ、なぜ両方0スタートじゃないのか...
そもそもtm_wdayとtm_ydayは更新されるって書いてあるし
関係ないけど
・tm_mday: 1 から 31 の範囲の日付。
・tm_mon: 1 月からの月数 (0 から 11 の範囲)。
なのは毎回もやるわ、なぜ両方0スタートじゃないのか...
186はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7d3e-OdF3)
2022/09/11(日) 15:04:45.97ID:D/VbhUuk0 >>185
月は (英語では) 月の名前に置き換える (配列から名前を引く) という都合から自然にそうなったという説は聞いたことがあるな。
日は番号をそのまま表示するもんだから最初から番号通りのほうが都合がいいし。
月は (英語では) 月の名前に置き換える (配列から名前を引く) という都合から自然にそうなったという説は聞いたことがあるな。
日は番号をそのまま表示するもんだから最初から番号通りのほうが都合がいいし。
187デフォルトの名無しさん (ワッチョイ f116-V+uT)
2022/09/15(木) 17:53:22.84ID:gNCVLuZy0 ローカル変数の宣言で、宣言しようとしているポインタの初期化子に、同じ文で
宣言された変数を参照するのは規格上OKですか?
/* test1.c */
1 | int main(int argc, char **argv)
2 | {
3 | char s[100] = {'A'}, *p = s;
4 | int i = 10, *a[10] = {&i};
5 | return 0;
6 | }
最新の gcc で試したところ、-std=c89 -pedantic の場合に下記の警告が出ます。
特に3行目が OK で、4行目が駄目な理由がよく分からないです。
どちらもスタック上の相対位置はコンパイル時に決まると思うのですが。
Cの文法について詳しい方、教えてください。
gcc --version
gcc (GCC) 12.2.1 20220819 (Red Hat 12.2.1-1)
gcc -O0 -std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
test1.c: In function ‘main’:
test1.c:4:27: warning: initializer element is not computable at load time [-Wpedantic]
4 | int i = 10, *a[10] = {&i};
| ^
gcc -O0 -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
警告なし
宣言された変数を参照するのは規格上OKですか?
/* test1.c */
1 | int main(int argc, char **argv)
2 | {
3 | char s[100] = {'A'}, *p = s;
4 | int i = 10, *a[10] = {&i};
5 | return 0;
6 | }
最新の gcc で試したところ、-std=c89 -pedantic の場合に下記の警告が出ます。
特に3行目が OK で、4行目が駄目な理由がよく分からないです。
どちらもスタック上の相対位置はコンパイル時に決まると思うのですが。
Cの文法について詳しい方、教えてください。
gcc --version
gcc (GCC) 12.2.1 20220819 (Red Hat 12.2.1-1)
gcc -O0 -std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
test1.c: In function ‘main’:
test1.c:4:27: warning: initializer element is not computable at load time [-Wpedantic]
4 | int i = 10, *a[10] = {&i};
| ^
gcc -O0 -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
警告なし
188デフォルトの名無しさん (スップ Sdea-MyD4)
2022/09/15(木) 20:06:58.44ID:C6syfEgyd C99より前は集成体(配列、構造体)に対する初期化子定数式(アドレス定数式)でスタックは認められていないっぽい
3行目の初期化対象は配列じゃないでしょ
3行目の初期化対象は配列じゃないでしょ
189デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/16(金) 06:50:50.62ID:jyhWPRLZ0 int main(void)
{
int a = a;
}
これもOKなんだが
{
int a = a;
}
これもOKなんだが
190デフォルトの名無しさん (スッププ Sd0a-39XR)
2022/09/16(金) 19:26:37.47ID:alBs0lLWd >>189
スタック上のアドレスを使ってポインタを初期化できるかって話だろ
スタック上のアドレスを使ってポインタを初期化できるかって話だろ
191デフォルトの名無しさん (スッププ Sd0a-39XR)
2022/09/16(金) 19:31:34.25ID:alBs0lLWd192デフォルトの名無しさん (ワッチョイ 7d01-Mjbb)
2022/09/16(金) 19:59:25.14ID:u2ZYVkG20 一見
スタックに実体をもつ配列の先頭はセーフで (3行目)
スタックに実体をもつ変数のポインタはアウトというふうに見えるけど (4行目)
{ } の中か否かの差もあるんやね
スタックに実体をもつ配列の先頭はセーフで (3行目)
スタックに実体をもつ変数のポインタはアウトというふうに見えるけど (4行目)
{ } の中か否かの差もあるんやね
193デフォルトの名無しさん (ワッチョイ 17c2-okD4)
2022/09/17(土) 00:57:57.08ID:GfZyyjDu0 >>190
そんなん言い出したら自動変数をポインタで指せるのかさえ怪しくなってくるな
そんなん言い出したら自動変数をポインタで指せるのかさえ怪しくなってくるな
194デフォルトの名無しさん (スッププ Sdbf-UZdd)
2022/09/17(土) 12:49:57.03ID:fh691Hyrd スコープ内でアドレスが参照されたならば
自動変数はレジスタ変数にはならなくなる
「自動」の意味
自動変数はレジスタ変数にはならなくなる
「自動」の意味
195デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 19:52:14.52ID:fgoWI+8da win10(以下win)
strawberry perl入れた時一緒にいれたgcc
wsl
ubuntu22.04 gcc
どっかでみた配列関係のサンプルで
(間違えるとnull見つかるまで一生探し続けるよ的なコード)
で試したら
winで値がおかしい
linuxで正しい
とりあえずwin側でgdbで見ると
winで格納アドレスが逆順になってました
例えばコード上で
array1うんたら
array2かんたら
とあって
array2がアドレス100番台
array がアドレス200番台
みたいになってました
この挙動は環境依存なのかバグなのか知りたいです
まぁ結局両方windowsなんですが
strawberry perl入れた時一緒にいれたgcc
wsl
ubuntu22.04 gcc
どっかでみた配列関係のサンプルで
(間違えるとnull見つかるまで一生探し続けるよ的なコード)
で試したら
winで値がおかしい
linuxで正しい
とりあえずwin側でgdbで見ると
winで格納アドレスが逆順になってました
例えばコード上で
array1うんたら
array2かんたら
とあって
array2がアドレス100番台
array がアドレス200番台
みたいになってました
この挙動は環境依存なのかバグなのか知りたいです
まぁ結局両方windowsなんですが
196デフォルトの名無しさん (ワッチョイ ffbb-xFG9)
2022/09/17(土) 19:56:51.12ID:ZRyqS0700 ネットワークオーダーとかエンディアンとかが絡んでる可能性はあるけど、コードを見ないとなんとも
197デフォルトの名無しさん (スッププ Sdbf-UZdd)
2022/09/17(土) 20:03:08.34ID:PxOaZq6Kd >>195
抽象的すぎて全然わからんw
抽象的すぎて全然わからんw
198デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:04:45.56ID:fgoWI+8da199デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:08:18.29ID:fgoWI+8da 因みにこっちのwin環境だと
上サイトで24byteになるはずの所が10byteになります
上サイトで24byteになるはずの所が10byteになります
200デフォルトの名無しさん (ワッチョイ ffbb-xFG9)
2022/09/17(土) 20:22:45.77ID:ZRyqS0700 strlenのことか?
文字列と違ってchar配列の末尾には自動的にnull挿入されたりしないから、nullまで数え上げるstrlenが何を返すかわからないし、環境によってはメモリアクセス違反で落ちるかも
文字列と違ってchar配列の末尾には自動的にnull挿入されたりしないから、nullまで数え上げるstrlenが何を返すかわからないし、環境によってはメモリアクセス違反で落ちるかも
201デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:26:08.77ID:fgoWI+8da いや多分違います
アドレスが逆
多分ここが重要なんですがその原因が
と言うところです
アドレスが逆
多分ここが重要なんですがその原因が
と言うところです
202デフォルトの名無しさん (ワッチョイ ff46-EKt7)
2022/09/17(土) 20:44:25.86ID:LY5v/fLv0 環境依存です
ゼロで終端されていないものにstrlenを呼んではいけません
そのコードが誤り
ゼロで終端されていないものにstrlenを呼んではいけません
そのコードが誤り
203デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:51:16.94ID:I+4Vfslra うーん
そう言うことじゃなくて・・・
なんでメモリアドレスの格納が逆になるの?
と言うところです
cの規格的な話じゃなくてですね・・・
そう言うことじゃなくて・・・
なんでメモリアドレスの格納が逆になるの?
と言うところです
cの規格的な話じゃなくてですね・・・
204デフォルトの名無しさん (ワッチョイ ff46-EKt7)
2022/09/17(土) 20:58:26.77ID:LY5v/fLv0 そのページを作った人の環境(コンパイラとバージョン)ではarr,arr2の順で
あなたの環境ではarr2,arrの順なんでしょ
たまたまそうなっただけです
あなたの環境ではarr2,arrの順なんでしょ
たまたまそうなっただけです
205デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 21:10:35.35ID:I+4Vfslra 文系脳で行き着く先っていつもそうなんですよね
でも残念ながら「それ」がないんですよ
この世界
たまたま
なんかわかんないけど
偶然
楽しけりゃいいじゃん
なんで生きてるのお前?
馬鹿は嫌い 回線で首でも吊ってろカスが
ジパング馬鹿しかいないからもう寝る
でも残念ながら「それ」がないんですよ
この世界
たまたま
なんかわかんないけど
偶然
楽しけりゃいいじゃん
なんで生きてるのお前?
馬鹿は嫌い 回線で首でも吊ってろカスが
ジパング馬鹿しかいないからもう寝る
206デフォルトの名無しさん (スッップ Sdbf-Zv9H)
2022/09/17(土) 21:15:00.75ID:W7nqA9Zmd オタクくん怒って寝ちゃったw
207デフォルトの名無しさん (アウアウウー Sa5b-zcFf)
2022/09/17(土) 21:44:56.47ID:njcq0eeLa スタックはアドレス高位から低位の方向に積まれることが多いから、arr2のアドレスがarrのそれより小さくなるとかですかね
208デフォルトの名無しさん (ワッチョイ 9f63-E+l9)
2022/09/17(土) 21:46:48.25ID:aOSn8JHC0 そういう人を落とし込める記述はやめよう
209デフォルトの名無しさん (ワッチョイ 9f2c-bG2j)
2022/09/17(土) 23:27:39.41ID:eA0eWCp60 スタックの方向などは環境依存だろ
環境依存は他にも、little/big endian とか、
char が、0〜255, -128〜127 のどちらなのかとか
文字コードが、BOM 無しUTF-8 以外とか
環境依存は他にも、little/big endian とか、
char が、0〜255, -128〜127 のどちらなのかとか
文字コードが、BOM 無しUTF-8 以外とか
210デフォルトの名無しさん (ワッチョイ d7b3-q6Lr)
2022/09/18(日) 01:46:10.06ID:3xNGEVex0 gdbの使い方、ここで質問してもいいですか?
211デフォルトの名無しさん (ワッチョイ 973e-E+l9)
2022/09/18(日) 02:19:18.49ID:OVhdQ/fk0212デフォルトの名無しさん (US 0H7f-G1yF)
2022/09/18(日) 02:40:43.36ID:3nFqfKLUH >>209
UTF-8 に BOM は本質的に不要です
なぜならば BOM = Byte Order Mark ですが、UTF にバイトオーダーなど存在しません
BOM なし、と断ること自体、頭が悪い証拠を如実に表出していると愚考させていただきます
馬鹿は死ね
UTF-8 に BOM は本質的に不要です
なぜならば BOM = Byte Order Mark ですが、UTF にバイトオーダーなど存在しません
BOM なし、と断ること自体、頭が悪い証拠を如実に表出していると愚考させていただきます
馬鹿は死ね
213デフォルトの名無しさん (アウアウエー Sadf-D5P0)
2022/09/18(日) 02:43:34.57ID:Z+lYrLLqa はじめてのC言語完全入門!【Hello World〜ポインタまで徹底解説】
91,121 回視聴
freeCodeチャンネル
91,121 回視聴
freeCodeチャンネル
214デフォルトの名無しさん (ワッチョイ 973e-E+l9)
2022/09/18(日) 03:28:52.56ID:OVhdQ/fk0 >>212
BOM はエンコード方式の識別に使われる場合もあると公式 (unicode consortium) の資料に書かれている。
BOM が BOM という名前である以上は本来の用途からの転用ではあるが、
バイトオーダーだけを根拠にして不要と断じるのはエンジニアリング的に良い姿勢ではないな。
BOM はエンコード方式の識別に使われる場合もあると公式 (unicode consortium) の資料に書かれている。
BOM が BOM という名前である以上は本来の用途からの転用ではあるが、
バイトオーダーだけを根拠にして不要と断じるのはエンジニアリング的に良い姿勢ではないな。
215デフォルトの名無しさん (ワッチョイ ff10-Zv9H)
2022/09/18(日) 04:26:41.31ID:GkyrVNWr0216デフォルトの名無しさん (スッププ Sdbf-UZdd)
2022/09/18(日) 05:15:19.35ID:fdsnSmbGd217デフォルトの名無しさん (スッププ Sdbf-UZdd)
2022/09/18(日) 05:26:48.38ID:fdsnSmbGd >>205
よく見るとそのページ内容がむちゃくちゃだなw
データが格納される順番はコンパイラ依存なのでそんなサンプルコードは作ってはいけない
「まず、arr のオブジェクトサイズは 24 バイトと表示されますが、」じゃねえよw
「内部の詳細を無視してしまうと恐ろしいエラーが発生する可能性があります。」もう起こっているw
以上
よく見るとそのページ内容がむちゃくちゃだなw
データが格納される順番はコンパイラ依存なのでそんなサンプルコードは作ってはいけない
「まず、arr のオブジェクトサイズは 24 バイトと表示されますが、」じゃねえよw
「内部の詳細を無視してしまうと恐ろしいエラーが発生する可能性があります。」もう起こっているw
以上
218デフォルトの名無しさん (ワッチョイ 9fad-52V3)
2022/09/18(日) 10:38:22.56ID:kY5VkQwD0219デフォルトの名無しさん (アウアウウー Sa5b-8eP5)
2022/09/18(日) 13:53:49.44ID:KpBP36NGa 文系は全称と単称の区別が出来ない
大抵の馬鹿はこれで判別出来る
大抵の馬鹿はこれで判別出来る
220デフォルトの名無しさん (ワッチョイ 9f63-E+l9)
2022/09/18(日) 14:04:23.72ID:CIgAfYZs0 そういう表現も、大体根拠が希薄
血液型占いと同程度
血液型占いと同程度
221デフォルトの名無しさん (アウアウウー Sa5b-PfD3)
2022/09/18(日) 14:12:29.01ID:Rev08jtKa222デフォルトの名無しさん (スッププ Sdbf-UZdd)
2022/09/18(日) 18:22:49.00ID:JcdidFMxd 機械翻訳まるだしだし
Pythonのおまけで載ってるだけだから
そんなページあてにするなとしか
Pythonのおまけで載ってるだけだから
そんなページあてにするなとしか
223デフォルトの名無しさん (ワッチョイ 9fad-dwAj)
2022/09/18(日) 18:23:22.20ID:rN2/Bhfe0224デフォルトの名無しさん (ワッチョイ 973e-E+l9)
2022/09/18(日) 19:08:21.37ID:OVhdQ/fk0 >>223
UTF-8 ではない形で保存されている可能性はいつでもあるわけだが……。
UTF-8 ではない形で保存されている可能性はいつでもあるわけだが……。
225デフォルトの名無しさん (ワッチョイ 9f63-E+l9)
2022/09/18(日) 19:35:00.75ID:CIgAfYZs0226デフォルトの名無しさん (スププ Sdbf-MXZj)
2022/09/18(日) 20:14:09.21ID:tcByEu8Hd wcharはutf8圧に負けて廃れるんかね
Cのようなロートル言語使ってると固定幅(但し幅は決まっていない)エンコの有り難みをひしひしと感じる
Cのようなロートル言語使ってると固定幅(但し幅は決まっていない)エンコの有り難みをひしひしと感じる
227デフォルトの名無しさん (ワッチョイ 9f01-bNpc)
2022/09/18(日) 21:11:58.46ID:/3elu/X80 ストレージはutf-8
メモリーはwchar_t
じゃね?
メモリーはwchar_t
じゃね?
228デフォルトの名無しさん (ワッチョイ 9fad-dwAj)
2022/09/18(日) 22:03:00.04ID:rN2/Bhfe0 >>225
それでBOM付き選んじゃうやつが居るんだろうな。選択肢無くして欲しいものだ。
それでBOM付き選んじゃうやつが居るんだろうな。選択肢無くして欲しいものだ。
229デフォルトの名無しさん (ワッチョイ 9fad-dwAj)
2022/09/18(日) 22:05:23.89ID:rN2/Bhfe0230デフォルトの名無しさん (ワッチョイ 1f02-MXZj)
2022/09/18(日) 22:23:37.69ID:zhWgY60z0 >>229
ふぇふふ…
ふぇふふ…
231デフォルトの名無しさん (ワッチョイ 9f2c-ret5)
2022/09/18(日) 22:58:27.34ID:JTgtpdd/0 メモ帳は、BOM 付きUTF-8 になるから、ダメ
BOM無しUTF-8は、VSCode, サクラエディタなどを使う。
TeraPad は、新し目の文字に対応していないので、ダメ
BOM無しUTF-8は、VSCode, サクラエディタなどを使う。
TeraPad は、新し目の文字に対応していないので、ダメ
232デフォルトの名無しさん (ワッチョイ 9f63-E+l9)
2022/09/18(日) 23:06:51.28ID:CIgAfYZs0 メモ帳、デフォルトでBOM無しで保存する
BOM付けるにはセレクトで一番下を選ぶ操作が必要
BOM付けるにはセレクトで一番下を選ぶ操作が必要
233デフォルトの名無しさん (テテンテンテン MM3f-2Jl6)
2022/09/18(日) 23:10:07.79ID:tcp3M/eWM UnicodeのBOMはUTF-{8, 16, 32}で並び順が違うから判別に使える
逆に無いと推測に頼るしかない
メモ帳はSJISのテキストを開かれることもあるから、BOM無しUTF-8の場合は推測している
BOMが有れば確実に判別出来る
なのでBOM付きUTF-8は悪くない
逆に無いと推測に頼るしかない
メモ帳はSJISのテキストを開かれることもあるから、BOM無しUTF-8の場合は推測している
BOMが有れば確実に判別出来る
なのでBOM付きUTF-8は悪くない
234デフォルトの名無しさん (ワッチョイ 5701-dv3E)
2022/09/18(日) 23:10:14.33ID:a87PubfG0 WindowsではBOM付きのほうが便利だけどね。
■ このスレッドは過去ログ倉庫に格納されています
