C言語なら俺に聞け 149
■ このスレッドは過去ログ倉庫に格納されています
>>792
頑張れば書けるよ!
Cというよりは Cの文法を使った何か になったけどな・・・ ちょっとすみません
gccの最適化オプションの-O2を使った場合に動作がおかしくなったりすることはありますか? あるかもしれないし、ないかも知れない
そういうソースがあるなら、晒して皆に確かめてもらえ >>801
ある。
多分これからvolatileに関するやりとりが始まる。 >>802
最適化したことでおかしくなったと言うわけではないんですが
どうなのかなと気になったもので
具体的にはO2の中のどの最適化でバグが出ることがありますか?
あとgccではなくg++でした >>803
volatileというものに気を付けないといけないわけですか >>804
仕様上規定されていない部分は最適化によって挙動が変わることがある。だから不確定な処理や誤った処理を書いていた場合に、これまでたまたま上手く動くコードが生成されていただけで、最適化によって挙動が変わってバグが顕在化することがある。
例えば、評価順序が不確定な処理を書いていたのがたまたま期待通りの順序で実行するコードになっていただけとか、不正なアドレスのメモリを参照や更新してしまっていたがたまたま問題がなかっただけだったとか。 >>803
volatile は一切使わないことにしました… volatileにすべきところでしないから最適化でバグるんだよ >>808
volatile すべきところ、って具体的にどういうところですか?それは本当に volatile にする必要があるのですか? >>809
メモリマップドIOと
共有メモリマルチプログラミングで
最適化時のアクセス省略防止。 >>806
ありがとうございます
そうであれば不確定な部分がなければバグはでないということですね
最適化用にプログラムの書き方も変える必要があるのかと思っていました
volatileはライブラリの中で使っていそうですがきっと大丈夫でしょう >>810
個人的には、memory-maped な世界はよくしらない(インテル系しかしらない…).
shared memory って、特別なことはありましたっけ?マルチスレッドなら排他処理用のオブジェクト(pthread-mutex/cond)を使っておれば問題ないし、fork() の中と外で同じ変数をつつくときは…はて、どうしてたっけ? そういやvolatileってC言語の場合CPUによってはうまく行かない事がありうるのな。
例えば4バイトの整数にアクセスするとして、そのCPUが2バイトづつしか読み書きできなかったら必ず2回のアクセスになる。
すると上位バイトと下位バイトで取得した時間が違っていたり一度に4バイト全体の内容を書き換えられない。 >>813
そういうのは >>812 のとおり、そのためのカラクリ(pthread等)を使用してアクセスするべきだと思います、裸で触ること自体が発想としてイカレているのではないでしょうか? マイコンなどのIO アドレスを、PC 側のメモリのアドレスに関連付けているのだろう(Memory-mapped I/O)。
これで、PC側のアプリでは、PCのメモリを読み書きするだけで、マイコンの操作ができる
PC側のメモリを読むと、マイコン側のメモリから読み込む。
読み込むと、マイコンの電圧が変わって、値が不定か逆などになる
通常は、pull up, pull down 抵抗などで、5V・0V にしているけど、
閾(しきい)値(Threshold)があって、
例えば、1V以下なら0V、4V以上なら5Vと判定される場合、1〜4Vは、不定になる
まあとにかく、読み込むだけで電圧が変わる・リセットされるから、
読み込むだけでも、電圧の状態が変わる
だから、IOアドレスを読むだけでも意味がある・状態を変えているので、
コンパイラで最適化・省略してほしくない! >>815
volatileと一切何の関係もねえし いや、「Cのプログラムで変数(あるアドレス)を読むことが、
ハードウェア的には状態リセットの操作になっているから、
読めと指示した場所で必ず読み取り動作を行って欲しい」だから、
volatileの使い方のひとつとして正当でしょ。
ハードウェア的な内幕の説明が少々ぎごちない気がするけどね。 >>813
多バイトアクセスがatomicに行われないのはvolatileの守備範囲ではなくinterlockの守備範囲。
なのでCPUによってはvolatileがうまく行われないってのはvolatileに対する名誉毀損になる。 マイコンなどのIO アドレス(port)を読み書きするには、その装置の手順が決まっている
まず、制御ポートに、読み込むポート番号を教える。
そこで装置を制御できるようにするために、例えば、50μ秒待つ
次に、ポートから読み込む。
読み込まれたポートは、電圧の状態を変える
電気電子的動作の要件・時間が、厳密に決まっている。
ある回路を動作させるときに、回路を切り替えないといけない
電圧の高低で、ある回路の部分を止めて、異なる部分を動作させる(電流を流す)。
そのため、規定の時間よりも、速くアクセスできない 電流を流すってのはバイポーラの場合だね
今ほとんどのコンピュータがCMOSで電流はゼロアンペアだ
寄生容量で交流成分が漏れたり貫通電流の問題はあるが
それは信号が電流表現ということではない >>804
最適化でおかしくなる場合の例としては潜在的バクがある。そしてよく見るのは組み込み系。volatileもそうだがprintfいれたり-O0にすると動作が正常化するってのがある。
volatileの例だと
int* fifo=0x0001;
int data=*fifo;
のようなコードはvolatileつけないと順番入れ替えられたりコードそのものがなくなったりする。
-O0やprintf入れると直る系はキャッシュ周りのこともある。キャッシュを積極的に使うかどうかで、キャッシュを使わない場合に安定する。キャッシュをたくさん使うprintfのような関数を入れると再度積み直しになって安定する。
後者は潜在的なバグで発見が難しいことが多い。プログラミングはわかるけど組み込みを知らない人がやらかすバグの一つ。 キャッシュ絡みの潜在的なソフトのバグってのは経験ないなぁ。キャッシュが化けるハードのバグなら経験あるけど。
キャッシュ絡みってシノニム問題のこと? キャシュの話はC言語にかぎらずどの言語でも起こりそう ああ、キャッシュ絡みのソフトバグ思い出した。
動的にプログラム入れ替えるソフト作ったときにIキャッシュをクリアし忘れてて誤動作したことあるわ。
Dキャッシュと分離されてる拡張ハーバードアーキテクチャの良い勉強になった思い出。 IMCCOやTecConfのエントリー作品を見る限り、
Cのコードゴルフって10年くらい前と短かさとかが変っていないように思えるんだけど
これはCが成熟しきった(所謂「枯れた」)言語である程度の成長限界があるからなのかな。
それとも凄腕プログラマの興味がPythonやらRubyなんかに移っちゃったのかな。 > コードゴルフ
意味無いから誰も参加しないだけでは >>766
アセンブラとC言語はまったく違うのに何を言っているのか? >>798
あのな、コンピータには文字列という概念がないのだよ。 > それとも凄腕プログラマの興味がPythonやらRubyなんかに移っちゃったのかな。
ハハッ、ナイスジョーク >>828
それを言ったら数値という概念もないよね
人間から見たら数値として扱えるように演算しているだけで
コンピュータにはビットのオンオフしかないよ >>830
CPUがビット演算しか備えていないならそうかも知れないけど、整数や浮動小数点数の演算を備えているのだから数値の概念はあるだろう。 それいったらあるのはせいぜい、アルファベットとか… チューリングマシンの説明に数値なんて出てこないでしょ >>834
チューリングマシンは計算機のひとつの仮想モデルだけど、いつからそれに限定した話になったの?
そもそもスレ違いだからこれ以上議論する必要はないけど。 チューリングマシンでもコンピュータでもなんでもいいけど、記号操作をやってるんです。
数値なんてのはかなり抽象化した話です。 CPU の数値演算はビット列をAND、OR、 NOTの組み合わせで変換してるだけだしね まぁ根本的に機械にはビットも数値も文字も文字列も無いわな。電気的にHiかLowかって話だから。
そういう話するスレではないと思うが。 演算器を構成するゲートレベルなら話は別だが、CPUレベルなら整数の加算てのは
ひとつのプリミティブな操作だろう。 >>837
3種類もあるのかなあ… NAND または NOR どちらか一方だけじゃない? 今どきはHDLで書いてLUTベースになってるんじゃないのん? >>841
NAND だけで全ての論理回路を構成できるけど NAND だけで構成されてるかどうかはわからん 基本回路はNOTで、その出力で駆動する
スイッチング素子を直列に置くか並列に置くかでAND/ORにしてるだけ
出力を負論理にするのはIOL>IOHだったTTL時代の名残 たとえば水流で動作するコンピュータがあったらと考えると電子とホールは全然本質じゃない そういや、スマートボール(まぁパチンコ台みたいなものと思ってくれ)式に
上の投入口からボールを落とすと、台に仕組まれたシーソーの傾きが変わって
後から入れるボールの流れも変わる、ていう「機械式計算機」の
モデルもあったな。
シーソーにラッチがついてて「メモリ機能」を持たせたり、
ボールを何個か積み上げるとラッチが解除される仕掛けで変更したり。
>>846 は半導体素子の原理説明だったかな。
P型、N型それぞれの中でも、電子と正孔の両方があったはず、だよね。 正孔なんてものは存在しない
あるはずの電子がない状態というだけ
電流の向きと電子の移動方向が逆ということを
どうしても受け入れられない石頭のための説明だ >>849
あるはずの電子がない状態を「正孔」と定義してるのでは?
正孔が存在しないってのは定義を否定することになる。 >>850
ならない
おまえ個人のオレ様ルールで否定ということにしたいだけだ >>849
「あるはずの電子が無い状態」のことを性行っていうんよ 846みたいに陽電子と勘違するやつがいるから指摘しといたんだ 誤「あるはずの電子がない」
正「電子がある方が結合が安定する(けど陽子数と合わない)」 >>855
ほほう それでそれで?
____
/:::::::ヽ
f::/" ̄ ̄ヾi
|:リ _ _|
|r==( o)( o)
( ヽ _) i
__/ヽ ー== イ
/ヽ ヽ \__ノ
`/ i \_/、
/ r-、 ハ
レ⌒ヾi / / |
i  ̄`ー―-ヘ |
ヽ_____ノーイ
| \ ノ
 ̄ ̄ ̄ ̄ ホールはあるぞ。
電子も実はないんだとか言うならまだわかるが。 なんだ、やっぱりその状態があるって認めてるじゃん。正孔(という状態)は存在する、と。
てか誰も「正孔というモノ」の話なんかしてなくて一人だけ勘違いしてるw >>860
絡んできたくせに結局849の日本語が通じてないだけかよ
相手して損した トムとジェリー 仲良くけんかしな
トムトムトムにゃーご
ジェリージェリージェリーちゅう >>865
もうこの話題も飽きたので相手しないだけ。 >>866
猫にねずみが噛み付いた
あべこべだ猫たたき
ねずみっていきものさ!
猫だっていきものさ! そういやトムジェリって一作目が作られたのが1940年なのな。戦前だ。
それで延々と続いて2017年にもOVAのDVDが出ている。恐ろしく長寿だ。
まあディズニー関係が一番長寿なんだろうけどね。 スーパーマンの1941年のアニメなんてすごいレベル高いよ フラッグの状態によって引数を変更する必要があるのですが
どのやり方がベストでしょうか?
//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]); //続き
//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"); 個人的にはAが好きだけど
こういうの馬鹿にする人いそうなのが困る この範囲だけで言えば A が見通しが良くて分かりやすいんじゃないかな。
1, 2, 3 の並び方が(順列で)6通り存在するとか、
1 と "hoge1"... だけでなく、1 と "hoge2" の組み合わせも発生しうるとか、
func()の呼び出しパターンがもっと複雑だったら、
「flagの値に応じて適切な引数でfunc()を呼び出す関数」を作ると思う。
call_func(int flag, [func()に渡す引数]); みたいな感じ。
[func()に渡す引数] の部分を、カンマで区切った引数群にするか、
構造体にまとめるかは、別の要素が絡むので、強く主張できない。 俺なら次のようにする。
void *a[]={1,&"hoge1",2,&"hoge2",3,&"hoge3",2,&"hoge2",3,&"hoge3",1,&"hoge1"};
func(flag?a:a+6); >>875
その flag が 0 か 0 以外の値にしかならず 1 や 2 で違う動作になる事は未来永劫ない場合と、将来的になる可能性がある場合とでやり方は変えるかも知れない。
でも最初のやり方で良いんじゃないかな。あまり捻ると分かりづらくなるし。
flagの値によって何十通りもの違う呼び出しになるとかいうなら色々考えた方が後々良いのかも知れないが。 flagに1も2もあるかよ
Win32のGetMessageみたいなアホなケースはあるが 突然のステマ(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でかなり最近に開発されたおかげか挙動が素直 Username for Subversion luatex repository
とか入力を求められるけど、何やら登録が必要? >>889
ユーザー名: anonsvn
パスワード: anonsvn ていうかごめん。普通に匿名SVNであることを書き忘れてたわw こちらも Subversion の公開レポジトリでは anonsvn が一般的と知らなかった。
案内ページも表示されないんで完全会員制の秘密クラブの扉でも
ウッカリ開いてしまったのかと、少々慌ててしまった部分もある。 確かにAPIはスッキリしてるけど機能が少なすぎるね>>887
Poppler使うわ。 >>897
この板をPCのクロームで見てみて
レス数が903なのに、メイトでは897なんよね >>898
なんかNGしてるワッチョイでもあるんでは? ■ このスレッドは過去ログ倉庫に格納されています