1 名前:デフォルトの名無しさん (ワッチョイ 0f63-sFbk) mailto:sage [2023/04/21(金) 14:05:20.18 ID:rqj2HSDF0.net] !extend:checked:vvvvv:1000:512 (新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 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 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 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
220 名前:デフォルトの名無しさん (ワッチョイ 5146-rNJ6) [2023/06/08(木) 13:01:02.12 ID:5qYvg3Wg0.net] 盲者のモノ作りなど認めない。
221 名前:デフォルトの名無しさん (ワッチョイ 4297-UW6r) mailto:sage [2023/06/08(木) 13:06:43.94 ID:2i+h5Gbt0.net] 目開けても何も見てない奴いるからな
222 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 13:39:09.53 ID:JhrUsqpHd.net] 野良審査員には餌をやらん主義
223 名前:はちみつ餃子 mailto:sage [2023/06/08(木) 14:35:42.49 ID:Iro3x2NJ0.net] >>214 C99 からだが経緯としては先に C++ で採用されていたという事情がある。 C with Classes から C++ になる 1984 年頃に BCPL 風を参考にして スラッシュふたつで始めるコメント記法が導入され、 更に 1998 年にそのコメント記法も含めて ISO の規格として確立した。 C と C++ でプリプロセッサは共用することも多いだろうし コメントはプリプロセッサで除去するだろうから C++ で採用された段階で実際には C でもスラッシュふたつのコメント記法を 使えていた環境は割と有ったのだと思う。
224 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 14:52:55.41 ID:ldHYl5bi0.net] マイクロソフトが独自拡張で当時C++のみのはずの//をCでも許していた 言わずと知れた屈指の大手がやっているので規格が追認することとなった
225 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 16:45:48.60 ID:JA9B62300.net] gccも使えてた気がする
226 名前:デフォルトの名無しさん mailto:sage [2023/06/10(土) 18:04:06.65 ID:Yvl44ooC0.net] 90年後半からしか実務で使ってないけどVCでは普通に書けてたな UNIX系はベンダー製のCの制限が酷かった思い出
227 名前:デフォルトの名無しさん mailto:sage [2023/06/10(土) 18:47:34.87 ID:Yrme8ZC10.net] borlandやwatcomでも使えなかったっけか?
228 名前:デフォルトの名無しさん mailto:sage [2023/06/10(土) 20:49:31.43 ID:6EfmWVuRd.net] 便利だからね オプションで使えなくすることもできたはず
229 名前:デフォルトの名無しさん (ワッチョイ c1bb-s+nx) mailto:sage [2023/06/16(金) 01:45:49.62 ID:q8ApsJJ90.net] int a[3] = {}; int b[3] = {0}; aの初期化はgcc拡張で規格に沿っているのはbの初期化だと記憶していたんだけど、 規格の6.7.8を見るとメンバの個数より波カッコで囲まれた初期化子が少ない場合は暗黙的に静的に初期化するとあった。 この規格の文章を見る限りはaも規格に合致していると思えるんだけど、aがgcc拡張っていうのは本当ですか?
230 名前:228 (ワッチョイ c1bb-s+nx) mailto:sage [2023/06/16(金) 02:08:30.52 ID:q8ApsJJ90.net] 参照した規格はX 3010:2003 (ISO/IEC 9899:1999) です
231 名前:デフォルトの名無しさん (ワッチョイ e95f-2rqm) mailto:sage [2023/06/16(金) 08:46:04.94 ID:qgM8i0iT0.net] >>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
232 名前:デフォルトの名無しさん (アウアウウー Sadd-g1CP) mailto:sage [2023/06/16(金) 16:12:05.48 ID:ly+Q1cW8a.net] struct hoge { char a[]; }; struct fuga { char a[0]; };
233 名前:デフォルトの名無しさん (ワッチョイ c1bb-s+nx) mailto:sage [2023/06/16(金) 16:20:37.85 ID:q8ApsJJ90.net] >>230 なるほど構文規則ってところを見るんですね どうもありがとう
234 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c13e-2rqm) mailto:sage [2023/06/16(金) 17:28:57.05 ID:QEmhRLek0.net] >>228 gcc でも -pedantic オプションを付けたら警告は出るぞ。 > warning: ISO C forbids empty initializer braces
235 名前:デフォルトの名無しさん (ワッチョイ 0dbb-p8ty) mailto:sage [2023/06/17(土) 21:50:15.83 ID:q+Kf8pNU0.net] >>233 知りませんでした! どうもありがとう
236 名前:デフォルトの名無しさん (ワッチョイ a52d-wYA+) mailto:sage [2023/06/25(日) 08:36:37.75 ID:D6GgnyEK0.net] int main(void)って書く流派ってどこでそんなの身に着けたの?
237 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/25(日) 09:20:49.86 ID:yrM2OONq0.net] >>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) { /* ... */ }
238 名前:デフォルトの名無しさん (ワッチョイ 4b46-GfJH) [2023/06/25(日) 10:53:26.83 ID:/MLTigPj0.net] >>235 この指摘をしばしば見るが、int main(void) が違反だった時代はいつ頃なの。
239 名前:デフォルトの名無しさん (ワッチョイ a52d-wYA+) mailto:sage [2023/06/25(日) 10:56:42.79 ID:D6GgnyEK0.net] C99からint main(void)と書いてもいいらしい
240 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/25(日) 11:13:38.04 ID:+vRVyhzX0.net] main については C89 のときから変わってないよ。
241 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/25(日) 11:58:52.46 ID:yrM2OONq0.net] >>237 K&R Cにはvoidというキーワードが存在しなかった
242 名前:デフォルトの名無しさん (ワッチョイ a52d-wYA+) mailto:sage [2023/06/25(日) 12:22:01.62 ID:D6GgnyEK0.net] K&R第2版にint main(void)なんて書き方出てきた記憶がないんだよね
243 名前:デフォルトの名無しさん (ワッチョイ a397-HUf/) mailto:sage [2023/06/25(日) 12:38:23.47 ID:6RRGV0Qg0.net] printf(null);
244 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/25(日) 12:38:51.73 ID:+vRVyhzX0.net] >>241 日本語版だと 41 ページに 「リストが明らかに空であるときには,予約語 void を使うべきである」 と書かれているのを見つけた。
245 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/25(日) 17:09:36.88 ID:+vRVyhzX0.net] 関数定義のときに仮引数がゼロ個なら void を書くのは当然の作法なんだから main についてはどうでも良いとはいえども main だけ空にするのもなんか変じゃない?
246 名前:デフォルトの名無しさん (ワッチョイ 1b79-SnHJ) mailto:sage [2023/06/25(日) 19:26:05.36 ID:20Xxe9+j0.net] 処理系は引数で任意のスタートアップを指定できるからmain書きたくない需要も満たせるよ
247 名前:デフォルトの名無しさん (スッププ Sd43-W+UZ) mailto:sage [2023/06/25(日) 22:39:44.42 ID:7VFzLtX7d.net] >>235 めんどくさいだけだろ
248 名前:デフォルトの名無しさん (ワッチョイ 955f-bte+) mailto:sage [2023/06/26(月) 06:14:35.93 ID:F8cl0T7T0.net] めんどくさい流免許皆伝
249 名前:デフォルトの名無しさん (ワッチョイ 4b46-GfJH) [2023/06/26(月) 07:16:23.26 ID:xzT4Agq20.net] 初級、めんどくさいので略記 初段、めんどくさいので無注釈 免許皆伝、めんどくさいので無ドキュメント
250 名前:デフォルトの名無しさん (ワッチョイ ad5f-9QlF) mailto:sage [2023/06/26(月) 08:07:26.96 ID:5ZBA7oeF0.net] 組み込み系ならmainに引き数なんて不用
251 名前:デフォルトの名無しさん (スプッッ Sd03-+QuN) mailto:sage [2023/06/26(月) 08:52:43.48 ID:r2qj24yMd.net] 元々プログラムはまんどくさいを代行するものだし・・・
252 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 12:05:19.83 ID:TXNTP2LF0.net] 組み込みでmainか・・・ ベクタテーブル作るときのラベルがマングリングされてないから短く済むけどそれだけ
253 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 12:06:17.67 ID:TXNTP2LF0.net] あ、ここCだっけ サーセン
254 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/26(月) 13:00:03.75 ID:DZPgqn/v0.net] >>249 main に引数が有るか無いかの話じゃなくて、無いときに void を書くという話題だよ。
255 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 13:16:56.95 ID:6bPwUIFfp.net] 実際の組み込み系には、二つのmainエントリーがある 引数のある奴と、無い奴な
256 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 13:20:15.17 ID:TXNTP2LF0.net] >>254 組み込みでargcとargvはどんな意味があるってんだ? コンソールがあるって前提?
257 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 13:24:00.16 ID:6bPwUIFfp.net] 意味なんて知るか ブートローダとか色々都合があるんだよ
258 名前:デフォルトの名無しさん (ワッチョイ 9dc9-3ptY) mailto:sage [2023/06/26(月) 13:31:08.91 ID:yiohjGaX0.net] 環境依存しまくってる部分だとは思うけど 組み込み用のコンパイラでも エントリは main のままなのね
259 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 13:43:40.71 ID:6bPwUIFfp.net] 組込みの真のエントリーはresetな でも普通はそこからmainまではハード会社が提供してる 初期化処理が入るからあんまり触らない
260 名前:デフォルトの名無しさん (スッププ Sdab-W+UZ) mailto:sage [2023/06/26(月) 16:47:50.70 ID:D5GxB3wJd.net] リンカにわたすオプションで_startだか_resetだかを指定してるだけ(例えばld -e _start) 自分で初期化を書きたければmakefileに先頭ラベルを記述すればいい
261 名前:デフォルトの名無しさん (ラクッペペ MM4b-d+Ca) mailto:sage [2023/06/26(月) 17:33:04.45 ID:O3f/yVVZM.net] 割込みベクタテーブルのリセット割込みのアドレスがエントリポイント マイコンのリセットでプログラムカウンタのアドレスが設定される
262 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 20:20:34.26 ID:6bPwUIFfp.net] >>260 石によるだろそんなん
263 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 20:39:52.87 ID:TXNTP2LF0.net] K&R Cで「死産だった」とされるentryというキーワードは、多分このへんの話だったんだろうな
264 名前:デフォルトの名無しさん (スプッッ Sd03-eK8M) [2023/06/26(月) 20:56:23.88 ID:aG57g/0Md.net] そもそもCPU(マイコン)と、そのCPUの命令セットに翻訳するコンパイラに自由度を与えるためにC言語規格で明言することを少なめにしてる 0x100からカウンタが始まるだのブートローダーが必要だの環境依存の初期化はコンパイラが知ってれば十分。
265 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 21:02:50.78 ID:6bPwUIFfp.net] コンパイラは知らないよ スタートアップライブラリが知ってる
266 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 21:10:49.81 ID:TXNTP2LF0.net] そそ
267 名前:デフォルトの名無しさん (ワッチョイ e3fb-eK8M) [2023/06/26(月) 21:26:51.56 ID:L7dTsKCZ0.net] ああそうかコンパイラ自体は初期化手段知らなくてもいいのね
268 名前:デフォルトの名無しさん (ワッチョイ bb2d-ctHD) mailto:sage [2023/07/07(金) 14:46:28.07 ID:Cp8NbwGm0.net] #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で実行すると毎回結果がばらばらになる
269 名前:デフォルトの名無しさん (ワッチョイ e26a-3VO7) mailto:sage [2023/07/07(金) 14:52:43.24 ID:RkflWXNN0.net] .textと.bssを比較すりゃさもありなん
270 名前:デフォルトの名無しさん (ササクッテロラ Sp5f-SBEo) mailto:sage [2023/07/07(金) 15:00:57.31 ID:Rpkmzd56p.net] プログラムとデータは別れてんだよなぁ
271 名前:デフォルトの名無しさん (テテンテンテン MM8e-OS6S) mailto:sage [2023/07/07(金) 16:12:54.67 ID:h0HZTRPQM.net] アドレス空間レイアウトのランダム化 (ASLR)だろ 差じゃなくてポインターの中身を表示してみればいいじゃん
272 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP) mailto:sage [2023/07/07(金) 16:20:17.47 ID:gGTaLgTI0.net] >>267 64bit 版の Windows だとしたら unsigned long はポインタを表すのに十分なサイズではない。 上位バイトが丸ごと抜け落ちて意図した計算が出来てないと思う。 へんなところを引き算するよりベースアドレスを基準に観察したほうがわかりやすいよ。 歴史的事情で Windows ではインスタンスハンドルがベースアドレスそのものということになってる。
273 名前:デフォルトの名無しさん (スップ Sd22-PY2F) [2023/07/07(金) 16:42:49.80 ID:LOYSagRvd.net] そういやlongはWindows環境だと32bitだっけか size_t使ったほうが面倒がなさそう
274 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP) mailto:sage [2023/07/07(金) 16:53:06.75 ID:gGTaLgTI0.net] Windows だとどっちでもいいけど意味の上では uintptr_t のほうが妥当だと思う。
275 名前:デフォルトの名無しさん (ワッチョイ 0e79-p0MK) mailto:sage [2023/07/07(金) 16:55:15.60 ID:tybFBPle0.net] いやもう露骨にbit数書いてくれた方がいいわ int128とか
276 名前:デフォルトの名無しさん (ワッチョイ bb2d-ctHD) [2023/07/07(金) 17:07:14.08 ID:Cp8NbwGm0.net] #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くらいでした
277 名前:デフォルトの名無しさん (ワッチョイ c67c-mdfO) mailto:sage [2023/07/07(金) 17:38:01.25 ID:GxNDHmP50.net] >>274 #include <stdint.h> の int64_tとかじゃあかんの?
278 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP) mailto:sage [2023/07/07(金) 17:44:32.91 ID:gGTaLgTI0.net] ここで欲しいのは「ポインタを格納するのに適した整数型」であって 具体的に何ビットなのかをプログラム上で表現するのは筋違いだと思うんだけど でもまあどうせ処理系に依存するなら抽象を挟んでもあまり得なことも無いかな とも思うし、まあそこらへんは感覚的なもんやからね……。
279 名前:デフォルトの名無しさん (ワッチョイ c67c-mdfO) mailto:sage [2023/07/07(金) 17:46:08.50 ID:GxNDHmP50.net] >>277 #include <stdint.h>の intptr_tやuintptr_tじゃあかんの?
280 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP) mailto:sage [2023/07/07(金) 17:49:07.83 ID:gGTaLgTI0.net] >>278 いいよ。 私は uintptr_t が妥当と述べてる。 (>>273 )
281 名前:デフォルトの名無しさん (ワッチョイ c67c-mdfO) mailto:sage [2023/07/07(金) 17:55:31.01 ID:GxNDHmP50.net] Windowsならこうなってるね LONG_PTR SetWindowLongPtrA( [in] HWND hWnd, [in] int nIndex, [in] LONG_PTR dwNewLong );
282 名前:デフォルトの名無しさん (ラクッペペ MM8f-VHD8) mailto:sage [2023/07/08(土) 09:25:06.78 ID:ZG00xBJMM.net] それハンドルを取得する関数なのでポインタとはちょっと違う
283 名前:デフォルトの名無しさん (スプープ Sd3f-4U7T) mailto:sage [2023/07/08(土) 11:55:06.89 ID:pEcLN/B5d.net] >>275 それで本当にスタックサイズ計算できてるの? MSの文書だとデフォルトでは1MBと書いてあるし もし不足が予想されるのならリンクオプションでサイズ変更できるし 本来大きいメモリはalloc系で確保すべき
284 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/08(土) 12:43:32.13 ID:svQTfB7/0.net] メモリ空間は 64bit あるけどその全てに実メモリが割り当てられているわけでは当然ない。 仮想的なメモリを管理するから API の名前に Virtual とついてて、 AllocationBase は管理している一塊の単位のベースってだけ。 その単位の中の全てがスタック用とは限らないので基準にはならないと思う。 各スレッドのスタックの底は thread information block に格納されているはず。
285 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/08(土) 19:02:15.63 ID:wtJKE3gc0.net] >>281 ????
286 名前:蟻人間 ◆T6xkBnTXz7B0 (スフッ Sdbf-yJMt) mailto:sage [2023/07/08(土) 19:05:04.15 ID:E2jAOZHYd.net] >>281 違うよ。ポインタと同じサイズの整数値を設定できる関数だよん。 型キャストすればポインタも渡せる。
287 名前:デフォルトの名無しさん (スップ Sd3f-hfg2) mailto:sage [2023/07/09(日) 12:33:23.59 ID:6bAebKnHd.net] 井の中の蛙だったか あーくだらん
288 名前:デフォルトの名無しさん (ワッチョイ 17b3-S1Rn) mailto:sage [2023/07/09(日) 18:21:47.85 ID:nGZbLr+D0.net] #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に代入しています。
289 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/09(日) 18:24:43.97 ID:6ZzBc/+b0.net] >>287 p = *card;
290 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/09(日) 18:31:02.01 ID:6ZzBc/+b0.net] >>287 この場合に card の型は int[5][5] なんだけど 配列は配列の先頭要素を指すポインタに暗黙に型変換されるのが基本ルール だから式中に card が出てきたら int(*)[5] として扱われる。 この型は int* と互換性のない型ということを警告は言ってる。 型が int(*)[5] であるような式に * を付けたら int[5] ということになるんだけど 上述の暗黙の型変換のルールで int* ということになって p の型と一致するようになる。 故に p = *card; で通る。
291 名前:デフォルトの名無しさん (ワッチョイ 17b3-6GCC) [2023/07/09(日) 18:37:18.48 ID:nGZbLr+D0.net] サンクス
292 名前:デフォルトの名無しさん (ワッチョイ 9ffb-9JJG) [2023/07/09(日) 18:49:34.69 ID:vTvbeyL00.net] この場合ってpを長さ25の1次元配列として使っていいという保証あるっけ? `card[0]`の長さ5の配列と`card[1]`の長さ5の配列に隙間がないことが保証されてればいいんだけど
293 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/09(日) 19:43:00.43 ID:6ZzBc/+b0.net] >>291 二次元配列ってのは理屈の上では一次元配列を要素とする配列と解釈される。 一次元配列で要素間に詰め物が入らないなら二次元でも理屈は同じ。
294 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/09(日) 20:21:15.21 ID:DZU7rHSU0.net] アフォはこう書く p = (int*)card; 先輩方に見捨てられるので気をつけて
295 名前:デフォルトの名無しさん (スプープ Sd3f-4U7T) mailto:sage [2023/07/09(日) 20:52:22.88 ID:QgBW0FA9d.net] >>291 心配なら int card[5*5]; とでも宣言すれば安心だけど パディングがもしあるなら card[5];の各要素の間にすでに挟まってるはずなので card[5][5];も同じようにアクセスできるはず
296 名前:デフォルトの名無しさん (ワッチョイ 175f-kkOg) mailto:sage [2023/07/09(日) 23:01:01.58 ID:uNLQZN7w0.net] >>291-292 隙間の有無とアクセス保証は関係ないでしょ。少なくとも規格上は。
297 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/10(月) 00:28:02.91 ID:EhhseXmK0.net] 規格上の規定は要素のレイアウトの規定として私は理解してたので そのレイアウトと矛盾しなければ一次元の配列として 扱っても仕様に反しないという解釈でいたんだが……。 直接的に書かれている演算方法を経由した場合しか許さん と捉えたなら保証はないのかもしれない。
298 名前:デフォルトの名無しさん (ワッチョイ ff63-kkOg) mailto:sage [2023/07/10(月) 00:33:20.12 ID:SSHQru750.net] 保証がないと、困るよ・・
299 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/10(月) 00:36:21.43 ID:EhhseXmK0.net] 解釈の余地があるときは安全側 (制約が厳しい側) で解釈しておくのが筋ではある。
300 名前:デフォルトの名無しさん (ワッチョイ ff63-kkOg) mailto:sage [2023/07/10(月) 00:53:08.94 ID:SSHQru750.net] 元々配列なんて一次元が基本だし、mallocで確保して多次元配列として扱うなんてのもよくあるし
301 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/10(月) 01:20:39.58 ID:EhhseXmK0.net] >>299 malloc で確保した領域はどんなオブジェクト (少なくとも仕様の範囲内で作れる型に対応するオブジェクト) に対しても適切に境界調整されている。 そこらへんは別の話。
302 名前:デフォルトの名無しさん (スプープ Sd3f-4U7T) mailto:sage [2023/07/10(月) 08:43:48.54 ID:Xrxae+evd.net] 先頭と領域が確保されていればその間にアクセスできない部分があることはないだろう そんな器用なことをする必然性がないわ
303 名前:デフォルトの名無しさん (アウアウウー Sa9b-8N3f) mailto:sage [2023/07/10(月) 08:47:35.15 ID:7JEyTvQka.net] #include <stdio.h> void main(void) { int card[5][5]; int **p1; int *p2 p1 = card; p2 = card[0]; }
304 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/10(月) 09:02:15.74 ID:BD2ve/J+0.net] >>302 こっちでやれ https://mevius.5ch.net/test/read.cgi/tech/1427572389/
305 名前:デフォルトの名無しさん (アウアウウー Sa9b-8N3f) mailto:sage [2023/07/10(月) 09:24:10.89 ID:dS/bwvgRa.net] >>303 おまえそっちでやれ ○○のはずとかそんなんで書くぐらいなら普通に書け
306 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/10(月) 09:29:04.81 ID:BD2ve/J+0.net] >>304 何のことだよ?
307 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/10(月) 09:53:48.86 ID:EhhseXmK0.net] >>301 オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。 ポインタの演算の結果は配列の要素か配列の最後の要素を ひとつ過ぎた位置を指さなければならない。 その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。 (C99 なら 6.5.6 の加減演算子の項目に書いてある。) 今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。 仕様に書かれている演算はその演算に相当するレイアウトで配置される という意味で解釈することも出来ると私は考えていたが 仕様の文面に厳密に言えば駄目かもわからん。 現代的な処理系ではポインタは由来 (provenance) という概念を持っていて 演算の元になったオブジェクトを外れたら未定義であるということを 利用して最適化することもある。 これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。 仕様に厳密にしないとわけのわからないことが起こるのが C というものなので 仕様の解釈は大事だよ。
308 名前:デフォルトの名無しさん (ワッチョイ 9fad-kkOg) [2023/07/10(月) 10:31:52.15 ID:ifz8cUKw0.net] >>302 p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。
309 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/10(月) 10:34:39.51 ID:BD2ve/J+0.net] int card[5][5]; となっているとき &card 二次元配列全体へのポインタ card 最初の行へのポインタ *card 最初の要素へのポインタ
310 名前:デフォルトの名無しさん (ワッチョイ bf79-CBkq) mailto:sage [2023/07/10(月) 12:23:15.05 ID:pvSg+WfU0.net] 2次元配列なんてExcelのRangeオブジェクトが返す配列ぐらいでしかお世話になったことないわ 特に効率的でもないし構造体でええやろ
311 名前:デフォルトの名無しさん (スップ Sd3f-hfg2) mailto:sage [2023/07/10(月) 12:47:58.91 ID:Wg7MEfSed.net] 何でそこで構造体?
312 名前:デフォルトの名無しさん (ワッチョイ 175f-kkOg) mailto:sage [2023/07/10(月) 12:53:57.17 ID:AzWw4sMa0.net] >>308 下2行は正しくない。
313 名前:デフォルトの名無しさん (スップ Sd3f-hfg2) mailto:sage [2023/07/10(月) 13:25:18.46 ID:Wg7MEfSed.net] §6.3.2.1の段落2で定める例外にあたらない場合という但し書きが足りないね 悪かったよ
314 名前:デフォルトの名無しさん (ワッチョイ ff63-/79E) [2023/07/10(月) 18:04:08.51 ID:SSHQru750.net] 5ch、専用ブラウザがサポート終了し、撤退する様です。 FireFoxだと書き込める様です。 それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。
315 名前:デフォルトの名無しさん (ワッチョイ ff7c-rqKn) [2023/07/10(月) 18:05:43.31 ID:BD2ve/J+0.net] ソースplz
316 名前:デフォルトの名無しさん (スップ Sd3f-9JJG) [2023/07/10(月) 18:24:57.71 ID:EIZKDTevd.net] 処理系が16byte境界に合うように 「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安 わざわざコンパイラがそんなことする理由は 1. 16byte境界の合わせたほうがindexの計算が速い 2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる 規格上パディングが入らないことが保証されるならこの話は忘れてくれ
317 名前:デフォルトの名無しさん (ワッチョイ ff63-/79E) [2023/07/10(月) 18:29:02.59 ID:SSHQru750.net] Talk専用ブラウザ 「Jane Style」 ← 5chの記述が消えました 20230710 Version 5.00 公開 ・Talk に対応しました * 5ch.net のサポートを終了しました janesoft.net/janestyle/
318 名前:デフォルトの名無しさん (アウアウウー Sa9b-HEX/) [2023/07/10(月) 18:54:15.08 ID:ebofKpc7a.net] >int **p1; 無いわωωω
319 名前:デフォルトの名無しさん (ワッチョイ 9fad-OD6X) mailto:sage [2023/07/11(火) 02:24:43.39 ID:vn98dBP10.net] >>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前)は近く再度利用可能となります。 > (以下略)
320 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-/79E) mailto:sage [2023/07/11(火) 11:41:03.76 ID:MoKwTryZ0.net] >>315 おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。