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


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

C言語なら俺に聞け 145



1 名前:デフォルトの名無しさん mailto:sage [2018/02/19(月) 22:13:58.98 ID:9/te2eSJ0.net]
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/


C言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

52 名前:片山博文MZ mailto:sage [2018/02/22(木) 21:36:38.38 ID:bw7NPixRd.net]
>>50
0〜9、そして0が描かれた画像を表示部分だけをクリッピング(切り抜き)して、回転させてアニメーションする。

53 名前:25 mailto:sage [2018/02/22(木) 22:38:43.81 ID:tV4J1Ww80.net]
>>26 >>30 >>33
コメントありがとうございました。
狙いは>>33に書かれてる通りで、>>25のコードもMinGWのgccでコンパイルが通って
実行結果も期待通りだったことから大丈夫なのかなと思ったのですが・・・。

そもそも古い書き方で、将来無くなる予定(ってC99の6.11.6に書かれてるんですね)との
ことですので止めておきます。

54 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 01:55:49.74 ID:UgOkn/Bq0.net]
int main(void), int main(int, char**) どちらも ok なのだか
int (*pfunc)()のような書き方はなくならないと思う

55 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 06:00:42.07 ID:lIelkvwO0.net]
関数ポインタにvoid*的な総称ポインタはねえぜ

56 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 07:59:19.70 ID:Ska5zxPe0.net]
long(*pfunc)() = func; の行がエラーになるのか。
long(*pfunc)(long, char, short) = func; なら通る。

「longを返す関数なら何でも入れられる関数ポインタの変数」てのが
認められないのね。

57 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 08:06:24.8 ]
[ここ壊れてます]

58 名前:3 ID:c0IwYAH60.net mailto: 良く考えると関数用の汎用ポインタが無いのはおかしい []
[ここ壊れてます]

59 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 10:50:05.99 ID:lIelkvwO0.net]
無理だよ
仮引数の違い=スタック構造の違いなんだから

60 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 12:07:23.73 ID:fgXllc68d.net]
gcol(rcol & 0xFF , & gcol & 0xFF ,
bcol & 0xFF)

これの意味を教えてください。



61 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 12:08:21.32 ID:fgXllc68d.net]
>>58
gcolor(rcol & 0xFF , & gcol & 0xFF ,
bcol & 0xFF)

これの意味を教えてください。

62 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/23(金) 12:15:11.26 ID:uhME+YqbM.net]
>>57
呼出側が責任持つのがc流で、だから可変引数が実装出来る
って習ったんだが、最近は違うのけ?

63 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 12:18:14.88 ID:0SE2Ag1M0.net]
>, & gcol & 0xFF ,
間違ってるような気がするけどな。
変数/関数名からRGB値取ってるだけに思えるし。

64 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 12:27:00.80 ID:yhtAX1ye0.net]
呼出し側の引数や戻り値の扱いを規定するのは呼出規約
x86/x64上のC言語ではcdeclが一般的だけど組み込み系の処理系の一部には独自実装のものもある
https://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84

65 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 12:36:44.19 ID:fgXllc68d.net]
>>61
それは変数宣言で
rcol gcol  bcol =64です。
&16進数なのはどうしてですか?

66 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 13:51:39.54 ID:lIelkvwO0.net]
>>60
可変引数?
void func(double);
void (*ptr)() = func;
ptr(1); //1.0で渡すべきところ1が渡される
void func(double arg) //スタック構造の不一致が起きる
{
//全然関係ねえだろ
}

67 名前: mailto:sage [2018/02/23(金) 14:15:00.31 ID:mpvgXBL20.net]
>>63
8 bit 幅分だけ &(and) 演算子で切り取っているのではないですか?

68 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 14:21:37.49 ID:vnQpXFI50.net]
>>60
可変引数なら可変引数として書かないとだめでしょ

69 名前: mailto:sage [2018/02/23(金) 14:22:41.05 ID:mpvgXBL20.net]
>>55
なるほどねえ
https://ideone.com/hVdYWa

70 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/23(金) 14:35:58.87 ID:uhME+YqbM.net]
>>64
そうか、良かったな。

所で、最近はそういうのも可変引数って言うように
なったのか。varargs.hは廃盤か。



71 名前:デフォルトの名無しさん [2018/02/23(金) 14:59:14.82 ID:0k9d4/ABa.net]
>>63
君が何を言っているのかよくわからない。

72 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 15:09:04.10 ID:lIelkvwO0.net]
>>68
あれが可変引数?
俺は全然関係ねえだろって書いたんだが

73 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 15:44:15.83 ID:0SE2Ag1M0.net]
ID:fgXllc68d は必要な情報書かな過ぎ。

74 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 15:47:17.83 ID:V7qyvSbE0.net]
可変個引数は va_start() するときに番兵となる引数が必要なので
最低でも1個は固定の引数が欲しいんだよね
func(int , ...) とかになる

75 名前:デフォルトの名無しさん [2018/02/23(金) 16:06:00.23 ID:0k9d4/ABa.net]
可変長引数なんて認めなければよかったのにな。
またはJavaみたいにシンタックスシュガーにしておいて実は配列に変換して要素数と共に渡すみたいにしておけばもっとましな感じになったのに。

76 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 16:43:48.45 ID:lIelkvwO0.net]
Bの頃からあったprintfの実装テクニックだし
だいいちCは簡潔さを売りにしてたんで
理想論に走って複雑さを増すようなことを嫌ったんだよ

77 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/23(金) 16:48:19.38 ID:yeKpu5OYM.net]
>>72
せやな。
で、func(int,....) な関数ポインタは作れるよね。
それを汎用的に使うことは出来る。ってのが56への回答じゃね?

78 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 17:03:04.90 ID:lIelkvwO0.net]
void func(int, double);
void (*ptr)() = func;
ptr(1, 1); //1.0で渡すべきところ1が渡される
void func(int top, double arg) //スタック構造の不一致が起きる
{
va_list ap;
va_start(ap, top);
assert(va_arg(ap, double) == arg); //通るわけねえだろ
va_end(ap);
}

79 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 17:11:03.17 ID:V7qyvSbE0.net]
>>75 いいや ポインタだけじゃ片手落ち
(キャストじゃだめで)関数の実体側の引数も同じ引数で実装しなければならない

80 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 17:26:46.79 ID:UgOkn/Bq0.net]
スタートアップは argc,argvをスタックに積んで _mainを呼ぶ
_mainが int main(void)だとしても問題ない



81 名前:55 mailto:sage [2018/02/23(金) 17:49:49.55 ID:Ska5zxPe0.net]
>>67 はエラーなくコンパイル・実行できてるようだから、もう少し検証。
ideone.com でなくローカルのgccで実験。

どうやら func() 定義の引数リストに制限があるみたい。
void f(double x) ... エラーなし ( >>67 の例と同じ)
void f(int x) ... エラーなし
void f(void* x) ... エラーなし
void f(char x) ... 警告:「互換性のないポインタ型」
void f(short x) ... 警告:「互換性のないポインタ型」
void f(float x) ... 警告:「互換性のないポインタ型」

警告は void (*pfunc)() = f; の行で発生。
実引数の自動拡張よりも狭い幅の仮引数の型を使おうとすると警告かな?
コンパイラによって動作が異なる部分で、深追いする価値は無いのかも。

82 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/23(金) 18:00:16.52 ID:yeKpu5OYM.net]
>>77
78が正解。更に言えばmainの引数には envp もある

83 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 18:25:51.38 ID:UgOkn/Bq0.net]
envpはANSI C 標準に対する Microsoft の拡張機能
https://msdn.microsoft.com/ja-jp/library/k104fy6h.aspx

84 名前: mailto:sage [2018/02/23(金) 18:42:59.00 ID:mpvgXBL20.net]
>>81
posix にもある、推奨されているわけではないが

85 名前:55 mailto:sage [2018/02/23(金) 19:10:50.73 ID:Ska5zxPe0.net]
補足というか訂正。
>>55 で「long(*pfunc)() = func; の行がエラーになる」
と書いたけど警告だった。よって >>25 のソースもコンパイル可能。

ちなみに結果は期待の 6 とは桁違いのデカい数値だった。

86 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 20:24:30.86 ID:mFkXyQ34M.net]
void*でええやん

87 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 21:15:05.64 ID:JKrDz8Gza.net]
 ヘ_ヘ
ミ・・ ミ
(   )〜

88 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 21:32:39.13 ID:my0767Fs0.net]
void から ヘミ猫 て fj かよ

89 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 00:57:58.46 ID:ar5NnKGja.net]
>>83
>>25の書き方そのままじゃlong aの部分しか渡されてないからb, cは不定値になってるのでは?

90 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 06:40:32.39 ID:agv5rOmv0.net]
>>87
param には「long幅の共用体3要素の配列」が含まれるから、
値渡しすればスタックに (sizeof(long) * 3) byteのデータが積まれるはず。

というか、main()でparamの各要素をlong解釈で表示させたら
見事にaやbの上位ビットにゴミが入っていた。



91 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 09:43:12.88 ID:uX3sJRXI0.net]
structにstaticつけ忘れてましたとか

92 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 15:58:01.09 ID:dhHE2VyNa.net]
>>88
> 各要素をlong解釈で表示させたら見事にaやbの上位ビットにゴミが入っていた。
それは初期化の問題では?

確かに値渡しはスタックにコピーされるけど、関数の引数にはもう一回コピーはいるから、そこで関数不一致の弊害が発生すると思う
>>25のコードそのままだとaしか正しく渡されてなくて、b,cは明後日の方向からデータ取ってきてるかと

93 名前:88 mailto:sage [2018/02/24(土) 16:57:25.47 ID:agv5rOmv0.net]
>>88 に「期待の6」と書いたせいで誤解させてしまった。
もちろん実際の動作で6が表示されると思っていたわけじゃないのだ。
この流れの発端の質問 >>25 と、それに追加された >>52 の、
「実行結果も期待通りだった」て記述を受けての「期待の6」でね。



94 名前:しろ共用体への代入で、
 param.u[0].a = 1; // charの代入 byte転送命令
 param.u[1].b = 2; // shortの代入 word転送命令
 param.u[2].c = 3; // longの代入 dword転送命令
てな具合にアセンブルされ a, b の上位ビットに未初期化のゴミが残り、
関数に実引数の値として渡されるときもゴミごとコピーされるのは当然。
>>52 で期待通りに動いたのは、paramの未初期化での状態が
たまたま全部ビットで0だったんだなぁ、というお話。

>>25 のリストで、関数 func() の仮引数 a, b, c の型と、
共用体の要素 a, b, c の型が食い違ってる点にも注目して頂きたい。


…長々と失礼。誤解の余地なく説明しようとするとクドくなってしまう。
[]
[ここ壊れてます]

95 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 18:41:41.80 ID:7mL/bBDwd.net]
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 80

void* my_realloc( void* p, size_t bytes, int line ) {
if( (p = realloc(p, bytes)) == NULL ) {
fprintf(stderr, "realloc failure called at line %d\n", line);
exit(EXIT_FAILURE);
}
return p;
}
int main () {
FILE *fp;
char *file = "data.csv";
char buf[BUF_SIZE], input[BUF_SIZE], format[20];
char **result, *s;
int i, size = 50, count = 0;

if( (fp = fopen(file, "r")) == NULL ) {
perror(file);
exit(EXIT_FAILURE);
}
sprintf(format, "%%%ds%%*[^\n]%%*c", sizeof(input) - 1);
scanf(format, input);

result = my_realloc(NULL, sizeof(*result) * size, __LINE__);

while( (fgets(buf, sizeof buf, fp)) != NULL) {
if( strstr(buf, input) == NULL ) continue;

96 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 18:42:06.22 ID:7mL/bBDwd.net]
s = my_realloc(NULL, strlen(buf) + 1, __LINE__);
strcpy(s, buf);
result[count++] = s;
if( count >= size ) result =my_realloc(result, sizeof(*result) * (size += 20), __LINE__);
}

for( i = 0; i < count; i++ ) {
printf(result[i]);
free(result[i]);
}
free(result);

return 0;
}

97 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 18:45:40.89 ID:7mL/bBDwd.net]
上記のコードから追加でしたいことが2つあります。
@検索単語を2つにしたい。
Aフォルダないの全ての.csvファイルを検索かけたい。

sprintf(format, "%%%ds%%*[^\n]%%*c", sizeof(input) - 1);
scanf(format, input);

result = my_realloc(NULL, sizeof(*result) * size, __LINE__);

ここの文の意味が分かりません。

98 名前:片山博文MZ mailto:sage [2018/02/24(土) 21:35:03.63 ID:h1W1dcA8d.net]
>>94
クソコードだ。あまり参考にせず、自分で考えた方がいい。
my_reallocはreallocをラップした関数形式マクロのようだ。リファレンスのreallocを参照。
__LINE__は現在の行番号を表し、デバッグなどに使う。
sprintfはprintfを文字列出力にしたものだ。%%は%になって出力される。

99 名前:片山博文MZ mailto:sage [2018/02/24(土) 21:47:22.04 ID:h1W1dcA8d.net]
sprintfで出力した文字列をscanfに書式として渡している。でもこのようなscanfの使い方はオススメできない。

100 名前:片山博文MZ mailto:sage [2018/02/24(土) 21:56:26.92 ID:h1W1dcA8d.net]
%dは整数を表す文字列になるので、%%%dsは%(何らかの整数)sになる。これは文字列出力の幅指定だ。
幅指定には、別の直接的な方法があるので、こんなことしなくてもいい。
scanfの使い方は引数の個数がちょっと間違っているように見える。



101 名前:片山博文MZ mailto:sage [2018/02/24(土) 21:59:21.39 ID:h1W1dcA8d.net]
バグや不具合の元になるscanfなんて使うな。fgetsとsscanf使えば充分で分かりやすくて確実だ。

102 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 22:25:03.02 ID:tEhbLaK5M.net]
>>94
@else ifでええやん
Areaddirでええやん

myreallocみたいなモンはマクロにしとけ
reallocみたいな糞ライブラリ使うな
sprintfみたいな糞ライブラリ使うな

103 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 22:45:22.29 ID:PDj ]
[ここ壊れてます]

104 名前:CLuF50.net mailto: 特定のフォルダ(dir)内のファイルを順次処理したいときは
Unix系ならばopendir()、readdir()、closedir()を使う。
VCならばFindFirstFile()、 FindNextFile()、FindClose()を使う。
[]
[ここ壊れてます]

105 名前: mailto:sage [2018/02/24(土) 23:27:16.76 ID:yWQ45jBy0.net]
たしかに realloc() はいろいろまずいところがあって、
一番悪いのは、やり直しができない、ということ

106 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 23:34:03.13 ID:PDjCLuF50.net]
一致した行をそのままファイルに書き出す方が簡単な気がする

107 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 01:42:29.02 ID:XjF3qDop0.net]
>>99>>101
え? realloc() が糞?じゃあ malloc() で確保したメモリ領域の大きさを変えるのは何を使えばいいの?
自分で確保し直して中身を自分で全部コピーしろと?

108 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 01:43:39.45 ID:XjF3qDop0.net]
>>101
てか、やり直しができないってどういう意味?幾らでもできると思うが。

109 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 01:50:49.81 ID:I4H7O+d10.net]
1バイトでもメモリ消費量を節約する事が求められた世代と
湯水の如く無尽蔵にメモリが使える世代のバトルが始まる?

110 名前:デフォルトの名無しさん [2018/02/25(日) 03:25:39.33 ID:XjF3qDop0.net]
>>105
そういうことなの?w



111 名前:デフォルトの名無しさん [2018/02/25(日) 06:04:48.57 ID:Jqo0wCIZ0.net]
>>92 >>94
sprintf(format, "%%%ds%%*[^\n]%%*c", sizeof(input) - 1);
の行では input[BUF_SIZE] で BUF_SIZE が80であることから
format[] に "%79s%*[^\n]%*c" (\nは改行コード) が格納される。
よって scanf(format, input); は scanf("%79s%*[^\n]%*c", input); の動作。
変換指定の "%79s%*[^\n]%*c" の意味や妥当性は別のお話。

>>96
scanf() の変換指定文字列を sprintf() で生成するやり方は
『プログラミング作法』(カーニハン&パイク)に載ってる。
BUF_SIZE の定義を変えたときにscanf()の変換指定の文字数指定部分も
自動的に追随させる便法(片方だけ修正忘れの防止)として、悪くないかと。

バッファサイズは固定なのに変換指定を動的に作るのは非効率だ、
という気持ちも分かるけどね。

112 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 07:37:51.66 ID:HIxgC6KA0.net]
片山氏はscanfがまともに使えず
自分のミスを道具のせいにする手合いか

113 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 08:49:08.43 ID:vTPpNH4CM.net]
>>103
そう
糞と言った理由は冪等性がないから
冪等性よりも結果整合性を重視するならrealloc使えば良いと思うよ

114 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 09:18:29.86 ID:Jqo0wCIZ0.net]
>>109 「冪等性がない」の意味を補足してくれまいか。
realloc()に冪等性がない、結果整合性はある、という意味が分からないのだ。

115 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 09:35:20.85 ID:miEl51/Z0.net]
失敗したとき NULL を返しつつ 「引数で渡したポインタは開放されない」
あたりに引っかかりを感じてるんでない?

NULL 返すなら 引数で渡したポインタを開放しろと?
※ 使いにくいかもなぁ…

116 名前:デフォルトの名無しさん [2018/02/25(日) 11:58:37.90 ID:XjF3qDop0.net]
俺も意味がわからん。

117 名前:デフォルトの名無しさん [2018/02/25(日) 12:17:48.32 ID:XjF3qDop0.net]
>>111
それはメモリ確保に失敗してるんだから解放したらダメだよね。
自分で malloc() 使って新規にメモリ確保しようとした場合でも NULL 返されたら元の方は free() しないだろう。

118 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 12:28:06.03 ID:vTPpNH4CM.net]
>>110
結果整合性って言葉が悪かったな
reallocの機能を重視するなら使えば良いと思うよって書けば良かった

冪等性の意味が分からないならググってくれとしか

119 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 12:33:20.87 ID:XjF3qDop0.net]
あ、もしや >>109 の言ってる冪等性がないって引数で渡したポインタとは違うポインタを返してくることがあるって意味?
あまりにも当たり前すぎて思い

120 名前:つかなかったが。

しかし malloc() の実装にもよるだろうがこれを許さないと効率は悪くなるのではないか?
[]
[ここ壊れてます]



121 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 13:13:10.59 ID:vTPpNH4CM.net]
>>115
そう
違うアドレスを返して初めて発現するバグをボケナスビがやらかしてから俺は戒律で禁じた
他にも初期化やアライメントの点もある

メモリ効率を重視するなら自分で管理構造作るべきだと思ってる

冪等性を最重視する俺はこのスレじゃ少数派みたいだからあまり気にせんでくれ

122 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 13:20:16.07 ID:L5EpKLxx0.net]
>>115
× 効率は悪くなる
○ まともな実装は無理(ほぼ全ての場合に失敗する)

>>116
気持ちは分からんでもないが、
reallocはそれが仕様で、いやならstd::stringみたいにラップするしかない。

123 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 13:22:50.04 ID:I4H7O+d10.net]
(流れが質問者を放置しているように感じる)

124 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 13:26:41.23 ID:qARxqxts0.net]
>>118
質問者の疑問を解決する事より自分の主張したいことに論点がシフトしちゃうのはよく見る光景だね。
質問スレでそれじゃダメだと思うが。

125 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 13:38:08.00 ID:vTPpNH4CM.net]
>>118>>119
確かにそうだな
俺は安価ついた分しかレスしないつもりだったけど、この話題についてはもう止めとく

スレ汚しすまんかった

126 名前: mailto:sage [2018/02/25(日) 13:44:15.14 ID:9iGYkY9C0.net]
>>103 >>104
c++ には realloc() は取り入れられなかった

ちょっと例が悪いが
concat3(char *a, char *b, cha *c) 文字列a と 文字列b と文字列c を連結して文字列a に返す関数を書こうとする
ここで 2 回の realloc() を行うとする
1 回目の realloc() は成功するが、2回目の realloc() は失敗したとする
このとき「関数 concat3() が失敗したときは状態は不変、成功したときだけ状態を変更する」という原則を満たせない

我ながらちょっと例が悪いとは思うが、
realloc() を暢気に使っていると、エラー処理が一手ばったりになってしまう。

127 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 13:49:23.19 ID:L5EpKLxx0.net]
>>120
俺はいいと思うぞ。
むしろ無理に「質問者様が神様だ」的にしたがるゆとりは死ねと思うが。

そもそも質問には回答つきまくってるし、質問者側が何らかの反応しないと話は進まないだろ。
流れも読めない癖に流れを主張するゆとりは殺すしかない。

128 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 14:39:52.01 ID:XjF3qDop0.net]
なるほど。まあ確かに使い方や使い所を間違えればハマるものではあるな。

そういや以前 realloc() で渡すポインターがNULLではなくサイズの指定が0だとfree()されるってのでハマったことがあった。w

129 名前:片山博文MZ mailto:sage [2018/02/25(日) 14:51:26.22 ID:nm5odapXd.net]
ANSI準拠のreallocは、mallocとfreeの代わりになる。

130 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 15:46:21.99 ID:s5td7qK+0.net]
未だにANSIの規格票を読んでる日本人いたのか



131 名前:デフォルトの名無しさん [2018/02/25(日) 15:51:12.25 ID:DMbXpP0c0.net]
俺も読んでる

132 名前:デフォルトの名無しさん [2018/02/25(日) 15:59:51.76 ID:NsuolzGja.net]
未だにANSI使う理由って何だろう?

133 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 16:00:08.18 ID:s5td7qK+0.net]
ISOではなくANSIか?

134 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 18:48:53.57 ID:bdk82RzyM.net]
>>121
それはプログラムの組み方が悪いだけでrealloc()のせいじゃないだろ

135 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 18:55:32.39 ID:I4H7O+d10.net]
>>121
最初から文字列3つ分の領域確保すれば良いんでないの?

136 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 19:23:06.76 ID:L5EpKLxx0.net]
>>121
reallocではなく、自前でmalloc+memcpy+freeでやればいいだけ。
ただその前に、指摘されているとおり、
3つの「同時に変更される」生ポインタを掴ませるのが問題。
その場合には普通は一つの構造体に入れてそれ経由で使い、
「同時に変更される」という条件が外部に見えないようにする。(隠蔽)
勘違いしている奴も多いが、OOPは文法の話ではない。

137 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 20:09:18.52 ID:fbPK05Px0.net]
reallocをmallocとmemcpyでやろうとするともとのメモリサイズわからずに詰まない?

138 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 20:41:49.10 ID:p0obWBJzd.net]
結果何をどうすればいいんですか?レベルが高すぎて何を言ってるのかさっぱりです

139 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 20:48:37.39 ID:Fc1MjilIa.net]
だからreallocはいまいちって話なのでは?

>>132
malloc_usable_size, _msize

140 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 20:58:36.53 ID:H8bVBKR7a.net]
>>133
reallocに関してはひとまず気にしなくて良いかと



141 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 21:15:09.00 ID:I4H7O+d10.net]
>>133
見つかった行の保持ってメモリー上でやりたいの?

142 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 21:58:18.03 ID:EC2T/8ze0.net]
>>136
別にこだわりがあるわけではないです。

明日やろうと思うので、調べるあたりこれ見とけとかあります?

143 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 22:15:41.07 ID:I4H7O+d10.net]
メモリ上に保持しなくても良いなら、検索して見つかった行をそのままファイルに書き出してしまう方が簡単だと思う。
あと、どういう環境で実行するか分からないんだが、もしも正規現が使えるなら、それを利用する方が簡単だと思う。
複数のキーワードで探したいときは一括で指定できるし。

144 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 22:23:36.04 ID:L5EpKLxx0.net]
>>137
1. grep/sedでおk
2. AWK/Perl/Ryby/Pythonでもおk
3. つかその用途でC使うとか正気じゃねえ。メモリ上でゴリゴリやるにしても普通はスクリプト言語。
4. それも分かっててC使う覚悟のある奴がここでこんなアホな質問する訳ねえ。>>138

145 名前: mailto:sage [2018/02/25(日) 22:51:32.71 ID:9iGYkY9C0.net]
>>139
>用途でC使うとか正気じゃねえ。メモリ上でゴリゴリやるにしても普通はスクリプト言語。
その判断をするのには、一定の C での経験が必要だと思います
python なんかでやったほうがいい仕事をあえて C で書く経験はあったほうがいいでしょう

146 名前:デフォルトの名無しさん mailto:sage [2018/02/25(日) 23:44:30.89 ID:EC2T/8ze0.net]
VBでは出来るんですがCの勉強をかねてトライしてます。
いろいろとありがとうございました!明日頑張ってみます!

147 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 11:24:56.97 ID:0MjsGOBH0.net]
>>132
メモリーサイズを知る必要はない
そもそも確保されてるサイズと strlen(a) が同じかどうかはわからんし

148 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 12:24:58.22 ID:4Dp3S/v30.net]
>>142
concat3とかいうQZのボケたろくでもない例のことは忘れろ

149 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 12:38:44.35 ID:lxlU26hn0.net]
>>132
メモリサイズは非公開というだけで、内部的には持っている
だからreallocの作者=mallocの作者が詰むことはない

それ言い出したらfreeも解放量わかんなくて詰むだろ

150 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 13:29:20.63 ID:zI4VKzz4M.net]
>>143
お前は何を言ってるんだ?



151 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/26(月) 17:32:30.23 ID:e+KVEn7XM.net]
K&Rで説明されている筈なんだが

152 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 17:41:14.36 ID:vVA9DKIbd.net]
結果出来ませんでした...






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

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

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