- 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
- 2 名前:デフォルトの名無しさん [2018/02/20(火) 02:33:02.25 ID:ji3scNPMa.net]
- 屑はFPGA用のCの話でもしたかったのかな
- 3 名前:デフォルトの名無しさん mailto:sage [2018/02/20(火) 02:44:25.94 ID:m4PE5Z7I0.net]
- C言語の話題のみ取り扱います
- 4 名前:デフォルトの名無しさん mailto:sage [2018/02/20(火) 14:09:01.08 ID:/DCDJ0JEd.net]
- ptintfの%nはハッカー用に用意されているのでしょうか?
- 5 名前:デフォルトの名無しさん mailto:sage [2018/02/20(火) 15:18:27.75 ID:hfa6NjO10.net]
- 違います
デジタル回路の設計用です
- 6 名前:デフォルトの名無しさん [2018/02/20(火) 17:08:35.47 ID:mAwVhufea.net]
- 0xがあるのに
0bがないので面倒っちい
- 7 名前:デフォルトの名無しさん mailto:sage [2018/02/20(火) 18:08:25.47 ID:cb0RUbY/d.net]
- visual studioが重いからvisual studio codo使って勉強してますが、これでデバッグできる環境設定がネットのだとよく分からないんですがどうやってやれば出来ます?
- 8 名前:デフォルトの名無しさん mailto:sage [2018/02/20(火) 19:11:44.29 ID:qvO4qxFaa.net]
- スレチだがVSが重い環境ってのが気になる
- 9 名前:デフォルトの名無しさん mailto:sage [2018/02/20(火) 21:29:40.57 ID:TNHwfC6jM.net]
- オトコは黙ってG・D・B
- 10 名前: mailto:sage [2018/02/20(火) 21:56:11.61 ID:SJPS4KKx0.net]
- >>9
gdb からは逃げ回っています、可能な限り printf() デバッグの方を選択します
- 11 名前:デフォルトの名無しさん [2018/02/21(水) 00:51:16.84 ID:srFoMZ/m0.net]
- そしてバッファリングされてしまうと
- 12 名前: mailto:sage [2018/02/21(水) 00:54:55.04 ID:jU0tYaxw0.net]
- >>11
fflush() は必ずペアで使いますよ、まあそれでも iostream<<と混在させるとぐちゃぐちゃになりますね
- 13 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 03:09:16.23 ID:srFoMZ/m0.net]
- ここはC言語のスレなので iostream の事は忘れてくれ。
- 14 名前:デフォルトの名無しさん [2018/02/21(水) 07:13:52.97 .net]
- setbuf(stdout, null);
setbuf(stderr, null); しとけばいいじゃん
- 15 名前:デフォルトの名無しさん [2018/02/21(水) 10:46:31.37 ID:zwuXHePGF.net]
- おそくなる
- 16 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 10:56:41.04 ID:t+c4IaP2d.net]
- 変数宣言後に値を代入する前にprintfで表示させると数値がでてきますがこれは何の数値ですか?
- 17 名前:デフォルトの名無しさん [2018/02/21(水) 11:05:20.20 ID:zwuXHePGF.net]
- メモリのなかみをprintfの書式で解釈したもの
- 18 名前:デフォルトの名無しさん [2018/02/21(水) 11:22:42.78 ID:1i/dh69la.net]
- >>16
不定値 何が出てくるかわからない
- 19 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 16:26:52.49 ID:aBAsvFL30.net]
- 前に使ったデータの切れはし
- 20 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 16:52:48.64 ID:JslMlxHn0.net]
- 意味のある値を期待してはいけない謎の値
固定値か実行毎に変わるかも謎
- 21 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 17:12:09.16 ID:hxHF5FEW0.net]
- スカートめくりしてはいけないのと同じ、見てはいけない場所
- 22 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 20:06:03.04 ID:N7GlfDUh0.net]
- グローバル変数とstaticなローカル変数はその変数の型によって決められている値(0や0Lや0.0など)で初期化される
staticでないローカル変数(殆どはこれ)の値は不定
- 23 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 21:09:11.08 ID:enETD2EIM.net]
- なんで不定なの?
- 24 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 21:11:25.31 ID:eHdxbQfi0.net]
- 定まった値を入れる手間すら惜しんでもいいようにしてるから
- 25 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 21:53:04.93 ID:XwEf5GYC0.net]
- Cで引数リスト部分が空の関数ポインタと構造体値渡しを↓のように組み合わせて使うのはNGですか?
#include <stdio.h> long func(long a, char b, short c) { return a+b+c; } int main(int argc, char *argv[]) { long(*pfunc)() = func; struct { union { char a; short b; long c; } u[3]; } param; param.u[0].a = 1; param.u[1].b = 2; param.u[2].c = 3; printf("%d\n", pfunc(param)); return 0; }
- 26 名前:片山博文MZ mailto:sage [2018/02/21(水) 22:18:58.55 ID:UifE8nP3d.net]
- >>25
関数の型が不一致。
- 27 名前:デフォルトの名無しさん [2018/02/21(水) 22:55:45.50 ID:04BHZTp/x.net]
- 全くの初心者だがプログラム手に入れて動かしている。
最近はテトリスを動かした。C言語は学生の時に 挫折しているので高望はしていないが俺の時代よりも 学習環境も随分と楽になったもんだ。
- 28 名前:デフォルトの名無しさん mailto:sage [2018/02/21(水) 22:56:32.48 ID:9Zl2Px8M0.net]
- 昔はLSI-Cくらいしか無かったからな
- 29 名前:デフォルトの名無しさん [2018/02/21(水) 23:28:19.69 ID:J5LO2Gvl0.net]
- [] [[[ [[ [] ][ [] [ ] [] ][]] [[[ [] }
- 30 名前:デフォルトの名無しさん [2018/02/22(木) 00:28:06.89 ID:rOhp+nuf0.net]
- >>25
NGっていうか、それ普通にダメだよね。型が一致しないし。 まあ、Cコンパイラの実装によってはうまいことスタックに積まれて a, b, c が意図した通りに伝わるのかも知れないが、 しかしそれは実装依存だ。同じコンパイラ使っても最適化したら違う結果になるんじゃないだろうか。
- 31 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/22(木) 00:37:40.47 ID:Tb8t5xzSM.net]
- >>27
ロードランナー本を手に入れるんだ
- 32 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 01:29:12.41 ID:G3RQleyza.net]
- 不定でバグ起きるコード書くなんてふてぇ野郎だ
- 33 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 06:13:33.98 ID:WzMowRZZ0.net]
- >>25 >>30
引数リストが空の場合に「引数を持たない関数」ではなく 「引数の整合をチェックしない関数」と解釈する、 古いCでの動作を期待してるんじゃないかな。一応は規格準拠のはず。 コンパイルオプションでの規格指定がモロに影響する部分かも。 構造体を値渡しで引数にするとき、単純型とは異なるスタックの使い方をする 可能性があるから期待とおりに動くかもしれん、動かないかもしれん、だな。 仮に各要素をスタックに積む場合でも、単純型の並びとは逆順に スタックに積まれる可能性もあるんじゃないか。
- 34 名前:33 mailto:sage [2018/02/22(木) 06:16:17.25 ID:WzMowRZZ0.net]
- すまん、上の書き込みは >>25 の質問に対する >>26 >>30 へのコメントだ。
なんだか混ざってしまった。
- 35 名前:33 mailto:sage [2018/02/22(木) 06:49:26.50 ID:WzMowRZZ0.net]
- たびたび申し訳ない。
引数リストを書かない関数定義/宣言 func() は どのCでも func(void) とは解釈されないんだっけ? C99で将来廃止予定という情報は見つかったけど、まだ廃止されてないか。
- 36 名前:デフォルトの名無しさん [2018/02/22(木) 11:30:56.06 ID:bU9JilnM0.net]
- ウインドーズのコマンドラインオプションで記号が{があると
ダブルクオートで囲んでもこの記号の前で引数がおわってしまうんですけどなぜでしょうか? リナックスではそうはなりませんでした、{の前にエスケープ文字\を置くとうまくいきました。 なぜこうなるのか教えてください。調べてもわかりませんでした。
- 37 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 11:45:12.93 ID:mvuupCVs0.net]
- >>36
それはC言語の範疇ではないよ。 windowsのコマンドプロンプトやLinuxのシェルとかを調べるといいかも。
- 38 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 12:10:34.27 ID:rGSqnyaQ0.net]
- >>36
具体的にどういうプログラムやコマンドでどういう操作をしてそういう現象が
- 39 名前:Nきたのか、手順を一通り書いてみて
ひょっとして自作のCプログラムでそうなったとか? [] - [ここ壊れてます]
- 40 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 12:18:26.14 ID:bU9JilnM0.net]
- 自作のプログラムでやりました。
具体的に書くとa "abcd{efghijk"みたいにコマンドをじっこうすると メイン関数のおぷしょんをしらべるとabcdしか入っていませんでした。
- 41 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 13:37:57.37 ID:WzMowRZZ0.net]
- >>36
自作コマンドにコマンドライン引数が渡る前に何者かが横取りするんだな。 Windowsのバージョンとか、コマンドプロンプトの種類とか、 Cコンパイラの種類を書くと情報が集まりやすいかも。
- 42 名前: mailto:sage [2018/02/22(木) 14:12:50.33 ID:Ee7revq90.net]
- >>36
これで試してみて こちらでは現象を再現できない https://ideone.com/CZGZae
- 43 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 14:16:59.02 ID:qwLRFwLN0.net]
- >>39
gcc (i686-posix-dwarf-rev1, Built by MinGW-W64 project) 7.2.0 Microsoft Windows 10 Pro 10.0.16299 N/A ビルド 16299 → 再現せず
- 44 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 15:22:35.73 ID:Fv+tpfSs0.net]
- 関数の宣言とプロトタイプは別物
- 45 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 15:51:29.29 ID:ejK712YH0.net]
- >>39
コマンドシェルの都合か コンパイラのランタイムの都合か 環境(使ってるコンパイラ 実行環境:コマンドラインからなのかデバッガーからなのか etc) に 委ねられてるかんじだな
- 46 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 15:56:19.77 ID:bU9JilnM0.net]
- ありがとうございます。
シェルを変えたらできました。
- 47 名前:デフォルトの名無しさん [2018/02/22(木) 16:30:38.85 ID:GyUXMKgfa.net]
- >>45
シェルって?何から何に変えたの?
- 48 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 16:57:56.68 ID:bU9JilnM0.net]
- eshellからmsys2に付属のやつに替えますた
- 49 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 17:29:33.80 ID:rGSqnyaQ0.net]
- >>47
それを先に言わないと 一番肝心のことじゃないか・・
- 50 名前:デフォルトの名無しさん [2018/02/22(木) 17:31:08.76 ID:4gldXmu7a.net]
- >>47
eshellは{}に特殊な意味がある。 それはeshellコマンドの実行結果に置き換えられる。(shのバッククオートと似ている)。
- 51 名前:デフォルトの名無しさん mailto:sage [2018/02/22(木) 21:33:01.57 ID:7WUP8gc30.net]
- スロットゲームを作成しようと思っていろいろサイト見てるんですけど、数字の1〜9を順番にループ表示ってどうやるんですか?
- 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使えば充分で分かりやすくて確実だ。
|

|