!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
C言語なら俺に聞け 161
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0f63-sFbk)
2023/04/21(金) 14:05:20.18ID:rqj2HSDF0214デフォルトの名無しさん (ササクッテロラ Sp91-4ePv)
2023/06/07(水) 21:46:42.98ID:xi4mV2dDp ダブルスラッシュがコメントに採用されたのどの版から?
215デフォルトの名無しさん (スッププ Sda2-KKRM)
2023/06/07(水) 22:41:36.55ID:JgjHIelbd >>210
概念的にはgetした瞬間にリングバッファから取り除かれてるはずなので
実際にはバッファが一回りするまで残っているが
消えてるかどうか曖昧で気持ち悪いのでコピーで返したほうが望ましい
まあ好みかもしれんが
概念的にはgetした瞬間にリングバッファから取り除かれてるはずなので
実際にはバッファが一回りするまで残っているが
消えてるかどうか曖昧で気持ち悪いのでコピーで返したほうが望ましい
まあ好みかもしれんが
216デフォルトの名無しさん (アウアウウー Sac5-tVFH)
2023/06/08(木) 11:06:02.87ID:rxjbLVG0a >>214
MSVC じゃなくて MS-C の 3 くらいからあったかも
MSVC じゃなくて MS-C の 3 くらいからあったかも
217デフォルトの名無しさん (スプッッ Sd02-w9Bk)
2023/06/08(木) 12:46:07.00ID:m0+KFU8md C99から
それ以前でもコンパイラ拡張で//コメントをサポートしてるのはあるらしいけど
以下のようなエッジケースで解釈が変わる
b=a//**/ 2
;
//コメントを認めないならb=a/2;
//コメントを認めるならb=a;
それ以前でもコンパイラ拡張で//コメントをサポートしてるのはあるらしいけど
以下のようなエッジケースで解釈が変わる
b=a//**/ 2
;
//コメントを認めないならb=a/2;
//コメントを認めるならb=a;
218デフォルトの名無しさん (ワッチョイ 916e-aXLw)
2023/06/08(木) 12:55:42.05ID:ldHYl5bi0 > 目をつぶって作ったのでバグがあっても知らない
そういうのは「作った」とは言わない
そういうのは「作った」とは言わない
219デフォルトの名無しさん (ワッチョイ 5146-rNJ6)
2023/06/08(木) 13:01:02.12ID:5qYvg3Wg0 盲者のモノ作りなど認めない。
220デフォルトの名無しさん (ワッチョイ 4297-UW6r)
2023/06/08(木) 13:06:43.94ID:2i+h5Gbt0 目開けても何も見てない奴いるからな
221デフォルトの名無しさん (スッププ Sda2-KKRM)
2023/06/08(木) 13:39:09.53ID:JhrUsqpHd 野良審査員には餌をやらん主義
222はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e53e-N/Lw)
2023/06/08(木) 14:35:42.49ID:Iro3x2NJ0 >>214
C99 からだが経緯としては先に C++ で採用されていたという事情がある。
C with Classes から C++ になる 1984 年頃に BCPL 風を参考にして
スラッシュふたつで始めるコメント記法が導入され、
更に 1998 年にそのコメント記法も含めて ISO の規格として確立した。
C と C++ でプリプロセッサは共用することも多いだろうし
コメントはプリプロセッサで除去するだろうから
C++ で採用された段階で実際には C でもスラッシュふたつのコメント記法を
使えていた環境は割と有ったのだと思う。
C99 からだが経緯としては先に C++ で採用されていたという事情がある。
C with Classes から C++ になる 1984 年頃に BCPL 風を参考にして
スラッシュふたつで始めるコメント記法が導入され、
更に 1998 年にそのコメント記法も含めて ISO の規格として確立した。
C と C++ でプリプロセッサは共用することも多いだろうし
コメントはプリプロセッサで除去するだろうから
C++ で採用された段階で実際には C でもスラッシュふたつのコメント記法を
使えていた環境は割と有ったのだと思う。
223デフォルトの名無しさん (ワッチョイ 916e-aXLw)
2023/06/08(木) 14:52:55.41ID:ldHYl5bi0 マイクロソフトが独自拡張で当時C++のみのはずの//をCでも許していた
言わずと知れた屈指の大手がやっているので規格が追認することとなった
言わずと知れた屈指の大手がやっているので規格が追認することとなった
224デフォルトの名無しさん (ワッチョイ ee63-N/Lw)
2023/06/08(木) 16:45:48.60ID:JA9B62300 gccも使えてた気がする
225デフォルトの名無しさん (ワッチョイ 1379-hEWj)
2023/06/10(土) 18:04:06.65ID:Yvl44ooC0 90年後半からしか実務で使ってないけどVCでは普通に書けてたな
UNIX系はベンダー製のCの制限が酷かった思い出
UNIX系はベンダー製のCの制限が酷かった思い出
226デフォルトの名無しさん (ワッチョイ d9f0-cgqc)
2023/06/10(土) 18:47:34.87ID:Yrme8ZC10 borlandやwatcomでも使えなかったっけか?
227デフォルトの名無しさん (スッププ Sd33-r9BM)
2023/06/10(土) 20:49:31.43ID:6EfmWVuRd 便利だからね
オプションで使えなくすることもできたはず
オプションで使えなくすることもできたはず
228デフォルトの名無しさん (ワッチョイ c1bb-s+nx)
2023/06/16(金) 01:45:49.62ID:q8ApsJJ90 int a[3] = {};
int b[3] = {0};
aの初期化はgcc拡張で規格に沿っているのはbの初期化だと記憶していたんだけど、
規格の6.7.8を見るとメンバの個数より波カッコで囲まれた初期化子が少ない場合は暗黙的に静的に初期化するとあった。
この規格の文章を見る限りはaも規格に合致していると思えるんだけど、aがgcc拡張っていうのは本当ですか?
int b[3] = {0};
aの初期化はgcc拡張で規格に沿っているのはbの初期化だと記憶していたんだけど、
規格の6.7.8を見るとメンバの個数より波カッコで囲まれた初期化子が少ない場合は暗黙的に静的に初期化するとあった。
この規格の文章を見る限りはaも規格に合致していると思えるんだけど、aがgcc拡張っていうのは本当ですか?
229228 (ワッチョイ c1bb-s+nx)
2023/06/16(金) 02:08:30.52ID:q8ApsJJ90 参照した規格はX 3010:2003 (ISO/IEC 9899:1999) です
230デフォルトの名無しさん (ワッチョイ e95f-2rqm)
2023/06/16(金) 08:46:04.94ID:qgM8i0iT0 >>228
本当。文法が空の {} を許していない。
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer
C23 から↓で initializer に {} が追加されてようやく通るようになる。
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2900.htm
本当。文法が空の {} を許していない。
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer
C23 から↓で initializer に {} が追加されてようやく通るようになる。
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2900.htm
231デフォルトの名無しさん (アウアウウー Sadd-g1CP)
2023/06/16(金) 16:12:05.48ID:ly+Q1cW8a struct hoge {
char a[];
};
struct fuga {
char a[0];
};
char a[];
};
struct fuga {
char a[0];
};
232デフォルトの名無しさん (ワッチョイ c1bb-s+nx)
2023/06/16(金) 16:20:37.85ID:q8ApsJJ90233はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c13e-2rqm)
2023/06/16(金) 17:28:57.05ID:QEmhRLek0234デフォルトの名無しさん (ワッチョイ 0dbb-p8ty)
2023/06/17(土) 21:50:15.83ID:q+Kf8pNU0235デフォルトの名無しさん (ワッチョイ a52d-wYA+)
2023/06/25(日) 08:36:37.75ID:D6GgnyEK0 int main(void)って書く流派ってどこでそんなの身に着けたの?
236デフォルトの名無しさん (ワッチョイ 856e-gmRT)
2023/06/25(日) 09:20:49.86ID:yrM2OONq0 >>235
ISO/IEC 9899:2011
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
ISO/IEC 9899:2011
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
237デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
2023/06/25(日) 10:53:26.83ID:/MLTigPj0 >>235
この指摘をしばしば見るが、int main(void) が違反だった時代はいつ頃なの。
この指摘をしばしば見るが、int main(void) が違反だった時代はいつ頃なの。
238デフォルトの名無しさん (ワッチョイ a52d-wYA+)
2023/06/25(日) 10:56:42.79ID:D6GgnyEK0 C99からint main(void)と書いてもいいらしい
239はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
2023/06/25(日) 11:13:38.04ID:+vRVyhzX0 main については C89 のときから変わってないよ。
240デフォルトの名無しさん (ワッチョイ 856e-gmRT)
2023/06/25(日) 11:58:52.46ID:yrM2OONq0 >>237
K&R Cにはvoidというキーワードが存在しなかった
K&R Cにはvoidというキーワードが存在しなかった
241デフォルトの名無しさん (ワッチョイ a52d-wYA+)
2023/06/25(日) 12:22:01.62ID:D6GgnyEK0 K&R第2版にint main(void)なんて書き方出てきた記憶がないんだよね
242デフォルトの名無しさん (ワッチョイ a397-HUf/)
2023/06/25(日) 12:38:23.47ID:6RRGV0Qg0 printf(null);
243はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
2023/06/25(日) 12:38:51.73ID:+vRVyhzX0244はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
2023/06/25(日) 17:09:36.88ID:+vRVyhzX0 関数定義のときに仮引数がゼロ個なら void を書くのは当然の作法なんだから
main についてはどうでも良いとはいえども main だけ空にするのもなんか変じゃない?
main についてはどうでも良いとはいえども main だけ空にするのもなんか変じゃない?
245デフォルトの名無しさん (ワッチョイ 1b79-SnHJ)
2023/06/25(日) 19:26:05.36ID:20Xxe9+j0 処理系は引数で任意のスタートアップを指定できるからmain書きたくない需要も満たせるよ
246デフォルトの名無しさん (スッププ Sd43-W+UZ)
2023/06/25(日) 22:39:44.42ID:7VFzLtX7d >>235
めんどくさいだけだろ
めんどくさいだけだろ
247デフォルトの名無しさん (ワッチョイ 955f-bte+)
2023/06/26(月) 06:14:35.93ID:F8cl0T7T0 めんどくさい流免許皆伝
248デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
2023/06/26(月) 07:16:23.26ID:xzT4Agq20 初級、めんどくさいので略記
初段、めんどくさいので無注釈
免許皆伝、めんどくさいので無ドキュメント
初段、めんどくさいので無注釈
免許皆伝、めんどくさいので無ドキュメント
249デフォルトの名無しさん (ワッチョイ ad5f-9QlF)
2023/06/26(月) 08:07:26.96ID:5ZBA7oeF0 組み込み系ならmainに引き数なんて不用
250デフォルトの名無しさん (スプッッ Sd03-+QuN)
2023/06/26(月) 08:52:43.48ID:r2qj24yMd 元々プログラムはまんどくさいを代行するものだし・・・
251デフォルトの名無しさん (ワッチョイ 856e-gmRT)
2023/06/26(月) 12:05:19.83ID:TXNTP2LF0 組み込みでmainか・・・
ベクタテーブル作るときのラベルがマングリングされてないから短く済むけどそれだけ
ベクタテーブル作るときのラベルがマングリングされてないから短く済むけどそれだけ
252デフォルトの名無しさん (ワッチョイ 856e-gmRT)
2023/06/26(月) 12:06:17.67ID:TXNTP2LF0 あ、ここCだっけ
サーセン
サーセン
253はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
2023/06/26(月) 13:00:03.75ID:DZPgqn/v0 >>249
main に引数が有るか無いかの話じゃなくて、無いときに void を書くという話題だよ。
main に引数が有るか無いかの話じゃなくて、無いときに void を書くという話題だよ。
254デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
2023/06/26(月) 13:16:56.95ID:6bPwUIFfp 実際の組み込み系には、二つのmainエントリーがある
引数のある奴と、無い奴な
引数のある奴と、無い奴な
255デフォルトの名無しさん (ワッチョイ 856e-gmRT)
2023/06/26(月) 13:20:15.17ID:TXNTP2LF0256デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
2023/06/26(月) 13:24:00.16ID:6bPwUIFfp 意味なんて知るか
ブートローダとか色々都合があるんだよ
ブートローダとか色々都合があるんだよ
257デフォルトの名無しさん (ワッチョイ 9dc9-3ptY)
2023/06/26(月) 13:31:08.91ID:yiohjGaX0 環境依存しまくってる部分だとは思うけど
組み込み用のコンパイラでも エントリは main のままなのね
組み込み用のコンパイラでも エントリは main のままなのね
258デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
2023/06/26(月) 13:43:40.71ID:6bPwUIFfp 組込みの真のエントリーはresetな
でも普通はそこからmainまではハード会社が提供してる
初期化処理が入るからあんまり触らない
でも普通はそこからmainまではハード会社が提供してる
初期化処理が入るからあんまり触らない
259デフォルトの名無しさん (スッププ Sdab-W+UZ)
2023/06/26(月) 16:47:50.70ID:D5GxB3wJd リンカにわたすオプションで_startだか_resetだかを指定してるだけ(例えばld -e _start)
自分で初期化を書きたければmakefileに先頭ラベルを記述すればいい
自分で初期化を書きたければmakefileに先頭ラベルを記述すればいい
260デフォルトの名無しさん (ラクッペペ MM4b-d+Ca)
2023/06/26(月) 17:33:04.45ID:O3f/yVVZM 割込みベクタテーブルのリセット割込みのアドレスがエントリポイント
マイコンのリセットでプログラムカウンタのアドレスが設定される
マイコンのリセットでプログラムカウンタのアドレスが設定される
261デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
2023/06/26(月) 20:20:34.26ID:6bPwUIFfp >>260
石によるだろそんなん
石によるだろそんなん
262デフォルトの名無しさん (ワッチョイ 856e-gmRT)
2023/06/26(月) 20:39:52.87ID:TXNTP2LF0 K&R Cで「死産だった」とされるentryというキーワードは、多分このへんの話だったんだろうな
263デフォルトの名無しさん (スプッッ Sd03-eK8M)
2023/06/26(月) 20:56:23.88ID:aG57g/0Md そもそもCPU(マイコン)と、そのCPUの命令セットに翻訳するコンパイラに自由度を与えるためにC言語規格で明言することを少なめにしてる
0x100からカウンタが始まるだのブートローダーが必要だの環境依存の初期化はコンパイラが知ってれば十分。
0x100からカウンタが始まるだのブートローダーが必要だの環境依存の初期化はコンパイラが知ってれば十分。
264デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
2023/06/26(月) 21:02:50.78ID:6bPwUIFfp コンパイラは知らないよ
スタートアップライブラリが知ってる
スタートアップライブラリが知ってる
265デフォルトの名無しさん (ワッチョイ 856e-gmRT)
2023/06/26(月) 21:10:49.81ID:TXNTP2LF0 そそ
266デフォルトの名無しさん (ワッチョイ e3fb-eK8M)
2023/06/26(月) 21:26:51.56ID:L7dTsKCZ0 ああそうかコンパイラ自体は初期化手段知らなくてもいいのね
267デフォルトの名無しさん (ワッチョイ bb2d-ctHD)
2023/07/07(金) 14:46:28.07ID:Cp8NbwGm0 #include <stdio.h>
void stack_size_estimate()
{
int dummy; // スタック上に確保するダミー変数
// スタック上のポインタとダミー変数の差を計算
unsigned long stack_size = (unsigned long)&dummy - (unsigned long)&stack_size_estimate;
printf("Estimated stack size: %lu bytes\n", stack_size);
}
int main()
{
stack_size_estimate();
return 0;
}
Windowsで実行すると毎回結果がばらばらになる
void stack_size_estimate()
{
int dummy; // スタック上に確保するダミー変数
// スタック上のポインタとダミー変数の差を計算
unsigned long stack_size = (unsigned long)&dummy - (unsigned long)&stack_size_estimate;
printf("Estimated stack size: %lu bytes\n", stack_size);
}
int main()
{
stack_size_estimate();
return 0;
}
Windowsで実行すると毎回結果がばらばらになる
268デフォルトの名無しさん (ワッチョイ e26a-3VO7)
2023/07/07(金) 14:52:43.24ID:RkflWXNN0 .textと.bssを比較すりゃさもありなん
269デフォルトの名無しさん (ササクッテロラ Sp5f-SBEo)
2023/07/07(金) 15:00:57.31ID:Rpkmzd56p プログラムとデータは別れてんだよなぁ
270デフォルトの名無しさん (テテンテンテン MM8e-OS6S)
2023/07/07(金) 16:12:54.67ID:h0HZTRPQM アドレス空間レイアウトのランダム化 (ASLR)だろ
差じゃなくてポインターの中身を表示してみればいいじゃん
差じゃなくてポインターの中身を表示してみればいいじゃん
271はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
2023/07/07(金) 16:20:17.47ID:gGTaLgTI0 >>267
64bit 版の Windows だとしたら unsigned long はポインタを表すのに十分なサイズではない。
上位バイトが丸ごと抜け落ちて意図した計算が出来てないと思う。
へんなところを引き算するよりベースアドレスを基準に観察したほうがわかりやすいよ。
歴史的事情で Windows ではインスタンスハンドルがベースアドレスそのものということになってる。
64bit 版の Windows だとしたら unsigned long はポインタを表すのに十分なサイズではない。
上位バイトが丸ごと抜け落ちて意図した計算が出来てないと思う。
へんなところを引き算するよりベースアドレスを基準に観察したほうがわかりやすいよ。
歴史的事情で Windows ではインスタンスハンドルがベースアドレスそのものということになってる。
272デフォルトの名無しさん (スップ Sd22-PY2F)
2023/07/07(金) 16:42:49.80ID:LOYSagRvd そういやlongはWindows環境だと32bitだっけか
size_t使ったほうが面倒がなさそう
size_t使ったほうが面倒がなさそう
273はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
2023/07/07(金) 16:53:06.75ID:gGTaLgTI0 Windows だとどっちでもいいけど意味の上では uintptr_t のほうが妥当だと思う。
274デフォルトの名無しさん (ワッチョイ 0e79-p0MK)
2023/07/07(金) 16:55:15.60ID:tybFBPle0 いやもう露骨にbit数書いてくれた方がいいわ
int128とか
int128とか
275デフォルトの名無しさん (ワッチョイ bb2d-ctHD)
2023/07/07(金) 17:07:14.08ID:Cp8NbwGm0 #include <stdio.h>
#include <Windows.h>
void stack_size_estimate()
{
int dummy; // スタック上に確保するダミー変数
SIZE_T stack_size;
// ダミー変数のアドレスを取得
LPVOID dummy_addr = &dummy;
// メモリ領域の情報を取得
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(dummy_addr, &mbi, sizeof(mbi));
// スタックサイズを計算
stack_size = (SIZE_T)dummy_addr - (SIZE_T)mbi.AllocationBase;
printf("Estimated stack size: %lu bytes\n", stack_size);
}
int main()
{
stack_size_estimate();
return 0;
}
2096444 bytes
になります、予想の5分の1くらいでした
#include <Windows.h>
void stack_size_estimate()
{
int dummy; // スタック上に確保するダミー変数
SIZE_T stack_size;
// ダミー変数のアドレスを取得
LPVOID dummy_addr = &dummy;
// メモリ領域の情報を取得
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(dummy_addr, &mbi, sizeof(mbi));
// スタックサイズを計算
stack_size = (SIZE_T)dummy_addr - (SIZE_T)mbi.AllocationBase;
printf("Estimated stack size: %lu bytes\n", stack_size);
}
int main()
{
stack_size_estimate();
return 0;
}
2096444 bytes
になります、予想の5分の1くらいでした
276デフォルトの名無しさん (ワッチョイ c67c-mdfO)
2023/07/07(金) 17:38:01.25ID:GxNDHmP50277はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
2023/07/07(金) 17:44:32.91ID:gGTaLgTI0 ここで欲しいのは「ポインタを格納するのに適した整数型」であって
具体的に何ビットなのかをプログラム上で表現するのは筋違いだと思うんだけど
でもまあどうせ処理系に依存するなら抽象を挟んでもあまり得なことも無いかな
とも思うし、まあそこらへんは感覚的なもんやからね……。
具体的に何ビットなのかをプログラム上で表現するのは筋違いだと思うんだけど
でもまあどうせ処理系に依存するなら抽象を挟んでもあまり得なことも無いかな
とも思うし、まあそこらへんは感覚的なもんやからね……。
278デフォルトの名無しさん (ワッチョイ c67c-mdfO)
2023/07/07(金) 17:46:08.50ID:GxNDHmP50279はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
2023/07/07(金) 17:49:07.83ID:gGTaLgTI0280デフォルトの名無しさん (ワッチョイ c67c-mdfO)
2023/07/07(金) 17:55:31.01ID:GxNDHmP50 Windowsならこうなってるね
LONG_PTR SetWindowLongPtrA(
[in] HWND hWnd,
[in] int nIndex,
[in] LONG_PTR dwNewLong
);
LONG_PTR SetWindowLongPtrA(
[in] HWND hWnd,
[in] int nIndex,
[in] LONG_PTR dwNewLong
);
281デフォルトの名無しさん (ラクッペペ MM8f-VHD8)
2023/07/08(土) 09:25:06.78ID:ZG00xBJMM それハンドルを取得する関数なのでポインタとはちょっと違う
282デフォルトの名無しさん (スプープ Sd3f-4U7T)
2023/07/08(土) 11:55:06.89ID:pEcLN/B5d >>275
それで本当にスタックサイズ計算できてるの?
MSの文書だとデフォルトでは1MBと書いてあるし
もし不足が予想されるのならリンクオプションでサイズ変更できるし
本来大きいメモリはalloc系で確保すべき
それで本当にスタックサイズ計算できてるの?
MSの文書だとデフォルトでは1MBと書いてあるし
もし不足が予想されるのならリンクオプションでサイズ変更できるし
本来大きいメモリはalloc系で確保すべき
283はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/08(土) 12:43:32.13ID:svQTfB7/0 メモリ空間は 64bit あるけどその全てに実メモリが割り当てられているわけでは当然ない。
仮想的なメモリを管理するから API の名前に Virtual とついてて、
AllocationBase は管理している一塊の単位のベースってだけ。
その単位の中の全てがスタック用とは限らないので基準にはならないと思う。
各スレッドのスタックの底は thread information block に格納されているはず。
仮想的なメモリを管理するから API の名前に Virtual とついてて、
AllocationBase は管理している一塊の単位のベースってだけ。
その単位の中の全てがスタック用とは限らないので基準にはならないと思う。
各スレッドのスタックの底は thread information block に格納されているはず。
284デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/08(土) 19:02:15.63ID:wtJKE3gc0 >>281
????
????
285蟻人間 ◆T6xkBnTXz7B0 (スフッ Sdbf-yJMt)
2023/07/08(土) 19:05:04.15ID:E2jAOZHYd286デフォルトの名無しさん (スップ Sd3f-hfg2)
2023/07/09(日) 12:33:23.59ID:6bAebKnHd 井の中の蛙だったか
あーくだらん
あーくだらん
287デフォルトの名無しさん (ワッチョイ 17b3-S1Rn)
2023/07/09(日) 18:21:47.85ID:nGZbLr+D0 #include <stdio.h>
void main(void) {
int card[5][5];
int *p;
p = card;
}
gccでコンパイルすると
aa.c:7:11: warning: assignment to ‘int *’ from incompatible pointer type ‘int (*)[5]’ [-Wincompatible-pointer-types]
7 | p = card;
となります。
エラーではないので動くのですが・・・この警告はどうすれば消えますか?
やりたいことは、2次元で宣言してる変数cardを2次元を意識することなくアクセスしたくて*pに代入しています。
void main(void) {
int card[5][5];
int *p;
p = card;
}
gccでコンパイルすると
aa.c:7:11: warning: assignment to ‘int *’ from incompatible pointer type ‘int (*)[5]’ [-Wincompatible-pointer-types]
7 | p = card;
となります。
エラーではないので動くのですが・・・この警告はどうすれば消えますか?
やりたいことは、2次元で宣言してる変数cardを2次元を意識することなくアクセスしたくて*pに代入しています。
289はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/09(日) 18:31:02.01ID:6ZzBc/+b0 >>287
この場合に card の型は int[5][5] なんだけど
配列は配列の先頭要素を指すポインタに暗黙に型変換されるのが基本ルール
だから式中に card が出てきたら int(*)[5] として扱われる。
この型は int* と互換性のない型ということを警告は言ってる。
型が int(*)[5] であるような式に * を付けたら int[5] ということになるんだけど
上述の暗黙の型変換のルールで int* ということになって p の型と一致するようになる。
故に p = *card; で通る。
この場合に card の型は int[5][5] なんだけど
配列は配列の先頭要素を指すポインタに暗黙に型変換されるのが基本ルール
だから式中に card が出てきたら int(*)[5] として扱われる。
この型は int* と互換性のない型ということを警告は言ってる。
型が int(*)[5] であるような式に * を付けたら int[5] ということになるんだけど
上述の暗黙の型変換のルールで int* ということになって p の型と一致するようになる。
故に p = *card; で通る。
290デフォルトの名無しさん (ワッチョイ 17b3-6GCC)
2023/07/09(日) 18:37:18.48ID:nGZbLr+D0 サンクス
291デフォルトの名無しさん (ワッチョイ 9ffb-9JJG)
2023/07/09(日) 18:49:34.69ID:vTvbeyL00 この場合ってpを長さ25の1次元配列として使っていいという保証あるっけ?
`card[0]`の長さ5の配列と`card[1]`の長さ5の配列に隙間がないことが保証されてればいいんだけど
`card[0]`の長さ5の配列と`card[1]`の長さ5の配列に隙間がないことが保証されてればいいんだけど
292はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/09(日) 19:43:00.43ID:6ZzBc/+b0293デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/09(日) 20:21:15.21ID:DZU7rHSU0 アフォはこう書く
p = (int*)card;
先輩方に見捨てられるので気をつけて
p = (int*)card;
先輩方に見捨てられるので気をつけて
294デフォルトの名無しさん (スプープ Sd3f-4U7T)
2023/07/09(日) 20:52:22.88ID:QgBW0FA9d >>291
心配なら
int card[5*5];
とでも宣言すれば安心だけど
パディングがもしあるなら card[5];の各要素の間にすでに挟まってるはずなので
card[5][5];も同じようにアクセスできるはず
心配なら
int card[5*5];
とでも宣言すれば安心だけど
パディングがもしあるなら card[5];の各要素の間にすでに挟まってるはずなので
card[5][5];も同じようにアクセスできるはず
295デフォルトの名無しさん (ワッチョイ 175f-kkOg)
2023/07/09(日) 23:01:01.58ID:uNLQZN7w0 >>291-292
隙間の有無とアクセス保証は関係ないでしょ。少なくとも規格上は。
隙間の有無とアクセス保証は関係ないでしょ。少なくとも規格上は。
296はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 00:28:02.91ID:EhhseXmK0 規格上の規定は要素のレイアウトの規定として私は理解してたので
そのレイアウトと矛盾しなければ一次元の配列として
扱っても仕様に反しないという解釈でいたんだが……。
直接的に書かれている演算方法を経由した場合しか許さん
と捉えたなら保証はないのかもしれない。
そのレイアウトと矛盾しなければ一次元の配列として
扱っても仕様に反しないという解釈でいたんだが……。
直接的に書かれている演算方法を経由した場合しか許さん
と捉えたなら保証はないのかもしれない。
297デフォルトの名無しさん (ワッチョイ ff63-kkOg)
2023/07/10(月) 00:33:20.12ID:SSHQru750 保証がないと、困るよ・・
298はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 00:36:21.43ID:EhhseXmK0 解釈の余地があるときは安全側 (制約が厳しい側) で解釈しておくのが筋ではある。
299デフォルトの名無しさん (ワッチョイ ff63-kkOg)
2023/07/10(月) 00:53:08.94ID:SSHQru750 元々配列なんて一次元が基本だし、mallocで確保して多次元配列として扱うなんてのもよくあるし
300はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 01:20:39.58ID:EhhseXmK0301デフォルトの名無しさん (スプープ Sd3f-4U7T)
2023/07/10(月) 08:43:48.54ID:Xrxae+evd 先頭と領域が確保されていればその間にアクセスできない部分があることはないだろう
そんな器用なことをする必然性がないわ
そんな器用なことをする必然性がないわ
302デフォルトの名無しさん (アウアウウー Sa9b-8N3f)
2023/07/10(月) 08:47:35.15ID:7JEyTvQka #include <stdio.h>
void main(void) {
int card[5][5];
int **p1;
int *p2
p1 = card;
p2 = card[0];
}
void main(void) {
int card[5][5];
int **p1;
int *p2
p1 = card;
p2 = card[0];
}
303デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/10(月) 09:02:15.74ID:BD2ve/J+0304デフォルトの名無しさん (アウアウウー Sa9b-8N3f)
2023/07/10(月) 09:24:10.89ID:dS/bwvgRa305デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/10(月) 09:29:04.81ID:BD2ve/J+0 >>304
何のことだよ?
何のことだよ?
306はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
2023/07/10(月) 09:53:48.86ID:EhhseXmK0 >>301
オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。
ポインタの演算の結果は配列の要素か配列の最後の要素を
ひとつ過ぎた位置を指さなければならない。
その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく
ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。
(C99 なら 6.5.6 の加減演算子の項目に書いてある。)
今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので
このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。
仕様に書かれている演算はその演算に相当するレイアウトで配置される
という意味で解釈することも出来ると私は考えていたが
仕様の文面に厳密に言えば駄目かもわからん。
現代的な処理系ではポインタは由来 (provenance) という概念を持っていて
演算の元になったオブジェクトを外れたら未定義であるということを
利用して最適化することもある。
これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。
仕様に厳密にしないとわけのわからないことが起こるのが C というものなので
仕様の解釈は大事だよ。
オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。
ポインタの演算の結果は配列の要素か配列の最後の要素を
ひとつ過ぎた位置を指さなければならない。
その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく
ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。
(C99 なら 6.5.6 の加減演算子の項目に書いてある。)
今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので
このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。
仕様に書かれている演算はその演算に相当するレイアウトで配置される
という意味で解釈することも出来ると私は考えていたが
仕様の文面に厳密に言えば駄目かもわからん。
現代的な処理系ではポインタは由来 (provenance) という概念を持っていて
演算の元になったオブジェクトを外れたら未定義であるということを
利用して最適化することもある。
これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。
仕様に厳密にしないとわけのわからないことが起こるのが C というものなので
仕様の解釈は大事だよ。
307デフォルトの名無しさん (ワッチョイ 9fad-kkOg)
2023/07/10(月) 10:31:52.15ID:ifz8cUKw0 >>302
p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。
p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。
308デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
2023/07/10(月) 10:34:39.51ID:BD2ve/J+0 int card[5][5]; となっているとき
&card 二次元配列全体へのポインタ
card 最初の行へのポインタ
*card 最初の要素へのポインタ
&card 二次元配列全体へのポインタ
card 最初の行へのポインタ
*card 最初の要素へのポインタ
309デフォルトの名無しさん (ワッチョイ bf79-CBkq)
2023/07/10(月) 12:23:15.05ID:pvSg+WfU0 2次元配列なんてExcelのRangeオブジェクトが返す配列ぐらいでしかお世話になったことないわ
特に効率的でもないし構造体でええやろ
特に効率的でもないし構造体でええやろ
310デフォルトの名無しさん (スップ Sd3f-hfg2)
2023/07/10(月) 12:47:58.91ID:Wg7MEfSed 何でそこで構造体?
311デフォルトの名無しさん (ワッチョイ 175f-kkOg)
2023/07/10(月) 12:53:57.17ID:AzWw4sMa0 >>308 下2行は正しくない。
312デフォルトの名無しさん (スップ Sd3f-hfg2)
2023/07/10(月) 13:25:18.46ID:Wg7MEfSed §6.3.2.1の段落2で定める例外にあたらない場合という但し書きが足りないね
悪かったよ
悪かったよ
313デフォルトの名無しさん (ワッチョイ ff63-/79E)
2023/07/10(月) 18:04:08.51ID:SSHQru750 5ch、専用ブラウザがサポート終了し、撤退する様です。
FireFoxだと書き込める様です。
それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。
FireFoxだと書き込める様です。
それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。
314デフォルトの名無しさん (ワッチョイ ff7c-rqKn)
2023/07/10(月) 18:05:43.31ID:BD2ve/J+0 ソースplz
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 高市政権にパイプ役不在…日中高まる緊張 公明党の連立離脱影響、自民内にも懸念「自分でまいた種は自分で刈り取ってもらわないと」★2 [ぐれ★]
- 【速報】 日経平均の下落率3%超す、財政懸念で長期金利上昇 [お断り★]
- 【速報】 高市政権、「日本版DOGE」を立ち上げ 米国で歳出削減をした「政府効率化省(DOGE)」になぞらえたもの [お断り★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- 清涼飲料水から麻薬成分東京都が注意喚起 [おっさん友の会★]
- 【悲報】早速高市首相のせいで全国の民泊でキャンセルラッシュwwwwwwwwwwww 経営者も嘆き「こんな事は初めてだ…」😲 [871926377]
- 【日刊】暇空茜、また敗訴🥸 [359965264]
- 中国「高市が謝罪撤回しないとこれ全部なくなるけどどうする?」 [931948549]
- 台湾政党が高市首相「存立危機事態」発言に感謝の書簡「我々の心を強く奮い立たせるものでした」 [834922174]
- 高市のプライドはエベレストより高い。だから、発言を撤回できない [805596214]
- んなっしょい🍬禁止🈲のお🏡
