- 1 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 23:32:27.83 ID:yWVViPyIM.net]
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C2x ドラフト www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.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言語なら俺に聞け 158 https://mevius.5ch.net/test/read.cgi/tech/1640401906/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 75 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 01:50:19.99 ID:FEOcjYNtd.net]
- >>70
switchはループ制御文ではないのになんでwhileやforと同じなのか
- 76 名前:デフォルトの名無しさん (ワッチョイ c202-mhOm) mailto:sage [[ここ壊れてます] .net]
- break は今いるブロック (波括弧といてもいい) から一つ外のブロックに出る
という意味を持つ
- 77 名前:はちみつ餃子 mailto:sage [2022/08/19(金) 09:19:24.91 ID:FT/EuRcZ0.net]
- >>75
そんなわけないだろ。
- 78 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 10:12:45.49 ID:FEOcjYNtd.net]
- それならif文からも脱出できるはずだができない
あくまでswitchが特例でループ文扱いされてるので脱出できる
- 79 名前:はちみつ餃子 mailto:sage [2022/08/19(金) 10:34:49.15 ID:FT/EuRcZ0.net]
- switch やループ構文はブロックとは独立した構文で、
これらを使うときにブロックを作らないことも出来るし、 逆に関係ないところでブロックを作ることも出来るので break をブロックと対応付けさせると変なことになるんだよな。 たとえば以下のコードでの break は実際には switch を抜けるだけなので printf は実行されるが、 ブロックを抜けるほうが自然だと思うか? #include <stdio.h> int main(void) { { switch(1) case 1: break; printf("hello\n"); } }
- 80 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 12:00:39.57 ID:FEOcjYNtd.net]
- そんな極端な例でなくても…
case 1: if( x < 4 ){ ……… break; } ……… break; 普通によく書くと思うが このif文の中のbreakでもちゃんと一番内側のswitch文の外に飛んでいく switch(k){ case 1: { int tmp_x; //この中だけで使う一時変数 ……… break; } case 2: ……… } こんな書き方でも(あまりよくないけど)ブロックは無視してswitch文の外に飛んでいく
- 81 名前:デフォルトの名無しさん [2022/08/19(金) 18:10:20.82 ID:opjWCie4a.net]
- for の中の if の中の break で単に if から脱出されても
おまえなにしとんねん 開いた口が塞がらない状態になる罠
- 82 名前:デフォルトの名無しさん [2022/08/19(金) 18:16:48.08 ID:opjWCie4a.net]
- do{
やりたいこと }while(0); っていう構造に変換するマクロは良く使われるが switch(0) default: { やりたいこと } なんかもアリなんだな
- 83 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 00:31:59.15 ID:YrrCECg9M.net]
- >>81
switchの方は初めて見た! 知らずに見たらちょっと考えちゃうよw
- 84 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 13:41:46.51 ID:DoG0cN1P0.net]
- 考えるな
感じるんだ
- 85 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 13:47:51.88 ID:zH67Kdp1d.net]
- 俺は()で囲むな
- 86 名前:デフォルトの名無しさん [2022/08/21(日) 07:14:13.14 ID:sPdtHxRX0.net]
- エロい人「割り込みの中で関数呼ぶな
なぜ??
- 87 名前:デフォルトの名無しさん mailto:sage [2022/08/21(日) 07:26:44.64 ID:calK6kMNd.net]
- バカな会社で働いてるから
- 88 名前:デフォルトの名無しさん mailto:sage [2022/08/21(日) 07:46:27.87 ID:3JIuIXQv0.net]
- >>85
環境によるけど割り込みに専用のスタック使ってるシステムとかだとそのスタックサイズはそれほど大きくなかったりするからかもね てかそのエロい人に聞けよ
- 89 名前:デフォルトの名無しさん mailto:sage [2022/08/21(日) 08:14:56.03 ID:lk6Yo6Bld.net]
- 再入可能でない関数ならわかるな
- 90 名前:デフォルトの名無しさん [2022/08/21(日) 09:42:18.04 ID:j3ukytx2a.net]
- stack8段しか無いcpuか
- 91 名前:デフォルトの名無しさん mailto:sage [2022/08/21(日) 10:25:51.63 ID:calK6kMNd.net]
- 割込はなるべく速く返さないといけないので
関数呼び出しのオーバーヘッドを嫌うというのもある
- 92 名前:デフォルトの名無しさん mailto:sage [2022/08/21(日) 16:28:21.98 ID:lk6Yo6Bld.net]
- だとすると>>86でFAだな
- 93 名前:デフォルトの名無しさん [2022/08/22(月) 09:18:01.26 ID:rymTPk3V0.net]
- 微妙なタイミング調整の_nop()マクロをオプティマイザが勝手に除去するのだがwwwwwwwwww
どうすりゃいいのよ
- 94 名前:デフォルトの名無しさん (ワッチョイ 7f01-cac/) mailto:sage [[ここ壊れてます] .net]
- >>92
インラインアセンブラ そもそも今時命令実行タイミングに依存する構成にするなよ...
- 95 名前:デフォルトの名無しさん mailto:sage [2022/08/22(月) 10:11:25.02 ID:xRj4VImad.net]
- Z80や6800でそんなことしてたけど
今時のCPUはnopでさえ速度が変動するからな
- 96 名前:はちみつ餃子 mailto:sage [2022/08/22(月) 10:15:31.51 ID:/BwQkwng0.net]
- インラインアセンブラも最適化の対象になることがある。
現代的な開発環境なら intrinsic 関数が提供されてないか?
- 97 名前:デフォルトの名無しさん [2022/08/22(月) 11:43:22.34 ID:sosiPY3F0.net]
- 最適化するなよw
そういうのを消すための最適化だろw
- 98 名前:デフォルトの名無しさん [2022/08/22(月) 13:53:48.03 ID:KX6mg0Ola.net]
- 最適化したら >>96 が消えました
- 99 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 11:33:41.80 ID:sT5+wQDE0.net]
- インライン記述じゃなく別個にアセンブラソースファイルに書いてアセンブルしろってことだな。
- 100 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 11:49:07.60 ID:iqB4j8J+0.net]
- スカイネット 「環境の最適化のため、人類を消去しました」
- 101 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 13:23:55.27 ID:sT5+wQDE0.net]
- 環境の最適化のためにスカイネット自身の消去が最適だとなったら実行するのかね。
- 102 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 16:20:32.32 ID:WIrE9pd90.net]
- 組み込みでは下みたいに使った
__asm__ __volatile__()
- 103 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 20:06:49.61 ID:PyYJPp//d.net]
- >>99
スカイネット「あれっ、誰に報告してんだろ…私ったら(テヘ)
- 104 名前:デフォルトの名無しさん mailto:sage [2022/08/26(金) 06:44:51.10 ID:DLmHAhGrd.net]
- >>100
i cannot self-terminate.て言ってたね
- 105 名前:デフォルトの名無しさん [2022/09/04(日) 05:09:23.47 ID:wx4H3U1ta.net]
- Learn C Programming with Dr. Chuck (feat. classic book by Kernighan and Ritchie)
freeCodeCamp.org チャンネル登録者数 619万
- 106 名前:デフォルトの名無しさん [2022/09/04(日) 10:23:39.44 ID:RQxkFcRFa.net]
- >>104
1本で9時間超えてるのかすげー
- 107 名前:デフォルトの名無しさん [2022/09/04(日) 19:10:32.17 ID:Rodv+P070.net]
- C言語のサンプルコードで関数内で関数プロトタイプ宣言するコードに出くわしました。
コンパイル通らないだろうと思って、clangで下記のような関数内に関数プロトタイプ宣言する コードをコンパイルするとエラーなく通りました。 C言語において関数内でプロトタイプ宣言をする利点というか理由というのはどういうものがあるのでしょうか。 #include<stdio.h> void hello(void) { printf("%s\n","hello world"); } int main(void) { void hello(void); hello(); return 0; }
- 108 名前:デフォルトの名無しさん mailto:sage [2022/09/04(日) 21:54:56.70 ID:moKhjs2Z0.net]
- >>106
私見だけど、その関数内でのみ呼び出すことを強調しているのかもしれない。 あと余計なこと。お遊びのネタ。本番で使うなキケン。 GCC拡張には関数の中で関数を定義できる機能がある。clangはこの先もおそらくサポートしない。 詳細が気になるなら gcc trampoline nested function で調べてね。
- 109 名前:デフォルトの名無しさん mailto:sage [2022/09/04(日) 22:27:57.67 ID:KVirSSMD0.net]
- main内の void hello(void); てプロトタイプ宣言(?)意味あんの?
- 110 名前:デフォルトの名無しさん [2022/09/05(月) 01:27:33.63 ID:TNrcEOZR0.net]
- 具体的に言うと、ここの
『UMLの状態遷移図をC言語のStateパターンで実装&単体テストしてみる』というタイトルのブログの void init_last_substate(FSM *fsm); 関数のプロトタイプ宣言です。State.c内でプロトタイプ宣言すればいいのに なぜかState.c内のState_init関数内でプロトタイプ宣言しているのはなんでかなと。 実装自体はSubState.c内で定義されているのでState.c内で使うのであれば プロトタイプ宣言が必要であることはわかるんですが、なんで関数内でプロトタイプ 宣言しているのかなと。
- 111 名前:はちみつ餃子 mailto:sage [2022/09/05(月) 01:31:45.75 ID:QNR7HRCU0.net]
- >>106
言語仕様にもある有効な文法だけれど、それほど使われることはない。 宣言はそのスコープで有効になるから直接的な理由としては >>107 が述べている通り限られた範囲での使用を想定しているということだと思う。 範囲を限りたいのが何故かなのかというのはプログラム全体の構成によるので全体を見ないと意図を推し量ることは出来ない。 なので正確な事情はわからないけども、あえて一例として私がそういう書き方をするとしたらという前提で空想すると ・ あまり色々なところで呼ばれたくない関数がある ・ しかし呼び出し箇所は他の翻訳単位にあるので内部リンケージにすることも出来ない というようなときにはヘッダにもファイルスコープにも宣言を書きたくないと思うことはあるかもしれない。
- 112 名前:デフォルトの名無しさん [2022/09/05(月) 01:40:28.48 ID:TNrcEOZR0.net]
- >>110
確かにそのコードはstatic宣言を各所に織り交ぜており、他ファイルからは関数が 呼び出せないようにしてありました。公開する関数は最小限にという感じ。 関数内でも関数のプロトタイプ宣言できるというのも、C言語の中では単なる変数宣言 double p; と同じ扱いみたいに考えればいいのかもしれないと思いました。 typedef で関数型定義できますが、それと同じような扱いということです。 とりあえず納得しました。ありがとうございます。
- 113 名前:デフォルトの名無しさん mailto:sage [2022/09/05(月) 04:58:10.54 ID:YC0Agv6v0.net]
- >>106
理由は昔のいわゆるK%R Cの名残だ main(argc, argv) char **argv; { extern printf(), exit(); auto i 0; for ( ; i < argc; i =+ 1) printf("%s\n", argv[i]); exit(0); }
- 114 名前:デフォルトの名無しさん mailto:sage [2022/09/05(月) 04:59:26.44 ID:YC0Agv6v0.net]
- 今そんなことをする必要は皆無
関数の実体がグローバルなのに 宣言がローカルなのは合理性を欠くだけ
- 115 名前:デフォルトの名無しさん (ワッチョイ 27bb-Iguz) mailto:sage [[ここ壊れてます] .net]
- staticじゃなけりゃどこからでも呼べるからな
- 116 名前:はちみつ餃子 mailto:sage [2022/09/05(月) 11:16:15.22 ID:QNR7HRCU0.net]
- そこらへんはプログラム的な都合だけでなく読む人に対しての意思表示という場合もあるから必要性だけで解釈することは出来ないよ。
今から書くプログラムではやめといたほうが良いが、この場合は今、目の前に実際にそう書かれているものがあるという話だから……。
- 117 名前:デフォルトの名無しさん mailto:sage [2022/09/05(月) 12:45:24.21 ID:NIl1ZTkW0.net]
- 何か古い記述方法だった気がする
- 118 名前:デフォルトの名無しさん [2022/09/05(月) 17:10:39.70 ID:BqjHubPk0.net]
- 何十年も前の機種依存C言語かもな
- 119 名前:デフォルトの名無しさん mailto:sage [2022/09/05(月) 21:43:16.79 ID:WAs1jsMo0.net]
- 古い表記を引っ張ってきたのか
意思表示としてそう記述した(可能性が高い)のか 全て俯瞰してみないとい結論は出ないだろうが そうできたところで、自分が使うことはないだろうといった代物
- 120 名前:デフォルトの名無しさん [2022/09/05(月) 22:13:22.67 ID:hTc6qxUq0.net]
- うむ。ないなあ。
- 121 名前:デフォルトの名無しさん (アウアウウー Sa8b-Ro21) [[ここ壊れてます] .net]
- namespace ってイマドキの C にあるの?
- 122 名前:デフォルトの名無しさん mailto:sage [2022/09/06(火) 10:01:27.84 ID:8iFyZ+3k0.net]
- ない
- 123 名前:デフォルトの名無しさん mailto:sage [2022/09/06(火) 20:11:23.99 ID:OXwnsseu0.net]
- 今度の規格には static_assert は入るのでしょうか?
- 124 名前:はちみつ餃子 mailto:sage [2022/09/06(火) 20:15:43.73 ID:TAdoM7Dg0.net]
- >>122
C23 に static_assert は入る。 C11 から _Static_assert が有ったけどこれも Alternative Spelling として残る。
- 125 名前:デフォルトの名無しさん [2022/09/07(水) 01:40:32.73 ID:nFqp2Ghc0.net]
- 構造体の一括初期化の仕組みがよくわかりません。
#include<stdio.h> enum Flag { First = 1, Second = 2, Third = 3, Finish = 4 }; typedef struct _FSM { size_t eof; size_t bytes; size_t flags; } FSM; static FSM initState = { 0, 0, First}; void FSM_init(FSM *self) { self = &initState; } int main(void) { FSM fsm; FSM_init(&fsm); printf("%zu", fsm.flags); return 0; } とFSM_initでFSM構造体のメンバの初期化を行おうとしたのですが、fsm.flagsにはゴミの値が入ってしまいます。 &self = initState;ではなく一つ一つ所属物を初期化すればちゃんと初期化できるのですが、 できればこの一括で初期化する方法のどこがまずいのか教えてほしいです。
- 126 名前:デフォルトの名無しさん [2022/09/07(水) 01:42:03.54 ID:nFqp2Ghc0.net]
- 肝は
static FSM initState = { 0, 0, First}; でここの初期化がまずいみたいですがよくわかりません。
- 127 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 01:45:22.24 ID:n6FjKa3l0.net]
- *self = initState;
- 128 名前:デフォルトの名無しさん [2022/09/07(水) 02:03:29.87 ID:nFqp2Ghc0.net]
- >>126
うまくいきましたが、すいません。 *self=initState; と self = &initState; の違いがわかりません。 ポインタに対してなんでアドレスを渡す形だとまずいことが理解できません。
- 129 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 02:27:51.81 ID:FvUlSDCrd.net]
- >>127
>self = &initState; selfはアドレスをコピーした仮引数
- 130 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 03:14:26.39 ID:7wpEGaL10.net]
- *selfはselfの実体の参照
&initStateはアドレスの参照
- 131 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 07:32:36.16 ID:UR0dF6Y90.net]
- >>127
self = &initState; これはポインタ変数selfにinitStateのアドレスを代入するが このままFSM_init関数から戻っているので、代入結果が即座に破棄され 何もしていないに等しい *self = initState; これはポインタ変数selfが指し示す先つまり構造体変数fsmに 構造体変数initStateの内容を転記する FSM_init関数から戻ってもmainの変数fsmは残っているので 後続のprintf関数の実行結果に反映される
- 132 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 09:54:43.70 ID:S6Oj2ikO0.net]
- void func(int a) { a = 10; }
- 133 名前:
int b = 50; func(a); とやっても a は 10 にならず a は 50 のまま 関数引数の型のままの書き戻しは 呼び出し元に反映されない これを int → int * に読み替えた場合が質問のケース [] - [ここ壊れてます]
- 134 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 10:01:21.59 ID:S6Oj2ikO0.net]
- 訂正
int b = 50; func(b); とやっても b は 10 にならず b は 50 のまま
- 135 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 10:16:34.68 ID:S6Oj2ikO0.net]
- ・ポインタを渡して関数内ではその指し先を利用して内容を書き換える (scanf みたいな感じ)
・戻り値で内容をどかっと戻す (=呼び出し元で代入してね) Cの文法ではこの2パターン
- 136 名前:ハノン mailto:sage [2022/09/07(水) 20:35:02.84 ID:DxyXj8J8H.net]
- >>127
参照 & は「ポインタで書くやりかた」の見せ方を変えただけ、と考えるのがいい すなわち、ポインタを使った書き方に習熟しないかぎり、参照の意味はわからない 参照をポインタから切り離して理解するのは不可能 参照がわからなければ、まず、ポインタを使った書き方ばかりで書きまくり、ポインタなら自信がある、くらいになるのがいい 参照はポインタを理解してからはじめて使い始めるべきもの
- 137 名前:デフォルトの名無しさん [2022/09/07(水) 21:11:00.47 ID:nFqp2Ghc0.net]
- >>134
いやさすがにそこはわかるんで・・・。 ポインタ変数を格納している仮引数に新しいアドレス値を代入しても 関数から出たら破棄されるので意味ないってことやね。 ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。 当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、 fsm->state = &initState; だとうまくいくのになんでだろうと思って聞いた。 この場合、fsm->stateで実体参照しているわけやね。
- 138 名前:デフォルトの名無しさん [2022/09/07(水) 22:08:19.73 ID:nFqp2Ghc0.net]
- FILE *fp;
errno_t err; err = fopen_s(&fp, "file.txt", "rb"); でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを 渡さないといけないですが、これなんでポインタじゃまずいんですか。
- 139 名前:デフォルトの名無しさん (ワッチョイ e710-q8Yd) mailto:sage [[ここ壊れてます] .net]
- ポインタに入ってる数値を書き換えるからそうじゃなきゃ変えられないでしょ
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
- 140 名前:ハノン ◆QZaw55cn4c (US 0Hff-KcK1) mailto:sage [[ここ壊れてます] .net]
- もっとも、私は pascal から入ったから、ポインタなくして参照を理解していた人なのではありますが‥‥うーむ
- 141 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 22:31:50.29 ID:gjYyI5to0.net]
- ポインタのアドレス取ったときとかポインタのポインタでごちゃごちゃになる人は
とりあえずポインタは整数を保存してるだけって考えればいいよ 整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
- 142 名前:デフォルトの名無しさん [2022/09/07(水) 23:04:25.54 ID:nFqp2Ghc0.net]
- >>137
なるほど。 FILE *fp の中身が0というアドレスで、 fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても 変更できないことですね。*つけてポインタにならないと変更できないと。
- 143 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 23:32:06.28 ID:zeO2o007M.net]
- int hoge(int *a) { *a = 1; }
int hoge(int &a) { a = 1; } これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
- 144 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 23:35
]
- [ここ壊れてます]
- 145 名前::11.50 ID:nFqp2Ghc0.net mailto: >>141
int hoge(int &a) { a = 1; } 関数定義でアドレス演算子使えるんですか? [] - [ここ壊れてます]
- 146 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 23:39:24.34 ID:nFqp2Ghc0.net]
- 何回も質問しているものです。
base64エンコーディングのプログラムを作っていました。 エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と 突き合わせると後半合いません。 1行目もなぜか幅が合いません。 状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。 https://ideone.com/rPlXWX
- 147 名前:はちみつ餃子 mailto:sage [2022/09/07(水) 23:39:37.84 ID:51dNe1to0.net]
- >>142
それは C++ の機能の話ね。 機械語にされたときの実体としては参照はポインタと同じことをしている。
- 148 名前:デフォルトの名無しさん mailto:sage [2022/09/07(水) 23:41:02.70 ID:nFqp2Ghc0.net]
- 最初の付近はうまくエンコードされているんですが、途中でごみの値が入ってくる
ようでずれてきます。どこにゴミが入っているのかわかりません。
- 149 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 00:50:34.87 ID:0dKPxAYF0.net]
- tmpfile()で作られる作業ファイルはどこに作られますか?
/tmpですか? なんかそれらしきファイル無いんですが OS:Linux Mint
- 150 名前:はちみつ餃子 mailto:sage [2022/09/08(木) 01:00:19.58 ID:MG9wnc1h0.net]
- >>146
glibc だと P_tmpdir が使われた上で失敗したら /tmp に作る。 musl だと /tmp に決め打ち。 作ったファイルはクローズするかプロセスが終了したら削除される。
- 151 名前:143 mailto:sage [2022/09/08(木) 02:30:52.24 ID:MgWIrRAL0.net]
- コードの構造が自分でもわかり難かったので、フルスクラッチで書き直しました。
https://ideone.com/ddQPJy でも相変わらずどこかにゴミデータが入り込んでいるようです。 C言語特有の問題に由来していると思うのですが。。
- 152 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 02:56:32.93 ID:m+If4M0FM.net]
- >>148
上から下までスクロールしたら一瞬で分かったw
- 153 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 08:55:08.15 ID:0dKPxAYF0.net]
- >>147
サンクス 読み書きは出来るので作業ファイルは作られているんだろうけど・・・ getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ なんかモヤモヤするな
- 154 名前:はちみつ餃子 mailto:sage [2022/09/08(木) 09:15:06.66 ID:MG9wnc1h0.net]
- >>150
3.11 以降の Linux カーネル、かつファイルシステムのサポートがあれば名前のないファイルを作るということらしい。 他のプロセスからは観測することが出来ない。
- 155 名前:デフォルトの名無しさん (アウアウウー Sa8b-Ro21) [[ここ壊れてます] .net]
- >>143
3の倍数と4の倍数でずれるから 穴埋め方法の仕様嫁
- 156 名前:デフォルトの名無しさん (ワッチョイ e769-9TNW) mailto:sage [[ここ壊れてます] .net]
- 8bit目が立ってるデータだと char を size_t にキャストするとよろしくない可能性
あと末尾のパディング処理 最新は rfc4648 か
- 157 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 10:12:47.05 ID:dSUuwrfW0.net]
- >>148
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
- 158 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 10:22:53.70 ID:dSUuwrfW0.net]
- >>150
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ https://sonic 64.com/2004-12-07.html
- 159 名前:はちみつ餃子 mailto:sage [2022/09/08(木) 10:30:42.77 ID:MG9wnc1h0.net]
- >>148
主旨とはずれるが…… 下線で始まる識別子はファイルスコープで予約されている。 下線で始まって大文字が続く識別子は常に予約されている。 予約されている識別子についてなんらかの宣言・定義した結果は未定義。 入門用の解説でやってることもよくあるけど真似しちゃ駄目。 構造体タグは使わないなら省略してしまったほうがよいと思う。
- 160 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 10:34:35.91 ID:0dKPxAYF0.net]
- >>150
>>155 ありがとう!すっきりした
- 161 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 10:35:11.25 ID:0dKPxAYF0.net]
- >>150→>>151ね
- 162 名前:デフォルトの名無しさん mailto:sage [2022/09/08(木) 23:34:00.51 ID:QimgDhZ1M.net]
- >>148
解決したのか知らんけど、freadが必ずBUFSIZE分読み込むとは限らんぞ なので、直後のforループはnreadまでにしないとゴミを処理してしまう
- 163 名前:デフォルトの名無しさん mailto:sage [2022/09/09(金) 00:38:56.32 ID:eFldOldK0.net]
- >>159
ありがとう。まだ未解決。格闘中。 なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、 結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。 ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
- 164 名前:148 mailto:sage [2022/09/09(金) 01:45:37.54 ID:eFldOldK0.net]
- 読み込むデータによってゴミデータが入ったり入らなかったりすることがわかった。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。 https://ideone.com/HRogms 読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。 何がまずいのかな。
- 165 名前:148 mailto:sage [2022/09/09(金) 01:56:18.41 ID:eFldOldK0.net]
- わかった。日本語部分が処理できてなかったことが原因だ。
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで 出力すると日本語部分が文字化けしてしまうのはなぜ?
- 166 名前:148 mailto:sage [2022/09/09(金) 01:57:45.15 ID:eFldOldK0.net]
- 1バイトで読み込んでるから2バイト文字がうまく読み込めないということかな?
- 167 名前:148 mailto:sage [2022/09/09(金) 02:04:19.38 ID:eFldOldK0.net]
- 1バイトづつバイナリデータを読み込みしたかったので、fread(buf,...)の
bufは char buf[BUFSIZE]; で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。 単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。 https://ideone.com/GvpcAm 010111....のビット列を単純に書き込んでいるという理解だったのですが、 そういうわけではないんですかね?
- 168 名前:デフォルトの名無しさん [2022/09/09(金) 02:19:22.29 ID:V/M3y8c30.net]
- >>153が正しい
size_t stack = (size_t)(unsigned char)c;
- 169 名前:デフォルトの名無しさん mailto:sage [2022/09/09(金) 02:52:44.78 ID:eFldOldK0.net]
- >>165
スタックデータが11111・・・に初期化されるという問題は直りました。 charだと11111111の取り扱いまずいんですね。 char 0~255 の値を格納できるという素朴な理解で使ってたんですが、 unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
- 170 名前:148 mailto:sage [2022/09/09(金) 02:53:47.99 ID:eFldOldK0.net]
- >>153
読み返してみると鮮やかですね。昨日の段階では何のことやら?って感じでしたが。 ありがとうございます。
- 171 名前:デフォルトの名無しさん mailto:sage [2022/09/09(金) 03:37:48.54 ID:JkEyHRIQ0.net]
- >>166
>unsigned char と char ってどう違うのか unsigned charは符号なしで値域は 0 ~ 255 signed charは符号ありで値域は -128 ~ 127 charは処理系依存でsignedかもしれないしunsignedかもしれない 他の整数型にキャストしたり比較したりする時は特に注意が必要
- 172 名前:デフォルトの名無しさん mailto:sage [2022/09/09(金) 06:49:36.79 ID:Cx7xgzBv0.net]
- >>168
char は 8bit とは限らん、というのは置いといて > charは処理系依存でsignedかもしれないしunsignedかもしれない charはsigned charやunsigned charとは違う型だよ https://www.jpcert.or.jp/sc-rules/c-str04-c.html
- 173 名前:デフォルトの名無しさん [2022/09/09(金) 10:32:00.65 ID:PQbAFFlG0.net]
- 数値と文字コードの認識の違いはどこらへんに出てくるのでしょうか?
- 174 名前:デフォルトの名無しさん [2022/09/09(金) 16:58:25.15 ID:ZqL3j+SP0.net]
- 環境依存によるとこが多すぎて、その都度環境に応じて調べるしかない
プログラム全般に言える事
- 175 名前:デフォルトの名無しさん mailto:sage [2022/09/09(金) 20:26:03.68 ID:wh55t5+tM.net]
- 文字はutf-8でも一文字が数バイト必要な事があるので、charはもはや要らない子と言える
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
|

|