X



C言語なら俺に聞け 145
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 9381-qput)
垢版 |
2018/02/19(月) 22:13:58.98ID:9/te2eSJ0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

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言語なら俺に聞け 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
0318デフォルトの名無しさん (ワッチョイ 7361-0aB1)
垢版 |
2018/03/08(木) 08:29:41.94ID:Eav/q7cG0
コンパイラーのエラーが出ないという意見をきいて
試してみたら別のところ―がエラーになっていたということでした。
そして自分が悪質なコンパイラーに騙されていたことに気づきました。
0320デフォルトの名無しさん (アウウィフ FF1f-0aB1)
垢版 |
2018/03/08(木) 10:10:36.36ID:ue18PqKiF
Cのエラーはエラーの発生個所を教えてくれるけど原因個所は教えてくれない
0322デフォルトの名無しさん (ワッチョイ fb93-ao9L)
垢版 |
2018/03/08(木) 17:10:32.81ID:/HWAGXcB0
関数型マクロの使用時、カッコの内側が空の場合に、
「引数が指定されていない」と解釈して警告を出すか、
「1個の引数(内容はヌルストリング)が指定されている」と解釈するか、
そういう問題みたいね。
0328デフォルトの名無しさん (アウアウカー Sa7b-vvOV)
垢版 |
2018/03/09(金) 12:13:57.64ID:LlK9d7kba
頭おかC
0332デフォルトの名無しさん (ワッチョイ fb93-ao9L)
垢版 |
2018/03/09(金) 17:11:34.80ID:er4JdT2d0
>>329
a >> b で、bの値がaの型のビット数「以上」のときは未定義動作、
に該当するから、コンパイラのバグではない。…と思う。

本当は規格の引用をすべきなんだが、どなたか頼む。
0333デフォルトの名無しさん (ワッチョイ 7361-0aB1)
垢版 |
2018/03/09(金) 17:12:19.58ID:AbBnYUJz0
コンパイラーは
gcc version 7.3.0 (Rev1, Built by MSYS2 project)
で試しました。
悪質なコンパイラーに騙されているのかもしれませんね。
0334デフォルトの名無しさん (ワッチョイ 7361-0aB1)
垢版 |
2018/03/09(金) 17:25:01.13ID:AbBnYUJz0
ファイル1
#include<stdio.h>
#include<stdint.h>
uint64_t f(uint8_t a,uint64_t b){
printf("%llx\n", b>>(64-a));
return b>>64-a;}
void e(uint8_t a){ f(0,0x8318318318318318);}
void g(uint8_t a){ f(a,0x8318318318318318);}
ファイル2
#include<stdint.h>
uint64_t f(uint8_t a,uint64_t b);
void g(uint8_t a);
void e(uint8_t a);
int main(void) {
g(0);
e(0);
return 0;
}
この二つのファイルをコンパイルして実行してみてください。
よろしくお願いします。
0338332 (ワッチョイ fb93-ao9L)
垢版 |
2018/03/09(金) 20:12:23.00ID:er4JdT2d0
>>337 フォローありがとう。この部分ですわ。
6.5.7 Bitwise shift operators ビットシフト演算子 の項。

もしも右オペランドの値が負、または汎整数拡張後の左オペランドの(ビット)幅より
大きいか等しい場合、振る舞いは未定義である。

と言った感じかな。
promoted left operand の部分が「汎整数拡張後の左オペランド」で
合ってるのか自信ないけど。
0340デフォルトの名無しさん
垢版 |
2018/03/09(金) 22:22:53.87
>>339
0になってくれれば余計な分岐やら演算やらを省けるかもしれないだろ
0343デフォルトの名無しさん
垢版 |
2018/03/09(金) 23:25:22.45
>>342
そんなん全ビット読まなきゃいけないじゃん
0354デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/10(土) 16:20:41.72ID:HvD6qwC3a
アセンブラについてはどうしても自分でアセンブリ言語で書かねばならない事態に陥らない限り書くことはないだろうなあ。
0356デフォルトの名無しさん (ワッチョイ 0b9f-RK0z)
垢版 |
2018/03/10(土) 17:18:49.50ID:a2p+alti0
gdb は普通に使うなあ。
0357デフォルトの名無しさん (アウウィフ FF1f-0aB1)
垢版 |
2018/03/10(土) 17:35:13.89ID:5pXC+BOTF
printfなめたらいかん
0359デフォルトの名無しさん (ワッチョイ 0b9f-uQtz)
垢版 |
2018/03/10(土) 18:10:52.64ID:a2p+alti0
俺はシグナルハンドラの中でログ出力しようとして FILE * 経由で fprintf() 等で出力したら
そのライブラリの中でデッドロックしてハマった。 kill -ABRT で core dump させて gdb
で core ファイルと共に読ませてようやっと停止箇所がわかった。
0361デフォルトの名無しさん (ワッチョイ 0b9f-uQtz)
垢版 |
2018/03/11(日) 01:20:23.17ID:ry5KQfC80
printf() をデバッグで使う時はバッファリングを考慮していないとハマる事がある。
それと stdout と stderr と両方に出る可能性がある場合にその順序が食い違う可能性もある。
シグナルハンドラ内やマルチスレッドプログラムで使ってうまく行かない事もある。

その辺を全て考慮するならいいだろうが、しかし、それなら初めからログファイルに出力される
ように作った方が良いような気もする。
0363デフォルトの名無しさん (ワッチョイ 8f23-0aB1)
垢版 |
2018/03/11(日) 09:19:44.59ID:zWe+i43K0
そこまでするならsyslog
0365デフォルトの名無しさん (ワッチョイ 0b9f-uQtz)
垢版 |
2018/03/11(日) 14:10:54.85ID:ry5KQfC80
>>363
そだねー

>>364
本当にそれだけで大丈夫かね?

この頃のライブラリは多分マルチスレッドでもちゃんと動くように内部でロック掛けている部分があると
思うんだけどね、例えばシグナルハンドラの中でそのロックを掛けている最中にまたシグナルが来て
同じシグナルハンドラに入ると同じロックを掛けようとしてデッドロックするなんてことが起こり得ると
思うんだが。(まあその程度のことでデッドロックしてしまうこと自体がバグかも知れんが。それ以前に
シグナルハンドラの中でprintf()は使うなって話でもあるか…)。
0368デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 16:08:45.67ID:sEfAJdP70
それはCじゃないから、このスレで話し合っても無駄では。
0370デフォルトの名無しさん (ワッチョイ be81-uQtz)
垢版 |
2018/03/11(日) 16:46:35.93ID:iUqzSqql0
30年以上前だったかな、あるメーカーのプリンタファーム開発用Cコンパイラが配列要素上限が255だった
当時アスキーネットでこれを聞いたvoid氏が呆れていたようだ。
0371デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 17:10:10.38ID:sEfAJdP70
インストラクションに8ビットまでの即値を組み込めるなら、その制限によって(そのような最適化が必要なプロセッサにとって)強烈な最適化をかけられるから、アリやナシやと問われればアリのような感がある。
0373デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 17:33:57.41ID:sEfAJdP70
本場ドイツ直輸入ポークソーセージを買ったら魚肉ソーセージだったような感じですね。
つまり詐欺です。
0376デフォルトの名無しさん (ワッチョイ 23b3-lJdD)
垢版 |
2018/03/11(日) 18:04:00.35ID:sEfAJdP70
こういう掲示板で宗教対決を規制したら過疎化するんじゃないだろか。
0377デフォルトの名無しさん
垢版 |
2018/03/11(日) 18:26:39.19
>>370
まるでUvaみたいな制限だな(藁
0382デフォルトの名無しさん (ワッチョイ 6ac6-lLam)
垢版 |
2018/03/11(日) 23:26:14.78ID:3FTmPjnp0
for(i=0;i<10;i++)
scanf("%d",&num[i])

で入力した変数がiに入ってしまうことがあるのですがなぜですか?
0386デフォルトの名無しさん (ブーイモ MM97-7yGo)
垢版 |
2018/03/12(月) 08:04:24.78ID:uoSNo/WDM
アルゴリズムによってはdo whileの方が素直なときがある。まれだが。マクロを本当の関数っぽく使うのにdo while (0)使うハックがある。まれだが。
コンパイラによってはdo whileの方が速いコード出す。まれだが。
0394デフォルトの名無しさん (ワッチョイ 8f23-0aB1)
垢版 |
2018/03/12(月) 12:03:54.32ID:A4+OWJSs0
こんな書き方たまにする

do{
・・・
条件
break;
・・・
条件
break;
・・・
条件
continue;
・・・
条件
break;
・・・
条件
continue;
・・・
}while(0);
0398デフォルトの名無しさん (JP 0H9b-7yGo)
垢版 |
2018/03/12(月) 17:04:49.51ID:Ro63JAiYH
出口が複数は可だけどエントリーポイントが変なとこにあるのは読みにくいからやめたほうがいい。
この例の場合はB Aの無限ループにして、Bのあとの条件で脱出するのが定石。
0401デフォルトの名無しさん (ワッチョイ 2fe9-uQtz)
垢版 |
2018/03/12(月) 17:31:42.39ID:kO6Vn+sG0
エントリーポイントが変なとこって、mainだって1行目にはまずならないしな
実装されることなく廃止になったキーワードにentryつーのがあって
そいつがおそらくは1行目に
entry main;
とか持ってこれるようにするつもりだったのかもな
0402デフォルトの名無しさん (アウアウカー Sa7b-joIP)
垢版 |
2018/03/12(月) 17:41:10.71ID:mlDQMbRTa
>>397
昔の BASIC を思い起こさせる goto の使い方だなw
0404デフォルトの名無しさん (アウウィフ FF1f-0aB1)
垢版 |
2018/03/12(月) 18:04:50.67ID:FajbO2mAF
exceptionさえあれば
0406デフォルトの名無しさん (アウウィフ FF1f-0aB1)
垢版 |
2018/03/12(月) 18:09:46.06ID:FajbO2mAF
atexit()はあるぞ
0410デフォルトの名無しさん (ドコグロ MMbb-3fsH)
垢版 |
2018/03/12(月) 20:42:20.27ID:SpziwmuNM
>>395
1995年頃でLBPだと16bitから32bit CPUに移行する頃だから配列サイズが最大255なんて言うのはさすがに見たことないわ
ちなみにうちはSH-2+独自モニタからR3000+VxWorksへの移行期だった
コンパイラもチップベンダーかOSベンダーのものを使ってた
■ このスレッドは過去ログ倉庫に格納されています

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