- 1 名前:デフォルトの名無しさん [2019/04/02(火) 11:23:37.62 ID:SQXqRaAc0.net]
- !extend:checked:vvvvv:1000:512
C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.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/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
- 458 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 23:52:54.47 ID:RPhfdkos0.net]
- >>442
スタックとヒープという概念は知ってる?知らなければまずそれを調べてみて。 それと、初心者なら効率を求める前に正しくメモリ管理を扱えるようになる必要があるが、その時点で残量は気にする必要はないぞ。
- 459 名前:デフォルトの名無しさん [2019/05/05(日) 23:59:16.82 ID:RXFRr1FQ0.net]
- FIFOだとかナントカ程度にしか。
「〜〜領域」という幾つかの用語がOSとかの環境が違っても 全く共通のものなのかよく分からないから正直スルーしてる
- 460 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 05:38:27.60 ID:wr9bFPpT0.net]
- >>414
>1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します 2^10 = 約1,000 千 2^20 = 約1,000,000 百万 2^30 = 約1,000,000,000 十億 >>441 Java VM の初期値は、256MB とか。 それよりも大きいと強制終了されるが、起動時に、512MBに設定できる たぶん、4GB の仮想メモリでも、ユーザー空間3GB・カーネル空間1GBぐらいだろ それ以上のデータは、動画みたいにstream になる。 バッファサイズ、例えば、1MB を読んでは捨てて、次の1MB読んでは捨てて、の繰り返し 読み込んだデータを使ったら、すぐに捨てないといけない。 ユーザー空間に、空きを作らないといけない
- 461 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 06:20:53.21 ID:Geq8Gq1G0.net]
- >>445
いつものRubyバカだろ。いい加減な知識でC言語のメモリの話題に口を挟むのはやめろ。この板になれている者からすれば「またいつものか...」ですむが、初心者にとっては害悪でしかないから消えろ。
- 462 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 06:25:32.64 ID:Geq8Gq1G0.net]
- >>444
組み込みとかの特殊な環境では例外もあるけど、基本的には環境によらずC言語で必須の概念だからスルーせずにちゃんと調べるべき。
- 463 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 08:39:59.60 ID:s1ulBxFy0.net]
- >439
>上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの? 他のプロセスがスワップ起こして重くなるから止めろって言いたい。
- 464 名前:デフォルトの名無しさん [2019/05/06(月) 10:14:49.95 ID:Om5TJBQR0.net]
- >>447
うん調べてみるよ ありがとう >>448 そんな視点もあるのか 他のプロセスも考慮しないといけない 思ったよりも数段以上やっかいだな
- 465 名前:デフォルトの名無しさん [2019/05/06(月) 10:19:59.43 ID:Om5TJBQR0.net]
- >読み込んだデータを使ったら、すぐに捨てないといけない
データをガンガン読み込んでいくようなプログラムだと「使ったらすぐ捨てる」のが鉄則か
- 466 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 10:40:24.77 ID:F7BEaxMm0.net]
- >>439
ユーザープロセスなのでカーネル空間はマッピングされないよ。プロセス管理のための領域はカーネル空間に多少は確保されるとは思うけど、それはユーザープロセス用ではないし。 ページサイズの関係で効率的に確保できるかどうかは別問題だけど仮想メモリ領域いっぱいまで取れるか否かと言えば取ることはできる。 実際にそんなことしたらスワップ発生しまくりでまともに動かないとは思うけど。
- 467 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 12:43:21.39 ID:53K/0wkW0.net]
- 実装としてはだいたいcopy on writeだから、確保だけだったら特に問題発生しないよ
- 468 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 16:08:26.90 ID:95XsbNbMM.net]
- >>451
どのOSなのか明示してくれ。 少なくともlinux 32bitは3GB以降はkernel空間にマッピングされてるだろ
- 469 名前:デフォルトの名無しさん [2019/05/06(月) 21:20:46.06 ID:lSipB+Y80.net]
- 配列にある16進数アスキーを
整数型変数に数値として入れたいのですが、上手くいきません。 valの値をprintfで出力しても「0」になります。 rbuf[5]の中身は「0xDC」 rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。) #include <stdio.h> unsigned char sbuf[255] = {'\0'}; //送信バッファ unsigned char rbuf[255] = {'\0'}; //受信バッファ unsigned char work[10] = {'\0'}; //ワークバッファ unsigned int val = 0; //値 work[0]=rbuf[5]; work[1]=rbuf[6]; work[2]='\0'; sscanf((char *)work, "%x", &val); よろしくお願いします。
- 470 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:29:36.69 ID:v87Zm/5a0.net]
- sscanf の %x は、文字列で記述された数字+アルファベットの列を 16進数として抜き出す
sscanf("10", "%x", &val); → val の値は 10進で16 となる 0xDC 0x18 の並びから どういう整数値にしたいんだろうか?
- 471 名前:454 [2019/05/06(月) 21:38:34.55 ID:lSipB+Y80.net]
- >>455
回答ありがとうございます。 val=0xDC18 という感じで取り出したいです。
- 472 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:40:18.62 ID:v87Zm/5a0.net]
- >>456 それなら
val = rbuf[5]; じゃあかんの?
- 473 名前:454 [2019/05/06(月) 21:50:08.40 ID:lSipB+Y80.net]
- >>457
ありがとうございます。そういうことか・・・ 下記で上手くできました! val= rbuf[5]; val = val << 8; val |= rbuf[6];
- 474 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:54:12.13 ID:v87Zm/5a0.net]
- >>458 解決してよかったね
0xDC 0x18 の並びから (最低でも32bit長の整数)0xDC18 が欲しかったということだね
- 475 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:55:43.20 ID:v87Zm/5a0.net]
- (俺がちゃんと >>456 を読めてなかった説 val=0xDC18 って書いてるやんけw)
- 476 名前:デフォルトの名無しさん [2019/05/06(月) 22:06:19.06 ID:NYoOX9LAa.net]
- >>454
> rbuf[5]の中身は「0xDC」 > rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。) だったらそれはASCIIではないよね。
- 477 名前:デフォルトの名無しさん [2019/05/06(月) 22:08:02.81 ID:NYoOX9LAa.net]
- などと、ゆっくり書いていたら既に解決か・・・
- 478 名前:デフォルトの名無しさん [2019/05/06(月) 22:09:16.82 ID:lSipB+Y80.net]
- >>460
>>461 ありがとうございます。 お陰様で解決できました。 勝手にASCII、文字列と勘違いしていたのがよくなかったです。
- 479 名前:デフォルトの名無しさん mailto:sage [2019/05/07(火) 06:48:35.98 ID:/Z9tG+PY0.net]
- ASCII は、7 bit キャラだろ
欧州文字コードなら、8 bitとか
- 480 名前:デフォルトの名無しさん mailto:sage [2019/05/07(火) 15:31:36.79 ID:gGAOuhJk0.net]
- BASIC時代 文字→文字コード変換関数が ASC(文字) だったな。
- 481 名前:デフォルトの名無しさん mailto:sage [2019/05/08(水) 20:11:19.53 ID:w7dyIR3e0.net]
- 逆はCHR$(コード)だったな。
- 482 名前:デフォルトの名無しさん mailto:sage [2019/05/08(水) 22:02:13.36 ID:LqpjdKM80.net]
- 「なんで朝潮?」と思ってしまった当時の俺w
- 483 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 08:32:10.12 ID:IVg2TokP0.net]
- わらってよりとも というのは、当時の人気番組名をもじったものだよ
- 484 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 12:40:11.38 ID:J26JobOx0.net]
- https://ae01.alicdn.com/kf/HTB1goomIL1TBuNjy0Fjq6yjyXXaS/Cetak-Pria-Kaus-Katun-Leher-o-Tshirts-ANSI-Pemrograman-C-Buku-Jepang-Lengan-Pendek-Wanita-Kaus.jpg_640x640.jpg
- 485 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 20:40:23.75 ID:axmpki24M.net]
- 「はじめてのC」なら買う
- 486 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 22:18:17.14 ID:fgRKvhjn0.net]
- その本の名前、買うときに恥ずかしいw
- 487 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 23:03:35.49 ID:vEdVh+9n0.net]
- 質問です
文字列の配列 char matrix[Y][X]を関数に引数として渡して、渡した先の関数でtxtファイルに出力したい。 YとXはその時々によって違う値でmatrixは文字列の配列だけど1行ごとに'\0'が入っていないとき、渡した先の関数でYとXをどうやれば参照できますか? 例えば matrix = {{‘a’, ‘b’, ‘c’}, {‘d’, ‘e’, ‘f’}}; みたいな配列です
- 488 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 00:00:40.06 ID:IBOrEgMWa.net]
- X(配列のサイズ)を共有してやればいいんじゃないかな
- 489 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 00:14:05.05 ID:Ojl9YgLP0.net]
- >>472
matrixのアドレスと共にX、Yの値を渡さないと無理
- 490 名前:デフォルトの名無しさん [2019/05/10(金) 03:11:16.60 ID:+vHN15fT0.net]
- >>472
https://qiita.com/Hiraku/items/babed27bc1d750c2e12d
- 491 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 09:26:09.21 ID:bwAvNWKg0.net]
- >>474
やっぱり配列のサイズ一緒に渡さないとだためですか
- 492 名前:デフォルトの名無しさん [2019/05/10(金) 09:44:04.32 ID:0Zlxa6bHa.net]
- そう。他の言語だと裏でこっそり渡すようになっていたりしてプログラムに書かなくても動くかも知れないが、Cはそこまでやってくれない。
- 493 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 10:05:05.80 ID:hw8N8wYC0.net]
- 標準関数も一次元配列ですら大きさを渡してるからねー
(文字列は '\0' が終端である という了解を持って大きさを不要にしているだけ)
- 494 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 12:34:03.34 ID:zZfQYrbwd.net]
- >>475
URL張って解党した気になってるアスペルガーのカスがスレ来んな
- 495 名前:デフォルトの名無しさん [2019/05/10(金) 23:50:49.39 ID:svzEPJh90.net]
- え?読んでもわからなかったの?
- 496 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 07:43:24.28 ID:glRpLuyC0.net]
- 確かにつまらんね
リンクだけとかググレカスとか せっかく掲示板にいるのに対話がないのは
- 497 名前:はちみつ餃子 mailto:sage [2019/05/11(土) 09:55:06.58 ID:GtXmrqj00.net]
- >>481
リンクを示すのも、ググればわかるようなことにググれというのも対話だよ。 対話を終わらせてるのはお前だろ。 リンク先を見て意味がわからんかったならどうわからなかったか、 よりよい説明があると思うならそれを示してもいい。 望むことだけ欲しいというのは対話とは言えんよ。
- 498 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 10:34:34.75 ID:glRpLuyC0.net]
- >>482
話が噛み合ってない おまえさんとは平行線のようだな
- 499 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 11:46:55.45 ID:0ygzdBDA0.net]
- ID:glRpLuyC0が対話する気なさすぎて草w
- 500 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 12:23:55.76 ID:9iCvmH6s0.net]
- ここは質疑を行うスレであって
対話したり、雑談したりする場ではない
- 501 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 19:10:51.09 ID:HOBfdmGr0.net]
- Cの上位互換(?)として、C++がありますが。C++は覚えた方がいいですか?
もしくは、CとC++を両方覚えたら、Cは不要になり、C++でコードを書くようになりますか? C++でできることはCでもできるように見えますので、ならCだけでいいようにも思えたり。
- 502 名前: mailto:sage [2019/05/11(土) 19:18:54.28 ID:KtHZQgR00.net]
- >>486
C++ は最近規格の改定がすすみ、いろんなことが C++ の枠内でできるようになりました
- 503 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 19:21:03.92 ID:2v2BzL6t0.net]
- >>486
言っておくが、python,C++,Java,javascript,C#,shellでできる事はC言語でも出来る 更に君が作ろうとしてるものや、やりたいことは、もう誰かが作ってる ましてや大規模になると、googleとかamazonと戦う羽目にもなる それが嫌ならプログラミングなんて辞めとけ
- 504 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 19:32:35.19 ID:HOBfdmGr0.net]
- >>487-488
了解です、ありがとうございます
- 505 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 21:07:19.81 ID:glRpLuyC0.net]
- >>484-485
482は反対意見を述べているという意味でまだいいところがあったが てめーらは一方的な押しつけしか頭にない100%真のノイズだ
- 506 名前:はちみつ餃子 mailto:sage [2019/05/11(土) 21:28:03.11 ID:GtXmrqj00.net]
- >>490
既に解説があると示すのも質問に対する回答として十分だし、それで不満な理由がまるでわからん。 それが対話でないと断言するのも意味がわからん。 結局のところどうして欲しいの?
- 507 名前:デフォルトの名無しさん [2019/05/11(土) 22:15:36.12 ID:YLmnNEXIa.net]
- きっと寂しいんだよ。
- 508 名前:デフォルトの名無しさん mailto:sage [2019/05/11(土) 22:49:22.08 ID:glRpLuyC0.net]
- >>491
意味がわからんからどうした? 平行線の相手に何か言って欲しいのか?
- 509 名前:はちみつ餃子 mailto:sage [2019/05/12(日) 10:19:15.38 ID:l86zXz3/0.net]
- >>493
そう決めつけて続きを拒むなら「一方的な押し付けしか頭にない」「対話がない」というまさにそれでしかなくね? 意味がわからんから解説してくれっての。 わからんことを理解する必要があるから対話になるんだろ。
- 510 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 11:22:06.40 ID:VeGHf8Lz0.net]
- >>494
自分の言葉で何か言えよと思う俺の意見を おまえ真っ向から全否定しただろ だから接点がないと判断したんだ 接点があるなら最初の態度を撤回しろ 話はそれからだ
- 511 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 11:57:36.56 ID:7nn+3/Jt0.net]
- >>495
意見を全否定って、そりゃ異なる意見があるのは当然だろう。異なる考えなら議論にならないなんて、議論する気が無いだけだろう。 ついでだが、俺もお前さんの意見には反対だ。自分の言葉で書くかはまったく重要ではないと思う。お手軽に書ける掲示板のレスは言葉足らずだったり不正確な表現なことも多々あるが、それよりきちんと纏まった情報をリンクされた方がありがたいことも多い。
- 512 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 12:19:14.09 ID:VeGHf8Lz0.net]
- >>496
意見が異なるのと全否定は違うぞ 自分はこう思うと述べるのと おまえは間違っているというのの違いだ よくいるんだよ、どっかからの受け売りを壊れたレコードみたいに繰り返すだけなやつとか 俺は自分の知見からは何も出てこないのかよと思うことがあるが おまえはそれで満足なら勝手に満足してろよ そこが俺とおまえの違いだな
- 513 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 15:34:15.26 ID:SbCKIsfP0.net]
- 質問です
テキストファイルから文字を1文字ずつ読み込んでchar型の2次元配列matrixに入れていきたい。 この時改行は配列に入れたくないときどうすれば良いですか? うまくいかないコード for (i=0;i<10;i++) { for (j=0;j<10;j++) { if (fgetc(fp) == ‘\n’) { continue; } matrix[i][j] = fgetc(fp); } } テキストファイルは行数と列数があらかじめ分かってるとして 例えば AAAAAAAAAA BBBBBBBBBB … のようなファイルです
- 514 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 15:51:11.62 ID:L7lYUohVa.net]
- fgetc二回呼びたいの?
- 515 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 16:10:46.32 ID:7kDDqNbD0.net]
- >>498
continueだと内ループ先頭に戻るから違うんじゃないの
- 516 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 16:24:47.11 ID:R31sKZyy0.net]
- >>498
.for ... { . for ... { . char c = fgetc(fp); . if (c != '\r' && c != '\n') { . m
- 517 名前:atrix[i][j] = c;
. } . } .} [] - [ここ壊れてます]
- 518 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 17:12:05.74 ID:SbCKIsfP0.net]
- >>499
呼ばなくていいです >>501 これでもうまくいかないです
- 519 名前:経団連 mailto:sage [2019/05/12(日) 17:22:08.08 ID:uLUIsoqa0.net]
- for (i=0;i<10;i++) {
for (j=0;j<10;j++) { matrix[i][j] = fgetc(fp); } fgetc(fp); //読み捨て }
- 520 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 17:29:14.22 ID:CrklWm7I0.net]
- 変な例出すなよ…
- 521 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 17:29:29.19 ID:gzai7Rgq0.net]
- サイズが固定なら fread でよくない?
そうすべきというほどのものでもないだろうが。
- 522 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 17:35:10.27 ID:x4ccFx6b0.net]
- >>498
「うまくいかない」症状を見れば、もう少し見当がつくんだけど…。 格納先の配列を char matrix[LINES][CHRS]; とか定義して、 printf("%s\n", matrix[n]); で表示してるの違うかな。 各行の文字列の末尾にあるべき '\0' が格納されてない、みたいな。
- 523 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 17:36:33.22 ID:JjryTeWM0.net]
- 2重ループやめても良いか?
while (1) { int c = fgetc(fp); if (c == EOF) { break; } if (c == '\n') { continue; } matrix[i][j] = c; j++; if (j == 10) { i++; j = 0; } }
- 524 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 17:38:28.80 ID:JjryTeWM0.net]
- 501の方法だと'\n'読んだ時に、スキップしているけど
ループ変数の方は ++1 してるからズレてくる
- 525 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 18:35:08.99 ID:SbCKIsfP0.net]
- >>503
>>507 どちらも行けました 507のは理解できるんですが 503の読み捨てというのはどう言うことなのでしょうか
- 526 名前:デフォルトの名無しさん mailto:sage [2019/05/12(日) 18:43:30.54 ID:JjryTeWM0.net]
- >>509
10個読んで1個捨てる
- 527 名前:デフォルトの名無しさん mailto:sage [2019/05/13(月) 20:38:42.19 ID:WOFscy660.net]
- バッファにつめるところを簡単にしてみた。
https://ideone.com/fJ91BI
- 528 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 06:41:01.67 ID:7SLYc+Rqr.net]
- OSSで構造体を公開しようとおもってる
そのサイズをバージョンアップしても固定にしたいんだけどいいアイデアないかな? struct foo { int a; double b; // ここをバージョンアップで追加 } char[100] buffer; 上記を予め含めておいて、追加サイズ分だけ減らすってのがよくある手段だと思うけど、intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない パディングでサイズも変わっちゃうしね C++ならテンプレートでいけるけど、OSSだから利用者が多いC言語で書いておく必要がある 構造体を公開しないで、ハンドラとセッタで扱えばいけるだろうけど、今回は構造体でいきたい
- 529 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 08:01:00.18 ID:YNmKUGxB0.net]
- 「sizeof(int)が環境依存」を前提にするなら
バージョンアップ以前のint a;だけでもう既にサイズ固定じゃないじゃん int32_tですら必ずある保証はないよ 「汎用な記述で全ての環境に対応したい」ってのが、土台無理な注文なのよ 低レベルなことやるなら、サポートする環境を列挙限定しなければならない 素直に「よくある手段」でやりなさいってことだ
- 530 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 08:07:10.74 ID:0o/9QF7Tx.net]
- >>512
処理系によるパディングとかの問題を別にしたら、bufferをunionにしといたらわざわざ減らさなくても良いのでは?
- 531 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 08:25:38.55 ID:7SLYc+Rqr.net]
- >>513
たしかにint aですでに違うね ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる そのときにセグメンテーションフォールトがでないようにしたい だから、すべての処理系で同じサイズにしたいってわけじゃなくて、同じ処理系の中ではバージョンにかかわらずサイズを保ちたいってことなんだよね 説明不足ですまん
- 532 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 08:36:30.40 ID:2RiYyx1fa.net]
- あらゆる環境だったらシリアライズしないとだし。
同じ処理系だったら同じ構造体でいいだろうし。
- 533 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 13:41:09.36 ID:d9/Wmgv60.net]
- >>514 のはこんな感じですかの
union foo { struct { int a; double b; // ここをバージョンアップで追加 }; char dummyBuffer[100]; };
- 534 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 13:59:44.65 ID:d9/Wmgv60.net]
- 構造体の大きさが char[100] に収まってる範囲での話
>>512 のように末尾に用意したギャップを引き算していくにしても、引ききれなくなった段階で破綻するよね ※ 突破したことをチェックするには sizoef(union foo) と sizeof(char[100]) とを比較すんのかなぁ…
- 535 名前:経団連 mailto:sage [2019/05/14(火) 14:09:24.00 ID:4po1tQ0w0.net]
- C99 <stdint.h>のuint*_t型を使った方がいいと思う。
- 536 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 14:39:04.31 ID:2RiYyx1fa.net]
- 普通符号付きでしょ
- 537 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 14:51:20.14 ID:5nOlmwWa0.net]
- 符号プログラミングか
- 538 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 15:42:40.54 ID:2RiYyx1fa.net]
- 今はstatic_assertとかいうものがあるらしいぞ
これでコンパイル時にチェックすればよい
- 539 名前:デフォルトの名無しさん mailto:sage [2019/05/14(火) 21:12:50.85 ID:8soz04JH0.net]
- >>512
不格好だけどこれでいけるよ 全部プリプロセッサで処理できて、構造体サイズは100バイト固定になる。 予想を超えてサイズを突き破った場合は別構造体作るしかないね。 #include <stddef.h> struct inner_foo { int a; char buf[]; }; #define MAX_STRUCT_SIZE 100 #define BUF_SIZE (MAX_STRUCT_SIZE - offsetof(struct inner_foo, buf)) struct foo { int a; double b; char buf[BUF_SIZE]; };
- 540 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 07:47:15.99 ID:FPbZusNo0.net]
- >>523 ちょっと間違ってるみたい。
struct foo には struct inner_foo に double b; が追加されてるせいで sizeof(struct foo) == MAX_STRUCT_SIZE にならない。 sizeof(struct foo) == MAX_STRUCT_SIZE + sizeof(double) になっちゃう。 inner_foo と foo とで char buf[] より前のメンバを一致させる必要がある。
- 541 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 08:35:12.84 ID:0TljqresM.net]
- >>515
なんでサイズが違うとセグメンテーションフォールトになるのかよくわからんが… Win32APIみたいに頭にサイズ入れときゃいいんじゃね?
- 542 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 08:56:22.39 ID:nK0I7Knm0.net]
- データファイルの話なら分かるが、intのサイズが違う環境の共有ライブラリってそもそも使えるのか?
- 543 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 09:12:43.64 ID:e9I3VVqQa.net]
- コンパイルは自分でしろって話だと思うよ。
そうすると単にメモリ配置を意識した
- 544 名前:vログラムだな。
当然、バイトオーダーも気にしろよっていう話に [] - [ここ壊れてます]
- 545 名前:デフォルトの名無しさん [2019/05/15(水) 09:32:21.44 ID:k0yjAgrYa.net]
- やっぱ int32_t みたいな環境に関係なく同じビット数になるやつにしといた方が良いんじゃないかな。
- 546 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 09:45:02.94 ID:25auY+1H0.net]
- 515の
>ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる >そのときにセグメンテーションフォールトがでないようにしたい 構造体のパラメータを追加し共有ライブラリを差し替えつつ 呼び出し側のコンパイルは行わないって無理ないか? 旧ソースで追加されたパラメータ部分は不定値であって その不定値をうけて共有ライブラリ内部が正しく動作できるとは思えないが…
- 547 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 11:40:27.07 ID:AfKgri370.net]
- 構造体には、サイズの変わらない、ポインタだけを置いておいて、
実際の領域は、ライブラリ内で確保して使って、解放すれば?
- 548 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 12:19:01.09 ID:e9I3VVqQa.net]
- さすがに実体を共有するという目的がないとこういう発想にはならんでしょ。
共有メモリとか、ファイルとか、通信とか。
- 549 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 12:31:29.02 ID:dMKqDPXvr.net]
- >>529
呼び出す側がバージョン情報をもっておいて、処理側で振り分けてアクセスしないようにすれば問題ないね #define version 2 void func (const struct* foo) { func_impl(foo, version); } void func_impl(const struct* foo, int version) { if (version > 1) { foo.b; } }
- 550 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 12:43:05.74 ID:25auY+1H0.net]
- >>532
そのバージョン情報の数字を埋め込むのに一番適度なのは実構造体のサイズって話に(>>525) >>531 のような背景なら ペイロードサイズは触りたくない ってのは納得できるな バージョン違いの吸収法は別途必要だけど
- 551 名前:デフォルトの名無しさん [2019/05/15(水) 12:53:24.07 ID:k0yjAgrYa.net]
- 構造体の中身を公開しないでポインタだけ使わせて読み書きする関数を別途用意するって方法もあると思う。オブジェクト指向の言語でのプロパティのようなものね。
内容のファイルへの読み書きやネットワークでのやり取りはそれようにデータをpack、unpackする処理を作ってそこにバージョン番号も埋め込む。
- 552 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 12:59:51.65 ID:Wbf0zcGJ0.net]
- exeがnew(malloc)するけど中をいじるのは全てdllの関数ってのはままある
dllだけ差し替えで済ましたい、サイズが変わらなければexeはビルドし直さなくていいのに… ってことだろう >512の >intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない >パディングでサイズも変わっちゃうしね は全く関係ない話だったということだ 素直に「よくある手段」でやればいい >514,517のunionもいいと思うけど foo.aでアクセスできないよね?foo.body.aとかしないと
- 553 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 13:12:20.84 ID:25auY+1H0.net]
- >>517 の foo.a でいきなりアクセスできる union が記述できるのは C11 からみたい
無名構造体/無名共用体
- 554 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 14:41:00.06 ID:dMKqDPXvr.net]
- >>535
intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ? intメンバを追加したとして、bufのサイズはどれだけ減らせばいいのかわからないのが問題 4の環境が多いだろけど、2の環境だと2を減らさなきゃいけないわけで dll差し替えで再ビルドしない場合、構造体サイズが変わると特に配列渡しの場合はセグメンテーションフォールトになる可能性が高くて危険 セーブデータみたいに構造体をそのままファイルに落とすとしても、サイズはずっと不変なのが扱いやすいね
- 555 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 14:56:07.34 ID:e9I3VVqQa.net]
- 数字付かないintのでかい方に合わせるなら、それこそunion使って明示的にオフセット決めるとか。
本当にそんなことしたいのか?という話は置いといて。 もちろんint32_tとかint_least32_t使う方がいいし、本当に位置合わせするならバイト位置指定して読み書きするし、そもそもサイズ固定
- 556 名前:ケずにシリアライズ用のライブラリ使うのが正しいよ。 []
- [ここ壊れてます]
- 557 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 19:35:47.81 ID:0TljqresM.net]
- >>537
> intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ? そんな話はとっくに終わっとる >>515をちゃんと読めよ
- 558 名前:デフォルトの名無しさん mailto:sage [2019/05/15(水) 20:46:54.27 ID:Wbf0zcGJ0.net]
- >>536
ほう知らんかった なら>517でほぼデメリットないね >>537 「その環境」でのintのサイズはsizeof(int)でおk
|

|