!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:rqj2HSDF0224デフォルトの名無しさん (ワッチョイ 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前)は近く再度利用可能となります。
> (以下略)
319はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-/79E)
2023/07/11(火) 11:41:03.76ID:MoKwTryZ0 >>315
おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。
おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。
320デフォルトの名無しさん (ワッチョイ b702-VAl4)
2023/07/11(火) 12:37:10.33ID:UJem4sQV0 テスト
> どういう理屈か知らんけど
> chmateで『URLから開く』で見たい板のURL貼り付けして
> 「5ch」の部分を「5Ch」に変えて開くと
> 5chのスレchmateで見れて草
https://twitter.com/motokamin_/status/1678473238177783835
https://twitter.com/5chan_nel (5ch newer account)
> どういう理屈か知らんけど
> chmateで『URLから開く』で見たい板のURL貼り付けして
> 「5ch」の部分を「5Ch」に変えて開くと
> 5chのスレchmateで見れて草
https://twitter.com/motokamin_/status/1678473238177783835
https://twitter.com/5chan_nel (5ch newer account)
321デフォルトの名無しさん (ワッチョイ e2ad-/jfo)
2023/07/17(月) 05:23:15.01ID:0PvTd+Ok0 chmate はもう対応できてないかな。俺は読み書きできるようになったよ。
今これはPCからで Siki っていうの使って書いてるが。
今これはPCからで Siki っていうの使って書いてるが。
322デフォルトの名無しさん (ワッチョイ 163e-MI76)
2023/07/17(月) 09:16:25.38ID:YifLUjyU0 旧 API を復活させて制限が緩くなったから昔の専ブラがそのままかちょっとした設定変更で使えるよ。
今のところ PC 用の専ブラとしては JaneXeno か Siki が決定版だと思われているようだ。
今のところ PC 用の専ブラとしては JaneXeno か Siki が決定版だと思われているようだ。
323デフォルトの名無しさん (ワッチョイ 3279-EJzg)
2023/07/17(月) 11:31:18.04ID:SG+RSRxx0 >>321
PCはAPI対応前の昔のlive2ch(live5ch)が使える
PCはAPI対応前の昔のlive2ch(live5ch)が使える
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
