!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:rqj2HSDF0219デフォルトの名無しさん (ワッチョイ 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
315デフォルトの名無しさん (スップ Sd3f-9JJG)
2023/07/10(月) 18:24:57.71ID:EIZKDTevd 処理系が16byte境界に合うように
「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安
わざわざコンパイラがそんなことする理由は
1. 16byte境界の合わせたほうがindexの計算が速い
2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる
規格上パディングが入らないことが保証されるならこの話は忘れてくれ
「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安
わざわざコンパイラがそんなことする理由は
1. 16byte境界の合わせたほうがindexの計算が速い
2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる
規格上パディングが入らないことが保証されるならこの話は忘れてくれ
316デフォルトの名無しさん (ワッチョイ ff63-/79E)
2023/07/10(月) 18:29:02.59ID:SSHQru750 Talk専用ブラウザ 「Jane Style」 ← 5chの記述が消えました
20230710
Version 5.00 公開
・Talk に対応しました
* 5ch.net のサポートを終了しました
http://janesoft.net/janestyle/
20230710
Version 5.00 公開
・Talk に対応しました
* 5ch.net のサポートを終了しました
http://janesoft.net/janestyle/
317デフォルトの名無しさん (アウアウウー Sa9b-HEX/)
2023/07/10(月) 18:54:15.08ID:ebofKpc7a >int **p1;
無いわωωω
無いわωωω
318デフォルトの名無しさん (ワッチョイ 9fad-OD6X)
2023/07/11(火) 02:24:43.39ID:vn98dBP10 >>314
https://agree.5ch.net/test/read.cgi/operate/9240230711/
正確にはJaneStyleが離反した
> 00015ちゃんねる ★2023/07/11(火) 00:00:00.00ID:LokiTech
> Janestyleはもう5ch.netと提携していません。
> Janestyle以外の専用ブラウザをご利用ください。
> 旧バージョンの5chブラウザ(API前)は近く再度利用可能となります。
> (以下略)
https://agree.5ch.net/test/read.cgi/operate/9240230711/
正確にはJaneStyleが離反した
> 00015ちゃんねる ★2023/07/11(火) 00:00:00.00ID:LokiTech
> Janestyleはもう5ch.netと提携していません。
> Janestyle以外の専用ブラウザをご利用ください。
> 旧バージョンの5chブラウザ(API前)は近く再度利用可能となります。
> (以下略)
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】中国、水産物輸入停止と通達 日本政府に [おっさん友の会★]
- 中国側が首相答弁の撤回要求、日本側拒否★6 [夜のけいちゃん★]
- 「厚かましい挑発的発言だ」中国国連大使が高市首相発言に強く反発 日本の常任理事国入りに明確に反対 [ぐれ★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 ★3 [蚤の市★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★5 [蚤の市★]
- 自民、経済対策で子ども1人に2万円給付へ 児童手当に上乗せ 所要額は約4000億円 [ぐれ★]
- 逆にお前が統一ネトウヨだったら質問した野党が悪い以外に高市早苗を擁護するパッケージ作れるの?無理だろ? [517791167]
- 【速報】中国、水産物輸入停止 [527893826]
- 【緊急】高市早苗 月内辞任か [695089791]
- 【悲報】高市早苗さん、たった一人で日本を崩壊へ導く [714769305]
- トランプさん、高市早苗を切り捨てる 「あ、うちは台湾有事発言に無関係なんで😅」 [175344491]
- 【高市悲報】官房長官「局長がペコペコしてる画像が拡散しているが日本は承知しとらん😡中国に申し入れした!」🤔 [359965264]
