[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/29 23:41 / Filesize : 272 KB / Number-of Response : 1007
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け 161



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

205 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 21:43:27.13 ID:t5k+pzJSM.net]
switchは良くないと思うよ

利用側でそれぞれの型用に別々の関数を書いて使う人が使い分ける感じじゃないかな
それこそ知らんけどレベルで申し訳ないが

206 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 22:36:35.79 ID:QLr+SdPOd.net]
>>203
毎回関数を作る
だってリングバッファだぞ
目をつぶっていても作れるぞw

207 名前:デフォルトの名無しさん mailto:sate [2023/06/07(水) 07:49:00.73 ID:uhVmgr37a.net]
>>203
お手本の定番は qsort() だろ

208 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 08:29:44.13 ID:MtVH7DHg0.net]
>>205
そういうのはライブラリ化しておくべき

209 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 09:26:39.45 ID:PykR7vOnd.net]
fread(void *buf, size_t size, size_t n, …
の順もあれば
qsort(void *base, size_t num, size_t size, …
の順もあって
行き当たりばったり感

210 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 12:34:45.81 ID:hQs7a5Jyd.net]
>>207

じゃあ、ほい

struct CUE{
int size;
int max;
int inp;
int out;
char buf[1];
};

struct CUE *create_cue(int size, int max)
{
struct CUE *cue =malloc(sizeof(struct CUE)+size*max);
if(cue){
cue->size=size;
cue->max=max;
cue->inp=cue->out=0
}
return cue;
}

int cue_get(struct CUE *cue, void*data)
{
if( cue->inp ==cue->out )
return 0;//buffer empty
memcpy(data,&cue->buf[cue->out* cue->size],cue->size);
if(++cue->out>=cue->max) cue->out=0;
return 1;
}

int cue_add(struct CUE *cue, void*newdata)
{
int index = cue->inp;
if(++index>=cue->max) index=0;
if( index ==cue->out ) return 0;//buffer full
memcpy(&cue->buf[cue->inp* cue->size],newdata,cue->size);
cue->inp=index;
return 1;
}

目をつぶって作ったのでバグがあっても知らない
要するにこういうことでしょ
他の人が言ってるように型チェックがまったく働かないので俺は使いたくない

211 名前:デフォルトの名無しさん (スッップ Sda2-NC7J) mailto:sage [2023/06/07(水) 13:05:36.32 ID:xTW5tL3jd.net]
memcpyは余計だな。ポインタを返して後は使用者(自分)に委ねるね俺は

212 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 14:05:23.13 ID:lsOQP3og0.net]
見てないけどCUEって時点でもう程度が知れる

213 名前:デフォルトの名無しさん [2023/06/07(水) 15:08:50.29 ID:hYVl7Kw10.net]
重箱の鬼の首をとる応用例

・(Perlを)Pearl って時点でもう程度が知れる
・(Daemon を)Demon って時点でもう程度が知れる



214 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 16:05:48.27 ID:e1NBMLRC0.net]
Luciferの事もたまには思い出してあげて

215 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 21:46:42.98 ID:xi4mV2dDp.net]
ダブルスラッシュがコメントに採用されたのどの版から?

216 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 22:41:36.55 ID:JgjHIelbd.net]
>>210
概念的にはgetした瞬間にリングバッファから取り除かれてるはずなので
実際にはバッファが一回りするまで残っているが
消えてるかどうか曖昧で気持ち悪いのでコピーで返したほうが望ましい
まあ好みかもしれんが

217 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 11:06:02.87 ID:rxjbLVG0a.net]
>>214
MSVC じゃなくて MS-C の 3 くらいからあったかも

218 名前:デフォルトの名無しさん (スプッッ Sd02-w9Bk) [2023/06/08(木) 12:46:07.00 ID:m0+KFU8md.net]
C99から
それ以前でもコンパイラ拡張で//コメントをサポートしてるのはあるらしいけど
以下のようなエッジケースで解釈が変わる

b=a//**/ 2
;

//コメントを認めないならb=a/2;
//コメントを認めるならb=a;

219 名前:デフォルトの名無しさん (ワッチョイ 916e-aXLw) mailto:sage [2023/06/08(木) 12:55:42.05 ID:ldHYl5bi0.net]
> 目をつぶって作ったのでバグがあっても知らない

そういうのは「作った」とは言わない

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
おまえそっちでやれ
○○のはずとかそんなんで書くぐらいなら普通に書け






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<272KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef