C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
2021/12/25(土) 12:11:46.61ID:xxeaCAplM
!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

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言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/06/17(金) 08:44:28.03ID:rAke7YJm0
なんとなくのイメージ
・宣言
「xxxxって名前の変数(関数)がどっかにあるらしいよ。詳しいことは知らん。」

・定義
「xxxxの詳細はココに書かれたxxxxxである!これは決定事項である!!」
2022/06/17(金) 13:54:11.29ID:zopwF6/i0
>>766
struct _Hoge;
struct _Hoge; // OK
これは _Hoge という識別子がタグ名という定型データとして作られ、
その後、定型データの中の属性フラグが検査されて一致が確認される

struct _Hoge;
union _Hoge; // NG
これは定型データの中の属性フラグが検査され不一致が検出される

struct _Hoge;
struct _Hoge { int a; }; // OK
これは定型データの中のポインタがまずNULLで作られ、
次に、そのポインタでメンバ宣言列という不定型データを指す

struct _Hoge { int a; };
struct _Hoge { int a; }; // NG
これは既にNULLでなくなったポインタの貼りかえで拒否される

宣言の重複は矛盾の検出のみを行い
定義の重複は不定型データの再作成で拒否される
{ } は無結合
769デフォルトの名無しさん (アウアウウー Sa67-iSSN)
垢版 |
2022/06/17(金) 16:09:04.52ID:G79h5Zera
>>763
誤訳
770デフォルトの名無しさん (アウアウウー Sa67-iSSN)
垢版 |
2022/06/17(金) 16:13:44.68ID:G79h5Zera
struct _Hoge { int a; };
struct _Hoge { int a; }; // NG

この場合でもコンパイル単位が別ファイルだと(ほぼ)問題無い訳で
一致していなければ一致していないなりの結果が産まれる
2022/06/17(金) 16:33:58.20ID:zopwF6/i0
>>770
(ほぼ)は不要
問題ないというか完全に同じ内容になっていない場合は未定義の動作
2022/06/17(金) 19:28:59.11ID:bL392TY50
>>768
なにを言いたいのかさっぱりわからんw
773デフォルトの名無しさん (アウアウウー Sa47-vQ73)
垢版 |
2022/06/18(土) 20:10:05.11ID:cOcEcivya
ヘッダ include したことないとか
ヘッダに実装描くとか
分割コンパイルしたことないとか
そういうアホのにおいがプンプン丸
774デフォルトの名無しさん (ワッチョイ ffad-P2F3)
垢版 |
2022/06/18(土) 23:11:41.82ID:eg6b2Ems0
どこにそんな話出てた…?
2022/06/20(月) 15:11:40.00ID:BalXxnr90
定義と宣言の区別に関して
同一翻訳単位の中で 重複が許されるのが宣言 の実例の話やろ
2022/06/20(月) 20:05:57.84ID:3bt1t/j50
聞きたいのは内容じゃなくてなぜそんな話をいきなり始めたのか?なんだけどw
777デフォルトの名無しさん (オッペケ Sr3b-P2F3)
垢版 |
2022/06/20(月) 20:11:30.62ID:8GsqMDfwr
ヘッダに実装書いたっていうレスもヘッダをincludeしたことないっていうレスも見当たらないけど…
778デフォルトの名無しさん (スップ Sdba-JtvC)
垢版 |
2022/06/20(月) 20:27:07.42ID:aPzFu0cfd
別ソースから同じヘッダをincludeしていてもコンパイル時には必ず別ファイルとなるわけで(ほぼ)じゃ困る
779デフォルトの名無しさん (ワッチョイ ffad-DcGD)
垢版 |
2022/06/25(土) 17:14:53.88ID:g21tYZQo0
if ( a == 0 )
{ port &= 0b11011111 ;
}
else
{ port |= 0b00100000 ;
}

これ条件文使わずに書けるよね?
2022/06/25(土) 17:41:40.76ID:ZgY7VkDz0
>>779
三項演算子は条件文に含みますか?
2022/06/25(土) 17:45:19.17ID:zMWMLrlCM
書けるかどうかより、分かりやすいかの方が大事
2022/06/25(土) 17:45:51.43ID:9jpr7vFN0
port = port & ~((a == 0) * ~0b11011111) | (a != 0) * 0b00100000
頭悪いんでこれ以上無理。確実にレビューで落ちる
2022/06/25(土) 17:56:58.31ID:9jpr7vFN0
何だこれでいいのか
port = port & 0b11011111 | (a != 0) << 5
784デフォルトの名無しさん (ワッチョイ ffad-DcGD)
垢版 |
2022/06/25(土) 18:15:30.63ID:g21tYZQo0
おまいらは何で素直にかけないんだ?(´・ω・`)?
785デフォルトの名無しさん (オッペケ Sra3-Htnq)
垢版 |
2022/06/25(土) 18:26:40.73ID:XIyeaAEpr
>>779
条件分を使わない理由はないよね?
2022/06/25(土) 18:26:54.17ID:9jpr7vFN0
まさか質問者に駄目だしされるとは思わなんだ
2022/06/25(土) 18:28:36.26ID:gQjoPRQF0
条件によって8ビット目以上も変える訳ではないのならば…かな
&= 0b11011111 | !!a << 5や&= ~0b00100000 | !!a << 5とかも論理否定は楽な方で
後者は若干レジスタ雑に出来るが…しかし最適化するとif文も分岐排除されてほぼ変わらん
2022/06/25(土) 19:15:33.07ID:ca1tbhpBH
条件文使わずに書いても何もメリットない
2022/06/25(土) 19:35:30.93ID:IvS/BJ7o0
やるならアセンブラレベルで・・・
2022/06/25(土) 22:45:43.97ID:UWoTCBGr0
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86

0b 使えないw
2022/06/25(土) 23:52:02.49ID:PITDVbGU0
そりゃそうだろ
C言語としてはGCCの拡張だし
C++14でコンパイルしたらいけるんじゃね?
2022/06/26(日) 09:58:04.14ID:EKr6eQfX0
>0b 使えない
0xに変換か、どうせ定数なんだからそれっぽいマクロで代用しとけばヨロシ。
2022/06/26(日) 10:58:18.13ID:hEbl3kj1a
orをandで記述する方法は
2022/06/26(日) 11:05:33.04ID:j/Qk9Cw40
負論理
2022/06/26(日) 11:39:10.83ID:ImrLxjwid
A|B == ~( ~A & ~B )

だけどまったく意味はないな
2022/06/26(日) 11:50:57.28ID:9tvF1jx30
ソースを難解にするのに多少貢献
2022/06/26(日) 14:00:18.84ID:r2JBCRM90
怒(プイプイ)モルカーだな
2022/07/09(土) 06:20:44.23ID:LJ5BAcPW0
今日の学び
voidは1バイト
2022/07/09(土) 11:11:08.31ID:8isXQv7m0
>>798 たぶんgcc拡張のポインタ演算の話でしょ。他ではそんなこと言えないから気を付けて。
2022/07/09(土) 12:16:19.03ID:LJ5BAcPW0
>>799
GCCだけど

printf("%d\n", sizeof(void)); // 1

になる。
これGCCだけなん?
2022/07/09(土) 12:23:26.90ID:U9EmutCWd
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gcc/Pointer-Arith.html
2022/07/09(土) 12:27:53.55ID:LJ5BAcPW0
>>801
へ~知らなかった
2022/07/09(土) 12:31:03.64ID:Pcby8BG30
ではvoid型変数 sを宣言してみて下さい
サイズを測ってご覧にいれます
2022/07/09(土) 12:37:25.10ID:rCvRfQZvM
糞坊主が
2022/07/09(土) 12:39:57.10ID:OQU8CgWM0
屏風に描いたvoidなんつって
2022/07/09(土) 20:15:12.04ID:A5P06KhI0
ヘ_ヘ
ミ・・ ミ
(   )~
2022/07/09(土) 20:56:46.61ID:2FL2bpN80
他人のふんどしで勝負する男の人って‥‥
2022/07/09(土) 21:10:00.31ID:eJjSZ+Lo0
はなししとは?
 ヘ_ヘ
ミ・・ ミ  
(   )~
2022/07/10(日) 01:02:53.42ID:NKXzP1tS0
このスレに50代の者が居ると見た
2022/07/10(日) 01:43:41.30ID:4ppCSg1ba
70までおるじゃろ
2022/07/10(日) 05:01:57.35ID:teKb0H7o0
ム板の寄合所かよ
2022/07/10(日) 15:27:56.20ID:EpSIEDJ/H
>>808
他人のふんどしで勝負する男の人って‥‥
2022/07/10(日) 15:35:59.80ID:IXzc/cv30
みっともねえよな
そんなことまでパクリしかできねえやつ

# 奴が来なくなって20年近く経ってんのに進歩してやがらねえ
2022/07/10(日) 15:38:00.79ID:pOdXKR0zH
>>813
ですよね
2022/07/11(月) 08:40:13.85ID:2XjvtJRn0
voidの長さはよくわからんが、取り敢えずvoid*のインクリ幅を実装の最小単位に取っておけば何でも指せるし、そのアドレス演算に意味を持たせる事も可能になる
どうしてもvoidのサイズを決めたいというのなら、まあ合理的な実装だと思う
2022/07/11(月) 13:22:34.96ID:cGEUsgsp0
void*のインクリ幅に何か意味があるの?
2022/07/11(月) 17:20:33.49ID:lWPgqJ6O0
char*でいいじゃん
なんだかわからないものは「バイト列」だろ
2022/07/11(月) 17:41:30.26ID:TkfF8Lfy0
警告されるから
2022/07/11(月) 17:44:52.74ID:rBy2qCXb0
普通は明示的キャストを介して使うよな
2022/07/11(月) 17:46:10.96ID:POJvWuxZ0
そう。
オブジェクトを指すポインタは void* との間で「暗黙に」変換することが出来る。
最終的に char* にキャストするのだとしてもインターフェイス (仮引数) が void* だとキャストをせずに済む。
memmove とかがそれ。
2022/07/11(月) 22:57:06.26ID:7aXqGp3Qd
なんでも指せるのとインクリメント幅を1にするのは関係ない
むしろインクリメントしようとしたらミスである可能性が高いのでワーニングかエラーにすべき
2022/07/12(火) 07:13:33.37ID:MjEzd7ZRd
ハード的な最小単位へのポインタは欲しいね
charって書くの本当は気持ち悪い
2022/07/12(火) 10:12:07.41ID:AnYAkaOT0
C の仕様上はアドレスを定義できる単位をバイトと呼び、 char は 1 バイトであると定義されてる。
つまり char はハードウェア的な最小単位と言えるが……、まあ名前が良くないのは確か。
2022/07/12(火) 12:14:37.21ID:MjEzd7ZRd
つーか符号がどうたら言われたくない
2022/07/12(火) 17:26:10.54ID:DhrJi4Do0
(char が 7bit の系って生き残ってるのかしら?)
2022/07/12(火) 17:42:00.57ID:4CshQ+Jw0
というかなんでcharってsignedにしてあるんだろ?
char と unsigned charじゃなくてchar と signed char にしてくれていればよかったのにと思わなくもない
intもsignedだし(逆にintがunsignedだったら使いづらいけど)符号付の計算が基本とかあるのかね?
827デフォルトの名無しさん (ワッチョイ a5d2-WFmy)
垢版 |
2022/07/12(火) 17:58:33.14ID:YvrX4qJi0
C++ではcharが符号付きか符号なしかは環境依存だよ
unsigned charともsigned charとも別の型扱いされる不思議な子

たぶんC言語でも同じ扱いだろう
2022/07/12(火) 18:06:57.31ID:ydFOrexCM
charの符号は処理系依存と違ったっけ?
2022/07/12(火) 18:30:46.85ID:AnYAkaOT0
そう。 >>827 の説明が正しい。
char の符号は処理系定義かつ signed char とも unsigned char とも異なる独立した型。
signed char か unsigned char のどちらかと別名という可能性もないので、
C++ のオーバーロードや C の _Generic で三種類に分岐することは出来るよ。

char は整数だから他の整数型との一貫性で考えれば符号付きになるのが自然なようにも思えるが……、
実行基本文字集合は char で (char が符号有りだとしても) 正の値になることを
要求している (C99 だと 6.2.5 に書いてある) ので各環境が採用している文字コードによっては
符号無しにせざるを得なかったのだと思う。
EBCDIC とかだとどうしてもそうなる。

まあ負の文字コードが有っても辻褄合わせは出来たとは思うんだが、
仕様が成立した時点でそうでない想定をしているコードが結構あったりしたんじゃないかな。
2022/07/12(火) 18:31:52.31ID:xJzxH9jqa
>>825
規格では8bit以上だったはず
http://www.bohyoh.com/CandCPP/FAQ/FAQ00013.html
2022/07/13(水) 11:20:33.14ID:Zw91A11j0
>>829
>まあ負の文字コードが有っても辻褄合わせは出来たとは思うんだが、
比較の際に暗黙で走る int への格上げの時にややこしくなりそうやね

char ch;
...
if (ch >= 0x80) // 上位ビット立ってる?
2022/07/13(水) 11:53:33.59ID:CCByLcFJM
&buf[0] ってbufと同じだよな?
なんか意味あんのこの書き方?
2022/07/13(水) 12:43:05.67ID:hH7ZnQ+pM
&buf[0] 配列の先頭要素のアドレス
buf 配列の先頭のアドレス
同じ

sizeof(&buf[0]) 配列の先頭要素のサイズ
sizeof(buf) 配列のサイズ
異なる

配列の要素数を求める場合
sizeof(buf)/sizeof(&buf[0])
で頻出する
2022/07/13(水) 12:44:54.67ID:WjRfIVOeM
センキュー
2022/07/13(水) 12:52:57.77ID:H8j4+v2od
>>833

>配列の要素数を求める場合
>sizeof(buf)/sizeof(&buf[0])
>で頻出する

ダウト。sizeof(buf)/sizeof(buf[0])の間違い。
2022/07/13(水) 14:23:32.52ID:Kb1eM8RI0
>>832
配列の先頭としての意味よりその要素に意味があるということを強調した雰囲気を表すためにそういう書き方をすることはあるよ。
仕様としての解釈 (動作) に差が無い場面であっても人が読む上では雰囲気の差はある。
2022/07/13(水) 16:51:43.98ID:Zw91A11j0
添え字が非0 のとき &buf[1] か buf+1
添え字が0 のとき &buf[1] か buf+0 か buf か

同じコードになるけど記述に意味を見出すかどうか
838デフォルトの名無しさん (アウアウウー Sa09-2HoA)
垢版 |
2022/07/13(水) 17:38:26.38ID:H0DndFW/a
_countof使わないのか
2022/07/14(木) 13:40:03.36ID:m4fVu3Vb0
配列の大きさを知る演算子くらい標準入りしてもよさそうなもんだとは思う。
2022/07/14(木) 13:46:25.72ID:YnALXIBFd
ポインタに使うアフォが出てくるに1ペリカ
2022/07/14(木) 14:14:28.24ID:m4fVu3Vb0
むしろ、イディオムやマクロによる素朴な実装だとポインタを渡してもエラーなく通過してしまうからこそ
言語の機能として提供して然るべきだと思うよ。
2022/07/14(木) 14:49:53.54ID:abQKMdR+a
結局、配列が無いのが問題、みたいな
2022/07/14(木) 15:26:18.20ID:fgF/JGu/0
配列とは別に文字列型作れば良かったのかな
2022/07/15(金) 19:30:20.65ID:r8EwCLZ2d
それを言ったら破門だよ
2022/07/15(金) 22:46:23.97ID:vZ8IDyva0
string_t *s = str_alloc();
2022/07/17(日) 00:26:30.17ID:1DBmbCgq0
char a[32];
char b[32];

fp = fopen("abc.csv", "r");
for(; fscanf(fp,"%[^,],%s%s", a, b) != EOF; ){
printf("%s %s\n", a, b);
}
fclose(fp);
2022/07/17(日) 00:28:02.51ID:1DBmbCgq0
test.c:23:31: warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat=]
for(; fscanf(fp,"%[^,],%s%s", a, b) != EOF; ){
           ^^
問題なく動くんですが、上のような警告が出ます。
気にしなくても良いですか?
2022/07/17(日) 01:16:21.70ID:RIt+yucva
&a[0]にでもしたらいいかもな
警告出さなきゃ出ないんじゃなかったかな
2022/07/17(日) 04:38:20.42ID:tV/KWY8I0
指定子の数と引数の数が合ってないのでは?
2022/07/17(日) 09:31:19.06ID:5kV34GW+0
%s は1つで良いんじゃね?
2022/07/17(日) 09:48:19.50ID:gh7Bz7cid
%sが多いね
あと32バイト以上あったらクラッシュするけどいいの
2022/07/17(日) 11:10:26.64ID:tV/KWY8I0
>>846
そのコードで問題なく動くならabc.csvがかなり特殊な形式だと思う

https://ideone.com/haAzIG
2022/07/17(日) 12:37:05.79ID:Fwel5trjd
最初の%[^,]でa[]にコンマの前までが取られて
次の%sが行末までをb[]に取るから
その次の%sをコピーするポインタが指定されてないので本来はここでクラッシュするけど
前の%sで行末に行ってるのでこの%sは必ず無視されるという綱渡り状態
直しておいたほうがいいよ
2022/07/18(月) 00:57:42.77ID:i3ini+Eo0
サンクス(´・ω・`)
855デフォルトの名無しさん (アウアウウー Sa39-3+h2)
垢版 |
2022/07/21(木) 23:01:29.27ID:qNAIu8qZa
生徒数と科目数と点数をキーボードから入力し、それぞれの科目数の個人、全体の合計点数、(科目数の個人、全体の)平均点をそれぞれ出すプログラミングをやっているのですが、全く分からないので教えてください。
2022/07/21(木) 23:24:42.74ID:25qjJOkGr
キーボードから入力する方法がわからないのか、平均点をだす方法がわからないのか?
2022/07/21(木) 23:58:01.60ID:tQt8NkV/0
多分学校の宿題かなにかなんだろうが、
言葉足らずで相当補わないと問題が分からない
出題されたまんまの内容を書いてみてくれないか
2022/07/22(金) 01:39:33.12ID:fX2QhDiX0
「全く分からない」に対してわかるように教えるには入門書の頭から説明しないと理解できない状態ってことだからなぁ。
それなら普通に入門書を読むべき (その上でどうしても理解できない箇所があるならそれを質問すべき) という話だし、
理解する気が無くてそういうプログラムが欲しいだけなら宿題スレに投下したほうがいい。
2022/07/22(金) 03:00:46.63ID:GQs5tpkHd
質問者です

僕は答えだけが欲しいんです。どうして説教なんかしてくるんですか?

貴方達は黙ってコードを書いてくれるだけでいいんです。それ以外のことを私は貴方達に求めていません

ご回答よろしくお願い致します
2022/07/22(金) 04:01:58.51ID:9CWw4cOJd
成績を収める配列変数を宣言して下さい。
ループ変数iとforループを使ってデータ入力する処理を記述して下さい。
ループ変数iとforループを使って合計を求める処理を記述して下さい。
合計と件数より、平均値を計算して下さい。
2022/07/22(金) 13:35:19.04ID:63Xcy7bk0
>>859
回答するから駅前でパンツ脱いで待ってろ
2022/07/22(金) 13:53:06.84ID:o6RHeQNrM
jkの視線が辛いです…
2022/07/22(金) 16:50:00.97ID:FTsytUCEd
近道を教えてください
目的地?そんなもの知らん
いじわるしないで近道だけ教えてくださいよ
2022/07/22(金) 17:05:43.46ID:5FG7Keur0
だから宿題スレ逝けってば
2022/07/22(金) 17:48:50.97ID:xVgLzEHZ0
他人にコード書いてもらいたいならお金払うのが常識だぞ
勉強になったな
866デフォルトの名無しさん (ワッチョイ daad-Vb2/)
垢版 |
2022/07/22(金) 18:36:47.63ID:iW5ae+Pc0
>>859
別人か?
釣りか?
スレを活性化させるための煽りか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況