X



C言語なら俺に聞け 149

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ af9f-7TBo)
垢版 |
2018/10/28(日) 22:01:44.38ID:D9Gt7gmT0
!extend:checked:vvvvv:1000:512

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

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言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0804デフォルトの名無しさん (ワッチョイ 7be9-uFMA)
垢版 |
2019/01/08(火) 23:28:52.41ID:BZbwJw/70
>>802
最適化したことでおかしくなったと言うわけではないんですが
どうなのかなと気になったもので
具体的にはO2の中のどの最適化でバグが出ることがありますか?
あとgccではなくg++でした
0806デフォルトの名無しさん (ワッチョイ d352-JBiS)
垢版 |
2019/01/08(火) 23:45:28.12ID:3ZWgvjCS0
>>804
仕様上規定されていない部分は最適化によって挙動が変わることがある。だから不確定な処理や誤った処理を書いていた場合に、これまでたまたま上手く動くコードが生成されていただけで、最適化によって挙動が変わってバグが顕在化することがある。
例えば、評価順序が不確定な処理を書いていたのがたまたま期待通りの順序で実行するコードになっていただけとか、不正なアドレスのメモリを参照や更新してしまっていたがたまたま問題がなかっただけだったとか。
0811デフォルトの名無しさん (ワッチョイ 7be9-uFMA)
垢版 |
2019/01/09(水) 02:45:48.52ID:cump+mlU0
>>806
ありがとうございます
そうであれば不確定な部分がなければバグはでないということですね
最適化用にプログラムの書き方も変える必要があるのかと思っていました

volatileはライブラリの中で使っていそうですがきっと大丈夫でしょう
0812 ◆QZaw55cn4c (ワッチョイ d347-5am+)
垢版 |
2019/01/09(水) 03:15:23.18ID:BRCoi/pn0
>>810
個人的には、memory-maped な世界はよくしらない(インテル系しかしらない…).
shared memory って、特別なことはありましたっけ?マルチスレッドなら排他処理用のオブジェクト(pthread-mutex/cond)を使っておれば問題ないし、fork() の中と外で同じ変数をつつくときは…はて、どうしてたっけ?
0813デフォルトの名無しさん (ワッチョイ fb02-cuFO)
垢版 |
2019/01/09(水) 03:28:53.85ID:T8HUoC+c0
そういやvolatileってC言語の場合CPUによってはうまく行かない事がありうるのな。
例えば4バイトの整数にアクセスするとして、そのCPUが2バイトづつしか読み書きできなかったら必ず2回のアクセスになる。
すると上位バイトと下位バイトで取得した時間が違っていたり一度に4バイト全体の内容を書き換えられない。
0814 ◆QZaw55cn4c (ワッチョイ d347-5am+)
垢版 |
2019/01/09(水) 04:25:49.36ID:BRCoi/pn0
>>813
そういうのは >>812 のとおり、そのためのカラクリ(pthread等)を使用してアクセスするべきだと思います、裸で触ること自体が発想としてイカレているのではないでしょうか?
0815デフォルトの名無しさん (ワッチョイ 8b2c-otaJ)
垢版 |
2019/01/09(水) 04:49:03.78ID:/QFmT4Vc0
マイコンなどのIO アドレスを、PC 側のメモリのアドレスに関連付けているのだろう(Memory-mapped I/O)。
これで、PC側のアプリでは、PCのメモリを読み書きするだけで、マイコンの操作ができる

PC側のメモリを読むと、マイコン側のメモリから読み込む。
読み込むと、マイコンの電圧が変わって、値が不定か逆などになる

通常は、pull up, pull down 抵抗などで、5V・0V にしているけど、
閾(しきい)値(Threshold)があって、
例えば、1V以下なら0V、4V以上なら5Vと判定される場合、1〜4Vは、不定になる

まあとにかく、読み込むだけで電圧が変わる・リセットされるから、
読み込むだけでも、電圧の状態が変わる

だから、IOアドレスを読むだけでも意味がある・状態を変えているので、
コンパイラで最適化・省略してほしくない!
0817デフォルトの名無しさん (ワッチョイ 997b-2hSR)
垢版 |
2019/01/09(水) 07:03:03.74ID:nmJLIVr10
いや、「Cのプログラムで変数(あるアドレス)を読むことが、
ハードウェア的には状態リセットの操作になっているから、
読めと指示した場所で必ず読み取り動作を行って欲しい」だから、
volatileの使い方のひとつとして正当でしょ。

ハードウェア的な内幕の説明が少々ぎごちない気がするけどね。
0818デフォルトの名無しさん (アークセー Sxc5-mE+R)
垢版 |
2019/01/09(水) 07:55:50.33ID:YaNn8N94x
>>813
多バイトアクセスがatomicに行われないのはvolatileの守備範囲ではなくinterlockの守備範囲。
なのでCPUによってはvolatileがうまく行われないってのはvolatileに対する名誉毀損になる。
0819815 (ワッチョイ 8b2c-otaJ)
垢版 |
2019/01/09(水) 08:02:53.56ID:/QFmT4Vc0
マイコンなどのIO アドレス(port)を読み書きするには、その装置の手順が決まっている

まず、制御ポートに、読み込むポート番号を教える。
そこで装置を制御できるようにするために、例えば、50μ秒待つ

次に、ポートから読み込む。
読み込まれたポートは、電圧の状態を変える

電気電子的動作の要件・時間が、厳密に決まっている。
ある回路を動作させるときに、回路を切り替えないといけない

電圧の高低で、ある回路の部分を止めて、異なる部分を動作させる(電流を流す)。
そのため、規定の時間よりも、速くアクセスできない
0820デフォルトの名無しさん (ワッチョイ 81ff-xhm2)
垢版 |
2019/01/09(水) 11:29:26.49ID:4Rn8lGBj0
電流を流すってのはバイポーラの場合だね
今ほとんどのコンピュータがCMOSで電流はゼロアンペアだ
寄生容量で交流成分が漏れたり貫通電流の問題はあるが
それは信号が電流表現ということではない
0821デフォルトの名無しさん (ササクッテロレ Spc5-W220)
垢版 |
2019/01/09(水) 18:32:34.88ID:ur1geU61p
>>804
最適化でおかしくなる場合の例としては潜在的バクがある。そしてよく見るのは組み込み系。volatileもそうだがprintfいれたり-O0にすると動作が正常化するってのがある。

volatileの例だと
int* fifo=0x0001;
int data=*fifo;
のようなコードはvolatileつけないと順番入れ替えられたりコードそのものがなくなったりする。

-O0やprintf入れると直る系はキャッシュ周りのこともある。キャッシュを積極的に使うかどうかで、キャッシュを使わない場合に安定する。キャッシュをたくさん使うprintfのような関数を入れると再度積み直しになって安定する。

後者は潜在的なバグで発見が難しいことが多い。プログラミングはわかるけど組み込みを知らない人がやらかすバグの一つ。
0822デフォルトの名無しさん (ワッチョイ 8901-ahzL)
垢版 |
2019/01/09(水) 19:37:23.10ID:pHvZAha70
キャッシュ絡みの潜在的なソフトのバグってのは経験ないなぁ。キャッシュが化けるハードのバグなら経験あるけど。
キャッシュ絡みってシノニム問題のこと?
0824デフォルトの名無しさん (ワッチョイ 8901-ahzL)
垢版 |
2019/01/09(水) 20:19:35.23ID:pHvZAha70
ああ、キャッシュ絡みのソフトバグ思い出した。
動的にプログラム入れ替えるソフト作ったときにIキャッシュをクリアし忘れてて誤動作したことあるわ。
Dキャッシュと分離されてる拡張ハーバードアーキテクチャの良い勉強になった思い出。
0825デフォルトの名無しさん (ワッチョイ 4d00-XG35)
垢版 |
2019/01/13(日) 00:46:58.72ID:Yl3ShYz90
IMCCOやTecConfのエントリー作品を見る限り、
Cのコードゴルフって10年くらい前と短かさとかが変っていないように思えるんだけど
これはCが成熟しきった(所謂「枯れた」)言語である程度の成長限界があるからなのかな。
それとも凄腕プログラマの興味がPythonやらRubyなんかに移っちゃったのかな。
0827デフォルトの名無しさん (ワッチョイ 715f-tbRK)
垢版 |
2019/01/13(日) 01:20:23.99ID:zp78LtJW0
>>766
アセンブラとC言語はまったく違うのに何を言っているのか?
0828デフォルトの名無しさん (ワッチョイ 715f-tbRK)
垢版 |
2019/01/13(日) 01:23:29.53ID:zp78LtJW0
>>798
あのな、コンピータには文字列という概念がないのだよ。
0833デフォルトの名無しさん (アウアウクー MM45-tbRK)
垢版 |
2019/01/13(日) 11:17:20.34ID:IIjq691iM
>>830
むしろ数値しかない
0838デフォルトの名無しさん (ワッチョイ 3af1-goYb)
垢版 |
2019/01/13(日) 12:27:42.01ID:Ov2pIYHC0
まぁ根本的に機械にはビットも数値も文字も文字列も無いわな。電気的にHiかLowかって話だから。
そういう話するスレではないと思うが。
0848デフォルトの名無しさん (ワッチョイ a57b-dZ8/)
垢版 |
2019/01/15(火) 08:01:36.67ID:c3MJrubW0
そういや、スマートボール(まぁパチンコ台みたいなものと思ってくれ)式に
上の投入口からボールを落とすと、台に仕組まれたシーソーの傾きが変わって
後から入れるボールの流れも変わる、ていう「機械式計算機」の
モデルもあったな。
シーソーにラッチがついてて「メモリ機能」を持たせたり、
ボールを何個か積み上げるとラッチが解除される仕掛けで変更したり。

>>846 は半導体素子の原理説明だったかな。
P型、N型それぞれの中でも、電子と正孔の両方があったはず、だよね。
0849デフォルトの名無しさん (ワッチョイ f9ff-VK1S)
垢版 |
2019/01/15(火) 08:06:38.17ID:O800IQzp0
正孔なんてものは存在しない
あるはずの電子がない状態というだけ

電流の向きと電子の移動方向が逆ということを
どうしても受け入れられない石頭のための説明だ
0856デフォルトの名無しさん (ワッチョイ f9ff-VK1S)
垢版 |
2019/01/15(火) 11:19:45.08ID:O800IQzp0
>>855
ほほう それでそれで?
      ____
     /:::::::ヽ
    f::/" ̄ ̄ヾi
    |:リ _ _|
    |r==( o)( o)
    ( ヽ  _) i
  __/ヽ ー== イ
 /ヽ ヽ \__ノ
`/ i  \_/、
/ r-、    ハ
レ⌒ヾi /  / |
i   ̄`ー―-ヘ |
ヽ_____ノーイ
| \    ノ
    ̄ ̄ ̄ ̄
0860デフォルトの名無しさん (アークセー Sx85-rXi3)
垢版 |
2019/01/15(火) 12:46:21.45ID:biAsBETNx
なんだ、やっぱりその状態があるって認めてるじゃん。正孔(という状態)は存在する、と。
てか誰も「正孔というモノ」の話なんかしてなくて一人だけ勘違いしてるw
0863デフォルトの名無しさん (アウアウウー Sa89-JzEj)
垢版 |
2019/01/15(火) 12:59:28.21ID:uoTEW6ZSa
ところで何の話をしているのかね?
0869デフォルトの名無しさん (アウアウウー Sa89-JzEj)
垢版 |
2019/01/15(火) 20:58:52.03ID:uoTEW6ZSa
昭和は遠くなりにけり
0871 ◆QZaw55cn4c (JP 0H62-jEXV)
垢版 |
2019/01/15(火) 22:02:49.14ID:niK8DUcQH
>>866
猫にねずみが噛み付いた
あべこべだ猫たたき
ねずみっていきものさ!
猫だっていきものさ!
0872デフォルトの名無しさん (ワッチョイ ce02-H432)
垢版 |
2019/01/16(水) 17:45:04.86ID:ECRqnYoc0
そういやトムジェリって一作目が作られたのが1940年なのな。戦前だ。
それで延々と続いて2017年にもOVAのDVDが出ている。恐ろしく長寿だ。
まあディズニー関係が一番長寿なんだろうけどね。
0875デフォルトの名無しさん (ワッチョイ c101-DeFq)
垢版 |
2019/01/17(木) 23:04:44.74ID:KvO4PGbE0
フラッグの状態によって引数を変更する必要があるのですが
どのやり方がベストでしょうか?

//A:冗長だけど単純で解りやすいと思う
if ( flag )
{
func(PARAM1, PARAM2, 1, "hoge1", 2, "hoge2", 3, "hoge3");
}
else
{
func(PARAM1, PARAM2, 2, "hoge2", 3, "hoge3", 1, "hoge1");
}

//B:いったん変数に入れてから function call
if ( flag )
{
n[0] = 1; n[1] = 2; n[2] = 3;
str[0] = "hoge1"; str[1] = "hoge2"; str[2] = "hoge3";
}
else
{
n[0] = 2; n[1] = 3; n[2] = 1;
str[0] = "hoge2"; str[1] = "hoge3"; str[2] = "hoge1";
}
func(PARAM1, PARAM2, n[0], str[0], n[1], str[1], n[2], str[2]);
0876デフォルトの名無しさん (ワッチョイ c101-DeFq)
垢版 |
2019/01/17(木) 23:05:39.65ID:KvO4PGbE0
//続き
//C:テーブルその1
const int table[2][3] = {{1,2,3},{2,3,1},};
const char *stbl[2][3] = {{"hoge1","hoge2","hoge3"},{"hoge2","hoge3","hoge1"}};
i = flag ? 0: 1;
func(PARAM1, PARAM2, table[i][0], stbl[i][0],table[i][1], stbl[i][1],table[i][2], stbl[i][2]);

//D:テーブルその2 順番が違うだけの場合だったらこれでもいける
const int table[3] = {1,2,3};
const char *stbl[3] = {"hoge1","hoge2","hoge3"};
int order[2][3] = {{0,1,2},{1,2,0}};
i = flag ? 0: 1;
func(PARAM1, PARAM2, table[order[i][0]], stbl[order[i][0]],table[order[i][1]], stbl[order[i][1]],table[order[i][2]], stbl[order[i][2]]);

//E:三項演算子 これは無駄に比較が多くなるから無しかも
func(PARAM1, PARAM2, flag?1:2, flag?"hoge1":"hoge2",flag?2:3, flag?"hoge2":"hoge3",flag?3:1, flag?"hoge3":"hoge1");
0879デフォルトの名無しさん (ワッチョイ c101-DeFq)
垢版 |
2019/01/18(金) 00:39:40.92ID:2Bf08m/t0
個人的にはAが好きだけど
こういうの馬鹿にする人いそうなのが困る
0883デフォルトの名無しさん (ワッチョイ 117b-g8bx)
垢版 |
2019/01/18(金) 05:44:13.01ID:APqq2jRu0
この範囲だけで言えば A が見通しが良くて分かりやすいんじゃないかな。

1, 2, 3 の並び方が(順列で)6通り存在するとか、
1 と "hoge1"... だけでなく、1 と "hoge2" の組み合わせも発生しうるとか、
func()の呼び出しパターンがもっと複雑だったら、
「flagの値に応じて適切な引数でfunc()を呼び出す関数」を作ると思う。
call_func(int flag, [func()に渡す引数]); みたいな感じ。

[func()に渡す引数] の部分を、カンマで区切った引数群にするか、
構造体にまとめるかは、別の要素が絡むので、強く主張できない。
0885デフォルトの名無しさん (アウアウウー Sa15-4KIe)
垢版 |
2019/01/18(金) 15:49:59.44ID:dETdnGdxa
>>875
その flag が 0 か 0 以外の値にしかならず 1 や 2 で違う動作になる事は未来永劫ない場合と、将来的になる可能性がある場合とでやり方は変えるかも知れない。

でも最初のやり方で良いんじゃないかな。あまり捻ると分かりづらくなるし。
flagの値によって何十通りもの違う呼び出しになるとかいうなら色々考えた方が後々良いのかも知れないが。
0887デフォルトの名無しさん (ワッチョイ 2100-b/bA)
垢版 |
2019/01/22(火) 14:42:25.83ID:Um5Ij+zI0
突然のステマ(OSSについてだけど)
LuaTeXっていうTeXのLua拡張?(よく分からん)に付いてくる
pplibっていうPDFライブラリおすすめ。
ドキュメント↓
https://serveur-svn.lri.fr/svn/modhel/luatex/trunk/source/texk/web2c/luatexdir/luapplib/html/ppapi.html#c-api
C向けのAPIでかなり最近に開発されたおかげか挙動が素直
0892デフォルトの名無しさん (ワッチョイ 117b-g8bx)
垢版 |
2019/01/22(火) 15:47:59.14ID:rPWXpeN+0
こちらも Subversion の公開レポジトリでは anonsvn が一般的と知らなかった。

案内ページも表示されないんで完全会員制の秘密クラブの扉でも
ウッカリ開いてしまったのかと、少々慌ててしまった部分もある。
0893デフォルトの名無しさん (アウアウウー Sa15-4KIe)
垢版 |
2019/01/22(火) 16:00:45.48ID:J1mDHp9Ya
バカには見えないプログラムでございます。
0897デフォルトの名無しさん (ワッチョイ 3152-FxQn)
垢版 |
2019/01/30(水) 20:09:31.10ID:5GzTmkIQ0
は?
■ このスレッドは過去ログ倉庫に格納されています

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