- 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
- 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]
- 結果出来ませんでした...
- 153 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 20:20:31.75 ID:4PPe6ndQ0.net]
- >>144
reallocの作者がmallocの作者と違う場合なんだが
- 154 名前:デフォルトの名無しさん [2018/02/26(月) 20:38:25.45 ID:9Qy36xi2a.net]
- 違うかなあ?まあ、ソース公開されてれば違う人が書くことは楽だが。
- 155 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 22:00:57.86 ID:Z8+ASG310.net]
- >>147
どの辺がどうできなかったかを書いてみて
- 156 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 22:08:57.21 ID:lxlU26hn0.net]
- >>148
俺は、それを空想論と断言してみる おまえさん恥をかかせてくれることはできるかな?
- 157 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 23:37:18.28 ID:Il2cKkTC0.net]
- >>150
- 158 名前:P純に自分でやってみようと思い一から書き始めたんですけど
CSVファイルのカンマ区切りで、行は日々増える形式で、13列の固定。それぞれ数字だったり文字だったり混合。 ファイルを開いて読み込んで一行ずつ検索文字列と比較して一致したら表示列を指定して表示させ、一致しなかったら次へを繰り返していこうと思って始めたんですけど。 配列に入らずうまいこといきませんでしたね。ネットの参考もいいのが見つからなくて... 前載せたコードを読みといた方が近道ですかね? [] - [ここ壊れてます]
- 159 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 23:49:55.49 ID:KRl4xBEA0.net]
- >>151
もともと標準mallocやfreeを使って自前realloc作るならという話の流れだっただろ
- 160 名前:デフォルトの名無しさん mailto:sage [2018/02/26(月) 23:57:50.74 ID:Z8+ASG310.net]
- >>152
CSVファイルを読み込むプログラムは作った事ありますが CSVの仕様をどの位受け入れるかで複雑さも変わると思います。 この辺は汎用的に作るか、自分が処理したいCSVの仕様の範囲にするかで違うとは思います。 scanf系の処理はとても癖が強く、 よっぽど仕様に精通していないと填まります 私ならその道を行くのはやめます
- 161 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 00:01:01.54 ID:uYnnRgds0.net]
- >>152
grepでおk、マジで そんなことをCでやる馬鹿はいないから、ろくな参考情報がないのも当たり前。
- 162 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 00:04:33.43 ID:vDZ6bRaj0.net]
- "と , のエスケープと 1要素の中に改行を含む文字列周辺 RFCみて頭いたくなった
- 163 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 00:13:39.83 ID:euQ4hghrM.net]
- >>152
俺なら間違いなくpythonつかうね https://qiita.com/okadate/items/c36f4eb9506b358fb608
- 164 名前:デフォルトの名無しさん [2018/02/27(火) 07:16:02.83 ID:pdRg+OHax.net]
- 配列とかポインタとか難しいと聞いていたから心配していたけど
とりあえず基礎の解説書レベルなら分かった。やれやれ。
- 165 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/27(火) 09:21:35.76 ID:uskldtVs0.net]
- 指定したサイズの2次元配列を確保する関数を設計してくれまいか?
- 166 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 10:07:05.72 ID:XfJ/ct090.net]
- >>159
無理じゃね? char (*dim_alloc(size_t width, size_t height))[width]; 最後の[width]がエラーになる[*]にしてもあかん []にすると通るには通るが、今度は char (*a)[3][4] = dim_alloc(3, 4); //型の不一致になる
- 167 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 10:08:23.25 ID:XfJ/ct090.net]
- あ、失礼
char (*a)[4][3] = dim_alloc(3, 4); 結果は同じだけど
- 168 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 10:55:55.07 ID:XfJ/ct090.net]
- できた
void dim_alloc(size_t, size_t, char (**b)[*]); int main(void) { size_t width = 3, height = 4; char (*a)[width]; dim_alloc(width, height, &a); } void dim_alloc(size_t width, size_t height, char (**b)[width]) { *b = (char (*)[width])malloc(width * height); } これならおk
- 169 名前:デフォルトの名無しさん [2018/02/27(火) 11:45:45.08 ID:r7ed+pq5a.net]
- ポインタの配列使っちゃえばいいじゃん。free()する時注意が必要だがアクセスがa[y][x]形式なのは同じだし。
- 170 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 11:48:09.27 ID:w9pRJ3lK0.net]
- 二次元配列とポインタの配列だと、使い方が違うでしょう
- 171 名前:デフォルトの名無しさん [2018/02/27(火) 12:21:42.40 .net]
- mallocされたサイズが分からんとか何言ってるの?
gccもVCも確保サイズを返す関数を提供してるだろ
- 172 名前:デフォルトの名無しさん [2018/02/27(火) 12:27:42.17 ID:r7ed+pq5a.net]
- >>164
確保時と解放時が違うが読み書きアクセスする時の表現は同じにできる。
- 173 名前: mailto:sage [2018/02/27(火) 12:30:04.09 ID:CvenUVT40.net]
- >>159
gcc6 では一筋縄ではいかなくなっているね…
- 174 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 12:35:33.45 ID:XfJ/ct090.net]
- >>165
非標準のね
- 175 名前: mailto:sage [2018/02/27(火) 17:51:59.04 ID:CvenUVT40.net]
- >>159
できた! https://mevius.5ch.net/test/read.cgi/tech/1434079972/36
- 176 名前: mailto:sage [2018/02/27(火) 18:02:32.91 ID:CvenUVT40.net]
- >>162
>>159 >char (*a)[width]; これに値をいれないといけないし、そもそも、それも含めて malloc() してほしい、のでは
- 177 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 18:07:21.76 ID:BEzsaLeta.net]
- ああ。先頭にポインタを詰め込んで一発で全部free()できるようにしたのか。
- 178 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 19:24:56.97 ID:LuvO3mbWM.net]
- >>165
非標準だし、そもそもそんなものを使う必要は滅多にない
- 179 名前:デフォルトの名無しさん [2018/02/27(火) 19:27:39.38 .net]
- >>168,172
上の方でmalloc作者じゃなきゃrealloc作れないっていう主張があったから、普通は処理系で専用関数を提供してるだろって話
- 180 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 19:47:16.45 ID:jvpYfXKk0.net]
- >>159
わざわざ関数を設計しなくても、例えば3次元配列なら int ary[dim_z][dim_y][dim_x]; int (*ptr)[dim_y][dim_x] = malloc(sizeof(int) * dim_z * dim_y * dim_x); とやれば ary と ptr は同等に扱えないかな。 ptrはfree()する必要があること、sizeofの対象にしたとき同じ値を返さないことは 別関数を作っても同じだし。
- 181 名前:デフォルトの名無しさん [2018/02/27(火) 19:54:46.22 .net]
- >>159は二次元配列を確保とは言っているがインタフェースは特に注文ないんだからxとyと型サイズを掛けて(必要ならアラインメント考慮も入れて)mallocしてvoidポインタを返せばいいよな
- 182 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 20:35:43.21 ID:XfJ/ct090.net]
- >>174
別関数を作っても同じとは思わないな void dim_alloc(size_t, size_t, char (**)[*]); void dim_free(size_t width, char const volatile (*head)[width]) { free((void *)head); } dim_allocが内部的に割り付けに使っている手段を dim_freeに隠蔽する意味はあるんだから
- 183 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 20:42:39.05 ID:LuvO3mbWM.net]
- >>173
> 上の方でmalloc作者じゃなきゃrealloc作れないっていう主張があった そもそもその主張がおかしいだろ
|

|