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
0750デフォルトの名無しさん (ワッチョイ 0d01-03bl)
垢版 |
2018/12/31(月) 21:39:38.58ID:MpZmteVw0
よくやるのは
#ifdef HOGE
#define func() ここに処理
#else
#define func()
#endif
で、-DオプションでHOGEの定義を切り替える。
好みや宗教により#ifdefを#if definedにしたり、HOGEの値により分けたり、プリプロセッサを使わず処理のifで分岐したり。
0754デフォルトの名無しさん (ワッチョイ 49e9-khkO)
垢版 |
2019/01/03(木) 10:32:23.68ID:H9RYMXki0
デバイスドライバというのはデバイスをドライブするプログラムである。
組み込みというのはまあ特定の製品を制御するための専用のシステムである。専用というのはつまり汎用ではないということで、要はPC向けではないということである。
0756デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/03(木) 16:57:06.44ID:38Nc8DQPa
LinuxならLinuxに合わせた形でデバイスとのやりとりを作る必要があるが、そうでないならその辺は自由になる。
0759デフォルトの名無しさん (ワッチョイ fb02-xhm2)
垢版 |
2019/01/03(木) 23:20:49.06ID:x5GCx+Ws0
まあ、組み込みとだけ言ってしまうとなんでもありになってしまうな。
Windows Embedded なんてのもあるし。組み込みだからといってOSがないとは限らない。
というか今となっては何も入ってない方が珍しいかな?
0761デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/05(土) 18:26:16.82ID:pJbMq/2ja
今じゃ小さいの幾らでもあるからなんでも組み込みにできるな。
コストと耐久性の問題はあるが。
0762デフォルトの名無しさん (ワッチョイ 8901-ahzL)
垢版 |
2019/01/06(日) 21:17:49.87ID:LPav389N0
一時はECUなど特定の分野を除いて組み込みもLinuxに席巻されそうになっていたけど、最近のIoTブームのせいか超小型超低消費電力のマイコンのニーズが高くなり昔ながらの職人芸的組み込みソフトが復権してきてるイメージあるわ。
0764デフォルトの名無しさん (ワッチョイ 997b-2hSR)
垢版 |
2019/01/07(月) 06:58:10.64ID:k1Vvc+OE0
PICなんかを使った、電子工作の延長みたいな
「Cでもプログラムできるワンチップ」ていうジャンルも
盛んになってるみたいだし。

あそこまで小さくなると、直接マシン語で考える方が
手っ取り早いような気がするわ。
0768デフォルトの名無しさん (ワッチョイ 0beb-xhm2)
垢版 |
2019/01/07(月) 18:58:49.76ID:YLZmdTQx0
>>767
なーるほど!コンパイラがいらずでCPUやメモリ使えるってことですね!
それは確かに便利だありがとうございます。初めてアセンブラの利用価値に合点がいきました。アセンブラわからないですが(´・ω・`)
0777デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/07(月) 21:58:59.48ID:fnTlHl64a
>>768
それだけでなく本当にCだけではできない事があるのが普通だ。CPUにもよるけどね。

何か特定のレジスタに値をセットしないと何かの機能が使えないみたいな場合はCではレジスタの指定をして値をセットすることができないので最低でもその部分だけインラインアセンブラにしたり全部アセンブラで書いたりする(またはそれ用に拡張がされたCコンパイラを使う)。

その他、80系やx86系ってI/Oポートあるが、あれはCからはアクセスできないのでその部分はアセンブラにする。

まあしかしそういうのはほとんどデバイスドライバの中で必要になる事なので普通は一般ユーザは考えなくてもよくなっている。
0778デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/07(月) 22:02:17.91ID:fnTlHl64a
>>773
それ昔は普通に居た。何せアセンブラなかったりあっても高かったりで使えないことが多かったからな。

>>774
3E 00   LD A,0

のような。
0780 ◆QZaw55cn4c (ワッチョイ d347-5am+)
垢版 |
2019/01/07(月) 22:37:49.75ID:c5u8F3uW0
>>777
思い出した!たしか 386 にて real mode から protected mode に移る命令は C では書けませんね…
他にもなにか面白い話があったような気がしましたが、もう思い出せない…実は 286 はリアルモードに戻れるとか…

>>774
HALT を言ってみよ
0782デフォルトの名無しさん (ワッチョイ 6992-4tJW)
垢版 |
2019/01/07(月) 23:06:04.57ID:JlpUfKel0
オムニバースを解析するソフトウェアを開発するにはどうすれば良いですか?
0785 ◆QZaw55cn4c (ワッチョイ d347-5am+)
垢版 |
2019/01/07(月) 23:54:17.89ID:c5u8F3uW0
>>783
>286では戻れずに、不便だったけど
通説ではそうなんですが、「実は…」という話があった気がします、そのため「だけ」に 286機を確保していたつもりだったのですが、うっかり捨ててしまった、やりたかったことを今思い出してしまった…
0786デフォルトの名無しさん (ワッチョイ 8b63-xhm2)
垢版 |
2019/01/08(火) 00:17:51.75ID:oEiIhl5B0
NECのPC98での話ですが、プロテクトモードとリアルモードを行き来するのに
リセットで実装していたと聞きました(死中に活ありみたいな感じ)。

「実は・・・」って話は知らないw
0790デフォルトの名無しさん (アークセー Sxc5-mE+R)
垢版 |
2019/01/08(火) 10:13:36.31ID:qFTAFG9Fx
昔から疑問なんだけど、マップドIO制御を除いてC言語だけでRTOSのカーネルは書けるのだろうか?
タスク同士のシステムコール発行によるプリエンプトはsetjmp/longjmpで何とかなりそうだけど、割り込みハンドラからのシステムコールによるタスクディスパッチは何をどうあがいてもスタックポインタの直接書き換えが必要な気がしてならない。
0792デフォルトの名無しさん (ワッチョイ 81ff-xhm2)
垢版 |
2019/01/08(火) 11:39:30.49ID:iKVSkTiF0
CだけでOSなんて、Cは元々そういう使い方を想定していない
実際UNIXは5%がアセンブラだった

特権命令は誰か言っていたとおりだし
PCとSPのようなCが前提にしているものの初期化をCでは絶対に書けない
0794デフォルトの名無しさん (オイコラミネオ MM95-hx//)
垢版 |
2019/01/08(火) 16:18:38.83ID:rMmlRXYeM
C言語を一番最初に学んで、C++、ほかスクリプト言語と使っているが、C言語で文字列処理ライブラリーってみんなどうしてる?
C++ だとboost C++ とかいろいろなライブラリがあって、オープンソースだったり商用利用できたり、物によってはGPLだったりするけど、そういうのに相当するC言語の文字列処理ライブラリってある?
各自で作りためたオレオレライブラリをみんな使ってるの??
07950794 (オイコラミネオ MM95-hx//)
垢版 |
2019/01/08(火) 16:22:15.64ID:rMmlRXYeM
つまり今から俺が自分用に文字列処理ライブラリ(独りよがりのオレオレライブラリ)を作る意味があるのか、俺が知らないだけでboostみたいに出来合いの洗練されたライブラリがあるのか…な…?
Pythonとかは言語仕様で十分複雑なことが出来るし、ホントC言語だけなんでこんな毎回面倒な目に合うのだろう。
0796デフォルトの名無しさん (ワッチョイ 81ff-xhm2)
垢版 |
2019/01/08(火) 16:37:12.54ID:iKVSkTiF0
Cを修行中ならオレオレライブラリを作ることにも充分に意味がある
既製品を使うことしかできないくせに天狗になってるやつが時々いる
使っているライブラリがオレオレか既製品かといった手段ではなく
知的な旅でどこへ行けたかが問題であることを見失うな
0797デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/08(火) 16:56:52.52ID:LJT6VvGba
俺はboostを知らない。
Cではあまり複雑な文字列処理を書かないしな。
複雑なのはPerl使ったりする。
0798デフォルトの名無しさん (オイコラミネオ MM95-hx//)
垢版 |
2019/01/08(火) 18:11:31.32ID:rMmlRXYeM
みんなありがとう

Cは全然修行中なわけではなく、別に必要にも迫られてない(C++もPythonも使える恵まれた環境)
ただ必要になったとき、みんなどーしてんだろうと。
C言語で文字列処理なんてするシチュエーションが少ない、とかかな。

初めてPython使ったときは感動した。簡単すぎて。C++では修行中に文字列処理ライブラリとかオレオレライブラリ作成やってみたけど、できあがった物がどう見てもboostの下位互換で悲しかった。
だからC言語で良いライブラリがあったら知っておきたいと思ったんだ。
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
正孔なんてものは存在しない
あるはずの電子がない状態というだけ

電流の向きと電子の移動方向が逆ということを
どうしても受け入れられない石頭のための説明だ
■ このスレッドは過去ログ倉庫に格納されています

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