!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C2x ドラフト
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.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/
※前スレ
C言語なら俺に聞け 158
https://mevius.5ch.net/test/read.cgi/tech/1640401906/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 159
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワンミングク MMa2-RRwJ)
2022/08/04(木) 23:32:27.83ID:yWVViPyIM110はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/05(月) 01:31:45.75ID:QNR7HRCU0 >>106
言語仕様にもある有効な文法だけれど、それほど使われることはない。
宣言はそのスコープで有効になるから直接的な理由としては >>107 が述べている通り限られた範囲での使用を想定しているということだと思う。
範囲を限りたいのが何故かなのかというのはプログラム全体の構成によるので全体を見ないと意図を推し量ることは出来ない。
なので正確な事情はわからないけども、あえて一例として私がそういう書き方をするとしたらという前提で空想すると
・ あまり色々なところで呼ばれたくない関数がある
・ しかし呼び出し箇所は他の翻訳単位にあるので内部リンケージにすることも出来ない
というようなときにはヘッダにもファイルスコープにも宣言を書きたくないと思うことはあるかもしれない。
言語仕様にもある有効な文法だけれど、それほど使われることはない。
宣言はそのスコープで有効になるから直接的な理由としては >>107 が述べている通り限られた範囲での使用を想定しているということだと思う。
範囲を限りたいのが何故かなのかというのはプログラム全体の構成によるので全体を見ないと意図を推し量ることは出来ない。
なので正確な事情はわからないけども、あえて一例として私がそういう書き方をするとしたらという前提で空想すると
・ あまり色々なところで呼ばれたくない関数がある
・ しかし呼び出し箇所は他の翻訳単位にあるので内部リンケージにすることも出来ない
というようなときにはヘッダにもファイルスコープにも宣言を書きたくないと思うことはあるかもしれない。
111デフォルトの名無しさん (ワッチョイ c710-bBdM)
2022/09/05(月) 01:40:28.48ID:TNrcEOZR0 >>110
確かにそのコードはstatic宣言を各所に織り交ぜており、他ファイルからは関数が
呼び出せないようにしてありました。公開する関数は最小限にという感じ。
関数内でも関数のプロトタイプ宣言できるというのも、C言語の中では単なる変数宣言
double p;
と同じ扱いみたいに考えればいいのかもしれないと思いました。
typedef で関数型定義できますが、それと同じような扱いということです。
とりあえず納得しました。ありがとうございます。
確かにそのコードはstatic宣言を各所に織り交ぜており、他ファイルからは関数が
呼び出せないようにしてありました。公開する関数は最小限にという感じ。
関数内でも関数のプロトタイプ宣言できるというのも、C言語の中では単なる変数宣言
double p;
と同じ扱いみたいに考えればいいのかもしれないと思いました。
typedef で関数型定義できますが、それと同じような扱いということです。
とりあえず納得しました。ありがとうございます。
112デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/05(月) 04:58:10.54ID:YC0Agv6v0 >>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);
}
理由は昔のいわゆる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);
}
113デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/05(月) 04:59:26.44ID:YC0Agv6v0 今そんなことをする必要は皆無
関数の実体がグローバルなのに
宣言がローカルなのは合理性を欠くだけ
関数の実体がグローバルなのに
宣言がローカルなのは合理性を欠くだけ
114デフォルトの名無しさん (ワッチョイ 27bb-Iguz)
2022/09/05(月) 05:43:33.44ID:H4wLhjVj0 staticじゃなけりゃどこからでも呼べるからな
115はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/05(月) 11:16:15.22ID:QNR7HRCU0 そこらへんはプログラム的な都合だけでなく読む人に対しての意思表示という場合もあるから必要性だけで解釈することは出来ないよ。
今から書くプログラムではやめといたほうが良いが、この場合は今、目の前に実際にそう書かれているものがあるという話だから……。
今から書くプログラムではやめといたほうが良いが、この場合は今、目の前に実際にそう書かれているものがあるという話だから……。
116デフォルトの名無しさん (ワッチョイ 5f97-MdAs)
2022/09/05(月) 12:45:24.21ID:NIl1ZTkW0 何か古い記述方法だった気がする
117デフォルトの名無しさん (ワッチョイ 675f-aOQU)
2022/09/05(月) 17:10:39.70ID:BqjHubPk0 何十年も前の機種依存C言語かもな
118デフォルトの名無しさん (ワッチョイ c701-9TNW)
2022/09/05(月) 21:43:16.79ID:WAs1jsMo0 古い表記を引っ張ってきたのか
意思表示としてそう記述した(可能性が高い)のか
全て俯瞰してみないとい結論は出ないだろうが
そうできたところで、自分が使うことはないだろうといった代物
意思表示としてそう記述した(可能性が高い)のか
全て俯瞰してみないとい結論は出ないだろうが
そうできたところで、自分が使うことはないだろうといった代物
119デフォルトの名無しさん (ワッチョイ 5fad-XKc1)
2022/09/05(月) 22:13:22.67ID:hTc6qxUq0 うむ。ないなあ。
120デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
2022/09/06(火) 09:31:54.11ID:9WMtC8ULa namespace ってイマドキの C にあるの?
121デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/06(火) 10:01:27.84ID:8iFyZ+3k0 ない
122デフォルトの名無しさん (ワッチョイ c7e6-KcK1)
2022/09/06(火) 20:11:23.99ID:OXwnsseu0 今度の規格には static_assert は入るのでしょうか?
123はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/06(火) 20:15:43.73ID:TAdoM7Dg0124デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 01:40:32.73ID:nFqp2Ghc0 構造体の一括初期化の仕組みがよくわかりません。
#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;ではなく一つ一つ所属物を初期化すればちゃんと初期化できるのですが、
できればこの一括で初期化する方法のどこがまずいのか教えてほしいです。
#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;ではなく一つ一つ所属物を初期化すればちゃんと初期化できるのですが、
できればこの一括で初期化する方法のどこがまずいのか教えてほしいです。
125デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 01:42:03.54ID:nFqp2Ghc0 肝は
static FSM initState = { 0, 0, First};
でここの初期化がまずいみたいですがよくわかりません。
static FSM initState = { 0, 0, First};
でここの初期化がまずいみたいですがよくわかりません。
126デフォルトの名無しさん (ワッチョイ 7f46-6esP)
2022/09/07(水) 01:45:22.24ID:n6FjKa3l0 *self = initState;
127デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 02:03:29.87ID:nFqp2Ghc0 >>126
うまくいきましたが、すいません。
*self=initState;
と
self = &initState;
の違いがわかりません。
ポインタに対してなんでアドレスを渡す形だとまずいことが理解できません。
うまくいきましたが、すいません。
*self=initState;
と
self = &initState;
の違いがわかりません。
ポインタに対してなんでアドレスを渡す形だとまずいことが理解できません。
128デフォルトの名無しさん (スップ Sd7f-8uVF)
2022/09/07(水) 02:27:51.81ID:FvUlSDCrd129デフォルトの名無しさん (ワッチョイ 27bb-Iguz)
2022/09/07(水) 03:14:26.39ID:7wpEGaL10 *selfはselfの実体の参照
&initStateはアドレスの参照
&initStateはアドレスの参照
130デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/07(水) 07:32:36.16ID:UR0dF6Y90 >>127
self = &initState;
これはポインタ変数selfにinitStateのアドレスを代入するが
このままFSM_init関数から戻っているので、代入結果が即座に破棄され
何もしていないに等しい
*self = initState;
これはポインタ変数selfが指し示す先つまり構造体変数fsmに
構造体変数initStateの内容を転記する
FSM_init関数から戻ってもmainの変数fsmは残っているので
後続のprintf関数の実行結果に反映される
self = &initState;
これはポインタ変数selfにinitStateのアドレスを代入するが
このままFSM_init関数から戻っているので、代入結果が即座に破棄され
何もしていないに等しい
*self = initState;
これはポインタ変数selfが指し示す先つまり構造体変数fsmに
構造体変数initStateの内容を転記する
FSM_init関数から戻ってもmainの変数fsmは残っているので
後続のprintf関数の実行結果に反映される
131デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/07(水) 09:54:43.70ID:S6Oj2ikO0 void func(int a) { a = 10; }
int b = 50;
func(a);
とやっても a は 10 にならず a は 50 のまま
関数引数の型のままの書き戻しは 呼び出し元に反映されない
これを int → int * に読み替えた場合が質問のケース
int b = 50;
func(a);
とやっても a は 10 にならず a は 50 のまま
関数引数の型のままの書き戻しは 呼び出し元に反映されない
これを int → int * に読み替えた場合が質問のケース
132デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/07(水) 10:01:21.59ID:S6Oj2ikO0 訂正
int b = 50;
func(b);
とやっても b は 10 にならず b は 50 のまま
int b = 50;
func(b);
とやっても b は 10 にならず b は 50 のまま
133デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/07(水) 10:16:34.68ID:S6Oj2ikO0 ・ポインタを渡して関数内ではその指し先を利用して内容を書き換える (scanf みたいな感じ)
・戻り値で内容をどかっと戻す (=呼び出し元で代入してね)
Cの文法ではこの2パターン
・戻り値で内容をどかっと戻す (=呼び出し元で代入してね)
Cの文法ではこの2パターン
134ハノン ◆QZaw55cn4c (US 0Hff-KcK1)
2022/09/07(水) 20:35:02.84ID:DxyXj8J8H >>127
参照 & は「ポインタで書くやりかた」の見せ方を変えただけ、と考えるのがいい
すなわち、ポインタを使った書き方に習熟しないかぎり、参照の意味はわからない
参照をポインタから切り離して理解するのは不可能
参照がわからなければ、まず、ポインタを使った書き方ばかりで書きまくり、ポインタなら自信がある、くらいになるのがいい
参照はポインタを理解してからはじめて使い始めるべきもの
参照 & は「ポインタで書くやりかた」の見せ方を変えただけ、と考えるのがいい
すなわち、ポインタを使った書き方に習熟しないかぎり、参照の意味はわからない
参照をポインタから切り離して理解するのは不可能
参照がわからなければ、まず、ポインタを使った書き方ばかりで書きまくり、ポインタなら自信がある、くらいになるのがいい
参照はポインタを理解してからはじめて使い始めるべきもの
135デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 21:11:00.47ID:nFqp2Ghc0 >>134
いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。
いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。
136デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 22:08:19.73ID:nFqp2Ghc0 FILE *fp;
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。
137デフォルトの名無しさん (ワッチョイ e710-q8Yd)
2022/09/07(水) 22:22:19.78ID:gjYyI5to0 ポインタに入ってる数値を書き換えるからそうじゃなきゃ変えられないでしょ
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
138ハノン ◆QZaw55cn4c (US 0Hff-KcK1)
2022/09/07(水) 22:26:00.67ID:9LeLCbkKH もっとも、私は pascal から入ったから、ポインタなくして参照を理解していた人なのではありますが‥‥うーむ
139デフォルトの名無しさん (ワッチョイ e710-q8Yd)
2022/09/07(水) 22:31:50.29ID:gjYyI5to0 ポインタのアドレス取ったときとかポインタのポインタでごちゃごちゃになる人は
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
140デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:04:25.54ID:nFqp2Ghc0 >>137
なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。
なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。
141デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/07(水) 23:32:06.28ID:zeO2o007M int hoge(int *a) { *a = 1; }
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
142デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:35:11.50ID:nFqp2Ghc0143デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:39:24.34ID:nFqp2Ghc0 何回も質問しているものです。
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
https://ideone.com/rPlXWX
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
https://ideone.com/rPlXWX
144はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/07(水) 23:39:37.84ID:51dNe1to0145デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:41:02.70ID:nFqp2Ghc0 最初の付近はうまくエンコードされているんですが、途中でごみの値が入ってくる
ようでずれてきます。どこにゴミが入っているのかわかりません。
ようでずれてきます。どこにゴミが入っているのかわかりません。
146デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 00:50:34.87ID:0dKPxAYF0 tmpfile()で作られる作業ファイルはどこに作られますか?
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint
147はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 01:00:19.58ID:MG9wnc1h0148143 (ワッチョイ c710-CzlZ)
2022/09/08(木) 02:30:52.24ID:MgWIrRAL0 コードの構造が自分でもわかり難かったので、フルスクラッチで書き直しました。
https://ideone.com/ddQPJy
でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。
https://ideone.com/ddQPJy
でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。
149デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/08(木) 02:56:32.93ID:m+If4M0FM >>148
上から下までスクロールしたら一瞬で分かったw
上から下までスクロールしたら一瞬で分かったw
150デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 08:55:08.15ID:0dKPxAYF0 >>147
サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな
サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな
151はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 09:15:06.66ID:MG9wnc1h0152デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
2022/09/08(木) 09:25:12.09ID:JEMfdspaa153デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/08(木) 09:54:46.94ID:NWgtv/6U0 8bit目が立ってるデータだと char を size_t にキャストするとよろしくない可能性
あと末尾のパディング処理
最新は rfc4648 か
あと末尾のパディング処理
最新は rfc4648 か
154デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/08(木) 10:12:47.05ID:dSUuwrfW0 >>148
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
155デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/08(木) 10:22:53.70ID:dSUuwrfW0 >>150
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
https://sonic
64.com/2004-12-07.html
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
https://sonic
64.com/2004-12-07.html
156はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 10:30:42.77ID:MG9wnc1h0 >>148
主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。
主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。
157デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 10:34:35.91ID:0dKPxAYF0158デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 10:35:11.25ID:0dKPxAYF0159デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/08(木) 23:34:00.51ID:QimgDhZ1M160デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/09(金) 00:38:56.32ID:eFldOldK0 >>159
ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
161148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:45:37.54ID:eFldOldK0 読み込むデータによってゴミデータが入ったり入らなかったりすることがわかった。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
https://ideone.com/HRogms
読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
https://ideone.com/HRogms
読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。
162148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:56:18.41ID:eFldOldK0 わかった。日本語部分が処理できてなかったことが原因だ。
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?
163148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:57:45.15ID:eFldOldK0 1バイトで読み込んでるから2バイト文字がうまく読み込めないということかな?
164148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:04:19.38ID:eFldOldK0 1バイトづつバイナリデータを読み込みしたかったので、fread(buf,...)の
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
https://ideone.com/GvpcAm
010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
https://ideone.com/GvpcAm
010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?
165デフォルトの名無しさん (ワッチョイ 7f46-bBdM)
2022/09/09(金) 02:19:22.29ID:V/M3y8c30 >>153が正しい
size_t stack = (size_t)(unsigned char)c;
size_t stack = (size_t)(unsigned char)c;
166デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:52:44.78ID:eFldOldK0 >>165
スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
167148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:53:47.99ID:eFldOldK0168デフォルトの名無しさん (ワッチョイ 0701-+tyw)
2022/09/09(金) 03:37:48.54ID:JkEyHRIQ0 >>166
>unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要
>unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要
169デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/09(金) 06:49:36.79ID:Cx7xgzBv0 >>168
char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
https://www.jpcert.or.jp/sc-rules/c-str04-c.html
char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
https://www.jpcert.or.jp/sc-rules/c-str04-c.html
170デフォルトの名無しさん (ワッチョイ bfad-Am0N)
2022/09/09(金) 10:32:00.65ID:PQbAFFlG0 数値と文字コードの認識の違いはどこらへんに出てくるのでしょうか?
171デフォルトの名無しさん (ワッチョイ c701-tE3/)
2022/09/09(金) 16:58:25.15ID:ZqL3j+SP0 環境依存によるとこが多すぎて、その都度環境に応じて調べるしかない
プログラム全般に言える事
プログラム全般に言える事
172デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/09(金) 20:26:03.68ID:wh55t5+tM 文字はutf-8でも一文字が数バイト必要な事があるので、charはもはや要らない子と言える
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
173デフォルトの名無しさん (ラクッペペ MM8f-eA8r)
2022/09/09(金) 20:34:47.77ID:AfgZ2PrAM なお中国や日本、韓国などに限る
174デフォルトの名無しさん (ワッチョイ 7fbb-Hxh8)
2022/09/09(金) 21:21:58.31ID:CwUslwUl0 wchar_tこそ要らない子やん
お前一体何バイトなんだよ
お前一体何バイトなんだよ
175デフォルトの名無しさん (ワッチョイ 0701-+tyw)
2022/09/09(金) 23:02:27.43ID:JkEyHRIQ0176デフォルトの名無しさん (ワッチョイ 87ad-8Iqg)
2022/09/09(金) 23:22:11.84ID:qKP12tcq0 自分はvb→C言語→機械語だけど
機械語知らないとダメだよなって思ったわ
大体CPUの仕様と合わせるんだよな
8bitも昔のCPUの慣習出しさ
だからプレステのCPU大好きとかライゼンサイコー、いやいややはりインテルだろう
なんて言う自作オタがやり始めるとかなり速いんだよな
自作PCの構造はCPUの中身に似てるから
機械語知らないとダメだよなって思ったわ
大体CPUの仕様と合わせるんだよな
8bitも昔のCPUの慣習出しさ
だからプレステのCPU大好きとかライゼンサイコー、いやいややはりインテルだろう
なんて言う自作オタがやり始めるとかなり速いんだよな
自作PCの構造はCPUの中身に似てるから
177デフォルトの名無しさん (テテンテンテン MM3e-tdss)
2022/09/10(土) 00:37:03.60ID:d6i83HiwM178148 (ワッチョイ 5d10-V+uT)
2022/09/10(土) 02:16:33.70ID:bSy2C3T30 文字化けのところは手に負えないですが、おかげさまでbase64エンコーディングプログラムが完成しました。
ここで言われたことは全部含めてみました。
構造体のタグ、enum型、charじゃなくてuint8_t、終端処理など。
https://ideone.com/7wolLZ
コードが汚いなど直すところありましたらどしどしご意見ください。
とりあえず、最初に使ってみる言語はbase64エンコーディングプログラムを組んでみて
なれてみようという方針なので。
次はVBAで組んでみるか、sha256プログラムをC言語で組んでみようか考えてます。
ここで言われたことは全部含めてみました。
構造体のタグ、enum型、charじゃなくてuint8_t、終端処理など。
https://ideone.com/7wolLZ
コードが汚いなど直すところありましたらどしどしご意見ください。
とりあえず、最初に使ってみる言語はbase64エンコーディングプログラムを組んでみて
なれてみようという方針なので。
次はVBAで組んでみるか、sha256プログラムをC言語で組んでみようか考えてます。
179デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/11(日) 09:33:54.88ID:LP1WepGR0 struct tmって、冗長な設計になってるよね
たとえば tm_mon == 1 && tm_mday == 1 なら tm_yday == 0 のはずだけど tm_yday >= 1 にもなれる
こういう矛盾がある場合の扱いって規格票のどっかに書いてあったっけ?
たとえば tm_mon == 1 && tm_mday == 1 なら tm_yday == 0 のはずだけど tm_yday >= 1 にもなれる
こういう矛盾がある場合の扱いって規格票のどっかに書いてあったっけ?
180デフォルトの名無しさん (ブーイモ MM3e-0gnx)
2022/09/11(日) 14:26:36.00ID:Y1sYJFelM たとえば規格書のmktimeにはカレンダー時間で表現できなければ-1を返すって書いてあるかそう実装するのが正しそうだけども
181はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7d3e-OdF3)
2022/09/11(日) 14:31:15.93ID:D/VbhUuk0 >>180
tm_yday は無視するとも書いてあるぞ。
tm_yday は無視するとも書いてあるぞ。
182デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/11(日) 14:32:58.51ID:LP1WepGR0 レス㌧x
カレンダー時間で表現できるか否かということは
tm_year, tm_mon, tm_mdayのことで、tm_ydayには該当しない議論だよね
逆にtm_ydayに合わせるように補正はしないとなると
ここに優先順位があるのかな
カレンダー時間で表現できるか否かということは
tm_year, tm_mon, tm_mdayのことで、tm_ydayには該当しない議論だよね
逆にtm_ydayに合わせるように補正はしないとなると
ここに優先順位があるのかな
183デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/11(日) 14:34:54.92ID:LP1WepGR0 すまん、ちょっと外出する
夜には戻る
夜には戻る
184デフォルトの名無しさん (ブーイモ MM3e-0gnx)
2022/09/11(日) 14:37:22.22ID:Y1sYJFelM あらほんとだ。戻り値の説明しか見てなかったわ
185デフォルトの名無しさん (ワッチョイ ea01-FaWt)
2022/09/11(日) 15:00:19.15ID:hGIJSvzu0 >>182
そもそもtm_wdayとtm_ydayは更新されるって書いてあるし
関係ないけど
・tm_mday: 1 から 31 の範囲の日付。
・tm_mon: 1 月からの月数 (0 から 11 の範囲)。
なのは毎回もやるわ、なぜ両方0スタートじゃないのか...
そもそもtm_wdayとtm_ydayは更新されるって書いてあるし
関係ないけど
・tm_mday: 1 から 31 の範囲の日付。
・tm_mon: 1 月からの月数 (0 から 11 の範囲)。
なのは毎回もやるわ、なぜ両方0スタートじゃないのか...
186はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7d3e-OdF3)
2022/09/11(日) 15:04:45.97ID:D/VbhUuk0 >>185
月は (英語では) 月の名前に置き換える (配列から名前を引く) という都合から自然にそうなったという説は聞いたことがあるな。
日は番号をそのまま表示するもんだから最初から番号通りのほうが都合がいいし。
月は (英語では) 月の名前に置き換える (配列から名前を引く) という都合から自然にそうなったという説は聞いたことがあるな。
日は番号をそのまま表示するもんだから最初から番号通りのほうが都合がいいし。
187デフォルトの名無しさん (ワッチョイ f116-V+uT)
2022/09/15(木) 17:53:22.84ID:gNCVLuZy0 ローカル変数の宣言で、宣言しようとしているポインタの初期化子に、同じ文で
宣言された変数を参照するのは規格上OKですか?
/* test1.c */
1 | int main(int argc, char **argv)
2 | {
3 | char s[100] = {'A'}, *p = s;
4 | int i = 10, *a[10] = {&i};
5 | return 0;
6 | }
最新の gcc で試したところ、-std=c89 -pedantic の場合に下記の警告が出ます。
特に3行目が OK で、4行目が駄目な理由がよく分からないです。
どちらもスタック上の相対位置はコンパイル時に決まると思うのですが。
Cの文法について詳しい方、教えてください。
gcc --version
gcc (GCC) 12.2.1 20220819 (Red Hat 12.2.1-1)
gcc -O0 -std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
test1.c: In function ‘main’:
test1.c:4:27: warning: initializer element is not computable at load time [-Wpedantic]
4 | int i = 10, *a[10] = {&i};
| ^
gcc -O0 -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
警告なし
宣言された変数を参照するのは規格上OKですか?
/* test1.c */
1 | int main(int argc, char **argv)
2 | {
3 | char s[100] = {'A'}, *p = s;
4 | int i = 10, *a[10] = {&i};
5 | return 0;
6 | }
最新の gcc で試したところ、-std=c89 -pedantic の場合に下記の警告が出ます。
特に3行目が OK で、4行目が駄目な理由がよく分からないです。
どちらもスタック上の相対位置はコンパイル時に決まると思うのですが。
Cの文法について詳しい方、教えてください。
gcc --version
gcc (GCC) 12.2.1 20220819 (Red Hat 12.2.1-1)
gcc -O0 -std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
test1.c: In function ‘main’:
test1.c:4:27: warning: initializer element is not computable at load time [-Wpedantic]
4 | int i = 10, *a[10] = {&i};
| ^
gcc -O0 -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
警告なし
188デフォルトの名無しさん (スップ Sdea-MyD4)
2022/09/15(木) 20:06:58.44ID:C6syfEgyd C99より前は集成体(配列、構造体)に対する初期化子定数式(アドレス定数式)でスタックは認められていないっぽい
3行目の初期化対象は配列じゃないでしょ
3行目の初期化対象は配列じゃないでしょ
189デフォルトの名無しさん (ワッチョイ adc2-+Wio)
2022/09/16(金) 06:50:50.62ID:jyhWPRLZ0 int main(void)
{
int a = a;
}
これもOKなんだが
{
int a = a;
}
これもOKなんだが
190デフォルトの名無しさん (スッププ Sd0a-39XR)
2022/09/16(金) 19:26:37.47ID:alBs0lLWd >>189
スタック上のアドレスを使ってポインタを初期化できるかって話だろ
スタック上のアドレスを使ってポインタを初期化できるかって話だろ
191デフォルトの名無しさん (スッププ Sd0a-39XR)
2022/09/16(金) 19:31:34.25ID:alBs0lLWd192デフォルトの名無しさん (ワッチョイ 7d01-Mjbb)
2022/09/16(金) 19:59:25.14ID:u2ZYVkG20 一見
スタックに実体をもつ配列の先頭はセーフで (3行目)
スタックに実体をもつ変数のポインタはアウトというふうに見えるけど (4行目)
{ } の中か否かの差もあるんやね
スタックに実体をもつ配列の先頭はセーフで (3行目)
スタックに実体をもつ変数のポインタはアウトというふうに見えるけど (4行目)
{ } の中か否かの差もあるんやね
193デフォルトの名無しさん (ワッチョイ 17c2-okD4)
2022/09/17(土) 00:57:57.08ID:GfZyyjDu0 >>190
そんなん言い出したら自動変数をポインタで指せるのかさえ怪しくなってくるな
そんなん言い出したら自動変数をポインタで指せるのかさえ怪しくなってくるな
194デフォルトの名無しさん (スッププ Sdbf-UZdd)
2022/09/17(土) 12:49:57.03ID:fh691Hyrd スコープ内でアドレスが参照されたならば
自動変数はレジスタ変数にはならなくなる
「自動」の意味
自動変数はレジスタ変数にはならなくなる
「自動」の意味
195デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 19:52:14.52ID:fgoWI+8da win10(以下win)
strawberry perl入れた時一緒にいれたgcc
wsl
ubuntu22.04 gcc
どっかでみた配列関係のサンプルで
(間違えるとnull見つかるまで一生探し続けるよ的なコード)
で試したら
winで値がおかしい
linuxで正しい
とりあえずwin側でgdbで見ると
winで格納アドレスが逆順になってました
例えばコード上で
array1うんたら
array2かんたら
とあって
array2がアドレス100番台
array がアドレス200番台
みたいになってました
この挙動は環境依存なのかバグなのか知りたいです
まぁ結局両方windowsなんですが
strawberry perl入れた時一緒にいれたgcc
wsl
ubuntu22.04 gcc
どっかでみた配列関係のサンプルで
(間違えるとnull見つかるまで一生探し続けるよ的なコード)
で試したら
winで値がおかしい
linuxで正しい
とりあえずwin側でgdbで見ると
winで格納アドレスが逆順になってました
例えばコード上で
array1うんたら
array2かんたら
とあって
array2がアドレス100番台
array がアドレス200番台
みたいになってました
この挙動は環境依存なのかバグなのか知りたいです
まぁ結局両方windowsなんですが
196デフォルトの名無しさん (ワッチョイ ffbb-xFG9)
2022/09/17(土) 19:56:51.12ID:ZRyqS0700 ネットワークオーダーとかエンディアンとかが絡んでる可能性はあるけど、コードを見ないとなんとも
197デフォルトの名無しさん (スッププ Sdbf-UZdd)
2022/09/17(土) 20:03:08.34ID:PxOaZq6Kd >>195
抽象的すぎて全然わからんw
抽象的すぎて全然わからんw
198デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:04:45.56ID:fgoWI+8da199デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:08:18.29ID:fgoWI+8da 因みにこっちのwin環境だと
上サイトで24byteになるはずの所が10byteになります
上サイトで24byteになるはずの所が10byteになります
200デフォルトの名無しさん (ワッチョイ ffbb-xFG9)
2022/09/17(土) 20:22:45.77ID:ZRyqS0700 strlenのことか?
文字列と違ってchar配列の末尾には自動的にnull挿入されたりしないから、nullまで数え上げるstrlenが何を返すかわからないし、環境によってはメモリアクセス違反で落ちるかも
文字列と違ってchar配列の末尾には自動的にnull挿入されたりしないから、nullまで数え上げるstrlenが何を返すかわからないし、環境によってはメモリアクセス違反で落ちるかも
201デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:26:08.77ID:fgoWI+8da いや多分違います
アドレスが逆
多分ここが重要なんですがその原因が
と言うところです
アドレスが逆
多分ここが重要なんですがその原因が
と言うところです
202デフォルトの名無しさん (ワッチョイ ff46-EKt7)
2022/09/17(土) 20:44:25.86ID:LY5v/fLv0 環境依存です
ゼロで終端されていないものにstrlenを呼んではいけません
そのコードが誤り
ゼロで終端されていないものにstrlenを呼んではいけません
そのコードが誤り
203デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 20:51:16.94ID:I+4Vfslra うーん
そう言うことじゃなくて・・・
なんでメモリアドレスの格納が逆になるの?
と言うところです
cの規格的な話じゃなくてですね・・・
そう言うことじゃなくて・・・
なんでメモリアドレスの格納が逆になるの?
と言うところです
cの規格的な話じゃなくてですね・・・
204デフォルトの名無しさん (ワッチョイ ff46-EKt7)
2022/09/17(土) 20:58:26.77ID:LY5v/fLv0 そのページを作った人の環境(コンパイラとバージョン)ではarr,arr2の順で
あなたの環境ではarr2,arrの順なんでしょ
たまたまそうなっただけです
あなたの環境ではarr2,arrの順なんでしょ
たまたまそうなっただけです
205デフォルトの名無しさん (アウアウウー Sa5b-Di2O)
2022/09/17(土) 21:10:35.35ID:I+4Vfslra 文系脳で行き着く先っていつもそうなんですよね
でも残念ながら「それ」がないんですよ
この世界
たまたま
なんかわかんないけど
偶然
楽しけりゃいいじゃん
なんで生きてるのお前?
馬鹿は嫌い 回線で首でも吊ってろカスが
ジパング馬鹿しかいないからもう寝る
でも残念ながら「それ」がないんですよ
この世界
たまたま
なんかわかんないけど
偶然
楽しけりゃいいじゃん
なんで生きてるのお前?
馬鹿は嫌い 回線で首でも吊ってろカスが
ジパング馬鹿しかいないからもう寝る
206デフォルトの名無しさん (スッップ Sdbf-Zv9H)
2022/09/17(土) 21:15:00.75ID:W7nqA9Zmd オタクくん怒って寝ちゃったw
207デフォルトの名無しさん (アウアウウー Sa5b-zcFf)
2022/09/17(土) 21:44:56.47ID:njcq0eeLa スタックはアドレス高位から低位の方向に積まれることが多いから、arr2のアドレスがarrのそれより小さくなるとかですかね
208デフォルトの名無しさん (ワッチョイ 9f63-E+l9)
2022/09/17(土) 21:46:48.25ID:aOSn8JHC0 そういう人を落とし込める記述はやめよう
209デフォルトの名無しさん (ワッチョイ 9f2c-bG2j)
2022/09/17(土) 23:27:39.41ID:eA0eWCp60 スタックの方向などは環境依存だろ
環境依存は他にも、little/big endian とか、
char が、0〜255, -128〜127 のどちらなのかとか
文字コードが、BOM 無しUTF-8 以外とか
環境依存は他にも、little/big endian とか、
char が、0〜255, -128〜127 のどちらなのかとか
文字コードが、BOM 無しUTF-8 以外とか
210デフォルトの名無しさん (ワッチョイ d7b3-q6Lr)
2022/09/18(日) 01:46:10.06ID:3xNGEVex0 gdbの使い方、ここで質問してもいいですか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 自民・麻生太郎 副総裁 石破政権の1年は「どよーん」 高市政権の発足で「何となく明るくなった」「世の中のことが決まり動いている」 [Hitzeschleier★]
- 東京都「都民の税金1.5兆円が国に奪われている」「全国に分配されている」に地方民ブチギレ [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【27歳会社員】「自慰行為に使うために」コインランドリーの乾燥機から24歳女性の下着など計11点(時価8万2080円相当)盗んだ疑い [nita★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- トランプ、G7に代わるcore 5を発表 [805596214]
- 麻生太郎が石破政権の1年を酷評「どよーんとして何も動かない感じだったな。それに引き換え高市政権は物事が動いている」 [597533159]
- 【速報】室井佑月、米山隆一との離婚を決意wwwwwwwwwwwwwwwwwwww [802034645]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★4
- 官僚「台湾有事についての質問か、『政府として逐一答えない』と…(カタカタカタ)」高市「私1人で答弁できるわよ!」 [972432215]
- (´・ω・`)ペンギンが好きなんだが
