!extend:checked:vvvvv:1000:512
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.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/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
C言語なら俺に聞け 151
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ cf8f-fy95)
2019/04/02(火) 11:23:37.62ID:SQXqRaAc0447デフォルトの名無しさん (ワッチョイ 8252-M0pk)
2019/05/06(月) 06:25:32.64ID:Geq8Gq1G0 >>444
組み込みとかの特殊な環境では例外もあるけど、基本的には環境によらずC言語で必須の概念だからスルーせずにちゃんと調べるべき。
組み込みとかの特殊な環境では例外もあるけど、基本的には環境によらずC言語で必須の概念だからスルーせずにちゃんと調べるべき。
448デフォルトの名無しさん (ワッチョイ 06d2-R0y6)
2019/05/06(月) 08:39:59.60ID:s1ulBxFy0 >439
>上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
他のプロセスがスワップ起こして重くなるから止めろって言いたい。
>上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
他のプロセスがスワップ起こして重くなるから止めろって言いたい。
449デフォルトの名無しさん (ワッチョイ 2f05-73UM)
2019/05/06(月) 10:14:49.95ID:Om5TJBQR0450デフォルトの名無しさん (ワッチョイ 2f05-73UM)
2019/05/06(月) 10:19:59.43ID:Om5TJBQR0 >読み込んだデータを使ったら、すぐに捨てないといけない
データをガンガン読み込んでいくようなプログラムだと「使ったらすぐ捨てる」のが鉄則か
データをガンガン読み込んでいくようなプログラムだと「使ったらすぐ捨てる」のが鉄則か
451デフォルトの名無しさん (ワッチョイ d701-LHRJ)
2019/05/06(月) 10:40:24.77ID:F7BEaxMm0 >>439
ユーザープロセスなのでカーネル空間はマッピングされないよ。プロセス管理のための領域はカーネル空間に多少は確保されるとは思うけど、それはユーザープロセス用ではないし。
ページサイズの関係で効率的に確保できるかどうかは別問題だけど仮想メモリ領域いっぱいまで取れるか否かと言えば取ることはできる。
実際にそんなことしたらスワップ発生しまくりでまともに動かないとは思うけど。
ユーザープロセスなのでカーネル空間はマッピングされないよ。プロセス管理のための領域はカーネル空間に多少は確保されるとは思うけど、それはユーザープロセス用ではないし。
ページサイズの関係で効率的に確保できるかどうかは別問題だけど仮想メモリ領域いっぱいまで取れるか否かと言えば取ることはできる。
実際にそんなことしたらスワップ発生しまくりでまともに動かないとは思うけど。
452デフォルトの名無しさん (ワッチョイ 7fe9-3iRC)
2019/05/06(月) 12:43:21.39ID:53K/0wkW0 実装としてはだいたいcopy on writeだから、確保だけだったら特に問題発生しないよ
453デフォルトの名無しさん (ブーイモ MM3e-iz+S)
2019/05/06(月) 16:08:26.90ID:95XsbNbMM454デフォルトの名無しさん (ワッチョイ 4321-QjK4)
2019/05/06(月) 21:20:46.06ID:lSipB+Y80 配列にある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);
よろしくお願いします。
整数型変数に数値として入れたいのですが、上手くいきません。
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デフォルトの名無しさん (ワッチョイ f701-EPtf)
2019/05/06(月) 21:29:36.69ID:v87Zm/5a0 sscanf の %x は、文字列で記述された数字+アルファベットの列を 16進数として抜き出す
sscanf("10", "%x", &val); → val の値は 10進で16 となる
0xDC 0x18 の並びから どういう整数値にしたいんだろうか?
sscanf("10", "%x", &val); → val の値は 10進で16 となる
0xDC 0x18 の並びから どういう整数値にしたいんだろうか?
456454 (ワッチョイ 4321-QjK4)
2019/05/06(月) 21:38:34.55ID:lSipB+Y80457デフォルトの名無しさん (ワッチョイ f701-EPtf)
2019/05/06(月) 21:40:18.62ID:v87Zm/5a0 >>456 それなら
val = rbuf[5]; じゃあかんの?
val = rbuf[5]; じゃあかんの?
458454 (ワッチョイ 4321-QjK4)
2019/05/06(月) 21:50:08.40ID:lSipB+Y80459デフォルトの名無しさん (ワッチョイ f701-EPtf)
2019/05/06(月) 21:54:12.13ID:v87Zm/5a0460デフォルトの名無しさん (ワッチョイ f701-EPtf)
2019/05/06(月) 21:55:43.20ID:v87Zm/5a0 (俺がちゃんと >>456 を読めてなかった説 val=0xDC18 って書いてるやんけw)
461デフォルトの名無しさん (アウアウウー Sabb-vI8p)
2019/05/06(月) 22:06:19.06ID:NYoOX9LAa462デフォルトの名無しさん (アウアウウー Sabb-vI8p)
2019/05/06(月) 22:08:02.81ID:NYoOX9LAa などと、ゆっくり書いていたら既に解決か・・・
463デフォルトの名無しさん (ワッチョイ 4321-QjK4)
2019/05/06(月) 22:09:16.82ID:lSipB+Y80464デフォルトの名無しさん (ワッチョイ e22c-4xtZ)
2019/05/07(火) 06:48:35.98ID:/Z9tG+PY0 ASCII は、7 bit キャラだろ
欧州文字コードなら、8 bitとか
欧州文字コードなら、8 bitとか
465デフォルトの名無しさん (ワッチョイ 23d2-R0y6)
2019/05/07(火) 15:31:36.79ID:gGAOuhJk0 BASIC時代 文字→文字コード変換関数が ASC(文字) だったな。
466デフォルトの名無しさん (ワッチョイ d701-LHRJ)
2019/05/08(水) 20:11:19.53ID:w7dyIR3e0 逆はCHR$(コード)だったな。
467デフォルトの名無しさん (ワッチョイ 9b6d-ahOC)
2019/05/08(水) 22:02:13.36ID:LqpjdKM80 「なんで朝潮?」と思ってしまった当時の俺w
468デフォルトの名無しさん (ワッチョイ 7f7c-gMth)
2019/05/09(木) 08:32:10.12ID:IVg2TokP0 わらってよりとも というのは、当時の人気番組名をもじったものだよ
469デフォルトの名無しさん (ワッチョイ 9f35-AilG)
2019/05/09(木) 12:40:11.38ID:J26JobOx0470デフォルトの名無しさん (ブーイモ MM9b-f8ez)
2019/05/09(木) 20:40:23.75ID:axmpki24M 「はじめてのC」なら買う
471デフォルトの名無しさん (ワッチョイ ff63-gMth)
2019/05/09(木) 22:18:17.14ID:fgRKvhjn0 その本の名前、買うときに恥ずかしいw
472デフォルトの名無しさん (ワッチョイ 9f79-ScLU)
2019/05/09(木) 23:03:35.49ID:vEdVh+9n0 質問です
文字列の配列
char matrix[Y][X]を関数に引数として渡して、渡した先の関数でtxtファイルに出力したい。
YとXはその時々によって違う値でmatrixは文字列の配列だけど1行ごとに'\0'が入っていないとき、渡した先の関数でYとXをどうやれば参照できますか?
例えば
matrix = {{‘a’, ‘b’, ‘c’}, {‘d’, ‘e’, ‘f’}};
みたいな配列です
文字列の配列
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:40.06ID:IBOrEgMWa X(配列のサイズ)を共有してやればいいんじゃないかな
474デフォルトの名無しさん (ワッチョイ ff63-gMth)
2019/05/10(金) 00:14:05.05ID:Ojl9YgLP0 >>472
matrixのアドレスと共にX、Yの値を渡さないと無理
matrixのアドレスと共にX、Yの値を渡さないと無理
475デフォルトの名無しさん (ワッチョイ bf02-XC4S)
2019/05/10(金) 03:11:16.60ID:+vHN15fT0476デフォルトの名無しさん (ワッチョイ 9f79-ScLU)
2019/05/10(金) 09:26:09.21ID:bwAvNWKg0 >>474
やっぱり配列のサイズ一緒に渡さないとだためですか
やっぱり配列のサイズ一緒に渡さないとだためですか
477デフォルトの名無しさん (アウアウウー Sa1b-wdoq)
2019/05/10(金) 09:44:04.32ID:0Zlxa6bHa そう。他の言語だと裏でこっそり渡すようになっていたりしてプログラムに書かなくても動くかも知れないが、Cはそこまでやってくれない。
478デフォルトの名無しさん (ワッチョイ ff69-PnGR)
2019/05/10(金) 10:05:05.80ID:hw8N8wYC0 標準関数も一次元配列ですら大きさを渡してるからねー
(文字列は '\0' が終端である という了解を持って大きさを不要にしているだけ)
(文字列は '\0' が終端である という了解を持って大きさを不要にしているだけ)
479デフォルトの名無しさん (スップ Sdbf-63hD)
2019/05/10(金) 12:34:03.34ID:zZfQYrbwd >>475
URL張って解党した気になってるアスペルガーのカスがスレ来んな
URL張って解党した気になってるアスペルガーのカスがスレ来んな
480デフォルトの名無しさん (ワッチョイ bf02-y0Vo)
2019/05/10(金) 23:50:49.39ID:svzEPJh90 え?読んでもわからなかったの?
481デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/11(土) 07:43:24.28ID:glRpLuyC0 確かにつまらんね
リンクだけとかググレカスとか
せっかく掲示板にいるのに対話がないのは
リンクだけとかググレカスとか
せっかく掲示板にいるのに対話がないのは
482はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-gMth)
2019/05/11(土) 09:55:06.58ID:GtXmrqj00 >>481
リンクを示すのも、ググればわかるようなことにググれというのも対話だよ。
対話を終わらせてるのはお前だろ。
リンク先を見て意味がわからんかったならどうわからなかったか、
よりよい説明があると思うならそれを示してもいい。
望むことだけ欲しいというのは対話とは言えんよ。
リンクを示すのも、ググればわかるようなことにググれというのも対話だよ。
対話を終わらせてるのはお前だろ。
リンク先を見て意味がわからんかったならどうわからなかったか、
よりよい説明があると思うならそれを示してもいい。
望むことだけ欲しいというのは対話とは言えんよ。
483デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/11(土) 10:34:34.75ID:glRpLuyC0484デフォルトの名無しさん (ワッチョイ 57dc-y0Vo)
2019/05/11(土) 11:46:55.45ID:0ygzdBDA0 ID:glRpLuyC0が対話する気なさすぎて草w
485デフォルトの名無しさん (ワッチョイ ff63-gMth)
2019/05/11(土) 12:23:55.76ID:9iCvmH6s0 ここは質疑を行うスレであって
対話したり、雑談したりする場ではない
対話したり、雑談したりする場ではない
486デフォルトの名無しさん (ワッチョイ 9f2d-y0Vo)
2019/05/11(土) 19:10:51.09ID:HOBfdmGr0 Cの上位互換(?)として、C++がありますが。C++は覚えた方がいいですか?
もしくは、CとC++を両方覚えたら、Cは不要になり、C++でコードを書くようになりますか?
C++でできることはCでもできるように見えますので、ならCだけでいいようにも思えたり。
もしくは、CとC++を両方覚えたら、Cは不要になり、C++でコードを書くようになりますか?
C++でできることはCでもできるように見えますので、ならCだけでいいようにも思えたり。
>>486
C++ は最近規格の改定がすすみ、いろんなことが C++ の枠内でできるようになりました
C++ は最近規格の改定がすすみ、いろんなことが C++ の枠内でできるようになりました
488デフォルトの名無しさん (ワッチョイ 375f-PSXp)
2019/05/11(土) 19:21:03.92ID:2v2BzL6t0 >>486
言っておくが、python,C++,Java,javascript,C#,shellでできる事はC言語でも出来る
更に君が作ろうとしてるものや、やりたいことは、もう誰かが作ってる
ましてや大規模になると、googleとかamazonと戦う羽目にもなる
それが嫌ならプログラミングなんて辞めとけ
言っておくが、python,C++,Java,javascript,C#,shellでできる事はC言語でも出来る
更に君が作ろうとしてるものや、やりたいことは、もう誰かが作ってる
ましてや大規模になると、googleとかamazonと戦う羽目にもなる
それが嫌ならプログラミングなんて辞めとけ
489デフォルトの名無しさん (ワッチョイ 9f2d-y0Vo)
2019/05/11(土) 19:32:35.19ID:HOBfdmGr0 >>487-488
了解です、ありがとうございます
了解です、ありがとうございます
490デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/11(土) 21:07:19.81ID:glRpLuyC0491はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-gMth)
2019/05/11(土) 21:28:03.11ID:GtXmrqj00492デフォルトの名無しさん (アウアウウー Sa1b-wdoq)
2019/05/11(土) 22:15:36.12ID:YLmnNEXIa きっと寂しいんだよ。
493デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/11(土) 22:49:22.08ID:glRpLuyC0494はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-gMth)
2019/05/12(日) 10:19:15.38ID:l86zXz3/0 >>493
そう決めつけて続きを拒むなら「一方的な押し付けしか頭にない」「対話がない」というまさにそれでしかなくね?
意味がわからんから解説してくれっての。
わからんことを理解する必要があるから対話になるんだろ。
そう決めつけて続きを拒むなら「一方的な押し付けしか頭にない」「対話がない」というまさにそれでしかなくね?
意味がわからんから解説してくれっての。
わからんことを理解する必要があるから対話になるんだろ。
495デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/12(日) 11:22:06.40ID:VeGHf8Lz0496デフォルトの名無しさん (ワッチョイ 9f52-tfUF)
2019/05/12(日) 11:57:36.56ID:7nn+3/Jt0 >>495
意見を全否定って、そりゃ異なる意見があるのは当然だろう。異なる考えなら議論にならないなんて、議論する気が無いだけだろう。
ついでだが、俺もお前さんの意見には反対だ。自分の言葉で書くかはまったく重要ではないと思う。お手軽に書ける掲示板のレスは言葉足らずだったり不正確な表現なことも多々あるが、それよりきちんと纏まった情報をリンクされた方がありがたいことも多い。
意見を全否定って、そりゃ異なる意見があるのは当然だろう。異なる考えなら議論にならないなんて、議論する気が無いだけだろう。
ついでだが、俺もお前さんの意見には反対だ。自分の言葉で書くかはまったく重要ではないと思う。お手軽に書ける掲示板のレスは言葉足らずだったり不正確な表現なことも多々あるが、それよりきちんと纏まった情報をリンクされた方がありがたいことも多い。
497デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/12(日) 12:19:14.09ID:VeGHf8Lz0 >>496
意見が異なるのと全否定は違うぞ
自分はこう思うと述べるのと
おまえは間違っているというのの違いだ
よくいるんだよ、どっかからの受け売りを壊れたレコードみたいに繰り返すだけなやつとか
俺は自分の知見からは何も出てこないのかよと思うことがあるが
おまえはそれで満足なら勝手に満足してろよ
そこが俺とおまえの違いだな
意見が異なるのと全否定は違うぞ
自分はこう思うと述べるのと
おまえは間違っているというのの違いだ
よくいるんだよ、どっかからの受け売りを壊れたレコードみたいに繰り返すだけなやつとか
俺は自分の知見からは何も出てこないのかよと思うことがあるが
おまえはそれで満足なら勝手に満足してろよ
そこが俺とおまえの違いだな
498デフォルトの名無しさん (ワッチョイ 9f79-ScLU)
2019/05/12(日) 15:34:15.26ID:SbCKIsfP0 質問です
テキストファイルから文字を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
…
のようなファイルです
テキストファイルから文字を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デフォルトの名無しさん (アウアウカー Saeb-NBbm)
2019/05/12(日) 15:51:11.62ID:L7lYUohVa fgetc二回呼びたいの?
500デフォルトの名無しさん (ワッチョイ d77f-hzJM)
2019/05/12(日) 16:10:46.32ID:7kDDqNbD0 >>498
continueだと内ループ先頭に戻るから違うんじゃないの
continueだと内ループ先頭に戻るから違うんじゃないの
501デフォルトの名無しさん (ワッチョイ ff12-f8ez)
2019/05/12(日) 16:24:47.11ID:R31sKZyy0 >>498
.for ... {
. for ... {
. char c = fgetc(fp);
. if (c != '\r' && c != '\n') {
. matrix[i][j] = c;
. }
. }
.}
.for ... {
. for ... {
. char c = fgetc(fp);
. if (c != '\r' && c != '\n') {
. matrix[i][j] = c;
. }
. }
.}
502デフォルトの名無しさん (ワッチョイ 9f79-ScLU)
2019/05/12(日) 17:12:05.74ID:SbCKIsfP0503経団連 ◆T6xkBnTXz7B0 (ワッチョイ 1701-PJeF)
2019/05/12(日) 17:22:08.08ID:uLUIsoqa0 for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
matrix[i][j] = fgetc(fp);
}
fgetc(fp); //読み捨て
}
for (j=0;j<10;j++) {
matrix[i][j] = fgetc(fp);
}
fgetc(fp); //読み捨て
}
504デフォルトの名無しさん (ワッチョイ b77c-NBbm)
2019/05/12(日) 17:29:14.22ID:CrklWm7I0 変な例出すなよ…
505デフォルトの名無しさん (ワッチョイ 9f1e-bWAY)
2019/05/12(日) 17:29:29.19ID:gzai7Rgq0 サイズが固定なら fread でよくない?
そうすべきというほどのものでもないだろうが。
そうすべきというほどのものでもないだろうが。
506デフォルトの名無しさん (ワッチョイ 577b-djxj)
2019/05/12(日) 17:35:10.27ID:x4ccFx6b0 >>498
「うまくいかない」症状を見れば、もう少し見当がつくんだけど…。
格納先の配列を char matrix[LINES][CHRS]; とか定義して、
printf("%s\n", matrix[n]); で表示してるの違うかな。
各行の文字列の末尾にあるべき '\0' が格納されてない、みたいな。
「うまくいかない」症状を見れば、もう少し見当がつくんだけど…。
格納先の配列を char matrix[LINES][CHRS]; とか定義して、
printf("%s\n", matrix[n]); で表示してるの違うかな。
各行の文字列の末尾にあるべき '\0' が格納されてない、みたいな。
507デフォルトの名無しさん (ワッチョイ ff63-gMth)
2019/05/12(日) 17:36:33.22ID:JjryTeWM0 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;
}
}
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:28.80ID:JjryTeWM0 501の方法だと'\n'読んだ時に、スキップしているけど
ループ変数の方は ++1 してるからズレてくる
ループ変数の方は ++1 してるからズレてくる
509デフォルトの名無しさん (ワッチョイ 9f79-ScLU)
2019/05/12(日) 18:35:08.99ID:SbCKIsfP0510デフォルトの名無しさん (ワッチョイ ff63-gMth)
2019/05/12(日) 18:43:30.54ID:JjryTeWM0 >>509
10個読んで1個捨てる
10個読んで1個捨てる
511デフォルトの名無しさん (ワッチョイ 3702-vVMj)
2019/05/13(月) 20:38:42.19ID:WOFscy660 バッファにつめるところを簡単にしてみた。
https://ideone.com/fJ91BI
https://ideone.com/fJ91BI
512デフォルトの名無しさん (オッペケ Sr8b-lJiK)
2019/05/14(火) 06:41:01.67ID:7SLYc+Rqr OSSで構造体を公開しようとおもってる
そのサイズをバージョンアップしても固定にしたいんだけどいいアイデアないかな?
struct foo {
int a;
double b; // ここをバージョンアップで追加
}
char[100] buffer;
上記を予め含めておいて、追加サイズ分だけ減らすってのがよくある手段だと思うけど、intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
パディングでサイズも変わっちゃうしね
C++ならテンプレートでいけるけど、OSSだから利用者が多いC言語で書いておく必要がある
構造体を公開しないで、ハンドラとセッタで扱えばいけるだろうけど、今回は構造体でいきたい
そのサイズをバージョンアップしても固定にしたいんだけどいいアイデアないかな?
struct foo {
int a;
double b; // ここをバージョンアップで追加
}
char[100] buffer;
上記を予め含めておいて、追加サイズ分だけ減らすってのがよくある手段だと思うけど、intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
パディングでサイズも変わっちゃうしね
C++ならテンプレートでいけるけど、OSSだから利用者が多いC言語で書いておく必要がある
構造体を公開しないで、ハンドラとセッタで扱えばいけるだろうけど、今回は構造体でいきたい
513デフォルトの名無しさん (ワッチョイ 9ff9-vVMj)
2019/05/14(火) 08:01:00.18ID:YNmKUGxB0 「sizeof(int)が環境依存」を前提にするなら
バージョンアップ以前のint a;だけでもう既にサイズ固定じゃないじゃん
int32_tですら必ずある保証はないよ
「汎用な記述で全ての環境に対応したい」ってのが、土台無理な注文なのよ
低レベルなことやるなら、サポートする環境を列挙限定しなければならない
素直に「よくある手段」でやりなさいってことだ
バージョンアップ以前のint a;だけでもう既にサイズ固定じゃないじゃん
int32_tですら必ずある保証はないよ
「汎用な記述で全ての環境に対応したい」ってのが、土台無理な注文なのよ
低レベルなことやるなら、サポートする環境を列挙限定しなければならない
素直に「よくある手段」でやりなさいってことだ
514デフォルトの名無しさん (アークセー Sx8b-Vhni)
2019/05/14(火) 08:07:10.74ID:0o/9QF7Tx >>512
処理系によるパディングとかの問題を別にしたら、bufferをunionにしといたらわざわざ減らさなくても良いのでは?
処理系によるパディングとかの問題を別にしたら、bufferをunionにしといたらわざわざ減らさなくても良いのでは?
515デフォルトの名無しさん (オッペケ Sr8b-lJiK)
2019/05/14(火) 08:25:38.55ID:7SLYc+Rqr >>513
たしかにint aですでに違うね
ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
そのときにセグメンテーションフォールトがでないようにしたい
だから、すべての処理系で同じサイズにしたいってわけじゃなくて、同じ処理系の中ではバージョンにかかわらずサイズを保ちたいってことなんだよね
説明不足ですまん
たしかにint aですでに違うね
ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
そのときにセグメンテーションフォールトがでないようにしたい
だから、すべての処理系で同じサイズにしたいってわけじゃなくて、同じ処理系の中ではバージョンにかかわらずサイズを保ちたいってことなんだよね
説明不足ですまん
516デフォルトの名無しさん (アウアウエー Sadf-NBbm)
2019/05/14(火) 08:36:30.40ID:2RiYyx1fa あらゆる環境だったらシリアライズしないとだし。
同じ処理系だったら同じ構造体でいいだろうし。
同じ処理系だったら同じ構造体でいいだろうし。
517デフォルトの名無しさん (ワッチョイ ff69-PnGR)
2019/05/14(火) 13:41:09.36ID:d9/Wmgv60 >>514 のはこんな感じですかの
union foo {
struct {
int a;
double b; // ここをバージョンアップで追加
};
char dummyBuffer[100];
};
union foo {
struct {
int a;
double b; // ここをバージョンアップで追加
};
char dummyBuffer[100];
};
518デフォルトの名無しさん (ワッチョイ ff69-PnGR)
2019/05/14(火) 13:59:44.65ID:d9/Wmgv60 構造体の大きさが char[100] に収まってる範囲での話
>>512 のように末尾に用意したギャップを引き算していくにしても、引ききれなくなった段階で破綻するよね
※ 突破したことをチェックするには sizoef(union foo) と sizeof(char[100]) とを比較すんのかなぁ…
>>512 のように末尾に用意したギャップを引き算していくにしても、引ききれなくなった段階で破綻するよね
※ 突破したことをチェックするには sizoef(union foo) と sizeof(char[100]) とを比較すんのかなぁ…
519経団連 ◆T6xkBnTXz7B0 (ワッチョイ 1701-PJeF)
2019/05/14(火) 14:09:24.00ID:4po1tQ0w0 C99 <stdint.h>のuint*_t型を使った方がいいと思う。
520デフォルトの名無しさん (アウアウエー Sadf-NBbm)
2019/05/14(火) 14:39:04.31ID:2RiYyx1fa 普通符号付きでしょ
521デフォルトの名無しさん (ワッチョイ 7f7c-gMth)
2019/05/14(火) 14:51:20.14ID:5nOlmwWa0 符号プログラミングか
522デフォルトの名無しさん (アウアウエー Sadf-NBbm)
2019/05/14(火) 15:42:40.54ID:2RiYyx1fa 今はstatic_assertとかいうものがあるらしいぞ
これでコンパイル時にチェックすればよい
これでコンパイル時にチェックすればよい
523デフォルトの名無しさん (ワッチョイ bf54-vVMj)
2019/05/14(火) 21:12:50.85ID:8soz04JH0 >>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];
};
不格好だけどこれでいけるよ
全部プリプロセッサで処理できて、構造体サイズは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:15.99ID:FPbZusNo0 >>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[] より前のメンバを一致させる必要がある。
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デフォルトの名無しさん (ドコグロ MMdf-vyow)
2019/05/15(水) 08:35:12.84ID:0TljqresM526デフォルトの名無しさん (ワッチョイ 57f2-y0Vo)
2019/05/15(水) 08:56:22.39ID:nK0I7Knm0 データファイルの話なら分かるが、intのサイズが違う環境の共有ライブラリってそもそも使えるのか?
527デフォルトの名無しさん (アウアウウー Sa1b-NBbm)
2019/05/15(水) 09:12:43.64ID:e9I3VVqQa コンパイルは自分でしろって話だと思うよ。
そうすると単にメモリ配置を意識したプログラムだな。
当然、バイトオーダーも気にしろよっていう話に
そうすると単にメモリ配置を意識したプログラムだな。
当然、バイトオーダーも気にしろよっていう話に
528デフォルトの名無しさん (アウアウウー Sa1b-wdoq)
2019/05/15(水) 09:32:21.44ID:k0yjAgrYa やっぱ int32_t みたいな環境に関係なく同じビット数になるやつにしといた方が良いんじゃないかな。
529デフォルトの名無しさん (ワッチョイ ff69-PnGR)
2019/05/15(水) 09:45:02.94ID:25auY+1H0 515の
>ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
>そのときにセグメンテーションフォールトがでないようにしたい
構造体のパラメータを追加し共有ライブラリを差し替えつつ
呼び出し側のコンパイルは行わないって無理ないか?
旧ソースで追加されたパラメータ部分は不定値であって
その不定値をうけて共有ライブラリ内部が正しく動作できるとは思えないが…
>ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
>そのときにセグメンテーションフォールトがでないようにしたい
構造体のパラメータを追加し共有ライブラリを差し替えつつ
呼び出し側のコンパイルは行わないって無理ないか?
旧ソースで追加されたパラメータ部分は不定値であって
その不定値をうけて共有ライブラリ内部が正しく動作できるとは思えないが…
530デフォルトの名無しさん (ワッチョイ 9f2c-NS0m)
2019/05/15(水) 11:40:27.07ID:AfKgri370 構造体には、サイズの変わらない、ポインタだけを置いておいて、
実際の領域は、ライブラリ内で確保して使って、解放すれば?
実際の領域は、ライブラリ内で確保して使って、解放すれば?
531デフォルトの名無しさん (アウアウウー Sa1b-NBbm)
2019/05/15(水) 12:19:01.09ID:e9I3VVqQa さすがに実体を共有するという目的がないとこういう発想にはならんでしょ。
共有メモリとか、ファイルとか、通信とか。
共有メモリとか、ファイルとか、通信とか。
532デフォルトの名無しさん (オッペケ Sr8b-lJiK)
2019/05/15(水) 12:31:29.02ID:dMKqDPXvr >>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;
}
}
呼び出す側がバージョン情報をもっておいて、処理側で振り分けてアクセスしないようにすれば問題ないね
#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:05.74ID:25auY+1H0534デフォルトの名無しさん (アウアウウー Sa1b-wdoq)
2019/05/15(水) 12:53:24.07ID:k0yjAgrYa 構造体の中身を公開しないでポインタだけ使わせて読み書きする関数を別途用意するって方法もあると思う。オブジェクト指向の言語でのプロパティのようなものね。
内容のファイルへの読み書きやネットワークでのやり取りはそれようにデータをpack、unpackする処理を作ってそこにバージョン番号も埋め込む。
内容のファイルへの読み書きやネットワークでのやり取りはそれようにデータをpack、unpackする処理を作ってそこにバージョン番号も埋め込む。
535デフォルトの名無しさん (ワッチョイ 9ff9-vVMj)
2019/05/15(水) 12:59:51.65ID:Wbf0zcGJ0 exeがnew(malloc)するけど中をいじるのは全てdllの関数ってのはままある
dllだけ差し替えで済ましたい、サイズが変わらなければexeはビルドし直さなくていいのに…
ってことだろう
>512の
>intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
>パディングでサイズも変わっちゃうしね
は全く関係ない話だったということだ
素直に「よくある手段」でやればいい
>514,517のunionもいいと思うけど
foo.aでアクセスできないよね?foo.body.aとかしないと
dllだけ差し替えで済ましたい、サイズが変わらなければexeはビルドし直さなくていいのに…
ってことだろう
>512の
>intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
>パディングでサイズも変わっちゃうしね
は全く関係ない話だったということだ
素直に「よくある手段」でやればいい
>514,517のunionもいいと思うけど
foo.aでアクセスできないよね?foo.body.aとかしないと
536デフォルトの名無しさん (ワッチョイ ff69-PnGR)
2019/05/15(水) 13:12:20.84ID:25auY+1H0 >>517 の foo.a でいきなりアクセスできる union が記述できるのは C11 からみたい
無名構造体/無名共用体
無名構造体/無名共用体
537デフォルトの名無しさん (オッペケ Sr8b-lJiK)
2019/05/15(水) 14:41:00.06ID:dMKqDPXvr >>535
intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ?
intメンバを追加したとして、bufのサイズはどれだけ減らせばいいのかわからないのが問題
4の環境が多いだろけど、2の環境だと2を減らさなきゃいけないわけで
dll差し替えで再ビルドしない場合、構造体サイズが変わると特に配列渡しの場合はセグメンテーションフォールトになる可能性が高くて危険
セーブデータみたいに構造体をそのままファイルに落とすとしても、サイズはずっと不変なのが扱いやすいね
intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ?
intメンバを追加したとして、bufのサイズはどれだけ減らせばいいのかわからないのが問題
4の環境が多いだろけど、2の環境だと2を減らさなきゃいけないわけで
dll差し替えで再ビルドしない場合、構造体サイズが変わると特に配列渡しの場合はセグメンテーションフォールトになる可能性が高くて危険
セーブデータみたいに構造体をそのままファイルに落とすとしても、サイズはずっと不変なのが扱いやすいね
538デフォルトの名無しさん (アウアウウー Sa1b-NBbm)
2019/05/15(水) 14:56:07.34ID:e9I3VVqQa 数字付かないintのでかい方に合わせるなら、それこそunion使って明示的にオフセット決めるとか。
本当にそんなことしたいのか?という話は置いといて。
もちろんint32_tとかint_least32_t使う方がいいし、本当に位置合わせするならバイト位置指定して読み書きするし、そもそもサイズ固定せずにシリアライズ用のライブラリ使うのが正しいよ。
本当にそんなことしたいのか?という話は置いといて。
もちろんint32_tとかint_least32_t使う方がいいし、本当に位置合わせするならバイト位置指定して読み書きするし、そもそもサイズ固定せずにシリアライズ用のライブラリ使うのが正しいよ。
539デフォルトの名無しさん (ドコグロ MMdf-vyow)
2019/05/15(水) 19:35:47.81ID:0TljqresM540デフォルトの名無しさん (ワッチョイ 9ff9-vVMj)
2019/05/15(水) 20:46:54.27ID:Wbf0zcGJ0541デフォルトの名無しさん (ワッチョイ d7ab-xJZP)
2019/05/15(水) 21:55:29.06ID:ZaVTFrP70 win32apiはバージョンによって構造体の変数が追加になるから構造体のサイズを構造体の先頭にセットする
542デフォルトの名無しさん (ワッチョイ baa5-bDB9)
2019/05/16(木) 08:13:26.18ID:eEplP63Q0 windows.hのsmallで一時間潰した
543デフォルトの名無しさん (ワッチョイ 29ad-BnNU)
2019/05/16(木) 19:38:59.34ID:GXqxfUU20 文字配列列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);
}
どこがおかしいのでしょうか…
以下のコードでは実行しても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);
}
どこがおかしいのでしょうか…
544デフォルトの名無しさん (ワッチョイ 3f01-pg4x)
2019/05/16(木) 19:48:10.73ID:q0J7kB7g0 後のループの一発目は
s[i]='\0';
I=i;
/* ここのforを削って */
t[I-i]=s[i];
こういうことになるから
t[0] = s[i] ってことになって t[0] = '\0'; をやってることになる
上記のは
1 2 3 4 \0 → \0 4 3 2 1 のコード
実装すべきなのは
1 2 3 4 \0 → 4 3 2 1 \0 となるコード
s[i]='\0';
I=i;
/* ここのforを削って */
t[I-i]=s[i];
こういうことになるから
t[0] = s[i] ってことになって t[0] = '\0'; をやってることになる
上記のは
1 2 3 4 \0 → \0 4 3 2 1 のコード
実装すべきなのは
1 2 3 4 \0 → 4 3 2 1 \0 となるコード
545デフォルトの名無しさん (アウアウウー Sa83-RNyv)
2019/05/16(木) 20:27:22.18ID:m1+/MMjMa 惜しいねえ。綺麗に逆に入ってはいるんだよな。
546デフォルトの名無しさん (ワッチョイ 29ad-BnNU)
2019/05/16(木) 20:38:11.53ID:GXqxfUU20 おっしゃる通りでした…今度は上手くいきました
ありがとうございます
ありがとうございます
547デフォルトの名無しさん (ワッチョイ 29ad-BnNU)
2019/05/16(木) 20:38:46.73ID:GXqxfUU20 おっしゃる通りでした…今度は上手くいきました
ありがとうございます
ありがとうございます
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】習主席とトランプ大統領が電話会談 台湾問題について★3 [ニョキニョキ★]
- 【速報】トランプ大統領、中国の習近平国家主席を「国賓」として招待することに [ニョキニョキ★]
- 米中電話会談、トランプ氏は「米国側は中国にとっての台湾問題の重要性を理解する」 [1ゲットロボ★]
- 【音楽】「なんでこんなバカが国のトップなの?」 若者に人気のバンド「GEZAN」のマヒトゥ・ザ・ピーポーが高市総理に苦言 [シャチ★]
- 【速報】習主席とトランプ大統領が電話会談 台湾問題について★4 [ニョキニョキ★]
- 中国人「『日本は危ないから行かないように』と言われたが、日本に来たらとても安全だった」 [お断り★]
- 【高市悲報】来年、習近平主席がアメリカに「国賓」として訪米。どうするんだよ高市・・・アメリカも敵に回すのか? [483862913]
- トランプおやびん「米中関係は極めて強固」高市早苗「」 [834922174]
- 【高市悲報】トランプおやびん「偉大な指導者である習近平首席、米国は中国にとっての台湾問題の重要性を理解しています」 [115996789]
- 【速報】足立ひき逃げ犯、精神病持ちだった [329271814]
- 【速報】高市「アタシぜっったい謝らないからッ!!」→中国焦る [308389511]
- 「琉球有事は中国有事」 中国のネトウヨが拡散 これには日本のネトウヨ叩きのめされる [241672384]
