[過去ログ] C言語なら俺に聞け 151 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
444
(1): (ワッチョイ 2f05-S4IJ) 2019/05/05(日)23:59 ID:RXFRr1FQ0(4/4)調 AAS
FIFOだとかナントカ程度にしか。
「〜〜領域」という幾つかの用語がOSとかの環境が違っても
全く共通のものなのかよく分からないから正直スルーしてる
445
(1): (ワッチョイ e22c-4xtZ) 2019/05/06(月)05:38 ID:wr9bFPpT0(1)調 AAS
>>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読んでは捨てて、の繰り返し

読み込んだデータを使ったら、すぐに捨てないといけない。
ユーザー空間に、空きを作らないといけない
446: (ワッチョイ 8252-M0pk) 2019/05/06(月)06:20 ID:Geq8Gq1G0(1/2)調 AAS
>>445
いつものRubyバカだろ。いい加減な知識でC言語のメモリの話題に口を挟むのはやめろ。この板になれている者からすれば「またいつものか...」ですむが、初心者にとっては害悪でしかないから消えろ。
447
(1): (ワッチョイ 8252-M0pk) 2019/05/06(月)06:25 ID:Geq8Gq1G0(2/2)調 AAS
>>444
組み込みとかの特殊な環境では例外もあるけど、基本的には環境によらずC言語で必須の概念だからスルーせずにちゃんと調べるべき。
448
(1): (ワッチョイ 06d2-R0y6) 2019/05/06(月)08:39 ID:s1ulBxFy0(1)調 AAS
>439
>上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
他のプロセスがスワップ起こして重くなるから止めろって言いたい。
449: (ワッチョイ 2f05-73UM) 2019/05/06(月)10:14 ID:Om5TJBQR0(1/2)調 AAS
>>447
うん調べてみるよ
ありがとう

>>448
そんな視点もあるのか
他のプロセスも考慮しないといけない
思ったよりも数段以上やっかいだな
450: (ワッチョイ 2f05-73UM) 2019/05/06(月)10:19 ID:Om5TJBQR0(2/2)調 AAS
>読み込んだデータを使ったら、すぐに捨てないといけない

データをガンガン読み込んでいくようなプログラムだと「使ったらすぐ捨てる」のが鉄則か
451
(1): (ワッチョイ d701-LHRJ) 2019/05/06(月)10:40 ID:F7BEaxMm0(1)調 AAS
>>439
ユーザープロセスなのでカーネル空間はマッピングされないよ。プロセス管理のための領域はカーネル空間に多少は確保されるとは思うけど、それはユーザープロセス用ではないし。
ページサイズの関係で効率的に確保できるかどうかは別問題だけど仮想メモリ領域いっぱいまで取れるか否かと言えば取ることはできる。
実際にそんなことしたらスワップ発生しまくりでまともに動かないとは思うけど。
452: (ワッチョイ 7fe9-3iRC) 2019/05/06(月)12:43 ID:53K/0wkW0(1)調 AAS
実装としてはだいたいcopy on writeだから、確保だけだったら特に問題発生しないよ
453: (ブーイモ MM3e-iz+S) 2019/05/06(月)16:08 ID:95XsbNbMM(1)調 AAS
>>451
どのOSなのか明示してくれ。
少なくともlinux 32bitは3GB以降はkernel空間にマッピングされてるだろ
454
(1): (ワッチョイ 4321-QjK4) 2019/05/06(月)21:20 ID:lSipB+Y80(1/4)調 AAS
配列にある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);

よろしくお願いします。
455
(1): (ワッチョイ f701-EPtf) 2019/05/06(月)21:29 ID:v87Zm/5a0(1/4)調 AAS
sscanf の %x は、文字列で記述された数字+アルファベットの列を 16進数として抜き出す
sscanf("10", "%x", &val); → val の値は 10進で16 となる

0xDC 0x18 の並びから どういう整数値にしたいんだろうか?
456
(2): 454 (ワッチョイ 4321-QjK4) 2019/05/06(月)21:38 ID:lSipB+Y80(2/4)調 AAS
>>455
回答ありがとうございます。
val=0xDC18
という感じで取り出したいです。
457
(1): (ワッチョイ f701-EPtf) 2019/05/06(月)21:40 ID:v87Zm/5a0(2/4)調 AAS
>>456 それなら
val = rbuf[5]; じゃあかんの?
458
(1): 454 (ワッチョイ 4321-QjK4) 2019/05/06(月)21:50 ID:lSipB+Y80(3/4)調 AAS
>>457
ありがとうございます。そういうことか・・・
下記で上手くできました!

val= rbuf[5];
val = val << 8;
val |= rbuf[6];
459: (ワッチョイ f701-EPtf) 2019/05/06(月)21:54 ID:v87Zm/5a0(3/4)調 AAS
>>458 解決してよかったね
0xDC 0x18 の並びから
(最低でも32bit長の整数)0xDC18 が欲しかったということだね
460
(1): (ワッチョイ f701-EPtf) 2019/05/06(月)21:55 ID:v87Zm/5a0(4/4)調 AAS
(俺がちゃんと >>456 を読めてなかった説 val=0xDC18 って書いてるやんけw)
461
(1): (アウアウウー Sabb-vI8p) 2019/05/06(月)22:06 ID:NYoOX9LAa(1/2)調 AAS
>>454
> rbuf[5]の中身は「0xDC」
> rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。)

だったらそれはASCIIではないよね。
462: (アウアウウー Sabb-vI8p) 2019/05/06(月)22:08 ID:NYoOX9LAa(2/2)調 AAS
などと、ゆっくり書いていたら既に解決か・・・
463: (ワッチョイ 4321-QjK4) 2019/05/06(月)22:09 ID:lSipB+Y80(4/4)調 AAS
>>460
>>461
ありがとうございます。
お陰様で解決できました。
勝手にASCII、文字列と勘違いしていたのがよくなかったです。
464: (ワッチョイ e22c-4xtZ) 2019/05/07(火)06:48 ID:/Z9tG+PY0(1)調 AAS
ASCII は、7 bit キャラだろ

欧州文字コードなら、8 bitとか
465: (ワッチョイ 23d2-R0y6) 2019/05/07(火)15:31 ID:gGAOuhJk0(1)調 AAS
BASIC時代 文字→文字コード変換関数が ASC(文字) だったな。
466: (ワッチョイ d701-LHRJ) 2019/05/08(水)20:11 ID:w7dyIR3e0(1)調 AAS
逆はCHR$(コード)だったな。
467: (ワッチョイ 9b6d-ahOC) 2019/05/08(水)22:02 ID:LqpjdKM80(1)調 AAS
「なんで朝潮?」と思ってしまった当時の俺w
468: (ワッチョイ 7f7c-gMth) 2019/05/09(木)08:32 ID:IVg2TokP0(1)調 AAS
わらってよりとも というのは、当時の人気番組名をもじったものだよ
469: (ワッチョイ 9f35-AilG) 2019/05/09(木)12:40 ID:J26JobOx0(1)調 AAS
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

470: (ブーイモ MM9b-f8ez) 2019/05/09(木)20:40 ID:axmpki24M(1)調 AAS
「はじめてのC」なら買う
471: (ワッチョイ ff63-gMth) 2019/05/09(木)22:18 ID:fgRKvhjn0(1)調 AAS
その本の名前、買うときに恥ずかしいw
472
(2): (ワッチョイ 9f79-ScLU) 2019/05/09(木)23:03 ID:vEdVh+9n0(1)調 AAS
質問です
文字列の配列
char matrix[Y][X]を関数に引数として渡して、渡した先の関数でtxtファイルに出力したい。
YとXはその時々によって違う値でmatrixは文字列の配列だけど1行ごとに'\0'が入っていないとき、渡した先の関数でYとXをどうやれば参照できますか?
例えば
matrix = {{‘a’, ‘b’, ‘c’}, {‘d’, ‘e’, ‘f’}};
みたいな配列です
473: (アウアウエー Sadf-NBbm) 2019/05/10(金)00:00 ID:IBOrEgMWa(1)調 AAS
X(配列のサイズ)を共有してやればいいんじゃないかな
474
(1): (ワッチョイ ff63-gMth) 2019/05/10(金)00:14 ID:Ojl9YgLP0(1)調 AAS
>>472
matrixのアドレスと共にX、Yの値を渡さないと無理
475
(1): (ワッチョイ bf02-XC4S) 2019/05/10(金)03:11 ID:+vHN15fT0(1)調 AAS
>>472
https://qiita.com/Hiraku/items/babed27bc1d750c2e12d
476: (ワッチョイ 9f79-ScLU) 2019/05/10(金)09:26 ID:bwAvNWKg0(1)調 AAS
>>474
やっぱり配列のサイズ一緒に渡さないとだためですか
477: (アウアウウー Sa1b-wdoq) 2019/05/10(金)09:44 ID:0Zlxa6bHa(1)調 AAS
そう。他の言語だと裏でこっそり渡すようになっていたりしてプログラムに書かなくても動くかも知れないが、Cはそこまでやってくれない。
478: (ワッチョイ ff69-PnGR) 2019/05/10(金)10:05 ID:hw8N8wYC0(1)調 AAS
標準関数も一次元配列ですら大きさを渡してるからねー
(文字列は '\0' が終端である という了解を持って大きさを不要にしているだけ)
479: (スップ Sdbf-63hD) 2019/05/10(金)12:34 ID:zZfQYrbwd(1)調 AAS
>>475
URL張って解党した気になってるアスペルガーのカスがスレ来んな
480: (ワッチョイ bf02-y0Vo) 2019/05/10(金)23:50 ID:svzEPJh90(1)調 AAS
え?読んでもわからなかったの?
481
(1): (ワッチョイ d7f6-y0Vo) 2019/05/11(土)07:43 ID:glRpLuyC0(1/4)調 AAS
確かにつまらんね
リンクだけとかググレカスとか
せっかく掲示板にいるのに対話がないのは
482
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf3e-gMth) 2019/05/11(土)09:55 ID:GtXmrqj00(1/2)調 AAS
>>481
リンクを示すのも、ググればわかるようなことにググれというのも対話だよ。
対話を終わらせてるのはお前だろ。

リンク先を見て意味がわからんかったならどうわからなかったか、
よりよい説明があると思うならそれを示してもいい。
望むことだけ欲しいというのは対話とは言えんよ。
483: (ワッチョイ d7f6-y0Vo) 2019/05/11(土)10:34 ID:glRpLuyC0(2/4)調 AAS
>>482
話が噛み合ってない
おまえさんとは平行線のようだな
484
(1): (ワッチョイ 57dc-y0Vo) 2019/05/11(土)11:46 ID:0ygzdBDA0(1)調 AAS
ID:glRpLuyC0が対話する気なさすぎて草w
485
(1): (ワッチョイ ff63-gMth) 2019/05/11(土)12:23 ID:9iCvmH6s0(1)調 AAS
ここは質疑を行うスレであって
対話したり、雑談したりする場ではない
486
(2): (ワッチョイ 9f2d-y0Vo) 2019/05/11(土)19:10 ID:HOBfdmGr0(1/2)調 AAS
Cの上位互換(?)として、C++がありますが。C++は覚えた方がいいですか?
もしくは、CとC++を両方覚えたら、Cは不要になり、C++でコードを書くようになりますか?
C++でできることはCでもできるように見えますので、ならCだけでいいようにも思えたり。
487
(1): ◆QZaw55cn4c (ワッチョイ 9f47-vVMj) 2019/05/11(土)19:18 ID:KtHZQgR00(1)調 AAS
>>486
C++ は最近規格の改定がすすみ、いろんなことが C++ の枠内でできるようになりました
488
(1): (ワッチョイ 375f-PSXp) 2019/05/11(土)19:21 ID:2v2BzL6t0(1)調 AAS
>>486
言っておくが、python,C++,Java,javascript,C#,shellでできる事はC言語でも出来る
更に君が作ろうとしてるものや、やりたいことは、もう誰かが作ってる
ましてや大規模になると、googleとかamazonと戦う羽目にもなる
それが嫌ならプログラミングなんて辞めとけ
489: (ワッチョイ 9f2d-y0Vo) 2019/05/11(土)19:32 ID:HOBfdmGr0(2/2)調 AAS
>>487-488
了解です、ありがとうございます
490
(1): (ワッチョイ d7f6-y0Vo) 2019/05/11(土)21:07 ID:glRpLuyC0(3/4)調 AAS
>>484-485
482は反対意見を述べているという意味でまだいいところがあったが
てめーらは一方的な押しつけしか頭にない100%真のノイズだ
491
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf3e-gMth) 2019/05/11(土)21:28 ID:GtXmrqj00(2/2)調 AAS
>>490
既に解説があると示すのも質問に対する回答として十分だし、それで不満な理由がまるでわからん。
それが対話でないと断言するのも意味がわからん。
結局のところどうして欲しいの?
492: (アウアウウー Sa1b-wdoq) 2019/05/11(土)22:15 ID:YLmnNEXIa(1)調 AAS
きっと寂しいんだよ。
493
(1): (ワッチョイ d7f6-y0Vo) 2019/05/11(土)22:49 ID:glRpLuyC0(4/4)調 AAS
>>491
意味がわからんからどうした?
平行線の相手に何か言って欲しいのか?
494
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf3e-gMth) 2019/05/12(日)10:19 ID:l86zXz3/0(1)調 AAS
>>493
そう決めつけて続きを拒むなら「一方的な押し付けしか頭にない」「対話がない」というまさにそれでしかなくね?
意味がわからんから解説してくれっての。
わからんことを理解する必要があるから対話になるんだろ。
495
(1): (ワッチョイ d7f6-y0Vo) 2019/05/12(日)11:22 ID:VeGHf8Lz0(1/2)調 AAS
>>494
自分の言葉で何か言えよと思う俺の意見を
おまえ真っ向から全否定しただろ
だから接点がないと判断したんだ
接点があるなら最初の態度を撤回しろ
話はそれからだ
496
(1): (ワッチョイ 9f52-tfUF) 2019/05/12(日)11:57 ID:7nn+3/Jt0(1)調 AAS
>>495
意見を全否定って、そりゃ異なる意見があるのは当然だろう。異なる考えなら議論にならないなんて、議論する気が無いだけだろう。

ついでだが、俺もお前さんの意見には反対だ。自分の言葉で書くかはまったく重要ではないと思う。お手軽に書ける掲示板のレスは言葉足らずだったり不正確な表現なことも多々あるが、それよりきちんと纏まった情報をリンクされた方がありがたいことも多い。
497: (ワッチョイ d7f6-y0Vo) 2019/05/12(日)12:19 ID:VeGHf8Lz0(2/2)調 AAS
>>496
意見が異なるのと全否定は違うぞ
自分はこう思うと述べるのと
おまえは間違っているというのの違いだ

よくいるんだよ、どっかからの受け売りを壊れたレコードみたいに繰り返すだけなやつとか
俺は自分の知見からは何も出てこないのかよと思うことがあるが
おまえはそれで満足なら勝手に満足してろよ

そこが俺とおまえの違いだな
498
(3): (ワッチョイ 9f79-ScLU) 2019/05/12(日)15:34 ID:SbCKIsfP0(1/3)調 AAS
質問です
テキストファイルから文字を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

のようなファイルです
499
(1): (アウアウカー Saeb-NBbm) 2019/05/12(日)15:51 ID:L7lYUohVa(1)調 AAS
fgetc二回呼びたいの?
500: (ワッチョイ d77f-hzJM) 2019/05/12(日)16:10 ID:7kDDqNbD0(1)調 AAS
>>498
continueだと内ループ先頭に戻るから違うんじゃないの
501
(1): (ワッチョイ ff12-f8ez) 2019/05/12(日)16:24 ID:R31sKZyy0(1)調 AAS
>>498
.for ... {
. for ... {
. char c = fgetc(fp);
. if (c != '\r' && c != '\n') {
. matrix[i][j] = c;
. }
. }
.}
502: (ワッチョイ 9f79-ScLU) 2019/05/12(日)17:12 ID:SbCKIsfP0(2/3)調 AAS
>>499
呼ばなくていいです
>>501
これでもうまくいかないです
503
(1): 経団連◆T6xkBnTXz7B0 (ワッチョイ 1701-PJeF) 2019/05/12(日)17:22 ID:uLUIsoqa0(1)調 AAS
for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
matrix[i][j] = fgetc(fp);
}
fgetc(fp); //読み捨て
}
504: (ワッチョイ b77c-NBbm) 2019/05/12(日)17:29 ID:CrklWm7I0(1)調 AAS
変な例出すなよ…
505: (ワッチョイ 9f1e-bWAY) 2019/05/12(日)17:29 ID:gzai7Rgq0(1)調 AAS
サイズが固定なら fread でよくない?
そうすべきというほどのものでもないだろうが。
506: (ワッチョイ 577b-djxj) 2019/05/12(日)17:35 ID:x4ccFx6b0(1)調 AAS
>>498
「うまくいかない」症状を見れば、もう少し見当がつくんだけど…。
格納先の配列を char matrix[LINES][CHRS]; とか定義して、
printf("%s\n", matrix[n]); で表示してるの違うかな。

各行の文字列の末尾にあるべき '\0' が格納されてない、みたいな。
507
(1): (ワッチョイ ff63-gMth) 2019/05/12(日)17:36 ID:JjryTeWM0(1/3)調 AAS
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;
  }
 }
508: (ワッチョイ ff63-gMth) 2019/05/12(日)17:38 ID:JjryTeWM0(2/3)調 AAS
501の方法だと'\n'読んだ時に、スキップしているけど
ループ変数の方は ++1 してるからズレてくる
509
(1): (ワッチョイ 9f79-ScLU) 2019/05/12(日)18:35 ID:SbCKIsfP0(3/3)調 AAS
>>503
>>507
どちらも行けました
507のは理解できるんですが
503の読み捨てというのはどう言うことなのでしょうか
510: (ワッチョイ ff63-gMth) 2019/05/12(日)18:43 ID:JjryTeWM0(3/3)調 AAS
>>509
10個読んで1個捨てる
511: (ワッチョイ 3702-vVMj) 2019/05/13(月)20:38 ID:WOFscy660(1)調 AAS
バッファにつめるところを簡単にしてみた。
https://ideone.com/fJ91BI
512
(4): (オッペケ Sr8b-lJiK) 2019/05/14(火)06:41 ID:7SLYc+Rqr(1/2)調 AAS
OSSで構造体を公開しようとおもってる

そのサイズをバージョンアップしても固定にしたいんだけどいいアイデアないかな?
struct foo {
int a;
double b; // ここをバージョンアップで追加
}

char[100] buffer;

上記を予め含めておいて、追加サイズ分だけ減らすってのがよくある手段だと思うけど、intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
パディングでサイズも変わっちゃうしね

C++ならテンプレートでいけるけど、OSSだから利用者が多いC言語で書いておく必要がある
構造体を公開しないで、ハンドラとセッタで扱えばいけるだろうけど、今回は構造体でいきたい
513
(1): (ワッチョイ 9ff9-vVMj) 2019/05/14(火)08:01 ID:YNmKUGxB0(1)調 AAS
「sizeof(int)が環境依存」を前提にするなら
バージョンアップ以前のint a;だけでもう既にサイズ固定じゃないじゃん
int32_tですら必ずある保証はないよ

「汎用な記述で全ての環境に対応したい」ってのが、土台無理な注文なのよ
低レベルなことやるなら、サポートする環境を列挙限定しなければならない

素直に「よくある手段」でやりなさいってことだ
514
(2): (アークセー Sx8b-Vhni) 2019/05/14(火)08:07 ID:0o/9QF7Tx(1)調 AAS
>>512
処理系によるパディングとかの問題を別にしたら、bufferをunionにしといたらわざわざ減らさなくても良いのでは?
515
(2): (オッペケ Sr8b-lJiK) 2019/05/14(火)08:25 ID:7SLYc+Rqr(2/2)調 AAS
>>513
たしかにint aですでに違うね
ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
そのときにセグメンテーションフォールトがでないようにしたい
だから、すべての処理系で同じサイズにしたいってわけじゃなくて、同じ処理系の中ではバージョンにかかわらずサイズを保ちたいってことなんだよね
説明不足ですまん
516: (アウアウエー Sadf-NBbm) 2019/05/14(火)08:36 ID:2RiYyx1fa(1/3)調 AAS
あらゆる環境だったらシリアライズしないとだし。
同じ処理系だったら同じ構造体でいいだろうし。
517
(3): (ワッチョイ ff69-PnGR) 2019/05/14(火)13:41 ID:d9/Wmgv60(1/2)調 AAS
>>514 のはこんな感じですかの

union foo {
 struct {
  int a;
  double b; // ここをバージョンアップで追加
 };
 char dummyBuffer[100];
};
518: (ワッチョイ ff69-PnGR) 2019/05/14(火)13:59 ID:d9/Wmgv60(2/2)調 AAS
構造体の大きさが char[100] に収まってる範囲での話
>>512 のように末尾に用意したギャップを引き算していくにしても、引ききれなくなった段階で破綻するよね

※ 突破したことをチェックするには sizoef(union foo) と sizeof(char[100]) とを比較すんのかなぁ…
519: 経団連◆T6xkBnTXz7B0 (ワッチョイ 1701-PJeF) 2019/05/14(火)14:09 ID:4po1tQ0w0(1)調 AAS
C99 <stdint.h>のuint*_t型を使った方がいいと思う。
520: (アウアウエー Sadf-NBbm) 2019/05/14(火)14:39 ID:2RiYyx1fa(2/3)調 AAS
普通符号付きでしょ
521: (ワッチョイ 7f7c-gMth) 2019/05/14(火)14:51 ID:5nOlmwWa0(1)調 AAS
符号プログラミングか
522: (アウアウエー Sadf-NBbm) 2019/05/14(火)15:42 ID:2RiYyx1fa(3/3)調 AAS
今はstatic_assertとかいうものがあるらしいぞ
これでコンパイル時にチェックすればよい
523
(1): (ワッチョイ bf54-vVMj) 2019/05/14(火)21:12 ID:8soz04JH0(1)調 AAS
>>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];
};
524: (ワッチョイ 577b-djxj) 2019/05/15(水)07:47 ID:FPbZusNo0(1)調 AAS
>>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[] より前のメンバを一致させる必要がある。
525
(1): (ドコグロ MMdf-vyow) 2019/05/15(水)08:35 ID:0TljqresM(1/2)調 AAS
>>515
なんでサイズが違うとセグメンテーションフォールトになるのかよくわからんが…
Win32APIみたいに頭にサイズ入れときゃいいんじゃね?
526: (ワッチョイ 57f2-y0Vo) 2019/05/15(水)08:56 ID:nK0I7Knm0(1)調 AAS
データファイルの話なら分かるが、intのサイズが違う環境の共有ライブラリってそもそも使えるのか?
527: (アウアウウー Sa1b-NBbm) 2019/05/15(水)09:12 ID:e9I3VVqQa(1/3)調 AAS
コンパイルは自分でしろって話だと思うよ。
そうすると単にメモリ配置を意識したプログラムだな。
当然、バイトオーダーも気にしろよっていう話に
528: (アウアウウー Sa1b-wdoq) 2019/05/15(水)09:32 ID:k0yjAgrYa(1/2)調 AAS
やっぱ int32_t みたいな環境に関係なく同じビット数になるやつにしといた方が良いんじゃないかな。
529
(1): (ワッチョイ ff69-PnGR) 2019/05/15(水)09:45 ID:25auY+1H0(1/3)調 AAS
515の
>ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
>そのときにセグメンテーションフォールトがでないようにしたい

構造体のパラメータを追加し共有ライブラリを差し替えつつ
呼び出し側のコンパイルは行わないって無理ないか?

旧ソースで追加されたパラメータ部分は不定値であって
その不定値をうけて共有ライブラリ内部が正しく動作できるとは思えないが…
530: (ワッチョイ 9f2c-NS0m) 2019/05/15(水)11:40 ID:AfKgri370(1)調 AAS
構造体には、サイズの変わらない、ポインタだけを置いておいて、

実際の領域は、ライブラリ内で確保して使って、解放すれば?
531
(1): (アウアウウー Sa1b-NBbm) 2019/05/15(水)12:19 ID:e9I3VVqQa(2/3)調 AAS
さすがに実体を共有するという目的がないとこういう発想にはならんでしょ。
共有メモリとか、ファイルとか、通信とか。
532
(1): (オッペケ Sr8b-lJiK) 2019/05/15(水)12:31 ID:dMKqDPXvr(1/2)調 AAS
>>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;
}
}
533: (ワッチョイ ff69-PnGR) 2019/05/15(水)12:43 ID:25auY+1H0(2/3)調 AAS
>>532
そのバージョン情報の数字を埋め込むのに一番適度なのは実構造体のサイズって話に(>>525)

>>531 のような背景なら
ペイロードサイズは触りたくない ってのは納得できるな
バージョン違いの吸収法は別途必要だけど
534: (アウアウウー Sa1b-wdoq) 2019/05/15(水)12:53 ID:k0yjAgrYa(2/2)調 AAS
構造体の中身を公開しないでポインタだけ使わせて読み書きする関数を別途用意するって方法もあると思う。オブジェクト指向の言語でのプロパティのようなものね。
内容のファイルへの読み書きやネットワークでのやり取りはそれようにデータをpack、unpackする処理を作ってそこにバージョン番号も埋め込む。
535
(1): (ワッチョイ 9ff9-vVMj) 2019/05/15(水)12:59 ID:Wbf0zcGJ0(1/2)調 AAS
exeがnew(malloc)するけど中をいじるのは全てdllの関数ってのはままある
dllだけ差し替えで済ましたい、サイズが変わらなければexeはビルドし直さなくていいのに…
ってことだろう

>512
>intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
>パディングでサイズも変わっちゃうしね
は全く関係ない話だったということだ

素直に「よくある手段」でやればいい

>514,517のunionもいいと思うけど
foo.aでアクセスできないよね?foo.body.aとかしないと
536
(1): (ワッチョイ ff69-PnGR) 2019/05/15(水)13:12 ID:25auY+1H0(3/3)調 AAS
>>517 の foo.a でいきなりアクセスできる union が記述できるのは C11 からみたい
無名構造体/無名共用体
537
(2): (オッペケ Sr8b-lJiK) 2019/05/15(水)14:41 ID:dMKqDPXvr(2/2)調 AAS
>>535
intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ?
intメンバを追加したとして、bufのサイズはどれだけ減らせばいいのかわからないのが問題
4の環境が多いだろけど、2の環境だと2を減らさなきゃいけないわけで

dll差し替えで再ビルドしない場合、構造体サイズが変わると特に配列渡しの場合はセグメンテーションフォールトになる可能性が高くて危険
セーブデータみたいに構造体をそのままファイルに落とすとしても、サイズはずっと不変なのが扱いやすいね
538: (アウアウウー Sa1b-NBbm) 2019/05/15(水)14:56 ID:e9I3VVqQa(3/3)調 AAS
数字付かないintのでかい方に合わせるなら、それこそunion使って明示的にオフセット決めるとか。
本当にそんなことしたいのか?という話は置いといて。
もちろんint32_tとかint_least32_t使う方がいいし、本当に位置合わせするならバイト位置指定して読み書きするし、そもそもサイズ固定せずにシリアライズ用のライブラリ使うのが正しいよ。
539: (ドコグロ MMdf-vyow) 2019/05/15(水)19:35 ID:0TljqresM(2/2)調 AAS
>>537
> intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ?
そんな話はとっくに終わっとる
>>515をちゃんと読めよ
540: (ワッチョイ 9ff9-vVMj) 2019/05/15(水)20:46 ID:Wbf0zcGJ0(2/2)調 AAS
>>536
ほう知らんかった
なら>517でほぼデメリットないね

>>537
「その環境」でのintのサイズはsizeof(int)でおk
541: (ワッチョイ d7ab-xJZP) 2019/05/15(水)21:55 ID:ZaVTFrP70(1)調 AAS
win32apiはバージョンによって構造体の変数が追加になるから構造体のサイズを構造体の先頭にセットする
542: (ワッチョイ baa5-bDB9) 2019/05/16(木)08:13 ID:eEplP63Q0(1)調 AAS
windows.hのsmallで一時間潰した
543: (ワッチョイ 29ad-BnNU) 2019/05/16(木)19:38 ID:GXqxfUU20(1/3)調 AAS
文字配列列sを逆順に文字配列tに格納して出力したいのですが、
以下のコードでは実行してもt=[]と出力されてしまいます
#include <stdio.h>
#define MAXLINE 1000
main()

{
char s[MAXLINE],t[MAXLINE];
int c,i,I;

for(i=0; i<MAXLINE-1 && (c=getchar())!=EOF && c!='¥n'; ++i)
{
s[i]=c;
}
if(c=='¥n'){
s[i]=c;
++i;
}
s[i]='\0';

I=i;
for(i=i; 0<=i; i=i-1)
{
t[I-i]=s[i];
}

printf("t=[%s]",t);
}

どこがおかしいのでしょうか…
1-
あと 459 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.035s