前スレ http://2chb.net/r/tech/1554171817/945 > 928 名前: ◆QZaw55cn4c (ワッチョイ ba47-FGjx)[sage] 投稿日:2019/06/16(日) 13:35:27.88 ID:gDHKfsB60 [1/2] > >>927 > 無指定でどうこう、というのは確か C89 までの話だったかと > C99 では C++ と同じく省略しても void と記憶しています > 945 名前: ◆QZaw55cn4c (ワッチョイ ba47-FGjx)[sage] 投稿日:2019/06/16(日) 21:15:12.39 ID:gDHKfsB60 [2/2] > >>944 > 多分語義をわざわざ意識していないと思われ そんなことはどうでもいい C99でどうたらを早く説明しろ 逃 げ ん な こ ら ! プログラム板にキチガイ降臨中!botに一晩も反応する異常さ 一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。 http://2chb.net/r/tech/1559872586/ 142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO >>141 名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、 片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか? 一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。 ゲッター(英語表記)getter 翻訳|getter ブリタニカ国際大百科事典 小項目事典の解説 ゲッター getter 真空装置内の残留気体を吸着しうる材料のことで,高真空を達成する目的に使用されるもの。固体で吸着作用を行わせるものを接触ゲッター,気体中に分散させて吸着させるものを分散または拡散ゲッターと呼んでいる。 ほとんどの金属は両方のゲッター作用をもっているが,トリウム,バナジウム,チタンなどは接触ゲッターとして,またカルシウム,マグネシウム,バリウムなどは分散ゲッター作用がおもに利用され,蒸着またはスパッタして用いられる。 真空管などの封じた系の真空度維持や,イオンポンプなどに利用されている。
gccのmallocはdlmallocを元に作られているから mallocを何度も使って小さな領域を沢山確保する場合にもパフォーマンスは 下がりませんか?
mallocを作るにはmmapつかえばいいの? どうやるの?
>>10 まずは蟹炒飯本のmallocを実装して勉強する 静的解析ツールはぬるぽとかメモリリークをどれくらい防げるものなの?
ポインタが多階層にまたがって参照されるクソコード書かなければ、ほぼ見つけてくれるよ。 勉強になるから積極的に使った方がいいよ。
>>11 カニチャーハンの本とは表紙がカニチャーハンの本のことか? mmapはつかうのか?つかわないのか? 何を使うのかだでけも教えてちょ lintのポータビリティチェックはどれくらいポータブルにしてくれるものなの?
演算に関する質問です。 8.21 * 5 = 41.050000000004←この4は何者でしょうか? 左の「8.21」が浮動小数点数、右の「5」は整数です。 演算の結果、制限の少ない型、すなわち浮動小数点数に変換されるのですが、 上記結果に示すように最後の4が何?不具合? C言語の歴史は長いのに、こういう初歩的なミスをどうして今の今まで気づかず、放置したんですか。 これを契機に俺は浮動小数点数は使わないことにした。
そのような現象が起こるのはC言語の浮動小数点数に限った話ではない 基本的に0か1かの世界であるコンピュータがどうやって浮動小数点数を扱っているのか その辺のことを考えながらすこし色々調べ直したほうが良い 正確な精度が必要なら浮動小数点数じゃなくて任意精度計算のライブラリを使いましょう
マジモンのネタか ホームラン級のアホか それとも嵐か 第四の選択肢をもった世界初の偉人か どれだ
>>21 答えを教えてください。最後の4の正体はなんですか?初心者なので。 >>24 あなたがちゃんと>>20 を調べたとは思えないので私は答えません。 調べているならちゃんと計算方法も出てくるし、本当にそうなるのか実際に自分の手で試してみようという気も起きると思います。 初心者だからこそ自分で調べて自分で計算してみてください。 >>25 スレタイにあるとおりC言語なら俺に聞けとあります。あなたは、その「俺」ではないのですか?なければやむを得ませんね。 ちなみにあなたの質問は「C言語」についての質問になっていません 「浮動小数点数を扱う規格」とそれを使った計算結果の質問です なのでそもそもこのスレで答える筋合いがありません
>>19 >8.21 * 5 = 41.050000000004←この4は何者でしょうか? >8.21 * 5 = 41.050000000000004 コピペミスか? >>28 コピペではありません。手入力です。0は重要ではありません。最後の4が曲者です そもそもなぜ4でなく0で完結しないのか。0だと不都合があるのか、本質が議論されていないからいつまでたってても解決しませんよ。
>>32 マジレスすると浮動小数点は内部で2^nの有限和でしか表現できないから(nはマイナスもあり)。 10進数に変換すると誤差が出る。 これで分からないなら諦めろ。 桁数には頓着せずに見かけの数値に拘るって どこかが変
>>32 答えは>>20 で出ており、議論すべきことはなにも残っていない。 残っているのはお前さんが提示された情報をちゃんと調べて自分の頭で考えることだ。 それをした上でまた疑問が出たならそれを質問すればいい。 >>35 手入力で適当に0埋めたからヒューマンエラーがあってしかるべき。だからおかしくない。 0.821を=a/2+b/4+c/8+....ってやってみて 出てきたabcd.....を5倍すると最後が4になるってことだよ
このレベルの質問者に対して、ieee754読んでこいおしまいも、そうとうどうにかしてる
>>42 申し訳ありません。最初にコメントした通り初心者なもんでして。 1000人の初心者に対して同じ質問しても1000人とも答えられないでしょう。だから恥じらいとかないんです。 >>44 回答してもらって納得するよりも、 自分でやる方が遙かに勉強になる ヒントだけ書いておこう 数値の内部表現を調べて、演算仮定を追いかけ 計算結果の内部表現を見て、それを10進表示に戻す 以上を追いかけていけば自ずと回答がでる >>41 今時ググればいくらでも情報あるから自分で調べる気があるならキーワードだけで充分だろ みんなこの質問に答えると中出しセックスできると本心では思っているからなかなかおしえてくれないよな 中出しセックスができなくなるアニメとかゲームとかパソコンの質問は簡単に教えてもらえるよ
>>19 普通はCは浮動小数点を内部で2進数で扱っているため。 10進数で歯切れのよい数でも2進数では循環小数になったりして割り切れない値になることがある(例えば10進数で 0.1 は2進数では 0.00110011...という循環小数になる)。そうなるとどうしても10進数文字列への変換で近似値にしか変換できない。 では最初から内部も全て10進数で全て計算すれば良いではないかと思うかも知れないが、それではコンピュータ内部での計算が遅くなる。 遅くなってでも正確さが必用とされるお金の計算等はそれ用のコンパイラまたはライブラリを使用して実現する(あるいはC言語ではないそれ用に設計された言語を使う)。 デフォルトではCは誤差が出てもいいから素早く計算出来る状態になっていると考えて良い。 >>48 > では最初から内部も全て10進数で全て計算すれば良いではないかと思うかも知れないが、それではコンピュータ内部での計算が遅くなる。 それ以前に1/3ってやられたら同じことになる 10進数だと内部形式と外部形式で変換誤差が出ないだけで計算にまで言及したら10進数も2進数も同じだよ 要は有効桁数を意識してりゃいいんだよ それ以上の制度が欲しいなら専用ライブラリ使えばいい
2進数で計算する方が悪い ちゃんと10進数で計算するライブラリを使え
有理数で計算するライブラリを使えばいい。 パイ?何それおっぱいのこと?
有理数計算は実装してみれば分かるが圧倒的に遅いからな 無理数はどうやって実装するのか知らん
有理数で計算したあと最後に無理数に直すところで一番最後が4になったらどうするんだよ
メモリが有限である限り無理数を厳密に表現するのは不可能だよ
C言語でWebAssemblyできるみたいだけど ハードウェアに近いとこでもなければC言語は使わないほうが良いイメージだけど 実際WebAssembly的にCはどうなんだろうか?
>>64 数値演算に拘ならければ数式処理でπはπ、√2は√2のままで計算できるだろ。 >>66 だから「厳密に」って言ってるじゃん πは14桁で事足りるし31兆行も必要ないからね > πは14桁で事足りるし ぐるぐる回転するとだんだんずれてくる
>>67 いや、そうではなくて数式処理ならメモリ有限でも厳密に表現できるんだけど。 なんか俺変なこと言ってる?もしかして議論噛み合ってない? >>71 πはπとして表現するってことね そりゃそうだよね >>71 数式でいいなら紙に数式を書けばそれが答えじゃないのか? でもpiを1として考えたら1が1/piになるんじゃないのか?
>>73 そりゃ紙に書いて数式演算って言い始めたら数値演算も紙の上でできるでしょ。 俺の言ってるのはMathmaticaのような数式処理。 建築設計や土木設計の時の数量計算なら、数字を出さないといけませんよ
紙が足りなくなってきたら最初の方から消しゴムで消していけばいいだけだからいつかは書き終わるだろう
半径5の円の面積求めなさいって言われて 78.5... と数値として答えるか 5^2*pi と数式で答えるか 俺は数値の精度の話をしてたんだよ
有理数を実装すればいかなる整数m, n に対しても m / n * n がきちんと m に戻る (decimal型でも普通無理) 同じようなことを無理数でやる方法がわからんって話よ 無理数が厳密に数値化できないなんて誰でも知ってる話はせんわ
>>83 現実問題としてそんな厳密解は必要がないってことだよ だから数値の精度の話したんだけどな NASAはπ15桁で軌道計算して誤差は約12cmだってよ >>84 「そんな厳密解は必要がない」ってのはお前の信条だろ お前の信条を話に混ぜられても困る >>85 どこに俺の信条があるんだよw じゃあ何が問題なのか具体的に言ってみろよ >>86 俺「どうすれば実現すればいいのかわからない」 お前「そんなものは必要ない」 話になってない >>89 計算の中で無理数を無理数として処理したい 最後に数値化したいならそのときの誤差だけは許容する >>91 その数式処理をどうやるのか知らないって話なんだが Mathmatica 的に数式処理したいならそういうパーサーを書いてだな… 解析解が求まるといいですね (lol
>>93 Mathmaticaいくらすると思ってんだよ… そもそもどう処理してるのか興味があるだけなんだがな OSS漁ればあるかな
「数式処理ソフト」と紙に書けばいいんじゃないのか?
>>80 やっぱり議論が噛み合ってなかったね。 俺は厳密解の話してたわ。 無理数が有限メモリで表現できないからの数式処理なら表せられるの流れだったのでまさか数値解の話で止まってるとは思わなかった。 「計算のステップごとに増えてく誤差の蓄積」と、 「最後に(それまで記号的に扱うことで保留していた) 無理数や無限小数を実際の数値に直す際の誤差」と、 話がゴッチャになってるでしょ。
>>100 数式で表現できるのは当たり前だし そんな当たり前の話されてもって感じだったわ ここはC言語のスレですよ 数式処理スレじゃないです
>>102 なら最初からそう書けばいいのに、何で数値解にこだわったの?俺は最初からこだわらなければと書いてるけど? C言語で扱えるのは数値解でしょ それ以外はスレ違いのテーマ
>>104 こだわりなんてないけどね πは数式でπと表現するなんて当たり前だから 当然、無理数の数値表現の話だと思っただけだよ >>106 無理数を有限の有理数表現するなんて、議論するまでもないじゃんw >>105 そだね、俺はMahmaticaのような数値処理をC言語で実装すれば無理数も有限メモリで扱えるよ、と言いたかったんだが、議論がスレチになったのでもうやめます。 >>108 その当たり前を分かってないからこうなってるじゃんw >>51 lint 前提のコードは、変てこなキャストとかが多用されているので、私は好きくない (void)fclose(fp); とか >>109 ま、ここではよくあるコミニュケーションエラーだったね。 建設的な議論になりそうにないので、もうやめとこ。 俺は数式処理にMathmaticaしか使ったことないけど、オープンソースでMaximaってソフトあるね。 どういう実装になってるのか今度見てみよう。 数式処理はコンパイラ書くのと同じですよ。 記号操作なんだから、ある意味コンピュータの仕事の本質です。数値よりも。
あと、mathematicaは任意桁の誤差なしの数値計算もできるけど、そっちはGNUのライブラリ使ってたのではないかと。
Axiomってのもソース読めるな 探せば色々でてくる パーサ書くなら昔はlexとyaccが定番だったけど今は何使ってるのかね
>>109 いや、わかってないのはお前 そもそも数式処理って最後に数値なんか出さないし 大学で(一般教養としての)数学やってないの? >>116 ああ、わかったわかったw 後出し多くて疲れるわw >>115 俺はむしろ数式処理はPrologのようなパターンマッチングやってると勝手に思ってる。 知らんけど。 >>117 えっ、後出し? マジで>>66 の言ってることを理解できてなかったのかよ… もしかして入試問題が「直径1cmの円の面積を求めよ、ただしπは3と仮定する」みたいな学校にしか入れなかったのか?w πの定義って本当は難しいではないかと考えるようになりました…
>>121 円周の長さって曲線ですよね 曲線の長さ…んー、曲がっているのに長さ? 「円周の長さが存在すると仮定したら」円の直径と円周の長さの比である、なら理解できなくもないのですけれども >>122 もうC言語に関係のない話題なんだから黙ってろよ >>64 いや可能だよ おまえさんがそう発言しているのは 有限のメモリを使って表示されている電子教材に厳密な定義が書いてあるからだ それはおそらく自然言語で書かれたものだろうがCに翻訳するのはおまえさんの仕事だ いま気づいたんだけどgccの拡張使えばC++のテンプレート的なことできるな
このMSの新コンソールのデモビデオ VIDEO 編集してるのは C のソースのように見えるけど "<=" を "≦" に変えたり、"==" を "=" にしたりとか何の冗談だろう それとも本当に こういう文字も OK になるのか? オレが知らないだけで すでに OK なのか? >>134-135 ググった。どうも Unicode のリガチャ? とすると見かけだけではなくて、ファイルに格納したときの文字コードも 変わるってこと? ていうか最近の C コンパイラはそれを認識するのか? >>136 自己れす 考えるに、やはり見かけだけのことだな CSS のスタイル指定と同じことをやってると fira codeっていうのがあってな emacsでもつかえる
>>64 3.1415926535897... ≒ 3.14 これだけの話 >>96 raspberry piからなら無料で使える raspberry pi 4も3日くらいまえに発売された C11を使っています。 #include <stdbool.h> void main( void) { int cnt = 0; bool hoge = false; while( !hoge){ if( cnt++ >= 10) hoge = true; } このような感じのコードを実行したところ、ループから抜けません。 stdbool.hにはtrueが1と定義されているので、10回ループを回ると while(!1)と同じ状態になると思います。 これはfalseと等価とは扱われないのですか?
>>145 そうですか・・・ TrueSTUDIO for STM32のコンパイラはgccじゃないかと思うのですが、 何か違うのかもしれません >>144 まさか知らんのか? ISO/IEC9899:2011のことだよ ISO/IEC9899:2018が現行規格で、 それの1個前の旧規格だ ・・・またおかしいことになってるな ISO/IEC9899:1990がC89なのと同様 ISO/IEC9899:2018がC17だ >>149 C11を使ってます、で意味が通じたということ? あと引数にvoidがあるけど、大丈夫だった? >>143 何か変な最適化されてるのかな? 逆アセンブラ見てみたいね。 hoge は不変とみなしてループ外に追い出すような類推が働いてしまうコードっぽくないのに true との比較ではなく !hoge だから間違いもおこさない形式だし
そもそもこのループは最適化で1行も生成されてないと推測。 んで何かの勘違いで抜けてないと思ってしまったと予想。
gccの -std=c11 -O0 でやったら終了した
>>148 ノ 彡 ノ ノ ノノ ミ 〆⌒ ヽ彡 (´・ω・`) if文の中を hoge == true とタイプミスしているとか
>>143 str fp, [sp, #-4]! add fp, sp, #0 sub sp, sp, #12 mov r3, #0 str r3, [fp, #-8] mov r3, #0 strb r3, [fp, #-9] b .L2 .L3: ldr r3, [fp, #-8] add r2, r3, #1 str r2, [fp, #-8] cmp r3, #9 ble .L2 mov r3, #1 strb r3, [fp, #-9] .L2: ldrb r3, [fp, #-9] eor r3, r3, #1 and r3, r3, #255 cmp r3, #0 bne .L3 nop add sp, fp, #0 @ sp needed ldr fp, [sp], #4 bx lr 問題なさそうだが、本当に抜けなくなったのか? そのコードはx86 じゃないの? STM32用の開発ツールらしいしARMのコードを吐くコンパイラだろ
疑いだしたらきりがないけど >このような感じのコード と言ってるあたり、このコードが100%再現する最小コードではない可能性もあるということだろうか? 擬似的に if( cnt++ >= 10) hoge = true; と書いてるけど 実情は割り込みや別スレッドかなんかで hoge を書き換えてたりとかさ
へんな動きしたらデカい配列作ってスタック破壊してないか疑う。 アセンブラ使てたらショートジャンプで128バイト以上離れてるラベル指定してないかとかも。 16/32bit時代のことですが。
スタック破壊は高確率でリターンアドレス壊して暴走(coreダンプとか例外とか)が発生するので発生しちゃえば案外すぐに分かる。
ポインタは値と参照どちらですか? f(&v);みたいにポインタを渡す事を参照渡しと呼ぶのは妥当ですか? ポインタをインクリメントしたりアドレス計算に使う場合があるから 値っぽい気もしますよね
「C言語は数値でアドレス指定してデータにアクセスする能力を持つ言語だ」 と捉えて、ポインタ渡しはあくまで値渡しと捉えるのも妥当そうじゃないですか?
そういう認識ができてるなら十分だな その値から指し先が示す実体を引っ張ってこれるってだけで 関数のインターフェースとしては値を渡してる C言語ではできないが int a = 0; foo(a); 呼び出した結果 a の値が書き換わって戻ってくる っていう渡り方があって、そっちを参照渡しって呼ぶし
そういう意味では全ての言語は参照または値を表記の違いこそあれ何かの値を渡してるわな。 「参照のための値(アドレス)を渡している」という意味において、C言語もまた参照渡しのある言語になるんじゃない?
Cに参照はないが、ポインタ経由のアクセスを参照だと脳内定義するなら参照ということにはなる。 ただC++は参照もポインタ経由のアクセスも両方使えるようになってるので後でC++やろうとすると混乱するかもね。
先輩「〜〜」 新人「なるほど、つまり参照渡しですね」 先輩「違います」 新人「オオ…オ……オ……」 そして新人はIT業界を去ったのであった
C言語の場合は素直にアドレス渡しで良いと思う 紛らわしい用語使うとかえって混乱するだけ
先輩「〜〜」 新人「なるほど、つまり参照渡しですね」 先輩「まあそうだね」 新人「なるほど理解しました」 優しい世界
姑息じゃない先輩「〜〜」 新人「なるほど、つまり参照渡しですね」 姑息じゃない先輩「まあそうだね」 新人「なるほど理解しました」 姑息じゃない先輩「でもC++の時は注意が必要だよ。その時にまた質問してね。」 素晴らしい先輩
Java は参照の筈なのにある日 NullPointerException を見て愕然とする。
NullPointerException を見て愕然 「ぬるぽ」を見ると「ガッ!」と返されることの由来。
ポインタ?BASICのPEEK、POKE、CALL、DEF FN使ったことあるなら(ry
>>179 DEF FNが全てのBASICにあると思うなよ。 I/Oの何十ページもあるダンプリスト打ち込んでたなあ・・・
デバドラを作った事がないんだけど C言語で作ったとして、 CPUやOSの違いに対してクロスプラットフォームなソースコードを作れるものなの?
>>179 それを言うならDEF USRだな 富士通のやつ CALLつーと早川電機か? クロスプラットフォームなデバイスドライバなんて見たことが無いんだけど存在するの? デバイスにもよるんだろうけどインストーラが分けてあるイメージある
実行ファイルは環境毎でも ソースコードは共通化されてるかもしれない
>>183 そりゃ無理だ。 デバドラはデバドラでOS毎にお作法がちがう。 >>184 早川電機じゃオッサンでも分からんだろ(笑) シャープと言えや。 確かにS-BASICにCALLはあったけども。 同じデバイスに対しては同じ様なプログラムになると思うぞ。
>>189 CPUの違いだけならクロスプラットフォームにできる? 間違えてはいないが単にその言葉が曖昧だ。 ifdef等を使わずにCPUの違いに対処できるCコードは書けるか?
>>191 デバドラの種類によるかな? ユーザモードドライバだけで済むような環境だとCPUが違ってもソースコードを共用できる可能性が高い。 >>194 プラットフォームの差を吸収するレイヤがありゃできるだろう。 普通のプログラムだってリンク時に解決してる部分がかなり大きいんだから。 Cで書いてる時点でそれなりに抽象度が高いと思うよ。 >>195 Linux は結構共通になってない?ものにもよるか。 PC-98、TWONS、AT互換機でDOSのファンクションコールしか使わないなら同じexeファイルが使えたと思った。
MSX-DOSとかCP/Mのプログラム動いたぜ。 Z80だし当たり前なんだけど驚いた。
hoge.hというヘッダーファイルがシステムで使用可能ならインクルードして、ないならローカルに用意したものをインクルードしたい時はどうすればいいですか? イメージはこんな感じです if (exists("hoge.h")): #include<hoge.h> else: #include"./src/hoge.h"
>>200 #if EXISTS_HOGE #include <hoge.h> #else #include "./src/hoge.h" #endif コンパイラオプションで-DEXISTS_HOGE=1を指定するとシステムのヘッダをインクルードできる これの欠点は手動で指定する必要があること 自動でやりたいならautotoolとかcmakeを使うしかない >>200 includeパスの優先順位を利用するのじゃダメなの? 自分の hage.h を用意しとけば。名前何でもいいけど。 で、本物のhageのインクルードガードのマクロ定義をチェックすればいい。マクロがあればの話だけど。
こっそり__has_include使えたりしないの?
cmake便利だよな。これを覚えたせいで仕事を簡単に家に持って帰れるようになってしまったよ……
ハッカータイプの人はそれが普通なんだよ パンピーには解らないし解ってもらいたいとも思わない
>>214 ポインタは変数で4バイトのメモリ領域で、 配列は連続したメモリ領域? int arr1[] = {1,2}; int arr2[] = {3,4}; arr1 = arr2; がエラーになるから配列はポインタ変数とは明確に区別されてるみたいだが 16-bitのMS-DOSの時代だと2バイトのポインタがあったし、64ビットのCPUなら、8バイトもあり得る。
また値渡し、ポインタ渡し、参照渡しは〜ってやるのか?
配列はポインタのシンタックスシュガーでしかない ポインタは何でも許されるが配列は操作が簡略化と同時に制限されてる
>>222 配列名は定数扱いのポインタですね しかし、配列だけに許される簡素化ってなんですか? >>223 配列は宣言した瞬間に領域が確保されてるだろ int a[1]; と int *a; a=(int *)malloc(sizeof(int)); の違いって何?
>>226 前者はスタックか静的領域に確保される。後者はヒープに確保される。前者はスコープを抜けると自動で解放。後者は解放しないとメモリーリークする。 >>227 ということは配列ってメモリのことよく分からない初心者プログラマ以外には無用の長物なん? 解放漏れの考慮以外でわざわざ配列使うメリットってあるの? >>228 寧ろ配列で済むのにポインタを使う意味がないぞ >>228 繰り返し(iteration)の処理で連続データを処理・制御するときに配列がないと困る。 >>229-230 int a[3]; for(int i=0;i<3;i++) a[i] = 0; int *a; a=(int *)malloc(sizeof(int * 3)); for(int i=0;i<3;i++) *(a+i) = 0; これとこれだと違うの? ポインタだとchar型の時とか文字列代入出来るし 上位互換な気がするんだけど。 >>231 sizeof(int) * 3の間違い。 ヒープだと可能なかぎり自由に実行時にサイズを決められる。 >>231 前者の方が簡潔だし 書かなくていい確保・開放処理は避けるものだ パフォーマンスも配列の方が上 >>228 自分で書いたんだから分かると思うけど、言語構造の話でも>>226 の場合は記述量で配列の方が楽だし、読む側もひと目でわかるじゃん。 じゃあ配列は、ポインタの一部機能を制限して使いやすさの向上を図ったものという認識でいいの? それとも生まれも育ちも全く別の概念? 何か、今やってるcの教材が、まず最初に配列を使ってプログラム書いて、 次の章でポインタ出てきて、今まで配列使って書いた奴をポインタで書き変えろみたいな例題ばっかりだから だったら最初から配列いらなくない?と思ってしまいました。
実用的なプログラム書いてたら、そのうちわかる。心配要らない。
分かりました。unionもわざわざこんなの使わずstruct使えばよくねって思うけどそういうもんだと今は思っときます。
>>237 むしろ、何故ポインタが不要だと思わんのか謎だわ なぜopenとfopenの二つのファイルアクセス手段が用意されているのか。
>>241 open() は OS が提供するシステムコールそのもの fopen() はライブラリ関数であり open() をラップして「使いやすくした」(本当か?)もの >>242 バッファっリングしてくれるとか、fprintf()もあったりしてテキストをフォーマットして出力するのも楽というのがある。 Cライブラリとしてはfopenしかないわけだけど、正直あんまり便利じゃないよな。
>>243 バッファリングはね…バッファリングは今は大部分 OS が抱いているものなんじゃないかな…アプリケーションが各々のユーザーランドに抱いていてメリットがあるのかな… >>245 ま、そうだけどね。Cってそういう今時のちゃんとしたOSのないところや完全にOSなし環境用のプログラム作るのにも使われるし、ああいうライブラリはあってもいいと思う。 まあしかしちょっと古くなった感はあるのでリニューアルしても良いんじゃないかとは思うけどね。てか、最低でも標準ライブラリなのにセキュリティーホール作ってしまうようなのは廃止した方が良いよな。 システムコール自体相当重いから、OS呼び出す回数減らすためのバッファリングだろ
入出力バッファリングしてくれるファイルシステムなんてあるか? ジャーナリングと勘違いしてるんだろ
しない方が珍しくね? writeしたらディスク書き込み完了するまで次がブロックするとか?
>>240 char *str; str = "abc\n"; が許されるから。 配列に文字列を代入出来ないのが不便 >>241 それ言うならfopenとfopen_sの方が意味分からんね VS使ってたら書き換えろと警告出してくるわ、書き換えたら引数の取り方違うとかいうクソ仕様だし >>253 そりゃ、現実としてそういう建て付けになってんだから使うよ。 でも文字列だったら最初からもうちょっと抽象的な操作の方がいいわ。ポインタ使いたかったら&つけてもいいんだし。 >>253 一応初期化の時だけ char s[] = "..."; って書き方できるけどね。これは初期化だけの特別な書き方だな。 やってるな。外付けのHDD付けた時なんかはするかしないか設定できたりして。
DOS時代、ディスクキャッシュはドライバーが必要だったな。
str[9]="おはよう" str[9]={'お','は','よ','う'} こうやってまとめて配列に日本語を入れるのは出来るんだけど「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか? 英語ならstr[0]=…、str[1]=…って済むけど
>>259 > こうやってまとめて配列に日本語を入れるのは出来るんだけど え?できる? >「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか? wchar_t 型を使ってL付けたらできないか? 要素数を明示してるので、文中の代入ではなく、初期化のときの話だろうとは予測できるが 「入れる」というのは、代入を連想させるので、うまい言い回しではないかもね
>>253 関係ないけどconst違反だね そのケースだけ特別に見逃すことになってるけど >>255 その書き方はK&Rでは静的記憶域期間にのみ許されていた なぜだかわかるか? >>262 そうだったっけ?そうだったような気もするが。 なかったのは自動変数だと毎回コピーすることになって無駄だからかな? >>262 初回のみ限定警告100%オフ! 送料無料! だからね いちおう違反ではないことになってる >259 >str[9]={'お','は','よ','う'} マルチバイト文字をこう書く時はエンディアンにも気をつけないとね。
>>263 memcpyみたいのは言語自体に組み入れるべき機能ではないという判断だ 俺は今でもそう思っている 思ってるって…… じゃK&Rにはwhyは書いてないってこと? なんでお前の脳みその中身を当てこしなきゃいけねーんだ バカかこいつ?
>>265 エンディアンが同じでも解釈が違うことがあるぞ printf("%x %x", 'あ', L'あ'); bcc32: a082 3042 cl: 82a0 3042 gcc: error >>267 じゃあ言い直そう - 思っている + 賛成している >>273 'あ' みたいなのは char じゃないから少なくとも警告出そうな感じするんだが。 int Code='ABCD'; なんて書き方できるから文字列はOK。(Code=0x41424344; と解釈) 全角文字の解釈はコンパイラ次第。unicodeやutf-8対応なら問題ないと思う。 S-JISはよく"\"が含まれる文字で誤作動起こすけど。
C99 6.4.4.4 Character constants で character-constant: 'c-char-sequence' L'c-char-sequence' c-char-sequence: c-char c-char-sequence c-char こうなってて文法的には 'ABCDEF' は許されるんだな ちょっと意外
>>275 printf("%x", Code); bcc32: 44434241 cl: 41424344 gcc: 41424344 int *ptr; ↑なんですが、「int型のポインタ変数ptr」、それとも「int *型のポインタ変数ptr」のどちらでしょうか?
>>281 読み方としては int (イント) * (ポインタ) 型の変数 でしょうか 「ポインタ変数」と言った場合は「* (ポインタ)変数」という捉え方でいいのでしょうか? 「ポインタ」と言った場合に「*」を指すのは普通ですか? >>282 好きなように把握すればよい、しかし int * の使われ方は決まっているのだから、それがすんなりできるかどうかが問題 >>280 Cの場合は変数に*がくっついた形で宣言されていると考えた方が良い。というのは int *a, b; と書いた場合に a は int * 型だが b は int 型になるからだ。 規格書には pointer to a character type pointers to structure types という文が頻繁に出てきますね 日本語で言ったら「char型へのポインタ」のほうが「charのポインタ型」より正しい気がします >>284 さんのpointer to intは日本語なら「int型へのポインタ」ですね と思ったんですが規格書には pointer type も出てくるので、どっちでもいいということでしょうか つまり「char型へのポインタ」=「charのポインタ型」ということになりますが 変数の宣言と型の宣言が同じ形というCの事情もありそうだが、そこは曖昧だと思うね。 アップキャストしたら単にポインタだし、ポインタ型と言う場面もあるだろう。 これいいね https://cdecl.org/ typedef char *pchar; とすると pchar 型は「charのポインタ型」というとにはなる。
some_type foo() と戻りがあるのに、その戻りを捨てる意図で (void)foo(); と呼び出すコードを見たことがあるような気がするが C++ かもしれん 最適化の際にうまいことしてくれるのを期待してるのかしら
>>296 コンパイラかコードチェッカーのwarning抑止のためじゃないかな Cでも使える。 一度も使ってない引数変数があるとか、関数の戻り値を使っとらんとかで警告が出る場合にくっつけるのが主だと思う。
> 引数なしの関数を書くときはvoidと書く プロトタイプじゃなかったっけ
>>297-298 なるほど、警告避けかー 引数に対してのは callback 関数として、引数の型&数は限定されてるけど 実装時には一部の引数を使わずに実装できちゃうときに発生しそうね void foo(int arg1, int arg2) { /* 色々書くけど arg2 は使わない: callback 関数の都合で引数の型と数は変えられん */ (void)arg2; } >>299 これ OKでしょ int func(void); int func() { return 0; } >>302 のは 非ANSI の K&Rフォームで警告されるんじゃ 引数有りの記述では int func(int); int func(a) int a; { return 0; } と等価 >>302 これアウトでしょ int func(void); int func() { return 0; } func(hoge); >>302 VCだと > warning C4255: 'func' : 関数プロトタイプがありません : '()' を '(void)' に変換します。 って警告出て、関数部分の引数を変えてしまってる >>302 おまえさん、自分のところで動作確認してるか? でたらめこくな char *p; p = "str1"; p = "str2"; こんな風に文字列リテラルのポインタを付け替える時に前の文字列リテラルのメモリ領域を解放するにはどうすればいいの?
X 3010:2003 では 6.7.5.3 関数宣言子(関数原型を含む) 「並びの中の唯一の項目が void 型で名前のない仮引数であるという特別な場合,関数が仮引数をもたないことを指定する。」 6.9.1 関数定義 typedef int F(void); F f, g; int f(void) { /*... */ } // 正 int g() { /*... */ } // 正 という訳で int func(void); /* prototype */ int func() /* definition */ { return 0; } どこかまちがっているか
>>309 まじですか。じゃあこのような書き方してたらいずれクラッシュするってことですか? char *p; while(1) { //何かの処理 p = "hoge"; } それは同じ"hoge"のアドレスがロードされるだけ 文字列リテラルのポインタ扱うならconst char *使いなされ
>>312 文字列の定数は静的な領域に作られるだけで実行時に動的に作られたりしないのでそれは問題なし。 あ、でも、定数でなくても同じか。単にポインタ代入してるだけだもんな。
>>301 その場合は↓で良いはず void foo(int arg1, int) { } >>311 おまえさんは「関数原型を含む」を、「関数原型についてのみ」と脳内変換しているのか? > int func() /* definition */ これのどこに、void型で名前のない仮引数があるんだ? 最近C言語学び始めた者ですが練習がてらトランプのブラック・ジャック的なものを作っています そこで11以上がでた時10とするという単純なプログラムを書きたいのですがつまづいています。 ご教授頂ければありがたいです
>>320 パッと思いつくのは、要素数13の配列用意して 対応する番号の所に希望する数を入れておく >>321 一応rand関数というのをつかって1~13までの数をランダムで出すようには組めたのですがそのランダムで出た数が11以上だった時10として扱うというのが組めません やはり13個全部配列組む方が確実なのでしょうか ブラックジャックのルール全部適用させようとすると初心者には結構ハードル高いような気がする。
>>322 式でやりたいなら、 i>10? 10: i >>324 ありがとうございます!早速試して見ます! >>323 あんまり細かいことはさすがに手が出ないのでとりあえず ・11以上は10として扱う ・21超えたら負け ・1がでたら1か11好きな方を選べる この3つだけできればとりあえずブラック・ジャックとしてゲームは成り立つかなと考えてます カード52枚作るのがいいと思いますよ。 シャッフルもしがいがある。 配列の要素は見た目(ハートのJとか)を表す構造体。なんだったら実際の値も入れる。Aが微妙ですが。
>>327 作り始めた時52枚全部定義すれば本格的になるかなと思ったのですが、ご教授お願いしている身で申し訳ないんですけど少し面倒だなと思ってしまいましてorz やっぱりちゃんとしたブラック・ジャックを作りたいなら52枚全部定義した方がいいですよね 某ゲーム内のブラックジャックは同じカードが自分と相手に出てきた。 カジノのブラックジャックだとトランプを何セットも混ぜてやってるらしいね。
絵札の数が決まっていると残りの絵札を数えれば勝てるらしい。
実際は6セットとか使うわけです。 有限なのでカウンティングができる。 過去の結果に依存するってことはサイコロ使うような無記憶な試行ではないってことだね。
カウンティングだけで勝つのは驚異的な記憶力がないとなかなか難しいと聞く。 小説「マルドゥックスクランブル」でのBJシーンは有名だけど、読んででも半分も理解できなかった記憶があるわ。
>麻雀の役判定、得点計算 あると思う 判定も計算も難しくはないし 無くても自製可能なレベル
ものすごく基礎的な質問で申し訳ないんだけどテトリスのようなゲームを作るとき、実行中のプログラムとは別にn秒ごとにあるプログラムを実行するようなのってどうすればいいの? キーボードからの入力待ちの状態と並行して時間の計測とブロックを落下させるみたいなの
OSによって違いがあるけれど、 指定した時間間隔でイベントを発生させ そのイベント通知を受けて処理を行うようにする
DOSならVSYNC割り込みとかタイマ割り込みっていうのがある。
入力待ちしてるはずなのになんでブロックは落ちてるんだ
うーん…前提から間違ってるのか? ブロックを生成した後、キーボードからの入力を待ちながら一定時間毎に落下させるのかと思ってたけど、一定時間毎に落下させる中でキーボードからの入力があればそちらを実行する感じ?
なるほど 同期処理、非同期処理を使えば割り込ませたりすることができるのか まだほとんど理解できてないけどある程度方向性は見えてきた気がする サンクス
>>346 マルチスレッドって分かるかな? 同時に複数の処理を行うんだけど 多分イメージしているプログラムは それを利用する事で出来ると思う ただし、OSが何かによって実装方法が変わってくる >>346 そうだよ。古典的なゲームは、1秒間に30回または60回、入力の取得と状態の更新と画面の更新を行う。 ギャラクシアンもといタスクシステムでぐぐれ テトリス程度の(コンピュータからしたらゆっくりな動きの)ゲームならマルチタスクやマルチスレッドにしなくても順番に処理すればできそうだけどな。 キー入力については何も押されてなかったらすぐに処理を抜けるようにしとけば良い。 で、画面書き換えたりする処理して、またキー入力されてるかを見て、という感じで繰り返す。 キー入力されてたらそれによって変化するパラメータ(テトリスならブロックの向き等)を変更する。
マルチスレッドだって順番だろう 昔はコアが一つしかなかったんじゃよ
>>352 順番って、時分割で切り替わるって意味? しかしそれは普通はOSレベルでやってるので切り替え部分までユーザが考える必要はないね。 そこまで自分で作らねばならないようなOSなし環境や昔の 8 bit CPU みたいなのだと別だが。 >>351 それってキー入力取り逃したりしないの? >>352 マルチスレッドじゃなくて単なるループだと思うが ハードウェア割り込みとマルチタスクOSがごっちゃになってるんだろ
>>355 処理のサイクル(1/30秒 や 1/60秒)の間に off->on->off とパルス状に入力されると取りこぼすよ 高橋名人の16連射でもコンピュータからすれば物凄く遅いスピードだから問題ない。40年ぐらい前のクロック4MHzで動く 8 bit CPU でも余裕だ。 それにゲームなら一回や二回入力が失敗しても文句を言うやつはまずいない。
>>356 まあユーザースレッドなんて言葉もあるけども 昔のCPUだとぶんまわすしかなかったけど、ある意味わかりやすい気がするわ。 リッチな環境でアクションゲームってどうやって作るの?条件変数とか使うのかね? >>358 炎のコマの解説は嘘だったんだよな あれ以来、人間を信用しなくなった 組み込みでは、0.1〜1秒など、長時間に渡って、 何回もキーを押しているかどうか確認してから、機械を動かす そうやって、ボタンを確実に押しているかどうかを判断する 1回で判断すると、ボタンの接触不良で、 モーターのon/off が繰り返されてしまうから、短時間で判断できない この判断を、ハードウェア回路で行うのと、ソフトウェアで行うのと、2つの方法がある 詳しくは、組み込み(エンベッド)情報処理資格の教科書を参照
一々教科書を読まなくても「組み込み チャタリング」などで調べれば分かるのでは
Windows初期はVsync待ちとかウェイトかけずに処理してて、CPU速度が上がったら実機より速くなって(60fps以上)ゲームにならんのもあったわ。
Linuxってconio.h使えないのかよ getcheもkbhitも駄目とか面倒臭いな
コンソールで色を付けるならpdcurse使え。ncursesは古い
pdcursesってcursesのWindows実装なんだけどな
>>368 ncursesとかを使ってそういうラッパー関数作れば良いのではないかな。 Cで面白いワンライナーとかない?ICCCMとかにも案外ワンライナーという分類はないんだよね。
BASIC時代に1画面プログラムってのがあったな。
>>373 既に世界中で書かれて公開されている予感 int i = 0; int s[2]; s[i] = i++ + 1; printf("%d", s[1]); これの出力が1になります。これは理解できません。 事実、3行目は以下のようにすると出力は0になります。 s[i++] = 1; また、3行目は以下のようにすると出力は0になります。 s[i] = i++;
「式の評価」という言葉はわかるか? 1+1という式を評価すると2になる。 C/C++の後置演算子では、全ての評価が終わった後で変数を書き換える。 i++は、++がiの後ろについているから、後置だ。i++を評価すると、評価した瞬間の値はiであり、そして式全体の評価が終わると、iはプラスいちになる。 後置の反対は前置演算子であり、式全体の評価の前に変数を+1もしくは-1する。
演算規則に従い、インクリメント後置なので、元の3行目の式は s[i(==0)] = i(==0) + 1 i = i + 1 の順に行われて結果、 s[0]に0が代入されてs[1]の値は初期値0だと思うのですが。 事実、3行目がs[i] = i++;なら上の通りの順で実行されます。 演算規則が無視されて結果がコンパイラ依存になる理由は何ですか?
また、3行目を以下の通りにすると演算規則通りに結果2が得られます。 s[i] = ++i + 1;
順番はこの通りです、 i = i + 1 s[i(==1)] = i(==1) + 1
>>387 主な原因は順序が決められないことと最適化のためらしい。詳しくは知らん i = i++; これの結果が未定義なのは直感的に理解できます。 代入とインクリメント増分の関係が不明だからです。 s[i] = i++; これの結果が未定義なのは直感的に理解できません。 演算規則に従えば、iはインデックスとしての間接参照でしかないからです。
>>387 左辺と右辺の評価順序は未定義だからだ gccとclとか違う環境で試してみれば分かる int x = 2*i + i++; それでは、これの結果もまた未定義ですか?
iの評価は何回だ? 評価が複数回入る式は書くなということだ 仕事でそんなコード書いたらどやされるぞ
私は勉強のためにコードを書いています。 コードがどのような動きをするか興味があります。 int a = 1; int x = (a = a) + a; それでは、この式ではxは定義されますか? 左辺と右辺の評価順序に関わらず、答えは同じです。
そんな無意味なコードから何を学ぼうとしているのか分からんわ
優先順位や式の評価順が曖昧かもって考えるソース、 書いてて気持ち悪くなりませんか?私はなりますよ。
while((s[i++] = t[j++]) != '\0') ; 元々気になったのは、tをsにコピーするこのコードです。 これを見て、他にインクリメントで簡略化出来そうなコードを考えています。
for(;t[j] != '\0'; j++){ s[i] = t[j]; i++; } s[i] = t[j]; 従来の私なら、このようにコードを書いていました。 新しいコードの記述なら1行で書けます。
while((s[i++] = t[i + 1]) != '\0') ; そこでtをsに1つずらしてコピーするコードをこのように書けないか考えていたら、未定義の問題が生じました。 私は演算規則から考えてこのコードは上手く働くと思いました。
せっかくC-FAQのリンク書いたのに… バカって人の言う事聞かないからバカのままなんだな…
>>401 「簡略化」とは、何を目指しているんだ? 行数が少ない方がいいとか考えているならバカな考えだからやめとけ。 コンパイラの最適化で同じコードになるような範囲の変形で行数を減らしたところで、可読性を下げてるだけで何のメリットもないぞ。 私は行数の少なさというよりはむしろ見た目の単純さで読みやすいと感じます。 C-FAQのリンクは事実が書かれているのみで演算規則が無視される理由が理解できませんでした。
>>407 演算規則って何のことだ? 構文解析や演算子の結合の優先順序と副作用の発生するタイミングはまた別の話だぞ。 どうせちゃんと読んでないか理解する能力がないんだろうな…
>>389 それはおかしいだろう 算術プラスの第1オペランドと第2オペランドの評価順序は未規定だぞ >>410 未規定の動作がたまたま自分の期待する動作と同じになったということが理解できてないんだろうね。人の話を聞かない相手に何を言ってもダメそうだね。 愛繆私は未定義な理由について理解できません。 なぜなら、演算規則に従い前置インクリメントを代入の評価より先に行えば、389の結果は一つと決まるからです。 しかし、評価順序が未定義となりコンパイラに依存となる理由は何ですか? この式を定義することによる問題の例を理解したいです。
つまり、私は未定義と規定されている理由を知りたいです。 定義することで発生する問題の例などです。
この人の言ってる「演算規則」って何なんだろうね。 「C言語 "演算規則"」でググっても、それらしきものは出てこないし。
int i = 0, j = 0; int x = i++; int y = ++j; これです。xでは代入の後に後置インクリメントされます。(x = 0) yでは代入の前に前置インクリメントされます。(y = 1) s[i] = ++i + 1; つまりこの式では代入の前に前置インクリメントされます。(次と等価です、) i = i +1; s[i(==1)] = i(==1) + 1;
これは、未定義と規定されていますが、理由が理解できません。 私が示した通り、定義することによる問題の例は何ですか?
389の中では、左辺はs[1]です。 なぜなら、代入より前にiが前置インクリメントされます。
i++のポストインクリメントとi+1の評価順が不定だから
i++のポストインクリメントとi+1の評価順が不定な理由は何ですか?
i = i++; これが未定義なのは理解できます。 しかし、389の中で私が示した通り、の定義をすると発生する問題の例は何ですか?
未定義な理由? 言語作った奴がそう決めたから 要するに「仕様だから」 そう決めた理由は想像になるけど最適化しやすい(と言うかそうしないと最適化の妨げになる)と考えたんだろうと思うよ
>>419 なんで? その添字いつ評価されんの? 演算子[]の中身だよ カッコだけどvoid書いちゃだめだよ インクリメントは式全体の前か後に実行されるからだろ 式の途中で実行されるとかあるの?
定義すると最適化の妨げになるという理由は、私には反論する知識は全くないので了承します。私は理解しました。
425の中で、書かれているように、実際には、演算規則でsのインデックスは0でした。 私は[]の優先を見落としていましたが、私が述べたかったことは、演算規則の優先で順番は決定できると思うことでした。
最適化の妨げにはならないだろ コンパイラー簡単に作れるとかじゃないの
現行のCの仕様に文句があるなら、ANSI?ISO?の仕様策定に参加でもすればいいんじゃね?
>>411 すまん 俺はとんでもない失言をしていて 突っ込まれるの覚悟しておとなしく待ってたんだが 一通り勉強しましたが、次に何をやったらいいのか分かりません! 何も作れません! どうしたらいい?
>>428 そりゃ決定するための規則を作れば決定するけど、めんどくさいじゃん >>432 作りたいものが無いなら無理に作らんでもいいじゃん >>432 散歩したり 景色を見たり… 昼寝したり 何もしない そのうちに急に書きたくなるんだよ >>426 , >>429 > インクリメントは式全体の前か後に実行されるからだろ > 式の途中で実行されるとかあるの? どのように実装してもいい 並列に処理することすら可能 と言うような最適化を妨げないための仕様 >>403 >while((s[i++] = t[i + 1]) != '\0') ; for(;(s[i] = t[i + 1]) != '\0';++i) ; これじゃ駄目な理由ってなんだろう 評価順序以前にループ条件が直感的に分かりにくい様なコードは書くべきでない
for(@;A;B) この123が全部必要だと思ってるんじゃね
MISRA-C 2004 の100ルールを守っていないソースコードは、読むに値しないw まず、コーディングルールを5年勉強しろ!w
>>443 その特徴的な書き方はいつものRuby大好きマンか? バカなこと言ってないで巣に帰れ。 >>443 MISRA なんて鎖や束縛を作りたがる「管理職」の思考法でしょう?なんでそんなものに従わなければならないのでしょうかね ルールはあってもいいけど、MISRAはあれアホだよね。 考えたやつお前はCを使うなよっていう。
>>446 あの阿呆なMISRAを制定した人間の種族はなにか、どんな属性か?得意な思考方法、苦手な思考方法は?信条・信念は? というところには興味があります、そのためだけに MISRA を読んでいたりします >>432 自分が作りたいものを作れ。 作る技術がまだ足りないならそれについて学習したり研究したりしろ。 一つ間違えてはいけないことは、自分の作りたいものを今の自分が持っている技術力で出来る範囲内に無理に収めないようにすることだ。 収めれば実現はたやすいが飛躍はできず本当にやりたかったことには届かない。 MISRAは実際の不具合を分析して作られたいわばバットノウハウ集だけど、言い換えると最低限のバカ避け。 バカがバカな不具合出すもんだからその他の人が迷惑を被る。 ま、バカはプログラム作るなって事だ。
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006 この研究会は、トヨタなど大企業から、数十人のベテが集まって、 欧州人に聞きながら、完成された本w 未だに、コーディングルールのバイブルだろがw 元々は、Andrew Koenig の本 C Traps and Pitfalls, 1988, c1989 Cプログラミングの落とし穴
自分が馬鹿だとしっている賢い人はMISRAを使うということか
ブランドにすがるだけで自分の頭で考えないやつは相手にならん あれ読んでて異論を持つことが全くないやつはその疑いが強い
>>454 だからどこに異論持ってるのか書けよ もしかしてグダグダ言うだけ君なの?w >>452 >この研究会は、トヨタなど大企業から、数十人のベテが集まって、 トヨタってコーディングを製造と言い切っちゃう人たちの集まりでしょう?そんな人たちの考え方って信じていいのでしょうかね… >>457 信じるのはダメだと思うよ 内容見て判断しなきゃ >>452 お前さんはいつも、有名な誰それがこう言った!とか、なんとかの本にこう書かれていた!とか、他人の発言を字面だけなぞって記憶するだけだから、中身の本質も適用すべき場面も長所短所も理解せずに垂れ流して害悪にしかならないから、もういい加減消えてくれないか? 多分MISRAはΣ計画とセットだったんじゃねえの とするとゾンビだよ
>>457 日本の研究会の考え方・思想は、ほとんどない! MISRA-C は、Andrew Koenig の本を参考にして、欧州人が作ったから 日本の研究会は、各ルールの例題を作って、誰でもわかるように解説した。 各ルールは、こういう事を言ってます、という解説書 江添 亮の「C++11/14 コア言語」のみたいな本。 無数の例題を並べて、各ルールを解説した本 だから、この2冊は、神の書と言える! ルールとかくそどうでもよくね 動いて読めればそれでいい
>>464 バカなのか? 俺は別に異論があるとは言ってない 異論があるなら書けよって言ってるだけ 俺に何を書けって言ってるんだよw >>465 またブーメランかよ、ワンパターンなやつだな 俺はさっき相手にならんと言ったはず 落ちものゲーム作れたと思ったけど落下処理の度に今表示中のものが上にズレて処理後のが新しく表示される仕組みのせいで目が死んだ これダメな奴だ
>>466 ハイハイ、結局具体的には何も言えないグダグダ君だったなw 煽っても情報は得られない インタビューの下手な人だな
情報持ってない奴からなにか得ようとしてるってか? 心配するなよ、お前に期待なんてしてないからw
githubに存在するMISRA適合のソースコードとかどんだけあるんだよ
そのルールを守らないという、逸脱手続きをすれば、OK トヨタでも、MISRA-C で採点したら、5/100点(ルール)しか取れなかったとかw 70〜80点は、欲しい
>>472 それはそうなんだけど、逸脱したらレビューと品質記録が必須になるので逸脱しない方向へのバイアスが強くなる。 結果、強制されてるのと同じになっちゃう。 ちなMISRAってどんなの? pdfのリンクはってれ
例えば、Linux では、関数の冒頭部分に、return がよくある。 冒頭部分で、処理しないものをはじいてしまう でも、MISRA-C では、関数内で、return は、最後に1つしか使えない。 複数箇所に、出口があってはならない そのルールを守らないなら、逸脱手続きをすればよい。 その代わりに、点数が下がっていく
>>471 ほとんどないんじゃね >>451 が言う通りバカ避けだから >> 関数は、その最後に1つだけの出口を持たなけらばならない みたいに適合させようとすると人によってはちょっと書き辛いルールもあったりするし あっ、被ったわ みんな結構このルールに抵抗あるんだなw
>>474 「misra-c 2004」「misra-c 2012」で検索して! 他にも、MISRA-C では、2重ループ内から、一気に脱出できないから、フラグを持ちまわる事になる このルールも嫌われる
組み込みとか医療用では、バグると簡単に人が死ぬから、 MISRA-C を勉強していない香具師が、コーディングするとヤバイ! だから、コーディングできる資格を作るべきだっていう話も聞く
なんでルールブックが有料やねんあほか勝手にやってろ
>>476 語るに落ちたな ブランドvsブランドの対戦成績を 自分の頭で考えないブランド志向なやつに出せるわけがない 4.12 必要 動的なメモリ割り当てを使用してはならない って酷くね
>>482 何を言ってるのか自分でもわかってないだろww ブランドとかバカじゃね 関数の中盤以降からreturnするならともかく、早期returnまでも認めないのはナンセンスだよな。 杓子定規すぎるわ。
>>484 組込みだと実行時間が読めなくなるのとフラグメンテーションで総容量足りててもエラーになることがあるからしょうがない >>486 おまえがすがっているのはブランド以外の何物でもない とぼけたら誤魔化せると思っているならおめでたいやつだ MISRAをブランドとか言うアホがいるんだ… まあ具体的な内容には突っ込めないグダグダ君だしなぁww
そもそもうちはMISRAは参考にしてるけど全面適用なんてしてないし
プログラムは書く人によって千差万別 書く物によっては複雑な物を書かなきゃならない そしてその上でのバグ千差万別 ルールブックなんてプログラム書かない管理者がこれを守れば大丈夫(キリッ ってするものだろう
普通は大勢で開発するときに必要な取り決めだけどな そういう規模で仕事しないなら,何しても良いけど
>>494 MISRAは明らかに小規模なプログラムのための規約だと思うよ 大規模なプロジェクトのコーディング規約を決める人がここにいるとは思わないからね 小規模だと思うなら,そのルールでやれば良いんじゃない?
大規模とか小規模とかじゃなく実際にプログラムを書いてると必要になったりとかあるって話で プログラムを書いた事内物が大規模ではとかいってるのか
MISRAを尊重するひとって、returnを書く位置によって返る先が変わると思ってるんだよ
間違ったことばかり書いてあるわけじゃないけどね 現場にそぐわないスキル不足なやつを庇うところには同意しかねるわけよ > ルール 8.14 必要 restrict型修飾子を使用してはならない 規格票が読めないようなアホの相手はやってらんね C++が混ざるところでも対策は簡単だし
トヨタのやってることは一つのミスでも人が死ぬということだよ もしrestrictを使って人が死んだら責任とれるの?
それなら、人が死なないプロジェクトではMISRAは守る必要がないですね。
>>501 規格票を確認しないやつにミスがどうたら言われたかねえぜ ○○を使って人が死んだら責任とれるの? ○○に何でも突っ込めるウルトラクソ論法 ポインタ、共用体、仮定義、数学関数、それから?
>>501 お前が作ってるプログラムはテストしないのか? >>492 絶対守るべき指標と守った方がいい指標、といった具合に何段階かにわかれていて 別途ルールがあるならば守らなくても良い(無理して守るべきでない)指標もあるよ 上司のバカかバカの上司でも理解できるまでに破壊されたC言語だろ それを規格と言ってるだけだ 安全かもしれないけど対照実験がないでしょ 安全であることをどうやって確かめたのか論文の欠片も見つからなかった だからMISRAの安全神話は神話かデマかフェイクニュースだよ
プライドだけは高いこの道30年の社畜が書いた様なルールだよ。 「してはいけない」ばかりでこうしろという記述が圧倒的に少ない。 フレームワークという発想がない。指摘だけ。すべて勘と経験という名の錯覚に基づいてる。 あと内容的に「最適化はしてはいけない」とか書いておけばいいんじゃないかと思う。次は入れて欲しい。
>>463 処理系依存や未定義だけどなんか上手く動いてる というのは、ちょっと怖い 組込み系の開発経験者いなくて草 MISRA準拠が納品物の条件にあるんだよ でもプロジェクト毎にカスママイズするから 100%適用するわけじゃないよ わけわからんルールは適用除外してる
>>511 > 組込み系の開発経験者いなくて草 ID:y88H95dP0 あたりは経験者だろ エディタ上での見栄えで桁合わせに 空白を使わず 0 で補ってやらかす
>>513 2進数や16進数は見慣れているんだが 8進数ってどういう時に使いたい? バイトが6bitの時は便利だったとかいう話だけど、今要らんよね emacs使っててエンコードがアレだと出てくるね
文字列で [ESC] を埋めるのに \033 を使ってるのを見るぐらい (2進数のリテラルをマクロでなんとかするとき 一時的に8進化するけど 中の話)
大昔のアーキテクチャは18bit,24bit とかで3bit 区切りが扱いやすかった 今は16,32,64と16進数が扱いやすいって話だね ゼロ始まりは8進数というのはB言語からきたらしいよ
>>513 いや、もうコンパイルオプションで禁止してもいいレベル >>515-516 Unix/Linuxのファイルパーミッションが3ビット単位だからと言うのはあるけど今時直書きなんてしないし >>517 それも "¥x1b" の方が馴染みがあると思う >>487 if の nest が深くなってしまう? >>521 教条主義的に守るなら そうせざるを得ないだろうね if (エラー) return ; // 即脱出 後続コード return ; // 最終 即脱出を禁ずるなら 後続コードは即脱出条件とは排他的なので if (or else) 内に収めるしかない if (!エラー) { 後続コード } return ; // 最終 うちはreturnは最後に一つのみってやつは適用除外になってる 理由はネストが深くなって読みづらくなるから gotoもネストしたループから一気に抜ける場合のみ使ってもよいことになってる フラグ使ってbreakで抜けるより読みやすいからね
もちろんgotoも禁止さ。 あと、各関数の頭で引数チェックも必須なのでreturn禁止とのコンボでほぼ必ず正常系処理のネストが一段以上深くなる。 引数チェック必須はISO26262だったかもしれん。
途中のreturn禁止を徹底するなら、ifとかelseの後に2行以上書くの禁止にした方がいいね。 代入だけ許容するくらいでいい。
>>513 0は0x0とか書かなきゃいけないんかね ここまできたらC言語も禁止だな。 pythonでコーディングしてコンパイルしてやればいい。
結構前から言われてない? 「C言語を使う必要が無いなら使うな」と
>>532 大丈夫さ。プログラム全体をtryで囲んで引っ掛かったらprint("手動運転に切り替てください")のコンボがある。 pythonでOSやデバドラ書けるようになったら考えるわ
#define xxx 06 #define yyy 07 //#define zzz 08 // なぜかエラーになる
ちょっと前に8進数が〜ってやってるのに あ、ネタかw
const char *sの順番が納得いかない 直感的にはchar * const sだろうが!!
>>542 >const char *sの順番が納得いかない >直感的にはchar * const sだろうが!! 前者はポイントされる文字列が const で、後者はポインタ自体が const でしょ const char* const s これも直感的じゃないって言うんだろうか
546です すみません、それを踏まえてということか…
const は後置で書いたほうが整合性が取れる char const * const s: しかし、見た目的にかわいいのは前置である const char * s; 私はかわいいのが好きである よって前置は使わない
そこで私が提案したいのが「strong」である strongは修飾したデータをすべてconstにする つまり char const * const s; と strong char * s; は等価である
「strongがやられたようだな…」 「フフフ…奴は四天王の中でも最弱…」
stringと間違えそうで嫌だなw readonlyはc#で使ってるしな やっぱconstだな
>>546 const int a → constなint型のa const char *s → constなchar *型のs constなのはchar *つまりポインタ(直感) char * const s → char *型のconstなs constなのはsつまり文字列自体(直感) なんで逆!! > const char *s → constなchar *型のs ギャグだよな?
宣言は右から左に読む const等の修飾は左にかかる char const * const s; // sは、const *である、const char型の 右にかかるなら↓のように書けないとおかしいがこれは構文エラーである const char const *s; 変数名はただの識別子で、ある領域にsという名前を付けただけにすぎない constやvolatileは型修飾子であり、これらが付くのは型に対してである 〜という領域を、以後sと呼ぶ、である
ちげーよ 宣言は真ん中から左右に読むんだよ char const *(* const s)[1];
>>526 引数チェックに関しては、Java のコーディングルールでは、 外部の人用のAPI、つまりpublic な関数には、必要 一方、そのモジュール・クラスの実装者が使う、 内部的なAPI、つまりprivate な関数には、いらない 既にどこかで、エラーチェックしてるから、何回も同じエラーチェックするのは、無駄 const char *sは*sがconst つまりポインタsの指すアドレスにある値が不変だけどsがどこを指すのかは可変 char *const sはsがconst つまりポインタsがどこを指すかは不変だけどsの指すアドレスにある値は可変 大体こんな認識で合ってる?
あってるけど納得いかないって話 1つ目がまず何で*sにかかるんだよ 自然に読んだらconstはchar *にかかるだろ 右から読むとか頭おかしいわ、アラビア語かよ
>>563 char * s; に 1 個の const を追加するとき、形式的に追加できる場所は 4 箇所 a) char * s const; b) char * const s; c) char const * s; d) const char * s; このうち a) はコンパイルできない b) c) は可能だが、の二つの間で意味は異なる d) は本来ならエラーであるべきだと私は考えているが、実際には c) と一緒の意味になっている C言語使う時はいつ? 早いコードが欲しい時 メモリー消費に無駄のないコードが欲しい時 他ある?
>>565 他の言語はほとんどわからず(かじってはみたものの使えるまでにはMPがあがらず)、C/C++ でしかまともに書けないし発想できないからです… そもそもconst char *sの宣言の時の切れ目がconst / char / *s なのも何だかなぁ const / char * / s でconstはchar *にかかれよjk 現実に間違ってるのは渋々受け入れてるけど開発者が許せない
>>564 自分は b or(and) d かなー >>565 他に思い付くところとしては、 組み込み環境などで、C言語以外の選択肢がない、または他の言語で実行できる環境を整えるよりCを使った方が楽な場合。 外部のライブラリのインタフェースがC言語で、呼び出す部分をCで作る方が楽な場合。 バイナリファイルの操作などポインタ操作を使って実装しやすい場合。 >>568 単純なポインタのことしか考えないから、左から右にこだわってんだろ。 >>560 も指摘している通り、変数宣言の構文は内から外だぞ。配列や関数ポインタも交えて、それらを多段階の組み合わせにしても一意に解釈できるのを理解すれば、合理的な物だとわかると思うよ。 >>563 1つ目は、constがかかってるのはcharだぞ。内側から解釈するとsは*が付いているからポインタであり、それが指す型がconstなcharだ。 char *s の意味は*sはchar型だよって意味で sはchar *型だよって意味じゃないよ
>>572 こう理解できてるとわかりやすいね。つまり const char *s は *s(sの指す先)はchar型でさらにconstだよ となる。 >>572 その宣言から以後、 sという式がchar*型 *sという式がchar型 2つの意味を同時に表現してるんだよ >>563 ポインタを表す * が型にくっついてるんじゃなくて変数にくっついてるからでは? 分かりにくいなら typedef でポインタの型を作ってそれを使えばいいんじゃないな。 右から読む事に関しては英語を日本語に翻訳する時に順序を入れ換えた方が自然な感じになる事があるのでなんとも言えんな。漢文のレ点みたいなものもあるしな。 日本語とは逆順の方が自然な表現になる言語はある。そして歴史的な事情で混在してしまっているのもある(アメリカでの年月日が月日年の順だとか)。 生まれながらにしてその言語使ってればその人にとってはそれが一番自然な表現だからな。 >>574 結果はいっしょでも解釈の仕方は複数ある感じだね。 自分にとって理解しやすいので char *s ↓ sの指す先はchar型、つまりsはポインタ って言う風に捉えてる。 この話は何時も混乱するんだけど 結局の所は 自分の言葉で理解するまでやる これをやらないと混乱してしまう なぜそうなってしまったのか? という視点で解釈しようとしないと なかなかにc言語って難しい その辺は例のc言語ポインタにのみついて書かれた本 あれを読んで 後は何とか自分の言葉で理解して解釈するしか方法が無い それとこんなになってしまっている原因に キーボード上の記号が少ない というのもある basic何かでは記号類は四則演算類だけ使って なるだけ英単語?を使って記述するようになっている だから使う場所によって記号の意味が違う なんていうのが起こりにくくなってる ある意味c言語が普及してしまったのはプログラミング世界にとっては不幸なのかもしれない
>>578 私も最初に C をやったときには、ここまで流行るとは思わなかったんです、むしろ pascal の方が筋がいいと思っていたのですが、どうしてこうなってしまったのでしょうか? >>579 当時は初心者用とかは特に無くて、BASIC でもある程度できる人はすぐに peek, poke を連発するようになったものです、最近の人は甘えていると思います >>580 UNIXがCで云々というのもあるけど、良い意味で高級アセンブラとして使い勝手が良かったからじゃないかな? 厳格で融通がきかないと嫌われる pascalはそんな感じ
>>583 delphi は結構流行ったと思ったんですけれど… pascal失速最大の原因は:=だろう これを採用している言語はもう一つも無い プログラミング業界最大かつ唯一にして不可侵の大例外を抱えてるのがpascalだ
pascalで開発したアプリっていうと JaneStyleが有名かな?
厳格で融通がきかないのは、教育用として最適だと思う
pascalでUNIX張りのOS書いていれば流行ったかもね
>>585 Modula-2は:=だったような気がする。 >>588 Delphiみたいに拡張されてれば可能だとは思うがコードが大きくなりそうなので昔のPCでは苦しいかもね。 ただし、Androidみたいに元のOSの上に乗っけて動くOSなら行けるかも。 もう一つが奥の深さでC言語ではポインタが奥の深い箇所にあたる この難易度が絶妙で難しい難しいと言われていて初学者には適度に難しいので挫折者が増える、 挫折者の総量が言語の価値を決定する 教育用に作られた言語は難しい箇所とか理屈に合わない箇所とか奥の深い箇所とかが無いのでオカルトとしての魅力が無い 学習曲線がいびつじゃないと流行しない
ポインタはただの入り口だろ Cは入り口で躓く奴が多いだけで奥は寧ろ浅い
ポインタ使わないでもC言語ってプログラム書けるんだよな 無理して難しいことをしなくても良いと思う ちゃんと動くかどうかの方が重要
超無理矢理ならポインタ使わずになんでもできるんかな? いずれにせよポインタ理解してないとライブラリ使えなくて詰むでしょ。たぶん突然落ちたりメモリリークだらけのプログラムができあがるはず。
グローバル領域に予め必要な変数や配列確保しておけば メモリーリークが発生する余地はないw
ネタで言ってるのか本気で言ってるのか判断が付かない
ポインタ難しいって言われてるけどそんなに難しいか? メモリイメージできれば理解できると思うけどな
俺はポインタは難しいことがわかってたから、一度にすべて理解しようとしなかった 数年使って徐々に理解した それが正解だった
初期化してないポインタにアクセスするとどうなっちゃうの とか危険そうなのは試してないからわからないが ハードウェアのイメージがあれば難しさはあまりない (命名規則で Xxx_p と書いておけば
> (命名規則で Xxx_p と書いておけば システムハンガリアンは大大大大大嫌い
>>585 ada, APLも知らない情弱知ったかは黙っとけ >>589 まあ作者は同じだから後継って感じだし >>599 そういう人もいるのか おれはアセンブラもやってたので秒で理解した >>580 マイコン用の小さいコードも作れるから。 昔のマイコンやPCはメモリが物凄く少ないのでその辺は重要。 少なくとも毎回でかいランタイムライブラリがくっついてしまうようではダメだ。 それと元々 UNIX の記述用に使ってた言語なので Linux 等の互換OSでも使われていて、そういうのが徐々に広まっていったので、それを通してCが流行った面もあると思う。 >>603 アセンブラできるとポインタについては理解が楽だよね。 アセンブラの方では普通に使う考え方だし。(というかないとプログラム作れないぐらい重要)。 >>603 はじめてのプログラミング言語がCだったからな けっこう苦労したよ、先輩 プログラムはZ80からなので、当たり前のようにアセンブラから学習した CPUの仕組みを学ぶのにちょうど良かった気がする
Z80だとパイプラインとかあんまり憶えないよな でRISCブームのとき苦労させられたと
まぁZ80全盛期にパイプラインしてたCPUなんて限られてたしな。 そういう汎用コンピータはほぼ高級言語使われてたし。
>>606 C++とかじゃ未だにオーバーライドとオーバーロードを間違えるので レベル的にはおまえとドッコイだよ、後輩 泣いてる顔文字→( ; ; )がforの無限ループにしか見えないのですが、職業病でしょうか?
8086のアセンブラはセグメントで挫折する・・・と言われてたけど Z80やってたらすんなり理解できたな。
>>613 煽りとかで()とか書かれてると関数に見えるときある 例: 職業病()とか言われましても >>613 はい。 >>614 セグメントすごくわかりやすいと思うけどな。まともに説明出来る人と巡り会えなかったのだろうか。 >>613 forで無限ループつかうの? おれはwhileかなw >>614 Z80にセグメントの概念なんてあったけっけ? メモリバンク切り替えは機種によってはあったけど、あれはZ80の機能ではないし。 空白のcontinue節みたいなのに入る必要がないから ちょっとwhileのほうが早いイメージ
>>619-620 俺はfor(;;)だな while(TRUE)は警告表示されることが多かったから for (;;) とwhile (1) がどっちがぱっと見分かりやすいか戦争勃発しますか? あとfor派は;;周りにスペースを入れるか入れないかでさらに細かく派閥が分かれていると聞きました!
あ、do {} while(1);派も出てくるとおもうので皆さん頑張ってください応援してます
>>629 それは #define で使うときだけでしょう? バッドノウハウに近いが do { if(...) break; … if(…) break; … } while(0); みたいなのは昔書いてたわ
flag=true; while(flag) { flag=(....); }
>>634 do { if (that(value)) break; if (value == -1) break; if (value == 0) break; puts("有効な値です"); } while (0); みたいなのは do { if ( that(value) || value == -1 || value == 0 ) break; puts("有効な値です"); } while (0); って書けばいいだけ do { if (that(value)) break; value = f(…); if (value == -1) break; value = g(…); if (value == 0) break; puts("有効な値です"); } while (0); みたいに間に処理をはさまる場合が難しい このスレって直接ここに複数行のソース書き始める人多いよね
#define fe for( ; ; ) が最強
>633 おかしな事してるのが一目で、continue が外に漏れるこれ オススメ switch(0)default:{
gotoが便利すぎて禁止されがちなのが悪い。ちゃんと使えばコードが見やすくなることこの上なしなのに。
>>642 そう言うこと なので最近は素直にgotoで書くことが多い 一部の言語の様にブロックに名前付けて break 名前; でそのブロックを抜けられるようにしてくれれば良いのにと常々思う ないものねだりではありますが perlのようにブロックやループの頭にラベルをつけて、 redo next last があったらもっと良い do {...} while(0); も {} と簡潔
>>642 便利すぎってどういうことだよ 教条主義的goto禁止論の域を出とらんだろうが >グローバル領域に予め必要な変数や配列確保しておけば >ネタで言ってるのか本気で言ってるのか判断が付かない 実際に仕様なんかがしっかりしているタイプで メモリー確保が動的に大きく変化しないものなら 実際にそういう風に作っているのを聞いた事は有る 配列式だと動的に確保したり開放したりが無く リークしたり無効になったりしない分かなり安全 実行開始時に使用する領域が完全に確保されているから
静的な所にプール作るのはメモリ制限ある組込では割とあったと思いますよ
>>643 最近の言語ではそういうのあるね。 とはいってもJavaには既にあったのでかなり前からあるな。 Java以前はあるかどうか俺は知らん。 あ、Perlもループにラベル付けてlastで抜けるなんてのあるな。
break ラベル で、多重ループから一気に抜けられると便利なんだがな
gotoが便利すぎというより 単純な break returnで間にあわないときには それしか制御がないのでは
二重ループから抜けるにはgotoが一番 gotoを廃止した言語制作者は天罰を受けるべき
goto はそれで使われている保障がないから、 保守性のためにも ループなどに名前付けて、それを抜けると明記したい
gccで X Window System (x11) でウインドウつくって画像合成するのって どうすればできますか? なにかサンプルプログラムなど無いでしょうか?
>>656 二次元配列を総なめする場合に ループを 1変数でやるのかな? >>657 古本を漁ればやり方が書いてあるかも。 XScreenSaverのソースみれば参考になるかも。 いにしえのシステムなら、関数名をmanコマンドで引けば、X Windowの関数のマニュアルが見られるはず。
>>659 linuxOSだとSDL(Simple DirectMedia Layer)で書いたほうが情報が多く 描画書き換え速度もはやい気がします SDLに移行したほうがやはり無難でしょうか? >>661 X11は将来、Waylandにバトンを渡すらしい。新しい端末ではX11が採用されない状況が考えられる。クロスプラットフォームの方が安心かな? 暗号化されてないX11をネットワークで見たら丸裸だからあんまり使いたくないよね。
ネットワーク環境はsshしか使ったこと無いのですが SDL_net などは関数に暗号化などがふくまれているのですか?
>>665 ソーシャルゲームを作るなら、暗号化は必須。暗号化方式を決めて、それに合った暗号化専用のライブラリーを使う形になる。 >>666 C言語の暗号化ライブラリで使いやすいのおせーてください いろいろあるんですけど、ライセンス的にopensslでいいやみたいな感じになりましたね waylandは5年後くらいにはなんとかなるんかな。どういうレイヤでサービス提供したいのかよくわからん所がある。
同じくopensslでいいんじゃないかと思いますな
gchar **command = (gchar *[]){"./Hello.exe","World",NULL}; を gcc6 で compile すると以下の2種類の warning が出ます。 warning: ISO c++11 does not allow conversion from string literal to 'gchar *' (aka 'char *') [-Wwritable-strings] warning: pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression [-Waddress-of-array-temporary] どう書くのが正解なのでしょうか? 教えてください。最後の NULL がなければ、 gchar **command = (gchar **)((char [][20]){"./Hello.exe","World"}); で良いと思うのですが、最後の NULL も必要です。よろしくお願いします。
要素の文字列をそれぞれキャストしてみるとか? でも別に文字列の実体を用意した方が無難では。
char * const command[3] = {"./Hello.exe","World"};
初心者で勉強中なんですが、 switch文は if文みたく switch(a >0)のように()の中に関係演算子を使った式はかけないんでしょうか? エラーがでるので無理なのかなと思ったんですが
エラーじゃなくて警告では? 動かない理由はないと思うのでgccで試してみたけど、ちゃんと動いたよ。 ただ、結果は1か0の2値しかないのでif文使ったほうが良いと思うよ
本当は switch (a) { case a > 0: ... 的なことをしたかったのではないかとエスパーしてみる。
>>674 これなんか意味あるの? 具体的に何がしたいか知りたいなあ >>676 switch(true) って裏技 あれマジで気色悪いよね case に何を書けばいいんだ?false は 0 でいいだろうけど、true は?
>>674 書くことはできる 関係式は int 型の 0 または 1 という結果を生じるので switch (a > 0) は a の値により switch (0) もしくは switch (1) と等価になる おまえさんが言いたいのは switch で範囲チェックができるのか ということだろうがそれはできない a と case に指定した定数の == 比較しかできないのが switch だ 不等号や != が使いたければ if 文か3項演算子ということになる >>672 ありがとうございます。具体的にはどうしたら良いでしょうか? char list[2][20] = {"./Hello.exe","World"}; gchar **command = (gchar **){ (char *)list[0], (char *)list[1], NULL}; だと、↓のエラーになります。 error: function-style cast to a builtin type can only take one argument 正しいやり方をお願いします。 うーむ。どうしたものか。 gchar ** 型をどうやって作るのかさっぱり分からない。。。 ダブルポインタがよく分かってない。もう warning は放っておくしかないのかな? その前に、671の警告でC++11って出てるのはなぜなのか。 複合リテラルってあれキャストではないよな。知らんけど。
>>672 gchar list1[][20] = {"../Exe/H2O.exe","World"}; gchar *list2[] = {(gchar *)list1[0], (gchar *)list1[1], NULL}; gchar **command = (gchar **)list2; いろいろ試したところ、↑だと warning でなくなりました。意図されたのはコレでしょうか?コレで良いでしょうか? >>680 文字列リテラルは書き換え不可なので当然の警告。 char const* const command[] なら警告は出ないだろうけど、渡した先で書き換えしない保証がないならアウト。 渡した先で書き換えしない保証がないなら、リテラルでの初期化は無理だと思う。 >>683 なんかおかしいですよね。 でも Makefile に書いていいて実際に compile に使っているのは間違いなく gcc6 です。 warning が g++6 と共通なのですかね? > warning: ISO c++11 does not allow conversion from string literal to 'gchar *' (aka 'char *') [-Wwritable-strings] charのエイリアスか なら最初に書いとけよ
>>688 ありがとうございます。スマートですね。参考にします。 gchar は char の別名です。すみません。 >>683 Makefile には gcc6 と書いてあるのですが、出力をみると c++ でコンパイルしていました。。。 今気づきました。 -std=c++11 もつけてある。 Cのソースを c++ でコンパイルするとマズいですか?今のところ何も問題はないです。 >>692 C++に複合リテラルないんじゃないかな。なくても困らんか。 あとさっきの配列の要素にstrdup突っ込むとconstにしなくていいかもな。 もしくはmemcpy(malloc(100),"hoge",5)とか。 標準に沿った書き方かどうかは知らん。 >>693 ありがとうございます。なるほど、複合リテラルですね。調べてみます。 自分、C で書いていて compile も C でやっているつもりだったんですが、コンパイラが c++ だった。。。 これは c++ 用の Makefile を流用した為です。 最初 c++ でアプリを作ろうとして、Makefile を用意して、ソースを書き始めたのですが、途中で仮想端末オブジェクトが c++ ではうまく使えない事が判明して、 ソースを C に書き変えたのです。Makefile はフラグ等あるので流用してしまった... これ以上は困らないですかね。困った時にはコンパイラが c++ な為を疑ってみます。 strdup と memcpy も試してみます これをヒントに検索していて g_strsplit なる関数もある事を発見しました。 C++ には引数に void だけって関数がないらしいぞ。 その他細かい違いがあるかも知れないので要注意だ。
どちらかというと()の解釈が違う c++だと()は(void)と同じ cは()が(void)と同じになる文脈とそうでない文脈がある
こうしてまた(void)論争が始まり3スレぐらい消費されるのであった。
strdupはいつになったら標準ライブラリに入るんですか?
> cは()が(void)と同じになる文脈とそうでない文脈がある ほほう、それはどんな場合だ? 具体的なコードで示せるか?
int f(); int f() { return 1; }
>>702 @(void) と同じ void f() { return; } A(void)と違う void f(); >>709 ()と(void)が違う例 1行目のコメントはずして、2行目にコメントつけたらコンパイル通る 定義の時は()は(void)と同じで引数の無い関数の定義になる はっ。ちょっと目を離したスキに(void)ネタだけでもうこんなに書き込みが。
2進数で表現されている多倍長整数を10進数の文字列に変換する場合、機械語レベルではどうするのが現代風ですか。 レジスタ長までならBCD変換でしょうか? 例えば、Cのprintf(“%d”, 12345)はどういう実装がされますか。 多倍長ならまた違ってきますか。
>>717 ありがとうございます。 多倍長演算では内部2進数のまま演算しているのですね。 改めて質問します。 2進数で内部表現されている整数を10進数の文字列に変換する場合、 機械語レベルではどうするのが現代風ですか。 レジスタ長までならBCD変換でしょうか? 例えば、Cのprintf(“%d”, 12345)はどういう実装がされますか。
現代風? 現代だろうが古代だろうが10で割った余りを並べながら10で割る事は変わらんと思うが。(CPUによってはBCDに一発変換なんて命令あるのかな?あればそれ使うと速いだろうね)。
JIS X3010:2003 6.7.5.3 関数宣言子(関数原型を含む) 意味規則 宣言“T D1”においてD1 が形式 D ( 仮引数型並び ) 又は D ( 識別子並びopt ) をもつ場合,次のとおりとする。 識別子並びは,関数の仮引数の識別子だけを宣言する。関数定義の一部である関数宣言子で識別子並びが空の場合,関数が仮引数をもたないことを指定する。関数定義の一部でない関数宣言子の識別子並びが空の場合,仮引数の個数及び型の情報がないことを指定する(124)。 (124) “今後の言語の方針”(6.11.6 参照)。 (125) 両方の関数型が“古い形式”の場合,仮引数の型は比較されない。 6.11.6 関数宣言子 空の括弧を伴う関数宣言子(関数原型形式の仮引数型並びではない。)の使用は,廃止予定事項とする。 6.11.7 関数定義 仮引数の識別子並びと宣言並びを別々に与える関数定義(関数原型形式の仮引数の型及び識別子の宣言ではない。)の使用は,廃止予定事項とする。
ソースのコメントで変数毎に「16進整数」とか「10進整数」とか区別してるのあったけど意味わからんかった。 全部intなのに。
void f() {} //関数定義の一部である関数宣言子で識別子並びが空の場合,関数が仮引数をもたないことを指定する。 void g(); //関数定義の一部でない関数宣言子の識別子並びが空の場合,仮引数の個数及び型の情報がないことを指定する(124)。 int main() { f(1); //NG: 0個の仮引数に1個の実引数 g(1); //OK: 任意の仮引数に1個の実引数 } void f(); //両方の関数型が“古い形式”の場合,仮引数の型は比較されない。 void g() {} //両方の関数型が“古い形式”の場合,仮引数の型は比較されない。 /* D:\learn\c>cl 710.c /W4 /nologo /c 710.c D:\learn\c>gcc 710.c -Wall -std=c18 -c D:\learn\c>clang-cl 710.c /W4 /c 710.c(6,8): warning: too many arguments in call to 'f' f(1); //NG: 0<8C><U+0082>?<BC><88><F8><90><94><82><C9>1<8C><U+0082>?<C0><88><F8><90><94> ~ ^ 1 warning generated. D:\learn\c> */
>>723 ひょっとして変数の接尾語に10進数や16進数を表す3文字以下のものを 付けるべきなのでは? 他のところの計算の時に間違えてしまう可能性が減ると思う >>720 Z80やx86にはBCD関連の命令がありました。 最近のレジスタビット数の大きいプロセッサは知りませんので伺いました。 10で割った余りだと桁数nとしてO(n^2)の計算量になりますよね。 流石にそれはないかなと思っています。 O(n)だね。 文字列変換時にBCDにするのではなく演算からBCDとして扱うプログラムを見たことある。 あまり効率が良いとは思えなかったが。
x64の場合、ALUでやる2ケタの加減乗除の方は廃止だが、FPUでやる18ケタの10進と2進の間の変換はまだ使える
聞くのはここでいいのか微妙だけど質問です abzのエンコーダで回転方向を検知したいんですがzパルスでリセットされるときに回転方向が正しく検知されなくなってしまうところの解決方法どなたか知ってますか
>>728 mod 10でO(n)、 それを桁数nに比例した分繰り返すからO(n^2) と考えています。 O(n)で内部2進表現の整数→10進数の文字列に変換ができればいいのですけどね。 あるいはdecimal型を持つ言語がありますが、そのような型では内部でBCDで持ってたりするのでしょうか。 1桁分のmod 10だけなら計算量は固定なのでO(1) n桁分を繰り返すなら計算量はO(n) すべての計算量のオーダーとしてはO(n)
>>733 わかりました。 剰余を固定命令数でできる桁数内であればO(n)でできるということですね。 現在、内部2進表現の整数を10進数の文字列に変換する方法としては、mod 10の繰り返しがメジャー(ベスト)ですか? printfの%dもこの実装が主流でしょうか。 modの計算量が固定ってこともないんじゃ? 除数にかなり依存しそうな
>>718 そうです、10進法変換は表示のときにはじめて実施します >>719 単純に 10 で割った余りを並べるだけですが、ただ >>717 で紹介したコードでは幾分かの最適化が追加されています >>726 いや、10 で割った余りそのものであり、他に方法はありません ただ、最適化の余地はあり、それは >>717 に示しました >>729 BCD はインプリメントする側としてはやる気が起きないものだ、と思いますよ 足し算、引き算はいいとして、掛け算、割り算は BCD では実装できないのです >>734 >現在、内部2進表現の整数を10進数の文字列に変換する方法としては、mod 10の繰り返しがメジャー(ベスト)ですか? 他に方法はありません、ただし最適化する余地はあると思っています >>739 は? 乗算と除算が実装できない?? 俺らの脳には義務教育できっちり実装されているんだがw >>741 今の話題は BCD BCD にて効率的に乗算・除算を実装している CPU はありますか? >>737 わかりました。 10進全桁を一旦BCDで全て求めなくても、 10進1桁ずつ求めることが出来るのですね。 >>738 単純に興味があるのでお聞きするのですが 「他に方法はありません」と断定する理由は何でしょうか。 効率を考えなければ、 単なる最適化ではない異なるアルゴリズムの他の方法が 容易に思いつきますが、例えば、 10で割る方法が原理的に最適であると証明できる というようなことでしょうか。 DIVやIDIVを上回る何かを見つけたとしたら大ごとですやん 除算器のない初期のRISCや貧ソな何かで無理矢理だとシフト使こた工夫もアリかもしれんけど if (x<0) {x = !x; ...} do {x = x>>4 +(v = t = (x&0xf), t>>=2, t &= (t>>1 ), v -= t*10, t);...}while (x) みたいな? >>747 なるほど…そういう方向性はありえますね >>742 そう、BCDの話だ おまえさんはBCDでは乗算と除算が実装できないと言ったんだ マイクロコードかどうかは関係ない >>747 あなんか昔はそういうHWがあったらしい 乗算部分はテーブル化しやすそう 除算は何処で軽くするのがいいのか皆目見当がつかねぇ
10進表記に関しては、いきなり割り算するよりはまず9とか99とか999とか9999とかと引き算なり大小比較なりしてもよさそうだけども。
まあ除算は昔からクソ遅いよな floatで逆数かける感じの方が速そうだ
>>753 可能なら逆数を掛けたほうが早いなんてハックに効き覚えがある (同じように2,4,8はシフト演算子で処理) ビットリバーサルについて質問です 誰もがわかりやすく簡単にできる方法は C言語でどうなるでしょうか?
整数定数除算は速度優先オプティマイズでアセンブラ出力見てみなよ
>>734 隣同士でひっくり返して、2こセットで隣同士でひっくり返して、4こセットで隣同士でひっくり返して… ってやるらしい。賢いね uint32_t reverse(uint32_t x) { x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1)); x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2)); x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4)); x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8)); return ((x >> 16) | (x << 16)); } >>755 簡単でわかり易いと言うなら素直にビット毎に処理すればいいと思う unsigned int x = …; unsigned int y = 0; for(size_t i = 0; i < 32; i++){ y <<= 1; y |= x & 1; x >>= 1; } てな感じ 高速化したいならテーブル引くなりすればいいかと 高速フーリエ変換でのビットリバーサルの書き方がどんなものがあるのか興味があったのでききました ビットリバーサルでの処理では速度は余り変わらそうなのでわかりやすい 表記で書こうとおもいます
>>749 では訂正しましょう 「BCD では『効率的な』乗算・除算は実装できない」、てへぺろ >>754 その逆数を実時間で効率的に求める方法はありますかね…あらかじめ求めておくというのは除いたとして BCDじゃなく10bitで10進3桁表すieee 754-2008のdecimal floating pointだと、回路的にそこまで無駄じゃないよね
>>763 効率的とは? ハードワイヤードでも組めるだろ? 加算 減算 乗算 除算 って回路的にどうやってるんだ? マルチバイブレータ系の回路が基本になってるのはわかるけど 詳細部でどうやってるんだ?
log通った後だと 乗算が加算に 除算が減算になるけど log通して加減算した後に累乗で戻すほうが重いんじゃろな
>>768 加減算はXORそのもの。 乗除は知らん。 >>770 加減算のXORの場合 繰り上がりはどうやってるんだ? 繰り上がりはand ただ実際は一気にがばっと先読みするので、すぐ下の桁だけに依存するわけではない
お前らコンピュータアーキテクチャの勉強もしたことないのか?
キャリールックアヘッドアダー っていう加算器の高速化手法もあるんかぁw
>>777 実はリップルキャリーと回路は同じです キャリールックアヘッドは、「多入力ゲートは2入力ゲートを組み合わせた分よりも速い」という仮定のもとに組まれたものです またまたいい加減なことを。 2入力ゲートだけでCLA作れるし、2入力ゲートだけのRCAより速いよ。
そりゃ多入力ゲートが2入力で模倣できるって言ってるだけでは
スレチですみません ここの人達は「プログラム」と聞いたときにどちらを思い浮かべますか? * バイナリ * コードが書かれたファイル * コード
>>784 やはりバイナリですよね プログラム=バイナリという理解で合ってますよね はい あなたの考えは一切の曇り無く隅々まで正しいです なのであなたの理解が最も正しいです それについてわたくしどもは一切口出しすべきことはございません あなたこそが正しいです
>>786 しかし辞書にはプログラムは問題解決の手順を特定の言語書いたものとあったので、 そう考えるとプログラムはバイナリを内包するという捉え方の方が正しいですよね あと>>784 さんはプログラムを動詞として使ってますが、それも使い方としては一般的なんですよね プログラミングは10年以上やっているんですが、いまさらになってプログラムの意味を調べていて…… プログラムの意味をなんとなく理解してたのがわかって、こんな質問してしまってるんですが >>787 どうやら貴方はプログラムより先に国語を勉強したほうが良いようだ。 ンなことカンケーなしに「俺はこう思ってる」「正解をくれ」を最初の>>783 に書けばいいじゃん なんでお前のお気持ちを察しなきゃいけないワケ 後出しジャンケンのコミュニケーション不全の物体だからマンセー要員しか求めてない 「どちらを思い浮かべますか?」と聞いてるんだから、 オレが思い浮かべるだけなら正解も不正解もない、 なのにいきなり「合ってる」とか言いだすとと値踏みされてるから不快だ なんでお前なんかに正誤判定されなきゃいけないの 正解を求めている旨を最初>>783 に書いてないからコミュニケーション不全だ 一見自由そうに見えるアンケートを取っておいて、それが合格か不合格かテメー独自のお気持ちで決めて人間を値踏みする、 その思考経路がアレすぎ アンケート取ったのはどっちが一般的なのか知りたかったからですよ そんなにカッカしないでください 一般的かどうかに私の主観は関係ないでしょ?
一連の処理(命令)を書いたものがプログラムだろ それを書く作業がプログラミングだろ 何が疑問なのかよくわからん
>>791 そうなんですが、プログラムって言葉がけっこう色んな意味で使われていて、調べていると混乱するんですよね…… >>789 同感 辞書って言われて正直少しムッとした ちなみに俺はその手の辞書サイトの間違いを指摘して訂正させたことがある >>794 別にここの人達の知識を疑ってるわけじゃないです あと試すようなこともしてるつもりはないです >>795 たとえばバイナリを指してプログラムと言うじゃないですか あとアプリのこともプログラムと言いますし プログラミングのことをプログラムするとも言うし バイナリもアプリも「一連の処理(命令)を書いたもの」とすることはできますが、 なんか混乱するんです あとプログラムとコードの違いもよくわかりません コードだって命令を書いたものじゃないですか それだとプログラム=コードということになりませんか?
>>798 「プログラミング=プログラムを作ること」なら、日本語の命令を書くことはプログラミングなのかという疑問が生まれませんか? 人間に与える日本語の命令を書いた場合、それはプログラミングと言えるのでしょうか? バイナリもアプリもソースコードもプログラムを内包するってことだろ
IT分野の話じゃないならスレチもいいとこだな そんなの辞書引けば分かるだろ
>>796 再びムッとしたぞ 人にものを尋ねておいて何だその態度は 失言ではなく性格のようだな >>778 単純なマルチバイブレータ連結のカウンタ回路考えたら 段数が多くなるほど速度が遅くなるのは当たり前だもんね! CPUの立場では、メモリ上に展開されている機械語のバイナリ列がプログラム OSの立場では、実行ファイルがプログラム C言語で記述する人にとっては、ソースファイル(郡)がプログラム どのレイヤーの話かで意味が変わってくる可能性
機械にとっては機械語だけで充分なのに 人間の理解にとって高級言語は必要最低限 認識のちがいとか感受性 によって見方はかわるんかな?w
用語なんて初めて使われた時の意味、定義化された時の意味、実際に使われてる場面での意味、 全部違ってることなんてザラでしょ。
>>806 わざとやってるんだよ 別にケンカがしたいわけじゃないから >>782 スイッチング特性ってどうなんだろ? トランジスタのftに依存するんやない? 最近のトランジスタは1815なんかにくらべると桁がだいぶ違うw >>799 言える。これだもの。 プログラム(program) [名](スル) 1 ある物事の進行状態についての計画や予定。予定表。「新人教育のプログラム」 2 演劇・映画・音楽会・テレビなどの演目・曲目・番組。また、出演者の紹介、解説などを印刷した小冊子や番組表。「雨天によりプログラムが一部変更された」 3 コンピューターへ指示する、計算や仕事の手順を特定の言語や形式で書いたもの。また、それを作ること。 更に、日本語のコンピュータ用のプログラムというのもある。 昔々のピュータのBASICだとか、C言語でも関数名や変数名その他に漢字使えるのあったし、Javaとかでも識別子に漢字使えるし。
utf8が普及して、今の方がむしろ普通に日本語使えるようになったと思うよ
だな、今時メジャーな環境で識別子に漢字とか使えない方が珍しい
絵文字が普及して外人の作るプログラムがマルチバイト文字に完全に対応してきた それまでは結構ダメダメだった
識別子に漢字使えるのにスペースは全角だとコンパイルエラーなのがちょっと納得いかない
0xE38080がUTFのスペース 0x20 がアスキーコード いまやってみたら全然ちがうやんかw
>>797 言葉の意味は文脈で異なる。 ある言葉と別の言葉の関係は一致か不一致かだけでなく、包含したり一部のみ重複したりもする。 >>779 >2入力ゲートだけでCLA作れるし そんなことをしたら「素子数ばかり馬鹿みたいに食らって速度はリップルキャリーと同一の遅さ」で、なんのためのキャリールックアヘッドなのかわからない、という悲惨な結果になりませんか? >>781 ありえないですね、キャリールックアヘッドは多入力で速度を稼ぐやりかたですよ、2入力に制限したらリップルキャリーと全然かわらないじゃないですか? キャッシュの容量とかパイプラインのちょうどいい区切りとか まで考えてプログラミングなんてはっきり言ってやってませんw 手抜きでしょうか?
>>821 いや、文字通り先読みが本質だと思いますよ ゲートはいくつあってもいい >>824 >文字通り先読みが本質だと思いますよ 薄っぺらい理解ですね 3 bit, 4 bit なりの アッダーを決めて、その MSB の和を作るのに必要な入力をじっと眺めて本質をつかんでください 単なる先読みではありませんよ >ゲートはいくつあってもいい 速くなるならね でも 2 入力論理演算だけで作ったキャリールックアヘッドは速くならない… >>825 そら、速い方がいいし回路もシンプルな方がいいですよ。 しかし、桁上がりを待ってるのと同じではないでしょうて。たとえ2入力ゲートを使ったとしても。 ディスクリートトランジスタでマルチバイブレータを組んでそれで カウンタ組んだの思い出したw 動くと感動するよね!w
基本はマルチバイブレータでつくった順序回路w なんだもんなぁw
この言語は扱うものが多くて頭がオーバーフローします たとえば正規表現は int regcomp(regex_t *preg, const char *regex, int cflags) int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); void regfree(regex_t *preg) これを見る度に数がおおくて何書いているのか分からなくなる
いいえ コマンドライン引数の場合訳に正規表現がつかえると嬉しいのです
>>821 お前まさか、16入力のANDを2入力ゲートで作れと言われたら、 縦に15個並べて順に接続するんじゃないだろうな。 >>839 普通にトーナメント方式に15個ならべますよ >>841 じゃ、RCAは遅延がO(n)で、CLAはN入力ゲートがあるならO(1)、2入力ゲートに制限してもO(log n)って気づくだろ。 >>842 そうか log n くらいには改善されるわけですね…てへぺろ ゲート容量分の時間誤差は絶対生まれるかんな(´・ω・`)
意味のわからん時間誤差とかいう用語、未定義で使うな
>>833 俺にはわかる。 慣れの問題では? まあでも慣れるかどうかは個人差あるしこの言語で慣れねばならないなんてことはないので気にせず他の自分がわかりやすいと感じた言語使えばいい。 >>848 それって正規表現をどう変換する関数なの? regexpをcompileするって概念はスクリプト言語ですら大抵存在するのに NFAやらDFAやらだったり専用VMのバイトコードに落としたりと色々だろ
>>849 最初のはパターンのコンパイル。次のは文字列とコンパイル済みパターンとのパターンマッチングをさせる関数。 詳細はマニュアルページ見るなりググるなりして調べてくれ。 まあしかし>>838 に書いてあるような内容なら正規表現使わないで単純な比較をするだけの方が速いしプログラムもわかりやすくなるような気がするなあ。 >>851 行ごとに文字列を細分化して それで当てはめていくって感じかな? 正規表現関係はけっこう頭抱えるもんね! C言語のソースメモをオートインデントして整理しようとプログラムくんだけど こういった関数つかって分岐かけていったほうが完璧なんかな? でも時間すごい掛かりそうw
>>854 そのプログラムを書く手間を自動化してみては? unixのindentコマンドか 本末転倒を体現する変なやつ
>>818 てか、Unicodeのスペースって沢山あるよ。 Wikipediaで「スペース」で検索して見てみな。 >>856 何もオプションを付けないindentコマンドを実行すると 予想外のソースコードが出てくる可能性が高い とか書いてるひといるね! インデントフォーマットって好みが人それぞれ違うから自分専用のもっててもええのかも?w >>817 Whitespaceごっこできないようにだろw >>864 ハードと無線の知識があればIoTが花盛り。 機械の試運転してるんだけど組み込みの部署に行きたい。どう勉強すればええ?
>>867 配線やら電気系のことして実際に動くかどうかを確認して不具合が出たら直す仕事 >>866 まずは日本語からかな 言いたい事が人に伝わるようになれ >>870 工業の情報卒なんだけど電気系に配属されたんやで。 PLCで動く機械もあるし、C言語で動く機械もあるで 車載系の仕事は最近多いよ でもCじゃなくてC++だと思う。規格的に。
だいぶ前(20年ぐらい前)からですが C言語で配列の範囲オーバーすると ほぼ必ずSegmentation Faultになるようになった メモリ上の配置を考えたら ちょっと範囲オーバーしたからって滅茶苦茶な値を読み込みながら普通に動くはず 毎回コンパイラが範囲チェックするようなマシン語吐いてるんでしょうか?
でかいプログラムなら余裕があるから今でも結構耐えると思うけどね ASLRのせいとか?
配列のメモリ配置をページ境界ぎりぎりに配置するようになってるリンカを使ってるとか。 環境わからんからなんとも言えんが、ちょっとはみ出した程度で障害を検知するようなメモリ配置するリンカは使ったこと無いので、もしあるなら環境知りたいわ。
「ちょっと」がどれくらいか知らないけど プログラムの割当範囲超えて読み出せたらセキュリティ問題になりそうだから OS側でエラーにしてるんじゃね 20年くらい前ってことはWin2000とか NT系列が普及してきた頃か
>>877 >OS側でエラーにしてるんじゃね どうやって… 1バイトでもずれたらエラーにするようなおせっかいな Cコンパイラなんて実用的に使われるはずないし、 それを検出するようなOSも存在しないから心配するな。 「ほぼ」必ずがどんなもんか知らんが、 環境も書かないうろ覚え情報は価値なし。
>>880 まあ大体そう 最近メモリコントローラは実家に戻って子供部屋おじさんになった C言語のポインタで 構造体の中で char *a; でメンバを入れてその後 bc.a=なんちゃら〜 で中身を入れれる意味がわかりません(bcは適当) この時のaはchar型のアドレスを入れる用の箱じゃないんですか?
>>884 なんちゃら〜が不明。もっとちゃんと引用して。 >>884 ん? 代入でbc.aのポインタが指す先の中に入れられると思ってるのか?それは気のせいだ コピペで事務仕事をある程度自動化できる程度やけとプログラマになってもええか? 組んだことあるのはJAVAとCとVBAや。ポインタはイマイチよく分かっとらん。
>>889 なってもいいけどそのレベルで食っていけるかどうか知らん >>889 やりたいならやればいい 人にやめとけって言われたらやめるのか? 人に聞くことじゃないぞ 今は製造管理部や。いつかはシステム系の仕事がしたい
コピペ事務員がC言語で何すんの? システム系って具体的になにがやりてーの?
C言語を趣味で勉強し始めて、苦C、プログラム言語Cを読んだだけでまだまともなプログラムを書いたことない者です。 実践を兼ねて職場で使えるプログラムを書いてみようと思っています。 職場環境がセキュリティの関係で新しいソフトなど入れられず、エクセルは元から入っている状況です。 やりたいことは日付と紐付いた情報群(8/1,a=12,c=20: 8/3, b=30, c=40)を複数個入れて、特定の日付に最も近い情報を任意の順番で並び替えながら取り出す(8/5: 8/1, a=12; 8/3, b=30; 8/3, c=30)ということです。 C言語の勉強にと思ったのですがこの状況だとVBAを勉強してエクセルでマクロを組む方がいいでしょうか…ご教授願います><
C言語で行う場合、どういう方法がいいでしょうか。 後出しで申し訳ないですが、コンパイラが無くpcで実行できるのがエクセルだけ、外部からテキストファイルすら入れられないpcです…
エクセル上でソースコード書いて動かす手段あればというご質問でした…超初歩的な質問ですみません 素直にVBA使います><
コンパイラすら入れられないならVBAでやったほうが絶対良いと思う。 というかすでにexcel上にあるデータに基づいた操作ならVBAでいいじゃん。 初心者の時点でCからexcelのデータ取り出すとか考えないほうが良いと思うよ
どうしてもCでやりたいならCloud9とかオンラインIDE使う方法もある だけどセキュリティ厳しい職場はネット制限もあるだろうね
>>905 御回答ありがとうございました! C言語の勉強になればと思いましたが、VBAでやってきます! >>902 C#でCコンパイラとリンカを書けばいいだけ >>908 ありがとうございます! 方法はあって皆様だと簡単にできることなのですね 少し調べたのですが、windowsに元々C#のコンパイラは入ってるのでそれを呼び出すということでしょうか まずVBAで完成させてから、こちらも勉強してチャレンジしてみます! >>902 そのpcってのは会社のPCか? コンパイラを入れられないなら、それを使うのは諦めろ C使いになれと会社が命じるのではなく C使いになりたいと自分が思うなら 必要なものは自分で揃えろ 今の会社を辞めても使えるスキルは個人資産だからだ ケチ臭いことばかり言ってしょぼい結果で終わるのか 自分を信じて大成するに相応しい投資をするのかは 人それぞれおまえ自身の生き方の問題だ >>911 これって商機?商機ならやってみたくなりますね… >>910 心に響くアドバイスありがとうございます。 上から言われたことでは全くないので、自分にスキル残るようにやっていきます。 >>911 そういうことになるのですか…無謀ですね… リンカのことなど完全に無知なのでちゃんと調べてみます。 今このスレに書き込みしているのは自宅の自分のPCか?ならばそれ使って学習環境整えて学習すると良い。 PCなしでスマホしか持ってないみたいな場合はまずはPC買え。 学習だけならばスマホしか持ってなくてもできなくはないが今の時代はPCなしではまだかなりの困難を伴うと思って間違いなし。
>>917 自宅での開発環境は構築できているので、学習進めて行きます! >>874 結論的には、ローカル変数はスタック上に確保され、スタックには関数の呼び出し 元へマシン語の ret 文で帰るための「戻りアドレス」や、以前のスタックフレームの 先頭アドレスを保存しておくために、push ebp とした際の関数の呼び出し元の スタックフレームの ebp の値なども入ってる。 なので、ローカル変数として、TYPE a[10]; のような配列 a を確保して、 a[x] で x の範囲が 9 を超えた場合、その戻りアドレスが壊される確率がとても 高い。 1. 戻りアドレスがへんな値に書き換われば、関数から戻る際に変なアドレスに 戻ろうとする。するとコード領域以外のデータ領域に戻ろうとしたり、 ページングされて無い変なページに戻ろうとすることになり、保護例外 が発生する可能性が高い。またたまたま、そのアドレスに「戻った(実際には 戻ったわけではなく、変なアドレスに jmp しただけ)」際に、 新しいアドレスのマシン語が変な命令に解釈されて、高い確率で 何らかの保護冷害が発生する。 2. 関数の最後で pop ebp を実行してから、元の関数へ戻ると、 ローカル変数は、mov [ebp+ofs],eax のような形でアクセスされる。 だから、スタックが変に書き換わっていた場合、ebp が変なアドレスになり、 [ebp+ofs]のアクセスの部分で保護例外が起きる。 よくわからんが、retして顕在化する問題の発生が増えたってこと?
20年ぐらい前からという条件なら特に変わりは無いだろう
いわゆる普通の Windows PC だとそんな感じかな?中身が Windows NT のやつになってよりまともな感じのOSになったと。 しかし他のOSやCPUでは約20年前からとか、そういうのはない。あったとしても時期が違う。
>>920 OSがプロテクトモード(保護モード)で動作して、アプリが保護違反をしてないかCPUが常に監視 しながら動くようになってからはその辺の事情は特に変わってない。なお、 スタックフレームは、 関数名 proc push ebp mov ebp,esp sub esp,定数値 ・・・ mov esp,ebp pop ebp ret 関数名 endp のような形式になっていて、もしローカル変数として配列を確保して、それが バッファオーバーランした書き込みを行った場合、上記の pop ebp で変なアドレス がebpに入り、retで変なアドレスへ飛ぼうとする。変なアドレスに飛ぼうとしたら そこで保護例外が起きる確率が高くなる。また、上記の関数の構造は、関数を 呼び出した親の関数でも同じなので、そこでも、祖父の関数へ戻る際、 最後の方で mov esp,ebpという命令が実行される。しかし、今言ったように ebpに狂ったアドレスが入ってしまっていれば、この命令で esp = ebp とされようとしたときにセグメンテーション・フォールトが起きる可能性が 高くなる。espへの代入は、保護に関して他のレジスタへの代入とは違う 特別な処理がされており、ss というスタックセグメントの範囲から逸脱していないか、 また、espが4で割り切れる値になっているかどうかのチェックが入る。 それは普通のページング・フォールトのチェックだけよりも調査項目が増えるので より厳しくなる。 >>926 ・ret文で変なアドレスに飛ぼうとした場合、そのページが実行属性が付いていない 場合や、そもそもページングされて無いアドレスであればページ例外が起きる。 さらに、たまたまそのチェックがすり抜けても飛んだ先の命令列のうちのどこかが、 存在しない命令パターンだったり、アプリでは使ってはいけない命令に なってしまっている確率も結構、高頻度で有ってその場合「不法命令外」 というものが生じる・ ・esp=ebpにされる際、espが4で割り切れるかどうかのチェック入る。だから、 スタックが破壊された場合、3/4(4分の3)、即ち75%の確率でここで スタック保護例外が生じる。また、スタック・セグメントの範囲チェックで、 大体、50%〜90%くらいの確率で異常が発見される。そして、これら二つの チェックで異常が発見される確率は、1-(1-0.75)*(1-0.5〜0.9)程度の確率となる。 となり、僅かでもスタックのebpの保存場所にバッファオーバーランが派生した場合、 結構な高確率で異常が発見される。大体、これだけでも、9割以上。 ・上記は、偶然に異常が発見される確率。全ての確立を総合すると、 1-(1-p_1)(1-p_2)・・・(1-p_n) のような形で偶然にして異常が発見されるが、 チェック項目の個数 n が十分大きいと、割と即座に近い時期に異常がたまたま発見される 確率は、99%位になっても不思議は無い。これは数学の話。 >>928 誤:なってしまっている確率も結構、高頻度で有ってその場合「不法命令外」 正:なってしまっている確率も結構、高頻度で有ってその場合「不法命令例外」 >>927 20年前1999年くらいに起きた変化だとすれば、単純にOSがCPUのプロテクト モード(保護モード)で(ちゃんと)動作するようになった影響だと考えられる。 まだちゃんと動作していないよ CPUがなんちゃってプロテクトモードだから
>>933 ユーザーアドレス空間をいちいちチェックしているとは思えませんが… 95や98とXPは違う、っていうなら単純にOSの違いが影響していると思われ
>>935 プロテクトモードだとCPUが常にチェックし続けてますよ。 3.5GHzとかで、1命令実行するたびにチェックしながら動いています。 ハードウェアレベルでそういうチェック機構がCPUの内部に入っているので。 ソフトと違い、ハードでのチェックは処理時間を遅延させないからな
最近はあまりないけどMMUの処理で1サイクル遅延するハードとかもあったよ 要するに「常に」処理時間を遅延させないってわけじゃないってことな
>>941 現代のCPUでは、パイプラインを使っているのである程度重い処理であっても、 速度低下には繋がらないような仕組みがあります。 結構複雑なMMUの処理が入っても1命令の実行速度の低下は全く無いことが 多いです。 そこまでやってくれるのにバッファオーバーラン自体はチェックしてくれんのですか
最近のCPUでの脆弱性がどうして起きているか,誰か解説して
まあそっちはばるぐりどんの仕事だよね。 最近は全然関係ないところでバスエラーが発生する様なプログラムはあんまり見なくなったわ。新規に作り込むことはないだろうし、古いコードもあらかた直したし。
>>942 通信簿に人の話をあまり聞いてないとか書かれたことない?w > 最近はあまりないけど >>943 バッファオーバーランはプログラム上の論理的な境界の問題だから、ハードウェア的に一律に処理することはできないよ バイト単位でマスク掛けてそこからはみ出すアクセスで割り込みできればなんとかなりそう。
仮想アドレスってどう実装されてるの? 86系はセグメントで先頭アドレス決めてるだけだろうけど。
>>949 ページングの話なのかセグメントの話なのか >>951 一応、x86系(IA32)で、仮想アドレスというと大体ページングの方をさし、 セグメントの方は、二部分アドレス、などということが多いことは多い。 >>952 それはそうだが>>949 が > 86系はセグメントで先頭アドレス決めてるだけだろうけど。 って書いてるので何を知りたいのかよくわからん >>949 記憶に頼って書くので、少し間違いがあるかもしれないが、IA32では、 ・仮想アドレスの4KBの領域が1ページと呼ばれる。 ・それぞれのページの先頭アドレスには好きな物理アドレスを割り付けることが 出来る。また、ページごとに、R,W,E 属性などを ON/OFF できる。 Read/Write/Execute ができるかどうかを指定できるということ。 ・1024個のページのをまとめてテーブルにして、そこにそれぞれのページの 上記情報をまとめて書く。このテーブルは連続した4MBの仮想アドレス領域 に対応している。このテーブルは、1ページあたりが4バイトになっていて、 「エントリ」と呼ばれる。4バイトのエントリが1024個集まって1つの テーブルを形作り、「ページテーブル」という。ページテーブル自体も また4KBになっていて、ページのサイズと同じになっている。 ・さらに、このページテーブルの先頭アドレスを1024個分まとめて書いた配列があり、 ページディレクトリと呼ばれる。既に述べたようにページテーブルが仮想アドレス 4MB分を管理するので、1024個分まとまると 4MB * 1024 = 4GB 分を管理 することができるようになる。これで2^32=4GBに相当するので32BITのアドレス 空間全てを管理できるようになる。 ・ページテーブルの中には、物理アドレスを割り付けないページを作ることも出来る。 ・ページディレクトリも、ページテーブルを割り付けないエントリが有っても良い。 ・ページディレクトリが置かれた物理アドレスは、CPUの特殊な専用レジスタの中に 入れられる。 ・ぺージディレクトリ、ページテーブルの情報は、メモリアクセスを伴うマシンご命令を 実行する際に必ず必要になるので、高速化するため、TLB(Translation Lookaside Buffer 、アドレス変換バッファ)という専用のキャッシュ領域に格納されて、とても高速に 処理できるようになっている。TLBのキャッシュをクリアして再度構築する(読み込む) には、結構時間がかかるといわれており、これがOSのプロセス(タスク)切り替えの 大きなオーバーヘッドを生むといわれている。 >>949 なお、WindowsやLinuxでは、セグメンテーションの方は積極的には ほとんど使っておらず、意味がある使い方をしているのはページングの方だけ。 だから、デファクトスタンダードのOSは、ほぼ全てページングだけを使っている と言っても過言では無い。セグメンテーションは、スタック領域(esp,ebp)の ためだけにはやや意味のある使い方がなされる場合があるかも知れない。 というのはスタック領域については、CPUの保護がちょっとだけ強く保護できる 仕組みを持っているが、それがセグメンテーションの仕組みを使っているから。 例えば、仮想アドレス領域の一部だけをスタック領域にして、そこからはみ出た 場合には保護例外を発生させたいような場合には、セグメンテーションが利用できる。 上手く使えば、スタックの自動伸張にも使えないことも無い。ただし、 自動伸張にか関してはそんなに上手く使いこなせる仕組みでも、そんなに 効率が上げられる訳でもない。再帰関数の何度も呼びすぎてスタック を使いすぎた場合にプログラマにエラーを表示するような目的には 使おうと思えば使える。 いくつか補足 >>・仮想アドレスの4KBの領域が1ページと呼ばれる。 今のx86では4MB、x64では2MBのページや1GBのページも使え、メモリ使用効率を犠牲にして大量のメモリを使うプログラムのパフォーマンスを上げられるようになっている。 >>・それぞれのページの先頭アドレスには好きな物理アドレスを割り付けることが出来る。また、ページごとに、R,W,E 属性などを ON/OFF できる。 先頭アドレスが設定できるアドレスは4kB毎。x86でのExecute指定はPAEが有効な時のみ >>・1024個のページのをまとめてテーブルにして、 x64とPAE有効なx86では8バイト512エントリ >>・さらに、このページテーブルの先頭アドレスを1024個分まとめて書いた配列があり、ページディレクトリと呼ばれる。 x64では512エントリのテーブルが4段で1ページ4kBだから、4*9+12=48ビットの物理メモリまで指定できる >>例えば、仮想アドレス領域の一部だけをスタック領域にして、そこからはみ出た場合には保護例外を発生させたいような場合には、セグメンテーションが利用できる。 x86では出来るが、ページングで自動伸長やスタックオーバーフロー検出を特に問題なくできるからわざわざ使わないし、x64ではベースとリミットが廃止されたから不可能 あと、x64で互換モード(32bit)とlongモード(64bit)の切り換えはコードセグメントの設定で自動的に行われるから、そのためには最低2つのコードセグメントが必要
>>949 セグメントと仮想アドレスは別物だぞ? セグメントはあくまで絶対アドレス、仮想アドレスはページングを使ったプロセス毎のリニアメモリ再構築。 おまいら詳しいな いつも煽るだけのジジイとは大違いだ
CPUの振る舞いは、MS-DOS時代から触っていたら、OSを直接触る仕事して無くともそれなりに身に付く知識。 90年代の雑誌の記事とか、今見返すと結構適当な言い回しがおおいかなー。
設計から組み込みの部門に転籍したいんやけど応用情報取ればアピールになる?
>>961 なんでここで聞くんだよ スレタイ読めないのか? >>964 なら答えてやろう お前には無理だ 資格云々言う前に人として問題がある >>961 アピりたいなら高度のESぐらいは取らないとだめだと思う そもそも自分の職種を「設計」って言う奴はもれなく仕事できない奴だから無理だと思うが >>961 アマチュアなので業界のことはよくわかりませんが、私の経験では応用情報なんて準備なしでもサクサク合格できる非常に簡単な試験だったので そんな馬鹿でも取れる試験を通ったところで、他人様にアピールできる要素なんて皆無だと思います まあ取らないよりはましかもしれませんが、とったところで、どうということもないかと 資格を取るより、何か作ったほうがいい それは何かを他人に説明できるものをな 最後までやり遂げるやつってアピールになる
>>968 馬鹿でも取れる資格で合格率2割か…世の中は馬鹿ばっかりと思ってる仕事できない人ですか? 隙あらば自分語り しかも応用情報所持者は馬鹿ときたもんだ 5chでコテハン付けてる人間にはろくなのが居ないのが良く分かるわ
>>968 ×バカでもとれる資格 ◯取れたバカもいた資格 >>971 実際馬鹿みたいに簡単な試験でしたから「世の中馬鹿ばかり」と勘違いする人もいるかもしれません、私はそうじゃありませんが >>973 まあ、そういう可能性も排除するつもりはありません >>972 コテハンじゃありません、トリップです(霧) 普段、eclipseでコード書いてるんだが実行環境を使わずにプログラムを動かしたいんだいんだ。 どうすれば良い?
コンピューターサイエンスの勉強に最適な言語ってCですか? 雰囲気でPythonやらGoを実務で使ってるのでもっと核を学びたいのです
>>981 アセンブリとCをやって、OS自作し、機械語を読めるくらいになったら間違いない。ただし、アセンブリやるならCPUの種類は選べ。マイナーなCPUを勉強しても役に立たない。 低レベルの勉強がしたいならアセンブラ もっと低レベルなことがしたいならはんだごて買ってきて論理回路を勉強すべき
>>982 >>983 時間があればその辺まできっちりやりたいですね。この前秋葉で面白そうな本ありましたし 実務で役に立てそうな知識も身に付きますか!? 業務で使ってるのが高級アセンブラじゃなくて モダンな高級言語なら業務の役には立たないだろうな デザインパターンやプログラム以外の知識を真面目に学んだ方が業務の役には立つぞ
>>984 大規模開発やりたいか、小規模開発やりたいかによる。大規模開発ならオブジェクト指向とか上流のシステム設計とかの高レベルの視点が必要になる。 小規模でも継続して開発するなら開発手法や設計の知識がないと全てがスパゲティになるぞ
コンピュータサイエンス学ぶのにアセンブラと言ったらまずはMMIXだろう。
>>985 >>986 デザインパターンとか設計とかはもちろん勉強してます! 加えて低レイヤーの理解が深まったらパフォーマンスの良いコード書けるのかなと思ったのですがそうでも無いんですね パフォーマンスの良いコード書きたいなら 現実的には使ってる言語の仕様を深く理解する方が先
>>982 アセンブラをやれる手軽な環境ってありますかね… gcc のインラインくらいしか思いつかない そもそも、アセンブラ記述が効果的なアルゴリズムってありますかね… キャリーフラグを触れるメリットが生かせるのは多桁長演算くらいしか思いつきません 今からアセンブラやるなら、gasかnasmが移植性が高く手頃だと思う。 OSのカーネルではCかアセンブラじゃないと信頼できない。割り込みはアセンブラじゃないと記述できないことがある。
Java仮想マシンのバイトコードも仮想アセンブラの一種と言えるのではないか。 最近ではLLVMというコンパイラ技術基盤があって、それを使えば仮想アセンブラというか中間言語でも高レベルの最適化ができる。 あくまで仮想だから本当のアセンブラとは言えない。
低レイヤやってきたおっさんのスタンスは「動けばなんでもいい」が普通なので、なるべく同じ道は進んで欲しくない
仮想アセンブラなんて言葉は、初めて聞いた 違和感ありすぎる
>>994 私は VM コードなんて「嘘くさくて」アセンブラに数えたくないし、仕様を把握する気にもなれません LLVM は所詮コンパイラ内の中間言語であって、バイナリーではないと思っています 五チャンネルの株式総会はこれで閉会と致します。お疲れ様でした。
lud20221115102236ca
このスレへの固定リンク: http://5chb.net/r/tech/1560763630/ ヒント: 5chスレのurlに
http ://xxxx.5ch
b .net/xxxx のように
b を入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「C言語なら俺に聞け 152 YouTube動画>1本 ->画像>1枚 」 を見た人も見ています:・C言語なら俺に聞け 142 ・C言語なら俺に聞け 150 ・C言語なら俺に聞け 140 ・C言語なら俺に聞け 145 ・C言語なら俺に聞け 146 ・C言語なら俺に聞け 147 ・C言語なら俺に聞け 143 ・C言語なら俺に聞け 151 ・C言語なら俺に聞け 149 ・C言語なら俺に聞け 148 ・C言語なら俺に聞け 144 ・C言語なら俺に聞け 153 ・C言語なら俺に聞け 159 ・C言語なら俺に聞け 155 ・C言語なら俺に聞け 156 ・C言語なら俺に聞け 157 ・C言語なら俺に聞け 160 ・C言語なら俺に聞け 139 ・C言語なら俺に聞け ・C言語なら俺に聞け 163 (518) ・●●●●TCL/TKなら俺に聞け 4●●●● ・ゲームプログラムなら俺に聞け33 ・CORBAなら俺に聞け ・キャンプの事なら俺に聞け! [無断転載禁止] ・LinuxカーネルはC言語なのにオブジェクト指向 ・パソコンのことなら何でも俺に聞け [無断転載禁止] ・steamに関する質問なんでも答えます わからないことは俺に聞け ・機械語なら俺に質問しろ!その2 ・C言語上級者スレ ・c言語的にjavaを教えて ・C言語相談室(上級者専用) ・海外「なんて論理的な言語なんだ」 日本語の構造を簡易化した図が外国人に大好評 ・C言語でRADって作れるんでしょうか? ・久々にC言語触ってるけどクソすぎじゃねこれ ・C言語でテトリス作れる人来て!👾 ・1行ずつC言語を書いてくスレ(目標なし) ・C言語の設計ミスった危険な関数トップ10決めようぜ ・敵「プログラミングはやりたいことを見つけてからやれ」俺「よし見つけたぞ!C言語始めてみよう!」 ・ネパール、日本の外国人奴隷問題が影響か人気言語1位が韓国語になる ・【IT】Swiftがトップ10入り、Pythonは3位から4位へ--10月TIOBEの人気言語ランキング ・【企業】「”C言語…?どこかで見た”程度でOK」 名古屋のアテック、求人広告が話題に エンジニアの人材不足、面白求人でカバーできる? ・【プログラミング】止まらないC言語の下落 - 12月言語ランキング [無断転載禁止] ・C言語って… ・C言語の第一歩 ・C言語をやりたいんですが ・[システム]プログラム言語など学習スレ[初心者] ・ソケット通信なら俺に任せろ ・C言語が理解できないのですが ・C言語を教えてください!! ・C言語でツール作ろうと思うんだけど何かいい案ある? ・ラズパイ4でc言語開発する方法教えてくれ ・C言語を学びたいんやが、まず何からやればいい? ・最長不倒関数■C言語でmain関数に全コードを入れる ・8ビットCPUでC言語?ないないありえないっしょ!5 ・お前らC言語で通信ライブラリ作れって言われたら出来る? ・C言語でTCP/IP通信勉強(プログラミング)したいんだが ・玄人「まずC言語から覚えろ!」「Cはすべての基礎!」これまじ?? ・MS「C言語は脆弱だな。改良してやんよ」→標準化! [無断転載禁止] ・SQLなら俺に訊け [無断転載禁止]&#169;2ch.net (355) ・c言語教えてくれ (9)
21:42:55 up 18 days, 8:07, 1 user, load average: 8.43, 9.19, 9.27
in 0.060034990310669 sec
@0.060034990310669@0b7 on 123011