TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
プログラムに詳しくなりたい
BrainFuck Part.3 <[+-.,]>
低スキルでも読めるコードは、属人的なコードになる
VRプログラム雑談【Unity/UnrealEngine】【HTC Vive/Oculus Rift/その他VR】
将来性ないプログラミング言語。Delphi含まれず安心
C言語なら俺に聞け 147
HelloWorld集めようぜ
Java Web Application Framework総合 ver2
C#は糞2.0
GPGPU#5

C言語なら俺に聞け 152


1 :2019/06/17 〜 最終レス :2019/08/05
!extend:checked:vvvvv:1000:512
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/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 151
https://mevius.2ch.sc/test/read.cgi/tech/1554171817/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured

2 :
前スレ
https://mevius.2ch.sc/test/read.cgi/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でどうたらを早く説明しろ

 逃 げ ん な こ ら !

3 :
>>2
ん?
今日はこちらに居ますよ、よろしかったら私の問題をぜひどうぞ
https://mevius.2ch.sc/test/read.cgi/tech/1558168409/

4 :
えーと。ゲッターロボの話をしていたんだっけ?

5 :
プログラム板にキチガイ降臨中!botに一晩も反応する異常さ
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.2ch.sc/test/read.cgi/tech/1559872586/

142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。

6 :
>>4
違うよ、ゲッターズ飯田の話だよ。

7 :
ゲッター(英語表記)getter
翻訳|getter

ブリタニカ国際大百科事典 小項目事典の解説
ゲッター
getter
真空装置内の残留気体を吸着しうる材料のことで,高真空を達成する目的に使用されるもの。固体で吸着作用を行わせるものを接触ゲッター,気体中に分散させて吸着させるものを分散または拡散ゲッターと呼んでいる。
ほとんどの金属は両方のゲッター作用をもっているが,トリウム,バナジウム,チタンなどは接触ゲッターとして,またカルシウム,マグネシウム,バリウムなどは分散ゲッター作用がおもに利用され,蒸着またはスパッタして用いられる。
真空管などの封じた系の真空度維持や,イオンポンプなどに利用されている。

8 :
gccのmallocはdlmallocを元に作られているから
mallocを何度も使って小さな領域を沢山確保する場合にもパフォーマンスは
下がりませんか?

9 :
>>8
推測するな計測せよ

10 :
mallocを作るにはmmapつかえばいいの?
どうやるの?

11 :
>>10
まずは蟹炒飯本のmallocを実装して勉強する

12 :
静的解析ツールはぬるぽとかメモリリークをどれくらい防げるものなの?

13 :
ポインタが多階層にまたがって参照されるクソコード書かなければ、ほぼ見つけてくれるよ。
勉強になるから積極的に使った方がいいよ。

14 :
>>11
カニチャーハンの本とは表紙がカニチャーハンの本のことか?
mmapはつかうのか?つかわないのか?
何を使うのかだでけも教えてちょ

15 :
>>14
sbrk

16 :
>>13
静的解析ツールの定番はなんでしょうか?

17 :
>>16
https://ja.m.wikipedia.org/wiki/静的コード解析
使ったことあるのはPGReliefとCoverity

18 :
lintのポータビリティチェックはどれくらいポータブルにしてくれるものなの?

19 :
演算に関する質問です。
8.21 * 5 = 41.050000000004←この4は何者でしょうか?
左の「8.21」が浮動小数点数、右の「5」は整数です。
演算の結果、制限の少ない型、すなわち浮動小数点数に変換されるのですが、
上記結果に示すように最後の4が何?不具合?
C言語の歴史は長いのに、こういう初歩的なミスをどうして今の今まで気づかず、放置したんですか。
これを契機に俺は浮動小数点数は使わないことにした。

20 :
>>19
ネタか?
IEEE754を読んでこい。

21 :
そのような現象が起こるのはC言語の浮動小数点数に限った話ではない

基本的に0か1かの世界であるコンピュータがどうやって浮動小数点数を扱っているのか
その辺のことを考えながらすこし色々調べ直したほうが良い

正確な精度が必要なら浮動小数点数じゃなくて任意精度計算のライブラリを使いましょう

22 :
マジモンのネタか
ホームラン級のアホか
それとも嵐か
第四の選択肢をもった世界初の偉人か

どれだ

23 :
四次元空間の歪みが原因

24 :
>>21
答えを教えてください。最後の4の正体はなんですか?初心者なので。

25 :
>>24
あなたがちゃんと>>20を調べたとは思えないので私は答えません。
調べているならちゃんと計算方法も出てくるし、本当にそうなるのか実際に自分の手で試してみようという気も起きると思います。
初心者だからこそ自分で調べて自分で計算してみてください。

26 :
>>25
スレタイにあるとおりC言語なら俺に聞けとあります。あなたは、その「俺」ではないのですか?なければやむを得ませんね。

27 :
ちなみにあなたの質問は「C言語」についての質問になっていません
「浮動小数点数を扱う規格」とそれを使った計算結果の質問です
なのでそもそもこのスレで答える筋合いがありません

28 :
>>19
>8.21 * 5 = 41.050000000004←この4は何者でしょうか?

>8.21 * 5 = 41.050000000000004

コピペミスか?

29 :
>>28
コピペではありません。手入力です。0は重要ではありません。最後の4が曲者です

30 :
誰かと思ったら引数voidじゃん。

31 :
手入力だったのかw
じゃあ犯人は君の右手だ

32 :
そもそもなぜ4でなく0で完結しないのか。0だと不都合があるのか、本質が議論されていないからいつまでたってても解決しませんよ。

33 :
>>32
マジレスすると浮動小数点は内部で2^nの有限和でしか表現できないから(nはマイナスもあり)。
10進数に変換すると誤差が出る。
これで分からないなら諦めろ。

34 :
>>33
んむ、、。。

35 :
桁数には頓着せずに見かけの数値に拘るって
どこかが変

36 :
>>32
答えは>>20で出ており、議論すべきことはなにも残っていない。
残っているのはお前さんが提示された情報をちゃんと調べて自分の頭で考えることだ。
それをした上でまた疑問が出たならそれを質問すればいい。

37 :
>>35
手入力で適当に0埋めたからヒューマンエラーがあってしかるべき。だからおかしくない。

38 :
>>37
ゲッターの話はもういいの?

39 :
0.821を=a/2+b/4+c/8+....ってやってみて
出てきたabcd.....を5倍すると最後が4になるってことだよ

40 :
マジレスできるが、おまえの態度が気に入らない

41 :
このレベルの質問者に対して、ieee754読んでこいおしまいも、そうとうどうにかしてる

42 :
基本情報の範囲でしょ。勉強不足。

43 :
質問自体がネタにしか思えないからなあ

44 :
>>42
申し訳ありません。最初にコメントした通り初心者なもんでして。
1000人の初心者に対して同じ質問しても1000人とも答えられないでしょう。だから恥じらいとかないんです。

45 :
>>44
回答してもらって納得するよりも、
自分でやる方が遙かに勉強になる
ヒントだけ書いておこう

数値の内部表現を調べて、演算仮定を追いかけ
計算結果の内部表現を見て、それを10進表示に戻す

以上を追いかけていけば自ずと回答がでる

46 :
>>41
今時ググればいくらでも情報あるから自分で調べる気があるならキーワードだけで充分だろ

47 :
みんなこの質問に答えると中出しセックスできると本心では思っているからなかなかおしえてくれないよな
中出しセックスができなくなるアニメとかゲームとかパソコンの質問は簡単に教えてもらえるよ

48 :
>>19
普通はCは浮動小数点を内部で2進数で扱っているため。
10進数で歯切れのよい数でも2進数では循環小数になったりして割り切れない値になることがある(例えば10進数で 0.1 は2進数では 0.00110011...という循環小数になる)。そうなるとどうしても10進数文字列への変換で近似値にしか変換できない。

では最初から内部も全て10進数で全て計算すれば良いではないかと思うかも知れないが、それではコンピュータ内部での計算が遅くなる。
遅くなってでも正確さが必用とされるお金の計算等はそれ用のコンパイラまたはライブラリを使用して実現する(あるいはC言語ではないそれ用に設計された言語を使う)。
デフォルトではCは誤差が出てもいいから素早く計算出来る状態になっていると考えて良い。

49 :
cでデシマル型ってあんの?

50 :
ない。

51 :
http://home.a00.itscom.net/hatada/c-tips/lint01.html
こういうものでチェックしたら完全にクロスプラットフォームになるの?
ifdefとかなしで?

52 :
>>48
> では最初から内部も全て10進数で全て計算すれば良いではないかと思うかも知れないが、それではコンピュータ内部での計算が遅くなる。
それ以前に1/3ってやられたら同じことになる
10進数だと内部形式と外部形式で変換誤差が出ないだけで計算にまで言及したら10進数も2進数も同じだよ

53 :
要は有効桁数を意識してりゃいいんだよ
それ以上の制度が欲しいなら専用ライブラリ使えばいい

54 :
2進数で計算する方が悪い
ちゃんと10進数で計算するライブラリを使え

55 :
>>54
53の言ってる意味わからんでしょ

56 :
>>49
http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1312.pdf

57 :
>>52
そうだね。

>>53
そういう事だな。

58 :
有理数で計算するライブラリを使えばいい。
パイ?何それおっぱいのこと?

59 :
有理数計算は実装してみれば分かるが圧倒的に遅いからな

無理数はどうやって実装するのか知らん

60 :
有理数で計算したあと最後に無理数に直すところで一番最後が4になったらどうするんだよ

61 :
>>60
4を引けばいいじゃない。

62 :
無理数って円周率とかeだろ?
違ったっけ?

63 :
有理数じゃなければ無理数だろ

64 :
メモリが有限である限り無理数を厳密に表現するのは不可能だよ

65 :
C言語でWebAssemblyできるみたいだけど
ハードウェアに近いとこでもなければC言語は使わないほうが良いイメージだけど
実際WebAssembly的にCはどうなんだろうか?

66 :
>>64
数値演算に拘ならければ数式処理でπはπ、√2は√2のままで計算できるだろ。

67 :
>>66
だから「厳密に」って言ってるじゃん
πは14桁で事足りるし31兆行も必要ないからね

68 :
>>67
31兆桁ね

69 :
> πは14桁で事足りるし
ぐるぐる回転するとだんだんずれてくる

70 :
>>69
なら必要な精度だせばいいじゃん

71 :
>>67
いや、そうではなくて数式処理ならメモリ有限でも厳密に表現できるんだけど。
なんか俺変なこと言ってる?もしかして議論噛み合ってない?

72 :
>>71
πはπとして表現するってことね
そりゃそうだよね

73 :
>>71
数式でいいなら紙に数式を書けばそれが答えじゃないのか?

74 :
でもpiを1として考えたら1が1/piになるんじゃないのか?

75 :
>>73
そりゃ紙に書いて数式演算って言い始めたら数値演算も紙の上でできるでしょ。
俺の言ってるのはMathmaticaのような数式処理。

76 :
建築設計や土木設計の時の数量計算なら、数字を出さないといけませんよ

77 :
最終的に望む精度で出せばいいだけでは

78 :
>>75
じゃあはじめから紙でいいだろ

79 :
紙が足りなくなってきたら最初の方から消しゴムで消していけばいいだけだからいつかは書き終わるだろう

80 :
半径5の円の面積求めなさいって言われて
78.5... と数値として答えるか 5^2*pi と数式で答えるか
俺は数値の精度の話をしてたんだよ

81 :
数値にしたら負けだよな

82 :
BCDコードは流行りませんか?

83 :
有理数を実装すればいかなる整数m, n に対しても m / n * n がきちんと m に戻る
(decimal型でも普通無理)
同じようなことを無理数でやる方法がわからんって話よ

無理数が厳密に数値化できないなんて誰でも知ってる話はせんわ

84 :
>>83
現実問題としてそんな厳密解は必要がないってことだよ
だから数値の精度の話したんだけどな
NASAはπ15桁で軌道計算して誤差は約12cmだってよ

85 :
>>84
「そんな厳密解は必要がない」ってのはお前の信条だろ
お前の信条を話に混ぜられても困る

86 :
>>85
どこに俺の信条があるんだよw
じゃあ何が問題なのか具体的に言ってみろよ

87 :
>>86
俺「どうすれば実現すればいいのかわからない」
お前「そんなものは必要ない」

話になってない

88 :
「どう実現すればいいのかわからない」だった

89 :
>>87
何を実現したいのよ

90 :
>>89
計算の中で無理数を無理数として処理したい

最後に数値化したいならそのときの誤差だけは許容する

91 :
>>90
じゃあ数式処理でいいじゃんw

92 :
>>91
その数式処理をどうやるのか知らないって話なんだが

93 :
>>92
>>75が言ってるじゃん
Mathmaticaでも使えば?

94 :
Mathmatica 的に数式処理したいならそういうパーサーを書いてだな…
解析解が求まるといいですね (lol

95 :
C++ 数式処理ライブラリ
で検索。

96 :
>>93
Mathmaticaいくらすると思ってんだよ…

97 :
そもそもどう処理してるのか興味があるだけなんだがな
OSS漁ればあるかな

98 :
>>96
じゃあお前が書けw
お前ならできる

99 :
「数式処理ソフト」と紙に書けばいいんじゃないのか?

100 :
>>80
やっぱり議論が噛み合ってなかったね。
俺は厳密解の話してたわ。
無理数が有限メモリで表現できないからの数式処理なら表せられるの流れだったのでまさか数値解の話で止まってるとは思わなかった。

101 :
「計算のステップごとに増えてく誤差の蓄積」と、
「最後に(それまで記号的に扱うことで保留していた)
無理数や無限小数を実際の数値に直す際の誤差」と、
話がゴッチャになってるでしょ。

102 :
>>100
数式で表現できるのは当たり前だし
そんな当たり前の話されてもって感じだったわ

103 :
ここはC言語のスレですよ
数式処理スレじゃないです

104 :
>>102
なら最初からそう書けばいいのに、何で数値解にこだわったの?俺は最初からこだわらなければと書いてるけど?

105 :
C言語で扱えるのは数値解でしょ
それ以外はスレ違いのテーマ

106 :
>>104
こだわりなんてないけどね
πは数式でπと表現するなんて当たり前だから
当然、無理数の数値表現の話だと思っただけだよ

107 :
>>105
その通りだね

108 :
>>106
無理数を有限の有理数表現するなんて、議論するまでもないじゃんw

>>105
そだね、俺はMahmaticaのような数値処理をC言語で実装すれば無理数も有限メモリで扱えるよ、と言いたかったんだが、議論がスレチになったのでもうやめます。

109 :
>>108
その当たり前を分かってないからこうなってるじゃんw

110 :
>>51
lint 前提のコードは、変てこなキャストとかが多用されているので、私は好きくない
(void)fclose(fp);
とか

111 :
多桁長演算は、私もすごく欲しくて遂には C++ で書いてみました
これさえあれば、有理数ライブラリもすぐに書けるでしょう
https://mevius.2ch.sc/test/read.cgi/tech/1434079972/51

無理数は無理ですが

112 :
>>109
ま、ここではよくあるコミニュケーションエラーだったね。
建設的な議論になりそうにないので、もうやめとこ。

俺は数式処理にMathmaticaしか使ったことないけど、オープンソースでMaximaってソフトあるね。
どういう実装になってるのか今度見てみよう。

113 :
数式処理はコンパイラ書くのと同じですよ。
記号操作なんだから、ある意味コンピュータの仕事の本質です。数値よりも。

114 :
あと、mathematicaは任意桁の誤差なしの数値計算もできるけど、そっちはGNUのライブラリ使ってたのではないかと。

115 :
Axiomってのもソース読めるな
探せば色々でてくる

パーサ書くなら昔はlexとyaccが定番だったけど今は何使ってるのかね

116 :
>>109
いや、わかってないのはお前
そもそも数式処理って最後に数値なんか出さないし
大学で(一般教養としての)数学やってないの?

117 :
>>116
ああ、わかったわかったw
後出し多くて疲れるわw

118 :
>>115
俺はむしろ数式処理はPrologのようなパターンマッチングやってると勝手に思ってる。
知らんけど。

119 :
>>117
えっ、後出し?
マジで>>66の言ってることを理解できてなかったのかよ…
もしかして入試問題が「直径1cmの円の面積を求めよ、ただしπは3と仮定する」みたいな学校にしか入れなかったのか?w

120 :
πの定義って本当は難しいではないかと考えるようになりました…

121 :
定義そのものは単純
円の直径と円周の長さの比

122 :
>>121
円周の長さって曲線ですよね
曲線の長さ…んー、曲がっているのに長さ?
「円周の長さが存在すると仮定したら」円の直径と円周の長さの比である、なら理解できなくもないのですけれども

123 :
え?

124 :
>>122
もうC言語に関係のない話題なんだから黙ってろよ

125 :
えーと、>>19から延々と話が続いてんのかな?

126 :
引数にvoidを指定したときから続いてる

127 :
>>64
いや可能だよ
おまえさんがそう発言しているのは
有限のメモリを使って表示されている電子教材に厳密な定義が書いてあるからだ
それはおそらく自然言語で書かれたものだろうがCに翻訳するのはおまえさんの仕事だ

128 :
ホラーだなw

129 :
いま気づいたんだけどgccの拡張使えばC++のテンプレート的なことできるな

130 :
素直にg++を使えばいいような・・・

131 :
>>129
させねーよ・・・

132 :
>>131
どいうこと?

133 :
このMSの新コンソールのデモビデオ
https://youtu.be/8gw0rXPMMPE

編集してるのは C のソースのように見えるけど
"<=" を "≦" に変えたり、"==" を "=" にしたりとか何の冗談だろう
それとも本当に こういう文字も OK になるのか?
オレが知らないだけで すでに OK なのか?

134 :
お前が知らないだけ

135 :
リガチャでググれ

136 :
>>134-135
ググった。どうも
Unicode のリガチャ? とすると見かけだけではなくて、ファイルに格納したときの文字コードも
変わるってこと?
ていうか最近の C コンパイラはそれを認識するのか?

137 :
>>136
自己れす
考えるに、やはり見かけだけのことだな
CSS のスタイル指定と同じことをやってると

138 :
fira codeっていうのがあってな
emacsでもつかえる

139 :
行書体フォントは合字で見映えを変えてるだけだな

嵯峨本フォント公開 - Togetter
https://togetter.com/li/691328

140 :
>>64

3.1415926535897... ≒ 3.14

これだけの話

141 :
>>96
raspberry piからなら無料で使える
raspberry pi 4も3日くらいまえに発売された

142 :
およそ3

143 :
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と等価とは扱われないのですか?

144 :
C11とは

145 :
>>143
私の手元で実行するとループを抜けています
https://ideone.com/1uEulv

146 :
>>145
そうですか・・・
TrueSTUDIO for STM32のコンパイラはgccじゃないかと思うのですが、
何か違うのかもしれません

147 :
あまり一般的じゃないコンパイラだね。バグか。

148 :
!!!hageとかすると動くんでしょうね

149 :
>>144
まさか知らんのか?
ISO/IEC9899:2011のことだよ
ISO/IEC9899:2018が現行規格で、
それの1個前の旧規格だ

・・・またおかしいことになってるな
ISO/IEC9899:1990がC89なのと同様
ISO/IEC9899:2018がC17だ

150 :
>>149
C11を使ってます、で意味が通じたということ?
あと引数にvoidがあるけど、大丈夫だった?

151 :
>>143
何か変な最適化されてるのかな?
逆アセンブラ見てみたいね。

152 :
hoge は不変とみなしてループ外に追い出すような類推が働いてしまうコードっぽくないのに
true との比較ではなく !hoge だから間違いもおこさない形式だし

153 :
そもそもこのループは最適化で1行も生成されてないと推測。
んで何かの勘違いで抜けてないと思ってしまったと予想。

154 :
gccの -std=c11 -O0 でやったら終了した

155 :
>>148

 
                 ノ
          彡 ノ
        ノ
     ノノ   ミ
   〆⌒ ヽ彡     
   (´・ω・`) 

156 :
if文の中を hoge == true とタイプミスしているとか

157 :
>>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
問題なさそうだが、本当に抜けなくなったのか?

158 :
そのコードはx86 じゃないの?
STM32用の開発ツールらしいしARMのコードを吐くコンパイラだろ

159 :
おまえさん、x86のレジスタ名は知ってるか?

160 :
疑いだしたらきりがないけど
>このような感じのコード
と言ってるあたり、このコードが100%再現する最小コードではない可能性もあるということだろうか?

擬似的に if( cnt++ >= 10) hoge = true; と書いてるけど
実情は割り込みや別スレッドかなんかで hoge を書き換えてたりとかさ

161 :
へんな動きしたらデカい配列作ってスタック破壊してないか疑う。
アセンブラ使てたらショートジャンプで128バイト以上離れてるラベル指定してないかとかも。
16/32bit時代のことですが。

162 :
スタック破壊は高確率でリターンアドレス壊して暴走(coreダンプとか例外とか)が発生するので発生しちゃえば案外すぐに分かる。

163 :
ポインタは値と参照どちらですか?
f(&v);みたいにポインタを渡す事を参照渡しと呼ぶのは妥当ですか?

ポインタをインクリメントしたりアドレス計算に使う場合があるから
値っぽい気もしますよね

164 :
「C言語は数値でアドレス指定してデータにアクセスする能力を持つ言語だ」
と捉えて、ポインタ渡しはあくまで値渡しと捉えるのも妥当そうじゃないですか?

165 :
そういう認識ができてるなら十分だな
その値から指し先が示す実体を引っ張ってこれるってだけで
関数のインターフェースとしては値を渡してる

C言語ではできないが
int a = 0;
foo(a);
呼び出した結果 a の値が書き換わって戻ってくる
っていう渡り方があって、そっちを参照渡しって呼ぶし

166 :
「C言語に参照渡しは無い」という理解でよくね?

167 :
そういう意味では全ての言語は参照または値を表記の違いこそあれ何かの値を渡してるわな。
「参照のための値(アドレス)を渡している」という意味において、C言語もまた参照渡しのある言語になるんじゃない?

168 :
違います。

169 :
Cに参照はないが、ポインタ経由のアクセスを参照だと脳内定義するなら参照ということにはなる。
ただC++は参照もポインタ経由のアクセスも両方使えるようになってるので後でC++やろうとすると混乱するかもね。

170 :
先輩「〜〜」
新人「なるほど、つまり参照渡しですね」
先輩「違います」
新人「オオ…オ……オ……」

そして新人はIT業界を去ったのであった

171 :
ポインタを特別扱いする必要とか無いがな

172 :
C言語の場合は素直にアドレス渡しで良いと思う
紛らわしい用語使うとかえって混乱するだけ

173 :
先輩「〜〜」
新人「なるほど、つまり参照渡しですね」
先輩「まあそうだね」
新人「なるほど理解しました」

優しい世界

174 :
そして姑息な優しさによりC++の参照で混乱する

175 :
C++なんてクソ言語は回避すればいい

176 :
姑息じゃない先輩「〜〜」
新人「なるほど、つまり参照渡しですね」
姑息じゃない先輩「まあそうだね」
新人「なるほど理解しました」
姑息じゃない先輩「でもC++の時は注意が必要だよ。その時にまた質問してね。」

素晴らしい先輩

177 :
Java は参照の筈なのにある日 NullPointerException を見て愕然とする。

178 :
NullPointerException を見て愕然

「ぬるぽ」を見ると「ガッ!」と返されることの由来。

179 :
ポインタ?BASICのPEEK、POKE、CALL、DEF FN使ったことあるなら(ry

180 :
>>179
DEF FNが全てのBASICにあると思うなよ。

181 :
I/Oの何十ページもあるダンプリスト打ち込んでたなあ・・・

182 :
かつて皆一度は通ってきた道

183 :
デバドラを作った事がないんだけど
C言語で作ったとして、
CPUやOSの違いに対してクロスプラットフォームなソースコードを作れるものなの?

184 :
>>179
それを言うならDEF USRだな
富士通のやつ
CALLつーと早川電機か?

185 :
クロスプラットフォームなデバイスドライバなんて見たことが無いんだけど存在するの?
デバイスにもよるんだろうけどインストーラが分けてあるイメージある

186 :
この話題に付いてこれるのは50代より上

187 :
実行ファイルは環境毎でも
ソースコードは共通化されてるかもしれない

188 :
早川電機ってw
何歳なんだよw

189 :
>>183
そりゃ無理だ。
デバドラはデバドラでOS毎にお作法がちがう。
>>184
早川電機じゃオッサンでも分からんだろ(笑)
シャープと言えや。
確かにS-BASICにCALLはあったけども。

190 :
同じデバイスに対しては同じ様なプログラムになると思うぞ。

191 :
>>189
CPUの違いだけならクロスプラットフォームにできる?

192 :
クロスプラットフォームの意味履き違えてない?

193 :
東京通信工業なんて会社、知らないだろうな

194 :
間違えてはいないが単にその言葉が曖昧だ。
ifdef等を使わずにCPUの違いに対処できるCコードは書けるか?

195 :
>>191
デバドラの種類によるかな?
ユーザモードドライバだけで済むような環境だとCPUが違ってもソースコードを共用できる可能性が高い。

196 :
>>194
プラットフォームの差を吸収するレイヤがありゃできるだろう。
普通のプログラムだってリンク時に解決してる部分がかなり大きいんだから。
Cで書いてる時点でそれなりに抽象度が高いと思うよ。

197 :
>>195
Linux は結構共通になってない?ものにもよるか。

198 :
PC-98、TWONS、AT互換機でDOSのファンクションコールしか使わないなら同じexeファイルが使えたと思った。

199 :
MSX-DOSとかCP/Mのプログラム動いたぜ。
Z80だし当たり前なんだけど驚いた。

200 :
hoge.hというヘッダーファイルがシステムで使用可能ならインクルードして、ないならローカルに用意したものをインクルードしたい時はどうすればいいですか?
イメージはこんな感じです
if (exists("hoge.h")):
#include<hoge.h>
else:
#include"./src/hoge.h"

201 :
>>200
#if EXISTS_HOGE
#include <hoge.h>
#else
#include "./src/hoge.h"
#endif

コンパイラオプションで-DEXISTS_HOGE=1を指定するとシステムのヘッダをインクルードできる
これの欠点は手動で指定する必要があること
自動でやりたいならautotoolとかcmakeを使うしかない

202 :
>>200
includeパスの優先順位を利用するのじゃダメなの?

203 :
自分の hage.h を用意しとけば。名前何でもいいけど。
で、本物のhageのインクルードガードのマクロ定義をチェックすればいい。マクロがあればの話だけど。

204 :
こっそり__has_include使えたりしないの?

205 :
cmake便利だよな。これを覚えたせいで仕事を簡単に家に持って帰れるようになってしまったよ……

206 :
社畜w

207 :
ハッカータイプの人はそれが普通なんだよ
パンピーには解らないし解ってもらいたいとも思わない

208 :
いわゆる暇プロタイプの人だな。

209 :
タクシー運転手の趣味がドライブみたいなものだな。

210 :
会社でマルウェア製造していたのか

211 :
四角くてもマルウェア

212 :
山田く~ん

213 :
マ板化してる・・・

214 :
>>163 >>167
ポインタと配列の違いを説明してみ

215 :
*p[]
(*p) []
**p
*(*p)

216 :
>>214
ポインタは変数で4バイトのメモリ領域で、
配列は連続したメモリ領域?

int arr1[] = {1,2};
int arr2[] = {3,4};
arr1 = arr2;

がエラーになるから配列はポインタ変数とは明確に区別されてるみたいだが

217 :
16-bitのMS-DOSの時代だと2バイトのポインタがあったし、64ビットのCPUなら、8バイトもあり得る。

218 :
また値渡し、ポインタ渡し、参照渡しは〜ってやるのか?

219 :
> *(*p)

ああ、こいつ解ってないな

220 :
>>219
それ顔文字っぽいよね。

221 :
>>216
うちのポインタは8バイトだ。

222 :
配列はポインタのシンタックスシュガーでしかない
ポインタは何でも許されるが配列は操作が簡略化と同時に制限されてる

223 :
>>222
配列名は定数扱いのポインタですね
しかし、配列だけに許される簡素化ってなんですか?

224 :
>>223
配列は宣言した瞬間に領域が確保されてるだろ

225 :
>>222
x[-1]、これも許されるんだよな

226 :
int a[1];

int *a;
a=(int *)malloc(sizeof(int));
の違いって何?

227 :
>>226
前者はスタックか静的領域に確保される。後者はヒープに確保される。前者はスコープを抜けると自動で解放。後者は解放しないとメモリーリークする。

228 :
>>227
ということは配列ってメモリのことよく分からない初心者プログラマ以外には無用の長物なん?
解放漏れの考慮以外でわざわざ配列使うメリットってあるの?

229 :
>>228
寧ろ配列で済むのにポインタを使う意味がないぞ

230 :
>>228
繰り返し(iteration)の処理で連続データを処理・制御するときに配列がないと困る。

231 :
>>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型の時とか文字列代入出来るし
上位互換な気がするんだけど。

232 :
>>231
sizeof(int) * 3の間違い。
ヒープだと可能なかぎり自由に実行時にサイズを決められる。

233 :
配列のサイズが決まるのはコンパイル時だ。

234 :
>>231
前者の方が簡潔だし
書かなくていい確保・開放処理は避けるものだ

パフォーマンスも配列の方が上

235 :
>>228
自分で書いたんだから分かると思うけど、言語構造の話でも>>226の場合は記述量で配列の方が楽だし、読む側もひと目でわかるじゃん。

236 :
かぶった

237 :
じゃあ配列は、ポインタの一部機能を制限して使いやすさの向上を図ったものという認識でいいの?
それとも生まれも育ちも全く別の概念?

何か、今やってるcの教材が、まず最初に配列を使ってプログラム書いて、
次の章でポインタ出てきて、今まで配列使って書いた奴をポインタで書き変えろみたいな例題ばっかりだから
だったら最初から配列いらなくない?と思ってしまいました。

238 :
実用的なプログラム書いてたら、そのうちわかる。心配要らない。

239 :
分かりました。unionもわざわざこんなの使わずstruct使えばよくねって思うけどそういうもんだと今は思っときます。

240 :
>>237
むしろ、何故ポインタが不要だと思わんのか謎だわ

241 :
なぜopenとfopenの二つのファイルアクセス手段が用意されているのか。

242 :
>>241
open() は OS が提供するシステムコールそのもの
fopen() はライブラリ関数であり open() をラップして「使いやすくした」(本当か?)もの

243 :
>>242
バッファっリングしてくれるとか、fprintf()もあったりしてテキストをフォーマットして出力するのも楽というのがある。

244 :
Cライブラリとしてはfopenしかないわけだけど、正直あんまり便利じゃないよな。

245 :
>>243
バッファリングはね…バッファリングは今は大部分 OS が抱いているものなんじゃないかな…アプリケーションが各々のユーザーランドに抱いていてメリットがあるのかな…

246 :
>>245
ま、そうだけどね。Cってそういう今時のちゃんとしたOSのないところや完全にOSなし環境用のプログラム作るのにも使われるし、ああいうライブラリはあってもいいと思う。

まあしかしちょっと古くなった感はあるのでリニューアルしても良いんじゃないかとは思うけどね。てか、最低でも標準ライブラリなのにセキュリティーホール作ってしまうようなのは廃止した方が良いよな。

247 :
システムコール自体相当重いから、OS呼び出す回数減らすためのバッファリングだろ

248 :
入出力バッファリングしてくれるファイルシステムなんてあるか?
ジャーナリングと勘違いしてるんだろ

249 :
しない方が珍しくね?
writeしたらディスク書き込み完了するまで次がブロックするとか?

250 :
それジャーナル制御の話だろ

251 :
バッファリングとキャッシュの区別が…。

252 :
>>248>>245へのレスな
バッファリングはアプリの仕事

253 :
>>240
char *str;
str = "abc\n";
が許されるから。
配列に文字列を代入出来ないのが不便

>>241
それ言うならfopenとfopen_sの方が意味分からんね
VS使ってたら書き換えろと警告出してくるわ、書き換えたら引数の取り方違うとかいうクソ仕様だし

254 :
>>253
そりゃ、現実としてそういう建て付けになってんだから使うよ。
でも文字列だったら最初からもうちょっと抽象的な操作の方がいいわ。ポインタ使いたかったら&つけてもいいんだし。

255 :
>>253
一応初期化の時だけ char s[] = "..."; って書き方できるけどね。これは初期化だけの特別な書き方だな。

256 :
OSによっては遅延書き込みってしているだろう

257 :
やってるな。外付けのHDD付けた時なんかはするかしないか設定できたりして。

258 :
DOS時代、ディスクキャッシュはドライバーが必要だったな。

259 :
str[9]="おはよう"
str[9]={'お','は','よ','う'}

こうやってまとめて配列に日本語を入れるのは出来るんだけど「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか?
英語ならstr[0]=…、str[1]=…って済むけど

260 :
>>259
> こうやってまとめて配列に日本語を入れるのは出来るんだけど

え?できる?

>「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか?

wchar_t 型を使ってL付けたらできないか?

261 :
要素数を明示してるので、文中の代入ではなく、初期化のときの話だろうとは予測できるが
「入れる」というのは、代入を連想させるので、うまい言い回しではないかもね

262 :
>>253
関係ないけどconst違反だね
そのケースだけ特別に見逃すことになってるけど

>>255
その書き方はK&Rでは静的記憶域期間にのみ許されていた
なぜだかわかるか?

263 :
>>262
そうだったっけ?そうだったような気もするが。

なかったのは自動変数だと毎回コピーすることになって無駄だからかな?

264 :
>>262
初回のみ限定警告100%オフ! 送料無料! だからね
いちおう違反ではないことになってる

265 :
>259
>str[9]={'お','は','よ','う'}
マルチバイト文字をこう書く時はエンディアンにも気をつけないとね。

266 :
>>265
てか、それできる?

267 :
>>263
memcpyみたいのは言語自体に組み入れるべき機能ではないという判断だ
俺は今でもそう思っている

268 :
思ってるって……
じゃK&Rにはwhyは書いてないってこと?

なんでお前の脳みその中身を当てこしなきゃいけねーんだ
バカかこいつ?

269 :
>>265
エンディアンが同じでも解釈が違うことがあるぞ
printf("%x %x", 'あ', L'あ');
bcc32: a082 3042
cl: 82a0 3042
gcc: error

270 :
>>267
じゃあ言い直そう
- 思っている
+ 賛成している

271 :
くそ、安価ミスとは俺としたことが
- >>267
+ >>268

272 :
>>267
なるほど。

273 :
>266
どのあたりに疑念を持ってるの?

274 :
>>273
'あ' みたいなのは char じゃないから少なくとも警告出そうな感じするんだが。

275 :
int Code='ABCD';
なんて書き方できるから文字列はOK。(Code=0x41424344; と解釈)

全角文字の解釈はコンパイラ次第。unicodeやutf-8対応なら問題ないと思う。
S-JISはよく"\"が含まれる文字で誤作動起こすけど。

276 :
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' は許されるんだな ちょっと意外

277 :
>>275
printf("%x", Code);
bcc32: 44434241
cl: 41424344
gcc: 41424344

278 :
処理系定義の動作だから移植性は落ちるよね

279 :
文字定数は
Cではint型
C++ではchar型

280 :
int *ptr;

↑なんですが、「int型のポインタ変数ptr」、それとも「int *型のポインタ変数ptr」のどちらでしょうか?

281 :
int*型の変数

282 :
>>281
読み方としては
int (イント) * (ポインタ) 型の変数
でしょうか

「ポインタ変数」と言った場合は「* (ポインタ)変数」という捉え方でいいのでしょうか?
「ポインタ」と言った場合に「*」を指すのは普通ですか?

283 :
>>282
好きなように把握すればよい、しかし int * の使われ方は決まっているのだから、それがすんなりできるかどうかが問題

284 :
pointer to int

285 :
>>280
Cの場合は変数に*がくっついた形で宣言されていると考えた方が良い。というのは int *a, b; と書いた場合に a は int * 型だが b は int 型になるからだ。

286 :
なんとなくわかりました
ありがとうございました

287 :
規格書には
pointer to a character type
pointers to structure types
という文が頻繁に出てきますね
日本語で言ったら「char型へのポインタ」のほうが「charのポインタ型」より正しい気がします
>>284さんのpointer to intは日本語なら「int型へのポインタ」ですね

と思ったんですが規格書には
pointer type
も出てくるので、どっちでもいいということでしょうか
つまり「char型へのポインタ」=「charのポインタ型」ということになりますが

288 :
変数の宣言と型の宣言が同じ形というCの事情もありそうだが、そこは曖昧だと思うね。
アップキャストしたら単にポインタだし、ポインタ型と言う場面もあるだろう。

これいいね
https://cdecl.org/

289 :
typedef char *pchar; とすると pchar 型は「charのポインタ型」というとにはなる。

290 :
ということはどっちでもいいんですね

291 :
気にしたことが無いくらいどうでもいい話。

292 :
引数のvoidが一体なんなのか考える方が有意義

293 :
引数なしの関数を書くときはvoidと書く

以上

294 :
voidって引数じゃないの?

295 :
引数に予約語使えるの?

296 :
some_type foo() と戻りがあるのに、その戻りを捨てる意図で
(void)foo(); と呼び出すコードを見たことがあるような気がするが C++ かもしれん

最適化の際にうまいことしてくれるのを期待してるのかしら

297 :
>>296
コンパイラかコードチェッカーのwarning抑止のためじゃないかな

298 :
Cでも使える。
一度も使ってない引数変数があるとか、関数の戻り値を使っとらんとかで警告が出る場合にくっつけるのが主だと思う。

299 :
> 引数なしの関数を書くときはvoidと書く
プロトタイプじゃなかったっけ

300 :
>>299
プロトタイプと違ったらエラーになる。

301 :
>>297-298
なるほど、警告避けかー

引数に対してのは
callback 関数として、引数の型&数は限定されてるけど
実装時には一部の引数を使わずに実装できちゃうときに発生しそうね

void foo(int arg1, int arg2)
{
 /* 色々書くけど arg2 は使わない: callback 関数の都合で引数の型と数は変えられん */
 (void)arg2;
}

302 :
>>299
これ OKでしょ
int func(void);
int func()
{
return 0;
}

303 :
アンカミスった >>300

304 :
>>302 のは 非ANSI の K&Rフォームで警告されるんじゃ

引数有りの記述では
 int func(int);
 int func(a)
 int a;
 { return 0; }
と等価

305 :
>>302
これアウトでしょ
int func(void);
int func()
{
return 0;
}

func(hoge);

306 :
>>302
VCだと
> warning C4255: 'func' : 関数プロトタイプがありません : '()' を '(void)' に変換します。
って警告出て、関数部分の引数を変えてしまってる

307 :
>>302
おまえさん、自分のところで動作確認してるか? でたらめこくな

308 :
char *p;
p = "str1";
p = "str2";

こんな風に文字列リテラルのポインタを付け替える時に前の文字列リテラルのメモリ領域を解放するにはどうすればいいの?

309 :
>>308
静的領域に確保しているから解放は無理

310 :
exit関数を呼び出せば解放できるね

311 :
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;
}
どこかまちがっているか

312 :
>>309
まじですか。じゃあこのような書き方してたらいずれクラッシュするってことですか?

char *p;
while(1) {
//何かの処理
p = "hoge";
}

313 :
それは同じ"hoge"のアドレスがロードされるだけ
文字列リテラルのポインタ扱うならconst char *使いなされ

314 :
>>312
文字列の定数は静的な領域に作られるだけで実行時に動的に作られたりしないのでそれは問題なし。

315 :
あ、でも、定数でなくても同じか。単にポインタ代入してるだけだもんな。

316 :
>>311
プロトタイプと同じだからOKだよね
>>302は何を言いたいのか分からんな

317 :
>>301
その場合は↓で良いはず
void foo(int arg1, int)
{
}

318 :
>>311
おまえさんは「関数原型を含む」を、「関数原型についてのみ」と脳内変換しているのか?

> int func() /* definition */
これのどこに、void型で名前のない仮引数があるんだ?

319 :
>>296
それは lint 対策ですよ

320 :
最近C言語学び始めた者ですが練習がてらトランプのブラック・ジャック的なものを作っています
そこで11以上がでた時10とするという単純なプログラムを書きたいのですがつまづいています。
ご教授頂ければありがたいです

321 :
>>320
パッと思いつくのは、要素数13の配列用意して
対応する番号の所に希望する数を入れておく

322 :
>>321
一応rand関数というのをつかって1~13までの数をランダムで出すようには組めたのですがそのランダムで出た数が11以上だった時10として扱うというのが組めません

やはり13個全部配列組む方が確実なのでしょうか

323 :
ブラックジャックのルール全部適用させようとすると初心者には結構ハードル高いような気がする。

324 :
>>322
式でやりたいなら、

i>10? 10: i

325 :
>>324
ありがとうございます!早速試して見ます!

326 :
>>323
あんまり細かいことはさすがに手が出ないのでとりあえず
・11以上は10として扱う
・21超えたら負け
・1がでたら1か11好きな方を選べる

この3つだけできればとりあえずブラック・ジャックとしてゲームは成り立つかなと考えてます

327 :
カード52枚作るのがいいと思いますよ。
シャッフルもしがいがある。
配列の要素は見た目(ハートのJとか)を表す構造体。なんだったら実際の値も入れる。Aが微妙ですが。

328 :
>>327
作り始めた時52枚全部定義すれば本格的になるかなと思ったのですが、ご教授お願いしている身で申し訳ないんですけど少し面倒だなと思ってしまいましてorz

やっぱりちゃんとしたブラック・ジャックを作りたいなら52枚全部定義した方がいいですよね

329 :
そうしないと確率が変わってしまうのではないかな。

330 :
某ゲーム内のブラックジャックは同じカードが自分と相手に出てきた。
カジノのブラックジャックだとトランプを何セットも混ぜてやってるらしいね。

331 :
絵札の数が決まっていると残りの絵札を数えれば勝てるらしい。

332 :
実際は6セットとか使うわけです。
有限なのでカウンティングができる。
過去の結果に依存するってことはサイコロ使うような無記憶な試行ではないってことだね。

333 :
カウンティングだけで勝つのは驚異的な記憶力がないとなかなか難しいと聞く。
小説「マルドゥックスクランブル」でのBJシーンは有名だけど、読んででも半分も理解できなかった記憶があるわ。

334 :
麻雀よりは簡単

335 :
麻雀の方が簡単か
すまん

336 :
BJのカードカウンティング、結構な種類があるんだね
ttps://vegasdocs.com/blackjack/counting.html

337 :
麻雀の役判定、得点計算できるライブラリってある?

338 :
>>337
ググれ

339 :
>麻雀の役判定、得点計算

あると思う
判定も計算も難しくはないし
無くても自製可能なレベル

340 :
ものすごく基礎的な質問で申し訳ないんだけどテトリスのようなゲームを作るとき、実行中のプログラムとは別にn秒ごとにあるプログラムを実行するようなのってどうすればいいの?
キーボードからの入力待ちの状態と並行して時間の計測とブロックを落下させるみたいなの

341 :
OSによって違いがあるけれど、
指定した時間間隔でイベントを発生させ
そのイベント通知を受けて処理を行うようにする

342 :
DOSならVSYNC割り込みとかタイマ割り込みっていうのがある。

343 :
入力待ちしてるはずなのになんでブロックは落ちてるんだ

344 :
待ってないから。

345 :
ブロッキング/ノンブロッキング
同期/非同期

346 :
うーん…前提から間違ってるのか?
ブロックを生成した後、キーボードからの入力を待ちながら一定時間毎に落下させるのかと思ってたけど、一定時間毎に落下させる中でキーボードからの入力があればそちらを実行する感じ?

347 :
非同期処理

348 :
なるほど
同期処理、非同期処理を使えば割り込ませたりすることができるのか
まだほとんど理解できてないけどある程度方向性は見えてきた気がする
サンクス

349 :
>>346
マルチスレッドって分かるかな?
同時に複数の処理を行うんだけど
多分イメージしているプログラムは
それを利用する事で出来ると思う
ただし、OSが何かによって実装方法が変わってくる

350 :
>>346
そうだよ。古典的なゲームは、1秒間に30回または60回、入力の取得と状態の更新と画面の更新を行う。
ギャラクシアンもといタスクシステムでぐぐれ

351 :
テトリス程度の(コンピュータからしたらゆっくりな動きの)ゲームならマルチタスクやマルチスレッドにしなくても順番に処理すればできそうだけどな。
キー入力については何も押されてなかったらすぐに処理を抜けるようにしとけば良い。
で、画面書き換えたりする処理して、またキー入力されてるかを見て、という感じで繰り返す。
キー入力されてたらそれによって変化するパラメータ(テトリスならブロックの向き等)を変更する。

352 :
マルチスレッドだって順番だろう
昔はコアが一つしかなかったんじゃよ

353 :
ソフトタイマ ポーリング 状態シーケンス制御

354 :
>>352
順番って、時分割で切り替わるって意味?
しかしそれは普通はOSレベルでやってるので切り替え部分までユーザが考える必要はないね。
そこまで自分で作らねばならないようなOSなし環境や昔の 8 bit CPU みたいなのだと別だが。

355 :
>>351
それってキー入力取り逃したりしないの?

356 :
>>352
マルチスレッドじゃなくて単なるループだと思うが

357 :
ハードウェア割り込みとマルチタスクOSがごっちゃになってるんだろ

358 :
>>355
処理のサイクル(1/30秒 や 1/60秒)の間に off->on->off とパルス状に入力されると取りこぼすよ

359 :
高橋名人の16連射でもコンピュータからすれば物凄く遅いスピードだから問題ない。40年ぐらい前のクロック4MHzで動く 8 bit CPU でも余裕だ。
それにゲームなら一回や二回入力が失敗しても文句を言うやつはまずいない。

360 :
>>356
まあユーザースレッドなんて言葉もあるけども

昔のCPUだとぶんまわすしかなかったけど、ある意味わかりやすい気がするわ。
リッチな環境でアクションゲームってどうやって作るの?条件変数とか使うのかね?

361 :
>>358
炎のコマの解説は嘘だったんだよな
あれ以来、人間を信用しなくなった

362 :
組み込みでは、0.1〜1秒など、長時間に渡って、
何回もキーを押しているかどうか確認してから、機械を動かす

そうやって、ボタンを確実に押しているかどうかを判断する

1回で判断すると、ボタンの接触不良で、
モーターのon/off が繰り返されてしまうから、短時間で判断できない

この判断を、ハードウェア回路で行うのと、ソフトウェアで行うのと、2つの方法がある

詳しくは、組み込み(エンベッド)情報処理資格の教科書を参照

363 :
一々教科書を読まなくても「組み込み チャタリング」などで調べれば分かるのでは

364 :
Windows初期はVsync待ちとかウェイトかけずに処理してて、CPU速度が上がったら実機より速くなって(60fps以上)ゲームにならんのもあったわ。

365 :
エイリアンの動きが速すぎて穴を掘ってる暇がないと

366 :
それ何ていう平安京エイリアン?

367 :
space panic

368 :
Linuxってconio.h使えないのかよ
getcheもkbhitも駄目とか面倒臭いな

369 :
コンソールで色を付けるならpdcurse使え。ncursesは古い

370 :
pdcurses

371 :
ioctl

372 :
pdcursesってcursesのWindows実装なんだけどな

373 :
>>368
ncursesとかを使ってそういうラッパー関数作れば良いのではないかな。

374 :
Cで面白いワンライナーとかない?ICCCMとかにも案外ワンライナーという分類はないんだよね。

375 :
1行と言うのは難しそうだが、7行で良ければ

https://uguisu.skr.jp/othello/7gyou.html

376 :
BASIC時代に1画面プログラムってのがあったな。

377 :
1行の定義って何?

378 :
>>373
既に世界中で書かれて公開されている予感

379 :
\n

380 :
>>378
結婚して///

381 :
#defineを-Dでやれば1行にできるかも
https://www.ioccc.org/2004/vik1.c

382 :
そもそも改行しないでプログラム書けば一行

383 :
cppディレクティブは1個1行

384 :
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++;

385 :
>>384
http://www.kouno.jp/home/c_faq/c3.html#0

386 :
「式の評価」という言葉はわかるか?
1+1という式を評価すると2になる。
C/C++の後置演算子では、全ての評価が終わった後で変数を書き換える。
i++は、++がiの後ろについているから、後置だ。i++を評価すると、評価した瞬間の値はiであり、そして式全体の評価が終わると、iはプラスいちになる。
後置の反対は前置演算子であり、式全体の評価の前に変数を+1もしくは-1する。

387 :
演算規則に従い、インクリメント後置なので、元の3行目の式は
s[i(==0)] = i(==0) + 1
i = i + 1
の順に行われて結果、
s[0]に0が代入されてs[1]の値は初期値0だと思うのですが。
事実、3行目がs[i] = i++;なら上の通りの順で実行されます。
演算規則が無視されて結果がコンパイラ依存になる理由は何ですか?

388 :
私は間違えました、s[0]に1が代入されます。

389 :
また、3行目を以下の通りにすると演算規則通りに結果2が得られます。
s[i] = ++i + 1;

390 :
順番はこの通りです、
i = i + 1
s[i(==1)] = i(==1) + 1

391 :
>>387
主な原因は順序が決められないことと最適化のためらしい。詳しくは知らん

392 :
i = i++;
これの結果が未定義なのは直感的に理解できます。
代入とインクリメント増分の関係が不明だからです。
s[i] = i++;
これの結果が未定義なのは直感的に理解できません。
演算規則に従えば、iはインデックスとしての間接参照でしかないからです。

393 :
>>387
左辺と右辺の評価順序は未定義だからだ
gccとclとか違う環境で試してみれば分かる

394 :
int x = 2*i + i++;
それでは、これの結果もまた未定義ですか?

395 :
iの評価は何回だ?
評価が複数回入る式は書くなということだ
仕事でそんなコード書いたらどやされるぞ

396 :
私は勉強のためにコードを書いています。
コードがどのような動きをするか興味があります。
int a = 1;
int x = (a = a) + a;
それでは、この式ではxは定義されますか?
左辺と右辺の評価順序に関わらず、答えは同じです。

397 :
されます

398 :
そんな無意味なコードから何を学ぼうとしているのか分からんわ

399 :
優先順位や式の評価順が曖昧かもって考えるソース、
書いてて気持ち悪くなりませんか?私はなりますよ。

400 :
>>394
副作用完了点でググってこい

401 :
while((s[i++] = t[j++]) != '\0') ;
元々気になったのは、tをsにコピーするこのコードです。
これを見て、他にインクリメントで簡略化出来そうなコードを考えています。

402 :
for(;t[j] != '\0'; j++){
s[i] = t[j];
i++;
}
s[i] = t[j];
従来の私なら、このようにコードを書いていました。
新しいコードの記述なら1行で書けます。

403 :
while((s[i++] = t[i + 1]) != '\0') ;
そこでtをsに1つずらしてコピーするコードをこのように書けないか考えていたら、未定義の問題が生じました。
私は演算規則から考えてこのコードは上手く働くと思いました。

404 :
俺はmemcpy使う
性能は知らん

405 :
せっかくC-FAQのリンク書いたのに…
バカって人の言う事聞かないからバカのままなんだな…

406 :
>>401
「簡略化」とは、何を目指しているんだ?
行数が少ない方がいいとか考えているならバカな考えだからやめとけ。
コンパイラの最適化で同じコードになるような範囲の変形で行数を減らしたところで、可読性を下げてるだけで何のメリットもないぞ。

407 :
私は行数の少なさというよりはむしろ見た目の単純さで読みやすいと感じます。
C-FAQのリンクは事実が書かれているのみで演算規則が無視される理由が理解できませんでした。

408 :
>>407
演算規則って何のことだ?
構文解析や演算子の結合の優先順序と副作用の発生するタイミングはまた別の話だぞ。

409 :
どうせちゃんと読んでないか理解する能力がないんだろうな…

410 :
>>389
それはおかしいだろう
算術プラスの第1オペランドと第2オペランドの評価順序は未規定だぞ

411 :
>>410
未規定の動作がたまたま自分の期待する動作と同じになったということが理解できてないんだろうね。人の話を聞かない相手に何を言ってもダメそうだね。

412 :
愛繆私は未定義な理由について理解できません。
なぜなら、演算規則に従い前置インクリメントを代入の評価より先に行えば、389の結果は一つと決まるからです。
しかし、評価順序が未定義となりコンパイラに依存となる理由は何ですか?
この式を定義することによる問題の例を理解したいです。

413 :
左辺は

414 :
つまり、私は未定義と規定されている理由を知りたいです。
定義することで発生する問題の例などです。

415 :
この人の言ってる「演算規則」って何なんだろうね。
「C言語 "演算規則"」でググっても、それらしきものは出てこないし。

416 :
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;

417 :
>>414
だから、左辺は

418 :
これは、未定義と規定されていますが、理由が理解できません。
私が示した通り、定義することによる問題の例は何ですか?

419 :
389の中では、左辺はs[1]です。
なぜなら、代入より前にiが前置インクリメントされます。

420 :
i++のポストインクリメントとi+1の評価順が不定だから

421 :
これ読んで分からないなら諦めろ


未規定の動作とは、複数考えられる動作のうち、どれが実行されるかの要求が課されない動作のこと。
未規定の動作への依存で移植性が低下します。

未規定の動作
・部分式が評価される順序、及び副作用が発生する順序。
ただし関数呼出しの()、&&, ||, ?:, カンマ演算子は除く。(6.5)
・代入演算子のオペランドが評価される順序。(6.5.16)

未規定の動作
http://www.c-lang.org/detail/unspecified_behavior.html
未定義の動作
http://www.c-lang.org/detail/undefined_behavior.html

422 :
i++のポストインクリメントとi+1の評価順が不定な理由は何ですか?

423 :
i = i++;
これが未定義なのは理解できます。
しかし、389の中で私が示した通り、の定義をすると発生する問題の例は何ですか?

424 :
未定義な理由?
言語作った奴がそう決めたから
要するに「仕様だから」
そう決めた理由は想像になるけど最適化しやすい(と言うかそうしないと最適化の妨げになる)と考えたんだろうと思うよ

425 :
>>419
なんで?
その添字いつ評価されんの?
演算子[]の中身だよ
カッコだけどvoid書いちゃだめだよ

426 :
インクリメントは式全体の前か後に実行されるからだろ
式の途中で実行されるとかあるの?

427 :
定義すると最適化の妨げになるという理由は、私には反論する知識は全くないので了承します。私は理解しました。

428 :
425の中で、書かれているように、実際には、演算規則でsのインデックスは0でした。
私は[]の優先を見落としていましたが、私が述べたかったことは、演算規則の優先で順番は決定できると思うことでした。

429 :
最適化の妨げにはならないだろ
コンパイラー簡単に作れるとかじゃないの

430 :
現行のCの仕様に文句があるなら、ANSI?ISO?の仕様策定に参加でもすればいいんじゃね?

431 :
>>411
すまん
俺はとんでもない失言をしていて
突っ込まれるの覚悟しておとなしく待ってたんだが

432 :
一通り勉強しましたが、次に何をやったらいいのか分かりません!
何も作れません!
どうしたらいい?

433 :
>>428
そりゃ決定するための規則を作れば決定するけど、めんどくさいじゃん

434 :
>>432
作りたいものが無いなら無理に作らんでもいいじゃん

435 :
>>432
散歩したり 景色を見たり…
昼寝したり 何もしない
そのうちに急に書きたくなるんだよ

436 :
>>426, >>429
> インクリメントは式全体の前か後に実行されるからだろ
> 式の途中で実行されるとかあるの?
どのように実装してもいい
並列に処理することすら可能
と言うような最適化を妨げないための仕様

437 :
要するに++,--は混ぜるな危険ってこと

438 :
能なしど低脳

439 :
>>403
>while((s[i++] = t[i + 1]) != '\0') ;
for(;(s[i] = t[i + 1]) != '\0';++i) ;
これじゃ駄目な理由ってなんだろう

440 :
評価順序以前にループ条件が直感的に分かりにくい様なコードは書くべきでない

441 :
for(@;A;B)

この123が全部必要だと思ってるんじゃね

442 :
>>431
こちらこそすまん。>>411>>410宛ではなく>>409宛だった。

443 :
MISRA-C 2004 の100ルールを守っていないソースコードは、読むに値しないw

まず、コーディングルールを5年勉強しろ!w

444 :
>>443
その特徴的な書き方はいつものRuby大好きマンか?
バカなこと言ってないで巣に帰れ。

445 :
>>443
MISRA なんて鎖や束縛を作りたがる「管理職」の思考法でしょう?なんでそんなものに従わなければならないのでしょうかね

446 :
ルールはあってもいいけど、MISRAはあれアホだよね。
考えたやつお前はCを使うなよっていう。

447 :
>>446
どこがアホなのか詳しく書いてみ

448 :
>>447
rubyが嫌になったってことですか?

449 :
>>446
あの阿呆なMISRAを制定した人間の種族はなにか、どんな属性か?得意な思考方法、苦手な思考方法は?信条・信念は?
というところには興味があります、そのためだけに MISRA を読んでいたりします

450 :
>>432
自分が作りたいものを作れ。
作る技術がまだ足りないならそれについて学習したり研究したりしろ。

一つ間違えてはいけないことは、自分の作りたいものを今の自分が持っている技術力で出来る範囲内に無理に収めないようにすることだ。
収めれば実現はたやすいが飛躍はできず本当にやりたかったことには届かない。

451 :
MISRAは実際の不具合を分析して作られたいわばバットノウハウ集だけど、言い換えると最低限のバカ避け。
バカがバカな不具合出すもんだからその他の人が迷惑を被る。
ま、バカはプログラム作るなって事だ。

452 :
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006

この研究会は、トヨタなど大企業から、数十人のベテが集まって、
欧州人に聞きながら、完成された本w

未だに、コーディングルールのバイブルだろがw

元々は、Andrew Koenig の本

C Traps and Pitfalls, 1988, c1989
Cプログラミングの落とし穴

453 :
自分が馬鹿だとしっている賢い人はMISRAを使うということか

454 :
ブランドにすがるだけで自分の頭で考えないやつは相手にならん
あれ読んでて異論を持つことが全くないやつはその疑いが強い

455 :
>>454
だからどこに異論持ってるのか書けよ
もしかしてグダグダ言うだけ君なの?w

456 :
命令すんな
そもそも自分が書かねえくせに

457 :
>>452
>この研究会は、トヨタなど大企業から、数十人のベテが集まって、
トヨタってコーディングを製造と言い切っちゃう人たちの集まりでしょう?そんな人たちの考え方って信じていいのでしょうかね…

458 :
>>456
どうせ書けないんだろ、無理すんなよw

459 :
>>457
信じるのはダメだと思うよ
内容見て判断しなきゃ

460 :
>>452
お前さんはいつも、有名な誰それがこう言った!とか、なんとかの本にこう書かれていた!とか、他人の発言を字面だけなぞって記憶するだけだから、中身の本質も適用すべき場面も長所短所も理解せずに垂れ流して害悪にしかならないから、もういい加減消えてくれないか?

461 :
多分MISRAはΣ計画とセットだったんじゃねえの
とするとゾンビだよ

462 :
>>457
日本の研究会の考え方・思想は、ほとんどない!
MISRA-C は、Andrew Koenig の本を参考にして、欧州人が作ったから

日本の研究会は、各ルールの例題を作って、誰でもわかるように解説した。
各ルールは、こういう事を言ってます、という解説書

江添 亮の「C++11/14 コア言語」のみたいな本。
無数の例題を並べて、各ルールを解説した本

だから、この2冊は、神の書と言える!

463 :
ルールとかくそどうでもよくね
動いて読めればそれでいい

464 :
>>458
ブーメラン乙

465 :
>>464
バカなのか?
俺は別に異論があるとは言ってない
異論があるなら書けよって言ってるだけ
俺に何を書けって言ってるんだよw

466 :
>>465
またブーメランかよ、ワンパターンなやつだな
俺はさっき相手にならんと言ったはず

467 :
落ちものゲーム作れたと思ったけど落下処理の度に今表示中のものが上にズレて処理後のが新しく表示される仕組みのせいで目が死んだ
これダメな奴だ

468 :
>>466
ハイハイ、結局具体的には何も言えないグダグダ君だったなw

469 :
煽っても情報は得られない
インタビューの下手な人だな

470 :
情報持ってない奴からなにか得ようとしてるってか?
心配するなよ、お前に期待なんてしてないからw

471 :
githubに存在するMISRA適合のソースコードとかどんだけあるんだよ

472 :
そのルールを守らないという、逸脱手続きをすれば、OK

トヨタでも、MISRA-C で採点したら、5/100点(ルール)しか取れなかったとかw
70〜80点は、欲しい

473 :
>>472
それはそうなんだけど、逸脱したらレビューと品質記録が必須になるので逸脱しない方向へのバイアスが強くなる。
結果、強制されてるのと同じになっちゃう。

474 :
ちなMISRAってどんなの?
pdfのリンクはってれ

475 :
例えば、Linux では、関数の冒頭部分に、return がよくある。
冒頭部分で、処理しないものをはじいてしまう

でも、MISRA-C では、関数内で、return は、最後に1つしか使えない。
複数箇所に、出口があってはならない

そのルールを守らないなら、逸脱手続きをすればよい。
その代わりに、点数が下がっていく

476 :
>>471
ほとんどないんじゃね
>>451が言う通りバカ避けだから
>> 関数は、その最後に1つだけの出口を持たなけらばならない
みたいに適合させようとすると人によってはちょっと書き辛いルールもあったりするし

477 :
あっ、被ったわ
みんな結構このルールに抵抗あるんだなw

478 :
>>474
「misra-c 2004」「misra-c 2012」で検索して!

479 :
他にも、MISRA-C では、2重ループ内から、一気に脱出できないから、フラグを持ちまわる事になる

このルールも嫌われる

480 :
組み込みとか医療用では、バグると簡単に人が死ぬから、
MISRA-C を勉強していない香具師が、コーディングするとヤバイ!

だから、コーディングできる資格を作るべきだっていう話も聞く

481 :
なんでルールブックが有料やねんあほか勝手にやってろ

482 :
>>476
語るに落ちたな
ブランドvsブランドの対戦成績を
自分の頭で考えないブランド志向なやつに出せるわけがない

483 :
>>481
検索したら出てきた
http://www.c-lang.org/detail/misra_c.html

484 :
4.12 必要 動的なメモリ割り当てを使用してはならない

って酷くね

485 :
俺以外は絶対守れよって思うルールも多々ある

486 :
>>482
何を言ってるのか自分でもわかってないだろww
ブランドとかバカじゃね

487 :
関数の中盤以降からreturnするならともかく、早期returnまでも認めないのはナンセンスだよな。
杓子定規すぎるわ。

488 :
>>484
組込みだと実行時間が読めなくなるのとフラグメンテーションで総容量足りててもエラーになることがあるからしょうがない

489 :
>>486
おまえがすがっているのはブランド以外の何物でもない
とぼけたら誤魔化せると思っているならおめでたいやつだ

490 :
MISRAをブランドとか言うアホがいるんだ…
まあ具体的な内容には突っ込めないグダグダ君だしなぁww

491 :
そもそもうちはMISRAは参考にしてるけど全面適用なんてしてないし

492 :
>>491
いや、しろよ

493 :
プログラムは書く人によって千差万別
書く物によっては複雑な物を書かなきゃならない
そしてその上でのバグ千差万別
ルールブックなんてプログラム書かない管理者がこれを守れば大丈夫(キリッ
ってするものだろう

494 :
普通は大勢で開発するときに必要な取り決めだけどな
そういう規模で仕事しないなら,何しても良いけど

495 :
>>494
MISRAは明らかに小規模なプログラムのための規約だと思うよ

496 :
大規模なプロジェクトのコーディング規約を決める人がここにいるとは思わないからね
小規模だと思うなら,そのルールでやれば良いんじゃない?

497 :
大規模とか小規模とかじゃなく実際にプログラムを書いてると必要になったりとかあるって話で
プログラムを書いた事内物が大規模ではとかいってるのか

498 :
そうそう、MISRAはクソ

499 :
MISRAを尊重するひとって、returnを書く位置によって返る先が変わると思ってるんだよ

500 :
間違ったことばかり書いてあるわけじゃないけどね
現場にそぐわないスキル不足なやつを庇うところには同意しかねるわけよ

> ルール 8.14 必要 restrict型修飾子を使用してはならない

規格票が読めないようなアホの相手はやってらんね
C++が混ざるところでも対策は簡単だし

501 :
トヨタのやってることは一つのミスでも人が死ぬということだよ
もしrestrictを使って人が死んだら責任とれるの?

502 :
それなら、人が死なないプロジェクトではMISRAは守る必要がないですね。

503 :
>>501
規格票を確認しないやつにミスがどうたら言われたかねえぜ

504 :
○○を使って人が死んだら責任とれるの?

○○に何でも突っ込めるウルトラクソ論法
ポインタ、共用体、仮定義、数学関数、それから?

505 :
>>501
お前が作ってるプログラムはテストしないのか?

506 :
>>492
絶対守るべき指標と守った方がいい指標、といった具合に何段階かにわかれていて
別途ルールがあるならば守らなくても良い(無理して守るべきでない)指標もあるよ

507 :
上司のバカかバカの上司でも理解できるまでに破壊されたC言語だろ
それを規格と言ってるだけだ

安全かもしれないけど対照実験がないでしょ
安全であることをどうやって確かめたのか論文の欠片も見つからなかった
だからMISRAの安全神話は神話かデマかフェイクニュースだよ

508 :
プライドだけは高いこの道30年の社畜が書いた様なルールだよ。
「してはいけない」ばかりでこうしろという記述が圧倒的に少ない。
フレームワークという発想がない。指摘だけ。すべて勘と経験という名の錯覚に基づいてる。

あと内容的に「最適化はしてはいけない」とか書いておけばいいんじゃないかと思う。次は入れて欲しい。

509 :
>>463
処理系依存や未定義だけどなんか上手く動いてる
というのは、ちょっと怖い

510 :
たまたま動いているのは
処理系のバグかも知れない

511 :
組込み系の開発経験者いなくて草
MISRA準拠が納品物の条件にあるんだよ
でもプロジェクト毎にカスママイズするから
100%適用するわけじゃないよ
わけわからんルールは適用除外してる

512 :
>>511
> 組込み系の開発経験者いなくて草
ID:y88H95dP0 あたりは経験者だろ

513 :
>>511
8進数使うな、とかいやだよね

514 :
エディタ上での見栄えで桁合わせに 空白を使わず 0 で補ってやらかす

515 :
>>513
2進数や16進数は見慣れているんだが
8進数ってどういう時に使いたい?

516 :
バイトが6bitの時は便利だったとかいう話だけど、今要らんよね
emacs使っててエンコードがアレだと出てくるね

517 :
文字列で [ESC] を埋めるのに \033 を使ってるのを見るぐらい

(2進数のリテラルをマクロでなんとかするとき 一時的に8進化するけど 中の話)

518 :
大昔のアーキテクチャは18bit,24bit とかで3bit 区切りが扱いやすかった
今は16,32,64と16進数が扱いやすいって話だね
ゼロ始まりは8進数というのはB言語からきたらしいよ

519 :
>>513
いや、もうコンパイルオプションで禁止してもいいレベル

>>515-516
Unix/Linuxのファイルパーミッションが3ビット単位だからと言うのはあるけど今時直書きなんてしないし

>>517
それも "¥x1b" の方が馴染みがあると思う

520 :
\0 … 8進数
\x0 … 16進数

521 :
>>487
if の nest が深くなってしまう?

522 :
>>521
教条主義的に守るなら そうせざるを得ないだろうね

if (エラー) return ; // 即脱出
後続コード
return ; // 最終

即脱出を禁ずるなら
後続コードは即脱出条件とは排他的なので if (or else) 内に収めるしかない

if (!エラー) {
 後続コード
}
return ; // 最終

523 :
goto ___exit; /* 震え声 */

524 :
多分 goto も塞がれてる気配w

525 :
うちはreturnは最後に一つのみってやつは適用除外になってる
理由はネストが深くなって読みづらくなるから

gotoもネストしたループから一気に抜ける場合のみ使ってもよいことになってる
フラグ使ってbreakで抜けるより読みやすいからね

526 :
もちろんgotoも禁止さ。
あと、各関数の頭で引数チェックも必須なのでreturn禁止とのコンボでほぼ必ず正常系処理のネストが一段以上深くなる。
引数チェック必須はISO26262だったかもしれん。

527 :
途中のreturn禁止を徹底するなら、ifとかelseの後に2行以上書くの禁止にした方がいいね。
代入だけ許容するくらいでいい。

528 :
>>513
0は0x0とか書かなきゃいけないんかね

529 :
>515
そりゃもう512色カラー設定に(ry

530 :
ここまできたらC言語も禁止だな。
pythonでコーディングしてコンパイルしてやればいい。

531 :
結構前から言われてない?
「C言語を使う必要が無いなら使うな」と

532 :
pythonを使って人が死んだら責任とれるの?

533 :
>>532
大丈夫さ。プログラム全体をtryで囲んで引っ掛かったらprint("手動運転に切り替てください")のコンボがある。

534 :
pythonでOSやデバドラ書けるようになったら考えるわ

535 :
#define xxx 06
#define yyy 07
//#define zzz 08 // なぜかエラーになる

536 :
なぜかはひみつ

537 :
>>535
なんてありがちな…

538 :
ここらへん嫁
https://programming-study.com/technology/lets-learn-how-to-express-constants/#i

539 :
祈りが足りないからだな

540 :
ちょっと前に8進数が〜ってやってるのに
あ、ネタかw

541 :
このスレの人って少し前のレス読まないよね

542 :
const char *sの順番が納得いかない
直感的にはchar * const sだろうが!!

543 :
char const*だろ?

544 :
* const char s
じゃね?

545 :
おれは何を言ってるんだ??

546 :
>>542
>const char *sの順番が納得いかない
>直感的にはchar * const sだろうが!!

前者はポイントされる文字列が const で、後者はポインタ自体が const でしょ

547 :
const char* const s
これも直感的じゃないって言うんだろうか

548 :
546です
すみません、それを踏まえてということか…

549 :
const は後置で書いたほうが整合性が取れる
char const * const s:
しかし、見た目的にかわいいのは前置である
const char * s;
私はかわいいのが好きである
よって前置は使わない

550 :
そこで私が提案したいのが「strong」である
strongは修飾したデータをすべてconstにする
つまり
char const * const s;

strong char * s;
は等価である

551 :
>>550
安易な予約語の追加は嫌われるよ

552 :
「strongがやられたようだな…」
「フフフ…奴は四天王の中でも最弱…」

553 :
<strong>char* s</strong>

554 :
stringと間違えそうで嫌だなw
readonlyはc#で使ってるしな
やっぱconstだな

555 :
大文字で CONST にするとか。

556 :
フン
char *const_s

557 :
>>546
const int a → constなint型のa
const char *s → constなchar *型のs
constなのはchar *つまりポインタ(直感)
char * const s → char *型のconstなs
constなのはsつまり文字列自体(直感)
なんで逆!!

558 :
> const char *s → constなchar *型のs

ギャグだよな?

559 :
宣言は右から左に読む
const等の修飾は左にかかる
char const * const s; // sは、const *である、const char型の

右にかかるなら↓のように書けないとおかしいがこれは構文エラーである
const char const *s;

変数名はただの識別子で、ある領域にsという名前を付けただけにすぎない
constやvolatileは型修飾子であり、これらが付くのは型に対してである
〜という領域を、以後sと呼ぶ、である

560 :
ちげーよ
宣言は真ん中から左右に読むんだよ
char const *(* const s)[1];

561 :
>>526
引数チェックに関しては、Java のコーディングルールでは、
外部の人用のAPI、つまりpublic な関数には、必要

一方、そのモジュール・クラスの実装者が使う、
内部的なAPI、つまりprivate な関数には、いらない

既にどこかで、エラーチェックしてるから、何回も同じエラーチェックするのは、無駄

562 :
const char *sは*sがconst
つまりポインタsの指すアドレスにある値が不変だけどsがどこを指すのかは可変

char *const sはsがconst
つまりポインタsがどこを指すかは不変だけどsの指すアドレスにある値は可変


大体こんな認識で合ってる?

563 :
あってるけど納得いかないって話
1つ目がまず何で*sにかかるんだよ
自然に読んだらconstはchar *にかかるだろ
右から読むとか頭おかしいわ、アラビア語かよ

564 :
>>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) と一緒の意味になっている

565 :
C言語使う時はいつ?
早いコードが欲しい時
メモリー消費に無駄のないコードが欲しい時
他ある?

566 :
>>565
他の言語はほとんどわからず(かじってはみたものの使えるまでにはMPがあがらず)、C/C++ でしかまともに書けないし発想できないからです…

567 :
>>563
実はアラビア語って可能性はないのか?

568 :
そもそもconst char *sの宣言の時の切れ目がconst / char / *s なのも何だかなぁ
const / char * / s でconstはchar *にかかれよjk
現実に間違ってるのは渋々受け入れてるけど開発者が許せない

569 :
>>564
自分は b or(and) d かなー

570 :
>>565
他に思い付くところとしては、
組み込み環境などで、C言語以外の選択肢がない、または他の言語で実行できる環境を整えるよりCを使った方が楽な場合。
外部のライブラリのインタフェースがC言語で、呼び出す部分をCで作る方が楽な場合。
バイナリファイルの操作などポインタ操作を使って実装しやすい場合。

571 :
>>568
単純なポインタのことしか考えないから、左から右にこだわってんだろ。
>>560も指摘している通り、変数宣言の構文は内から外だぞ。配列や関数ポインタも交えて、それらを多段階の組み合わせにしても一意に解釈できるのを理解すれば、合理的な物だとわかると思うよ。

>>563
1つ目は、constがかかってるのはcharだぞ。内側から解釈するとsは*が付いているからポインタであり、それが指す型がconstなcharだ。

572 :
char *s
の意味は*sはchar型だよって意味で
sはchar *型だよって意味じゃないよ

573 :
>>572
こう理解できてるとわかりやすいね。つまり
const char *s

*s(sの指す先)はchar型でさらにconstだよ
となる。

574 :
>>572
その宣言から以後、
sという式がchar*型
*sという式がchar型
2つの意味を同時に表現してるんだよ

575 :
*と*const があると憶えるべき。

576 :
>>563
ポインタを表す * が型にくっついてるんじゃなくて変数にくっついてるからでは?
分かりにくいなら typedef でポインタの型を作ってそれを使えばいいんじゃないな。

右から読む事に関しては英語を日本語に翻訳する時に順序を入れ換えた方が自然な感じになる事があるのでなんとも言えんな。漢文のレ点みたいなものもあるしな。
日本語とは逆順の方が自然な表現になる言語はある。そして歴史的な事情で混在してしまっているのもある(アメリカでの年月日が月日年の順だとか)。
生まれながらにしてその言語使ってればその人にとってはそれが一番自然な表現だからな。

577 :
>>574
結果はいっしょでも解釈の仕方は複数ある感じだね。
自分にとって理解しやすいので
char *s

sの指す先はchar型、つまりsはポインタ
って言う風に捉えてる。

578 :
この話は何時も混乱するんだけど
結局の所は
自分の言葉で理解するまでやる
これをやらないと混乱してしまう

なぜそうなってしまったのか?
という視点で解釈しようとしないと
なかなかにc言語って難しい
その辺は例のc言語ポインタにのみついて書かれた本
あれを読んで
後は何とか自分の言葉で理解して解釈するしか方法が無い

それとこんなになってしまっている原因に
キーボード上の記号が少ない
というのもある
basic何かでは記号類は四則演算類だけ使って
なるだけ英単語?を使って記述するようになっている
だから使う場所によって記号の意味が違う
なんていうのが起こりにくくなってる
ある意味c言語が普及してしまったのはプログラミング世界にとっては不幸なのかもしれない

579 :
C言語って初心者向けに作られたものではないと思う

580 :
>>578
私も最初に C をやったときには、ここまで流行るとは思わなかったんです、むしろ pascal の方が筋がいいと思っていたのですが、どうしてこうなってしまったのでしょうか?

581 :
>>579
当時は初心者用とかは特に無くて、BASIC でもある程度できる人はすぐに peek, poke を連発するようになったものです、最近の人は甘えていると思います

582 :
>>580
UNIXがCで云々というのもあるけど、良い意味で高級アセンブラとして使い勝手が良かったからじゃないかな?

583 :
厳格で融通がきかないと嫌われる
pascalはそんな感じ

584 :
>>583
delphi は結構流行ったと思ったんですけれど…

585 :
pascal失速最大の原因は:=だろう
これを採用している言語はもう一つも無い
プログラミング業界最大かつ唯一にして不可侵の大例外を抱えてるのがpascalだ

586 :
pascalで開発したアプリっていうと
JaneStyleが有名かな?

587 :
厳格で融通がきかないのは、教育用として最適だと思う

588 :
pascalでUNIX張りのOS書いていれば流行ったかもね

589 :
>>585
Modula-2は:=だったような気がする。

590 :
>>588
Delphiみたいに拡張されてれば可能だとは思うがコードが大きくなりそうなので昔のPCでは苦しいかもね。
ただし、Androidみたいに元のOSの上に乗っけて動くOSなら行けるかも。

591 :
もう一つが奥の深さでC言語ではポインタが奥の深い箇所にあたる
この難易度が絶妙で難しい難しいと言われていて初学者には適度に難しいので挫折者が増える、
挫折者の総量が言語の価値を決定する

教育用に作られた言語は難しい箇所とか理屈に合わない箇所とか奥の深い箇所とかが無いのでオカルトとしての魅力が無い
学習曲線がいびつじゃないと流行しない

592 :
ポインタはただの入り口だろ
Cは入り口で躓く奴が多いだけで奥は寧ろ浅い

593 :
ポインタ使わないでもC言語ってプログラム書けるんだよな
無理して難しいことをしなくても良いと思う
ちゃんと動くかどうかの方が重要

594 :
ポインタを使わないならCを使わない方がいい

595 :
超無理矢理ならポインタ使わずになんでもできるんかな?
いずれにせよポインタ理解してないとライブラリ使えなくて詰むでしょ。たぶん突然落ちたりメモリリークだらけのプログラムができあがるはず。

596 :
グローバル領域に予め必要な変数や配列確保しておけば
メモリーリークが発生する余地はないw

597 :
ネタで言ってるのか本気で言ってるのか判断が付かない

598 :
ポインタ難しいって言われてるけどそんなに難しいか?
メモリイメージできれば理解できると思うけどな

599 :
俺はポインタは難しいことがわかってたから、一度にすべて理解しようとしなかった
数年使って徐々に理解した
それが正解だった

600 :
初期化してないポインタにアクセスするとどうなっちゃうの
とか危険そうなのは試してないからわからないが
ハードウェアのイメージがあれば難しさはあまりない
(命名規則で Xxx_p と書いておけば

601 :
> (命名規則で Xxx_p と書いておけば

システムハンガリアンは大大大大大嫌い

602 :
>>585
ada, APLも知らない情弱知ったかは黙っとけ

>>589
まあ作者は同じだから後継って感じだし

603 :
>>599
そういう人もいるのか
おれはアセンブラもやってたので秒で理解した

604 :
>>580
マイコン用の小さいコードも作れるから。
昔のマイコンやPCはメモリが物凄く少ないのでその辺は重要。
少なくとも毎回でかいランタイムライブラリがくっついてしまうようではダメだ。

それと元々 UNIX の記述用に使ってた言語なので Linux 等の互換OSでも使われていて、そういうのが徐々に広まっていったので、それを通してCが流行った面もあると思う。

605 :
>>603
アセンブラできるとポインタについては理解が楽だよね。
アセンブラの方では普通に使う考え方だし。(というかないとプログラム作れないぐらい重要)。

606 :
>>603
はじめてのプログラミング言語がCだったからな
けっこう苦労したよ、先輩

607 :
プログラムはZ80からなので、当たり前のようにアセンブラから学習した
CPUの仕組みを学ぶのにちょうど良かった気がする

608 :
Z80だとパイプラインとかあんまり憶えないよな
でRISCブームのとき苦労させられたと

609 :
まぁZ80全盛期にパイプラインしてたCPUなんて限られてたしな。
そういう汎用コンピータはほぼ高級言語使われてたし。

610 :
6502とか

611 :
>>606
C++とかじゃ未だにオーバーライドとオーバーロードを間違えるので
レベル的にはおまえとドッコイだよ、後輩

612 :
ムカデ長老を見習え

613 :
泣いてる顔文字→( ; ; )がforの無限ループにしか見えないのですが、職業病でしょうか?

614 :
8086のアセンブラはセグメントで挫折する・・・と言われてたけど
Z80やってたらすんなり理解できたな。

615 :
>>613
煽りとかで()とか書かれてると関数に見えるときある
例: 職業病()とか言われましても

616 :
>>615
草、見えたことないわw

617 :
>>613
はい。

>>614
セグメントすごくわかりやすいと思うけどな。まともに説明出来る人と巡り会えなかったのだろうか。

618 :
>>608
わかりやすいけど面倒だよね

619 :
>>613
forで無限ループつかうの?
おれはwhileかなw

620 :
forの方が短くてすむじゃないか

621 :
>>614
Z80にセグメントの概念なんてあったけっけ?
メモリバンク切り替えは機種によってはあったけど、あれはZ80の機能ではないし。

622 :
空白のcontinue節みたいなのに入る必要がないから
ちょっとwhileのほうが早いイメージ

623 :
>>622
インタープリターじゃないんだからさ

624 :
>>619-620
俺はfor(;;)だな
while(TRUE)は警告表示されることが多かったから

625 :
for (;;) とwhile (1) がどっちがぱっと見分かりやすいか戦争勃発しますか?
あとfor派は;;周りにスペースを入れるか入れないかでさらに細かく派閥が分かれていると聞きました!

626 :
>>625
まさに永久ループ戦争!

627 :
字下げのいらないgotoも参戦

628 :
あ、do {} while(1);派も出てくるとおもうので皆さん頑張ってください応援してます

629 :
do while(0)は便利

630 :
>>629
それは #define で使うときだけでしょう?

631 :
いや、エラー判定とかでもよく使うだろ?

632 :
for (;;) は forever と読むとか

633 :
バッドノウハウに近いが
do {
if(...) break;

if(…) break;

} while(0);
みたいなのは昔書いてたわ

634 :
do {} while (0); の意味と目的【do while false イディオムの利点】 | MaryCore
ttps://marycore.jp/coding/do-while-false-idiom/

635 :
flag=true;
while(flag)
{
flag=(....);
}

636 :
>>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);
みたいに間に処理をはさまる場合が難しい

637 :
このスレって直接ここに複数行のソース書き始める人多いよね

638 :
>>633
小さなスコープを作るため?

639 :
breakが使えるスコープね

640 :
#define fe for( ; ; )
が最強

641 :
>633
おかしな事してるのが一目で、continue が外に漏れるこれ オススメ
switch(0)default:{

642 :
gotoが便利すぎて禁止されがちなのが悪い。ちゃんと使えばコードが見やすくなることこの上なしなのに。

643 :
>>642
そう言うこと
なので最近は素直にgotoで書くことが多い
一部の言語の様にブロックに名前付けて
break 名前;
でそのブロックを抜けられるようにしてくれれば良いのにと常々思う

644 :
ないものねだりではありますが
perlのようにブロックやループの頭にラベルをつけて、
redo next last があったらもっと良い
do {...} while(0); も {} と簡潔

645 :
>>642
便利すぎってどういうことだよ
教条主義的goto禁止論の域を出とらんだろうが

646 :
>>621
インデックスのことかも

647 :
>グローバル領域に予め必要な変数や配列確保しておけば

>ネタで言ってるのか本気で言ってるのか判断が付かない

実際に仕様なんかがしっかりしているタイプで
メモリー確保が動的に大きく変化しないものなら
実際にそういう風に作っているのを聞いた事は有る

配列式だと動的に確保したり開放したりが無く
リークしたり無効になったりしない分かなり安全
実行開始時に使用する領域が完全に確保されているから

648 :
>>645
すまん、そんなに深い意味はない。

649 :
静的な所にプール作るのはメモリ制限ある組込では割とあったと思いますよ

650 :
>>643
最近の言語ではそういうのあるね。
とはいってもJavaには既にあったのでかなり前からあるな。
Java以前はあるかどうか俺は知らん。

651 :
あ、Perlもループにラベル付けてlastで抜けるなんてのあるな。

652 :
break ラベル で、多重ループから一気に抜けられると便利なんだがな

653 :
gotoが便利すぎというより
単純な break returnで間にあわないときには
それしか制御がないのでは

654 :
二重ループから抜けるにはgotoが一番
gotoを廃止した言語制作者は天罰を受けるべき

655 :
goto はそれで使われている保障がないから、
保守性のためにも
ループなどに名前付けて、それを抜けると明記したい

656 :
まず多重ループを避けろと

657 :
gccで X Window System (x11) でウインドウつくって画像合成するのって

どうすればできますか? なにかサンプルプログラムなど無いでしょうか?

658 :
>>656
二次元配列を総なめする場合に
ループを 1変数でやるのかな?

659 :
>>657
古本を漁ればやり方が書いてあるかも。
XScreenSaverのソースみれば参考になるかも。

660 :
いにしえのシステムなら、関数名をmanコマンドで引けば、X Windowの関数のマニュアルが見られるはず。

661 :
>>659
linuxOSだとSDL(Simple DirectMedia Layer)で書いたほうが情報が多く 
描画書き換え速度もはやい気がします

SDLに移行したほうがやはり無難でしょうか?

662 :
質問者自身で決定すれば良いと思うが

663 :
>>661
X11は将来、Waylandにバトンを渡すらしい。新しい端末ではX11が採用されない状況が考えられる。クロスプラットフォームの方が安心かな?

664 :
暗号化されてないX11をネットワークで見たら丸裸だからあんまり使いたくないよね。

665 :
ネットワーク環境はsshしか使ったこと無いのですが
SDL_net などは関数に暗号化などがふくまれているのですか?

666 :
>>665
ソーシャルゲームを作るなら、暗号化は必須。暗号化方式を決めて、それに合った暗号化専用のライブラリーを使う形になる。

667 :
>>666
C言語の暗号化ライブラリで使いやすいのおせーてください

668 :
ソーシャルゲームは専門ではないが、暗号化なら
https://ja.m.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E6%AF%94%E8%BC%83

669 :
いろいろあるんですけど、ライセンス的にopensslでいいやみたいな感じになりましたね
waylandは5年後くらいにはなんとかなるんかな。どういうレイヤでサービス提供したいのかよくわからん所がある。

670 :
同じくopensslでいいんじゃないかと思いますな

671 :
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 も必要です。よろしくお願いします。

672 :
要素の文字列をそれぞれキャストしてみるとか?
でも別に文字列の実体を用意した方が無難では。

673 :
char * const command[3] = {"./Hello.exe","World"};

674 :
初心者で勉強中なんですが、
switch文は
if文みたく
switch(a >0)のように()の中に関係演算子を使った式はかけないんでしょうか?
エラーがでるので無理なのかなと思ったんですが

675 :
エラーじゃなくて警告では?
動かない理由はないと思うのでgccで試してみたけど、ちゃんと動いたよ。
ただ、結果は1か0の2値しかないのでif文使ったほうが良いと思うよ

676 :
本当は
 switch (a) {
 case a > 0:
...
的なことをしたかったのではないかとエスパーしてみる。

677 :
>>674
これなんか意味あるの?
具体的に何がしたいか知りたいなあ

678 :
>>676
switch(true) って裏技 あれマジで気色悪いよね

679 :
case に何を書けばいいんだ?false は 0 でいいだろうけど、true は?

680 :
>>673
>char * const command[3] = {"./Hello.exe","World"};

ありがとうございます。これでも1つめの warning "does not allow conv..." は出ました。皆さんの所では出ませんか?

それと、 command はどうしても char ** 型である必要があります。
仮想端末で何かを実行させる関数 vte_terminal_spawn_async() に与えるためです。
https://developer.gnome.org/vte/unstable/VteTerminal.html#vte-terminal-spawn-async

引き続きアドバイスをお願いします。

681 :
>>674
書くことはできる
関係式は int 型の 0 または 1 という結果を生じるので
switch (a > 0) は a の値により
switch (0) もしくは
switch (1) と等価になる

おまえさんが言いたいのは switch で範囲チェックができるのか
ということだろうがそれはできない
a と case に指定した定数の == 比較しかできないのが switch だ

不等号や != が使いたければ if 文か3項演算子ということになる

682 :
>>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 は放っておくしかないのかな?

683 :
その前に、671の警告でC++11って出てるのはなぜなのか。
複合リテラルってあれキャストではないよな。知らんけど。

684 :
>>672

gchar list1[][20] = {"../Exe/H2O.exe","World"};
gchar *list2[] = {(gchar *)list1[0], (gchar *)list1[1], NULL};
gchar **command = (gchar **)list2;

いろいろ試したところ、↑だと warning でなくなりました。意図されたのはコレでしょうか?コレで良いでしょうか?

685 :
>>682
https://ideone.com/a1eBqF
これなら警告出ないけど、やりたいことと合ってるかどうかは知らん

686 :
>>680
文字列リテラルは書き換え不可なので当然の警告。
char const* const command[] なら警告は出ないだろうけど、渡した先で書き換えしない保証がないならアウト。
渡した先で書き換えしない保証がないなら、リテラルでの初期化は無理だと思う。

687 :
>>683
なんかおかしいですよね。

でも Makefile に書いていいて実際に compile に使っているのは間違いなく gcc6 です。
warning が g++6 と共通なのですかね?

688 :
https://ideone.com/Cek4Tz
そもそもgcharってなんなの?
charのエイリアスかなんか?

689 :
> warning: ISO c++11 does not allow conversion from string literal to 'gchar *' (aka 'char *') [-Wwritable-strings]
charのエイリアスか
なら最初に書いとけよ

690 :
>>684
そういう話です。

691 :
>>688
ありがとうございます。スマートですね。参考にします。
gchar は char の別名です。すみません。

692 :
>>683
Makefile には gcc6 と書いてあるのですが、出力をみると c++ でコンパイルしていました。。。
今気づきました。 -std=c++11 もつけてある。
Cのソースを c++ でコンパイルするとマズいですか?今のところ何も問題はないです。

693 :
>>692
C++に複合リテラルないんじゃないかな。なくても困らんか。

あとさっきの配列の要素にstrdup突っ込むとconstにしなくていいかもな。
もしくはmemcpy(malloc(100),"hoge",5)とか。
標準に沿った書き方かどうかは知らん。

694 :
>>693
ありがとうございます。なるほど、複合リテラルですね。調べてみます。

自分、C で書いていて compile も C でやっているつもりだったんですが、コンパイラが c++ だった。。。
これは c++ 用の Makefile を流用した為です。
最初 c++ でアプリを作ろうとして、Makefile を用意して、ソースを書き始めたのですが、途中で仮想端末オブジェクトが c++ ではうまく使えない事が判明して、
ソースを C に書き変えたのです。Makefile はフラグ等あるので流用してしまった...

これ以上は困らないですかね。困った時にはコンパイラが c++ な為を疑ってみます。

strdup と memcpy も試してみます
これをヒントに検索していて g_strsplit なる関数もある事を発見しました。

695 :
C++ には引数に void だけって関数がないらしいぞ。
その他細かい違いがあるかも知れないので要注意だ。

696 :
どちらかというと()の解釈が違う
c++だと()は(void)と同じ
cは()が(void)と同じになる文脈とそうでない文脈がある

697 :
こうしてまた(void)論争が始まり3スレぐらい消費されるのであった。

698 :
生兵法家しかいないスレだから仕方ないね

699 :
また一つ燃料が投下された

700 :
線香花火程度

701 :
strdupはいつになったら標準ライブラリに入るんですか?

702 :
> cは()が(void)と同じになる文脈とそうでない文脈がある

ほほう、それはどんな場合だ? 具体的なコードで示せるか?

703 :
>>668
>>669
>>670
ありがとう!
なんとかがんばってやってみます

704 :
int f();

int f()
{
return 1;
}

705 :
>>702
@(void) と同じ
void f() { return; }
A(void)と違う
void f();

706 :
>>705
https://paiza.io/projects/v_bGi1kbrLaV_smq5mvcNA
https://ideone.com/iJZS6H
http://codepad.org/gy8qyLSL

707 :
>>706
thx 納得しました
https://ideone.com/0Bi6G8

708 :
>>706
https://ideone.com/whHGrw

709 :
>>708
ん、何が言いたい?

710 :
>>709
()と(void)が違う例
1行目のコメントはずして、2行目にコメントつけたらコンパイル通る

定義の時は()は(void)と同じで引数の無い関数の定義になる

711 :
>>710
>定義の時は()は(void)と同じで引数の無い関数の定義になる
そ、れ、が…
https://ideone.com/1jHHOQ

712 :
プロトタイプ宣言で引数部分を空にすると引数チェックがされなくなる
例えばこんなコードも動く
http://ideone.com/rjTqQt

713 :
https://softwareengineering.stackexchange.com/questions/286490/what-is-the-difference-between-function-and-functionvoid

draftだから正規版で変わった可能性もあるが
n1570の133,134ページに記載がある

714 :
>>710
すまんが、寝落ちする
明朝またくる

715 :
はっ。ちょっと目を離したスキに(void)ネタだけでもうこんなに書き込みが。

716 :
2進数で表現されている多倍長整数を10進数の文字列に変換する場合、機械語レベルではどうするのが現代風ですか。

レジスタ長までならBCD変換でしょうか?

例えば、Cのprintf(“%d”, 12345)はどういう実装がされますか。

多倍長ならまた違ってきますか。

717 :
>>716
C++ ですが多桁長演算を書いています。
https://mevius.2ch.sc/test/read.cgi/tech/1434079972/51
std::ostream &operator<<(std::ostream &stream, mpz_base_class c)
std::ostream &operator<<(std::ostream &stream, mpz_class c)

718 :
>>717
ありがとうございます。
多倍長演算では内部2進数のまま演算しているのですね。

719 :
改めて質問します。

2進数で内部表現されている整数を10進数の文字列に変換する場合、
機械語レベルではどうするのが現代風ですか。

レジスタ長までならBCD変換でしょうか?

例えば、Cのprintf(“%d”, 12345)はどういう実装がされますか。

720 :
現代風?

現代だろうが古代だろうが10で割った余りを並べながら10で割る事は変わらんと思うが。(CPUによってはBCDに一発変換なんて命令あるのかな?あればそれ使うと速いだろうね)。

721 :
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 関数定義 仮引数の識別子並びと宣言並びを別々に与える関数定義(関数原型形式の仮引数の型及び識別子の宣言ではない。)の使用は,廃止予定事項とする。

722 :
>>719
こうなっているらしい

printf()のソースコードで、ソースコードリーディングのコツを身に付ける (2/3):main()関数の前には何があるのか(5) - @IT
https://www.atmarkit.co.jp/ait/articles/1703/01/news170_2.html

723 :
ソースのコメントで変数毎に「16進整数」とか「10進整数」とか区別してるのあったけど意味わからんかった。
全部intなのに。

724 :
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>
*/

725 :
>>723
ひょっとして変数の接尾語に10進数や16進数を表す3文字以下のものを
付けるべきなのでは?
他のところの計算の時に間違えてしまう可能性が減ると思う

726 :
>>720
Z80やx86にはBCD関連の命令がありました。

最近のレジスタビット数の大きいプロセッサは知りませんので伺いました。

10で割った余りだと桁数nとしてO(n^2)の計算量になりますよね。
流石にそれはないかなと思っています。

727 :
https://days-of-programming.blogspot.com/2016/01/picbcd.html?m=1

728 :
O(n)じゃないか?
x64はもう命令ないんだね

729 :
O(n)だね。
文字列変換時にBCDにするのではなく演算からBCDとして扱うプログラムを見たことある。
あまり効率が良いとは思えなかったが。

730 :
x64の場合、ALUでやる2ケタの加減乗除の方は廃止だが、FPUでやる18ケタの10進と2進の間の変換はまだ使える

731 :
聞くのはここでいいのか微妙だけど質問です
abzのエンコーダで回転方向を検知したいんですがzパルスでリセットされるときに回転方向が正しく検知されなくなってしまうところの解決方法どなたか知ってますか

732 :
>>728
mod 10でO(n)、
それを桁数nに比例した分繰り返すからO(n^2)
と考えています。

O(n)で内部2進表現の整数→10進数の文字列に変換ができればいいのですけどね。

あるいはdecimal型を持つ言語がありますが、そのような型では内部でBCDで持ってたりするのでしょうか。

733 :
1桁分のmod 10だけなら計算量は固定なのでO(1)
n桁分を繰り返すなら計算量はO(n)
すべての計算量のオーダーとしてはO(n)

734 :
>>733
わかりました。
剰余を固定命令数でできる桁数内であればO(n)でできるということですね。

現在、内部2進表現の整数を10進数の文字列に変換する方法としては、mod 10の繰り返しがメジャー(ベスト)ですか?

printfの%dもこの実装が主流でしょうか。

735 :
modの計算量が固定ってこともないんじゃ?
除数にかなり依存しそうな

736 :
>>718
そうです、10進法変換は表示のときにはじめて実施します

737 :
>>719
単純に 10 で割った余りを並べるだけですが、ただ >>717 で紹介したコードでは幾分かの最適化が追加されています

738 :
>>726
いや、10 で割った余りそのものであり、他に方法はありません
ただ、最適化の余地はあり、それは >>717 に示しました

739 :
>>729
BCD はインプリメントする側としてはやる気が起きないものだ、と思いますよ
足し算、引き算はいいとして、掛け算、割り算は BCD では実装できないのです

740 :
>>734
>現在、内部2進表現の整数を10進数の文字列に変換する方法としては、mod 10の繰り返しがメジャー(ベスト)ですか?

他に方法はありません、ただし最適化する余地はあると思っています

741 :
>>739
は? 乗算と除算が実装できない??
俺らの脳には義務教育できっちり実装されているんだがw

742 :
>>741
今の話題は BCD
BCD にて効率的に乗算・除算を実装している CPU はありますか?

743 :
>>737
わかりました。
10進全桁を一旦BCDで全て求めなくても、
10進1桁ずつ求めることが出来るのですね。

>>738
単純に興味があるのでお聞きするのですが
「他に方法はありません」と断定する理由は何でしょうか。

効率を考えなければ、
単なる最適化ではない異なるアルゴリズムの他の方法が
容易に思いつきますが、例えば、
10で割る方法が原理的に最適であると証明できる
というようなことでしょうか。

744 :
秘密はvoidにありそう

745 :
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)
みたいな?

746 :
あ、2 と 4 で or 取らなきゃダメか

747 :
テーブル探す様な方法はないの?

748 :
>>747
なるほど…そういう方向性はありえますね

749 :
>>742
そう、BCDの話だ
おまえさんはBCDでは乗算と除算が実装できないと言ったんだ
マイクロコードかどうかは関係ない

750 :
>>747
あなんか昔はそういうHWがあったらしい

751 :
乗算部分はテーブル化しやすそう
除算は何処で軽くするのがいいのか皆目見当がつかねぇ

752 :
10進表記に関しては、いきなり割り算するよりはまず9とか99とか999とか9999とかと引き算なり大小比較なりしてもよさそうだけども。

753 :
まあ除算は昔からクソ遅いよな
floatで逆数かける感じの方が速そうだ

754 :
>>753
可能なら逆数を掛けたほうが早いなんてハックに効き覚えがある
(同じように2,4,8はシフト演算子で処理)

755 :
ビットリバーサルについて質問です
誰もがわかりやすく簡単にできる方法は
C言語でどうなるでしょうか?

756 :
>>753-754
初期のスーパーコンピューターCray-1はそういう構造
って結構有名な話
https://news.mynavi.jp/article/architecture-389:amp/

757 :
整数定数除算は速度優先オプティマイズでアセンブラ出力見てみなよ

758 :
>>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));
}

759 :
おっと>>755の間違い

760 :
>>755
簡単でわかり易いと言うなら素直にビット毎に処理すればいいと思う
unsigned int x = …;
unsigned int y = 0;
for(size_t i = 0; i < 32; i++){
y <<= 1;
y |= x & 1;
x >>= 1;
}
てな感じ
高速化したいならテーブル引くなりすればいいかと

761 :
>>758
>>760
ありがとうございます
どちらともわかりやすいですね!

762 :
高速フーリエ変換でのビットリバーサルの書き方がどんなものがあるのか興味があったのでききました

ビットリバーサルでの処理では速度は余り変わらそうなのでわかりやすい

表記で書こうとおもいます

763 :
>>749
では訂正しましょう
「BCD では『効率的な』乗算・除算は実装できない」、てへぺろ

764 :
>>754
その逆数を実時間で効率的に求める方法はありますかね…あらかじめ求めておくというのは除いたとして

765 :
BCDじゃなく10bitで10進3桁表すieee 754-2008のdecimal floating pointだと、回路的にそこまで無駄じゃないよね

766 :
>>764
ニュートン法とか?

767 :
>>763
効率的とは?
ハードワイヤードでも組めるだろ?

768 :
加算 減算 乗算 除算 って回路的にどうやってるんだ?
マルチバイブレータ系の回路が基本になってるのはわかるけど
詳細部でどうやってるんだ?

769 :
log通った後だと 乗算が加算に 除算が減算になるけど
log通して加減算した後に累乗で戻すほうが重いんじゃろな

770 :
>>768
加減算はXORそのもの。
乗除は知らん。

771 :
>>770
加減算のXORの場合 繰り上がりはどうやってるんだ?

772 :
>>771
単なるANDだろ
https://ja.m.wikipedia.org/wiki/加算器

773 :
繰り上がりはand
ただ実際は一気にがばっと先読みするので、すぐ下の桁だけに依存するわけではない

774 :
お前らコンピュータアーキテクチャの勉強もしたことないのか?

775 :
ビジコン嶋さんがアップをはじめました

776 :
>>772
https://ja.wikipedia.org/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8
半加算器と全加算器の組み合わせとかいろいろあるんやなw

777 :
キャリールックアヘッドアダー  っていう加算器の高速化手法もあるんかぁw

778 :
>>777
実はリップルキャリーと回路は同じです
キャリールックアヘッドは、「多入力ゲートは2入力ゲートを組み合わせた分よりも速い」という仮定のもとに組まれたものです

779 :
またまたいい加減なことを。
2入力ゲートだけでCLA作れるし、2入力ゲートだけのRCAより速いよ。

780 :
そりゃ多入力ゲートが2入力で模倣できるって言ってるだけでは

781 :
同じ入力数に制約しても速いって言ってんの

782 :
マルチエミッタって、スイッチング速いんだっけ?

783 :
スレチですみません
ここの人達は「プログラム」と聞いたときにどちらを思い浮かべますか?

* バイナリ
* コードが書かれたファイル
* コード

784 :
ROMにプログラム(書込)するのはバイナリ

785 :
>>784
やはりバイナリですよね
プログラム=バイナリという理解で合ってますよね

786 :
はい
あなたの考えは一切の曇り無く隅々まで正しいです
なのであなたの理解が最も正しいです
それについてわたくしどもは一切口出しすべきことはございません

あなたこそが正しいです

787 :
>>786
しかし辞書にはプログラムは問題解決の手順を特定の言語書いたものとあったので、
そう考えるとプログラムはバイナリを内包するという捉え方の方が正しいですよね
あと>>784さんはプログラムを動詞として使ってますが、それも使い方としては一般的なんですよね

プログラミングは10年以上やっているんですが、いまさらになってプログラムの意味を調べていて……
プログラムの意味をなんとなく理解してたのがわかって、こんな質問してしまってるんですが

788 :
>>787
どうやら貴方はプログラムより先に国語を勉強したほうが良いようだ。

789 :
ンなことカンケーなしに「俺はこう思ってる」「正解をくれ」を最初の>>783に書けばいいじゃん
なんでお前のお気持ちを察しなきゃいけないワケ
後出しジャンケンのコミュニケーション不全の物体だからマンセー要員しか求めてない

「どちらを思い浮かべますか?」と聞いてるんだから、
オレが思い浮かべるだけなら正解も不正解もない、
なのにいきなり「合ってる」とか言いだすとと値踏みされてるから不快だ

なんでお前なんかに正誤判定されなきゃいけないの
正解を求めている旨を最初>>783に書いてないからコミュニケーション不全だ

一見自由そうに見えるアンケートを取っておいて、それが合格か不合格かテメー独自のお気持ちで決めて人間を値踏みする、
その思考経路がアレすぎ

790 :
アンケート取ったのはどっちが一般的なのか知りたかったからですよ
そんなにカッカしないでください

一般的かどうかに私の主観は関係ないでしょ?

791 :
一連の処理(命令)を書いたものがプログラムだろ
それを書く作業がプログラミングだろ
何が疑問なのかよくわからん

792 :
>>783
テレビ番組表

793 :
>>791
そうなんですが、プログラムって言葉がけっこう色んな意味で使われていて、調べていると混乱するんですよね……

794 :
>>789
同感

辞書って言われて正直少しムッとした
ちなみに俺はその手の辞書サイトの間違いを指摘して訂正させたことがある

795 :
>>793
ITの分野で>>791以外の意味で使われることある?

796 :
>>794
別にここの人達の知識を疑ってるわけじゃないです
あと試すようなこともしてるつもりはないです

>>795
たとえばバイナリを指してプログラムと言うじゃないですか
あとアプリのこともプログラムと言いますし
プログラミングのことをプログラムするとも言うし

バイナリもアプリも「一連の処理(命令)を書いたもの」とすることはできますが、
なんか混乱するんです

797 :
あとプログラムとコードの違いもよくわかりません
コードだって命令を書いたものじゃないですか
それだとプログラム=コードということになりませんか?

798 :
>>796
voidに秘密がありそうですよ

799 :
>>798
「プログラミング=プログラムを作ること」なら、日本語の命令を書くことはプログラミングなのかという疑問が生まれませんか?
人間に与える日本語の命令を書いた場合、それはプログラミングと言えるのでしょうか?

800 :
バイナリもアプリもソースコードもプログラムを内包するってことだろ

801 :
IT分野の話じゃないならスレチもいいとこだな
そんなの辞書引けば分かるだろ

802 :
>>796
再びムッとしたぞ
人にものを尋ねておいて何だその態度は
失言ではなく性格のようだな

803 :
verilogはなんとプログラミング言語ではない

804 :
>>778
単純なマルチバイブレータ連結のカウンタ回路考えたら
段数が多くなるほど速度が遅くなるのは当たり前だもんね!

805 :
CPUの立場では、メモリ上に展開されている機械語のバイナリ列がプログラム
OSの立場では、実行ファイルがプログラム
C言語で記述する人にとっては、ソースファイル(郡)がプログラム

どのレイヤーの話かで意味が変わってくる可能性

806 :
ムッとしたってちょっと可愛い

807 :
機械にとっては機械語だけで充分なのに
人間の理解にとって高級言語は必要最低限

認識のちがいとか感受性 によって見方はかわるんかな?w

808 :
用語なんて初めて使われた時の意味、定義化された時の意味、実際に使われてる場面での意味、
全部違ってることなんてザラでしょ。

809 :
>>806
わざとやってるんだよ
別にケンカがしたいわけじゃないから

810 :
>>782
スイッチング特性ってどうなんだろ?
トランジスタのftに依存するんやない?

最近のトランジスタは1815なんかにくらべると桁がだいぶ違うw

811 :
>>799
言える。これだもの。

プログラム(program)
[名](スル)
1 ある物事の進行状態についての計画や予定。予定表。「新人教育のプログラム」
2 演劇・映画・音楽会・テレビなどの演目・曲目・番組。また、出演者の紹介、解説などを印刷した小冊子や番組表。「雨天によりプログラムが一部変更された」
3 コンピューターへ指示する、計算や仕事の手順を特定の言語や形式で書いたもの。また、それを作ること。

812 :
更に、日本語のコンピュータ用のプログラムというのもある。
昔々のピュータのBASICだとか、C言語でも関数名や変数名その他に漢字使えるのあったし、Javaとかでも識別子に漢字使えるし。

813 :
あ、ピュータじゃなくてぴゅう太だな。
https://ja.m.wikipedia.org/wiki/%E3%81%B4%E3%82%85%E3%81%86%E5%A4%AA

814 :
utf8が普及して、今の方がむしろ普通に日本語使えるようになったと思うよ

815 :
だな、今時メジャーな環境で識別子に漢字とか使えない方が珍しい

816 :
絵文字が普及して外人の作るプログラムがマルチバイト文字に完全に対応してきた
それまでは結構ダメダメだった

817 :
識別子に漢字使えるのにスペースは全角だとコンパイルエラーなのがちょっと納得いかない

818 :
0xE38080がUTFのスペース
0x20 がアスキーコード

いまやってみたら全然ちがうやんかw  

819 :
>>797
言葉の意味は文脈で異なる。
ある言葉と別の言葉の関係は一致か不一致かだけでなく、包含したり一部のみ重複したりもする。

820 :
>>779
>2入力ゲートだけでCLA作れるし
そんなことをしたら「素子数ばかり馬鹿みたいに食らって速度はリップルキャリーと同一の遅さ」で、なんのためのキャリールックアヘッドなのかわからない、という悲惨な結果になりませんか?

821 :
>>781
ありえないですね、キャリールックアヘッドは多入力で速度を稼ぐやりかたですよ、2入力に制限したらリップルキャリーと全然かわらないじゃないですか?

822 :
キャッシュの容量とかパイプラインのちょうどいい区切りとか
まで考えてプログラミングなんてはっきり言ってやってませんw
手抜きでしょうか?

823 :
演算器の設計 - 加算器(Adder)
https://news.mynavi.jp/article/computer_architecture-70/

演算器の設計 - キャリールックアヘッドアダー(1)
https://news.mynavi.jp/article/computer_architecture-71/

演算器の設計 - キャリールックアヘッドアダー(2)
https://news.mynavi.jp/article/computer_architecture-72/

パラレルプリフィックスアダー
https://news.mynavi.jp/article/architecture-73/

パラレルプリフィックスアダー(2)
https://news.mynavi.jp/article/architecture-74/

パラレルプリフィックスアダー(3)
https://news.mynavi.jp/article/architecture-75/

Lingアダー
https://news.mynavi.jp/article/architecture-76/

アダーの実装に関して
https://news.mynavi.jp/article/architecture-77/

824 :
>>821
いや、文字通り先読みが本質だと思いますよ
ゲートはいくつあってもいい

825 :
>>824
>文字通り先読みが本質だと思いますよ
薄っぺらい理解ですね
3 bit, 4 bit なりの アッダーを決めて、その MSB の和を作るのに必要な入力をじっと眺めて本質をつかんでください
単なる先読みではありませんよ

>ゲートはいくつあってもいい
速くなるならね
でも 2 入力論理演算だけで作ったキャリールックアヘッドは速くならない…

826 :
>>825
そら、速い方がいいし回路もシンプルな方がいいですよ。
しかし、桁上がりを待ってるのと同じではないでしょうて。たとえ2入力ゲートを使ったとしても。

827 :
>>826
ご発言の意味が掴みきれません

828 :
>>827
そりゃもう、読んでないですからね

829 :
ディスクリートトランジスタでマルチバイブレータを組んでそれで
カウンタ組んだの思い出したw
動くと感動するよね!w

830 :
現在はキャリー選択アダーに集約された

831 :
分岐予測みたいなの?

832 :
基本はマルチバイブレータでつくった順序回路w

なんだもんなぁw

833 :
この言語は扱うものが多くて頭がオーバーフローします
たとえば正規表現は
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)

これを見る度に数がおおくて何書いているのか分からなくなる

834 :
コンパイラつくってるんか?

835 :
いいえ
コマンドライン引数の場合訳に正規表現がつかえると嬉しいのです

836 :
>>835
たとえばどんな引数?

837 :
JSのmatchみたいなラッパー書けばいいじゃん

838 :
>>836
1~62の整数かt,today,n,nowかr,randomか無し
でした

perl ではこう書いてました
https://pastebin.com/txgSvNix

839 :
>>821
お前まさか、16入力のANDを2入力ゲートで作れと言われたら、
縦に15個並べて順に接続するんじゃないだろうな。

840 :


841 :
>>839
普通にトーナメント方式に15個ならべますよ

842 :
>>841
じゃ、RCAは遅延がO(n)で、CLAはN入力ゲートがあるならO(1)、2入力ゲートに制限してもO(log n)って気づくだろ。

843 :
qzは話通じてなさそうだな

844 :
>>842
そうか log n くらいには改善されるわけですね…てへぺろ

845 :
相変わらずの屑っぷり

846 :
ゲート容量分の時間誤差は絶対生まれるかんな(´・ω・`)

847 :
意味のわからん時間誤差とかいう用語、未定義で使うな

848 :
>>833
俺にはわかる。

慣れの問題では?
まあでも慣れるかどうかは個人差あるしこの言語で慣れねばならないなんてことはないので気にせず他の自分がわかりやすいと感じた言語使えばいい。

849 :
>>848
それって正規表現をどう変換する関数なの?

850 :
regexpをcompileするって概念はスクリプト言語ですら大抵存在するのに

NFAやらDFAやらだったり専用VMのバイトコードに落としたりと色々だろ

851 :
>>849
最初のはパターンのコンパイル。次のは文字列とコンパイル済みパターンとのパターンマッチングをさせる関数。
詳細はマニュアルページ見るなりググるなりして調べてくれ。

852 :
まあしかし>>838に書いてあるような内容なら正規表現使わないで単純な比較をするだけの方が速いしプログラムもわかりやすくなるような気がするなあ。

853 :
>>851
行ごとに文字列を細分化して それで当てはめていくって感じかな?
正規表現関係はけっこう頭抱えるもんね!

854 :
C言語のソースメモをオートインデントして整理しようとプログラムくんだけど
こういった関数つかって分岐かけていったほうが完璧なんかな?

でも時間すごい掛かりそうw

855 :
>>854
そのプログラムを書く手間を自動化してみては?

856 :
unixのindentコマンドか
本末転倒を体現する変なやつ

857 :
>>818
てか、Unicodeのスペースって沢山あるよ。
Wikipediaで「スペース」で検索して見てみな。

858 :
たくさんあるとなると「空白」の検索めんどくない?

859 :
>>856
何もオプションを付けないindentコマンドを実行すると
予想外のソースコードが出てくる可能性が高い とか書いてるひといるね!

インデントフォーマットって好みが人それぞれ違うから自分専用のもっててもええのかも?w

860 :
>>858
そう。面倒だよ。

ま、しかし、wchar_t型使えるならiswspace()とか色々判定する関数が使える。
http://www.c-tipsref.com/reference/wctype.html

861 :
https://i.imgur.com/J5yu9wS.jpg

862 :
>>861
グロ

863 :
>>817
Whitespaceごっこできないようにだろw

864 :
c言語って今どんな仕事あんの?

865 :
>>864
ハードと無線の知識があればIoTが花盛り。

866 :
機械の試運転してるんだけど組み込みの部署に行きたい。どう勉強すればええ?

867 :
機械の試運転とは?

868 :
>>867
配線やら電気系のことして実際に動くかどうかを確認して不具合が出たら直す仕事

869 :
>>866
まずは日本語からかな
言いたい事が人に伝わるようになれ

870 :
>>868
電子じゃない電気なの?

871 :
ひょっとしてシーケンサー?

872 :
>>870
工業の情報卒なんだけど電気系に配属されたんやで。
PLCで動く機械もあるし、C言語で動く機械もあるで

873 :2019/08/05
車載系の仕事は最近多いよ
でもCじゃなくてC++だと思う。規格的に。

SQLなら俺に訊け
C++相談室 part147
delphiで作った有名ソフトって何があるの?
☆★Java質問・相談スレッド182★★
C/C++以外の推薦図書/必読書のためのスレッド
【Delphi】Embarcaderoオッチャ その34【C++ビルダ】
Tapestryについて語ろうよ!
統計解析R たぶんpart3くらい
UNIXプログラミング質問すれ Part10
【QBASIC互換!?】FreeBasic【GPL】 2
--------------------
☆【画像】6277
はなの舞 大阪・神戸
琵琶湖岸釣り情報 2018 part5
教育大美術系集合
横国卒の福田萌ですら宅建には合格できなかった件
【就職】ボウリング場で働く人たち【転職】
【FFC】冨士痛アドバンストエンジニアリング2【松岡】
今若者に人気のファッションがこれ。 [479913954]
【iPhoneも】Titanium Mobileスレッド【Androidも】
■姓名判断で32画を持っている人■part3
カウントダウン文唱堂印刷
悪質なブロガーをANA、JALなどに通報しよう! ★3
春日野巡業部長、舞鶴事件について嘘をついていた
NGT48山口真帆さんが配信にて『殺されてたら…』 運営はメンバー関与を認めるも、 被害者が謝罪★2184
CR魔法少女まどか☆マギカ 59アルティメット
中国・韓国・北朝鮮が大好きな奥様 151
復活!イヤッッホォォォオオォオウ!衝動買い! 6回目
Arduino初心者熱烈大歓迎質問スレ part28
徴用工判決で韓国政府に文句言うの間違ってね?
【社会】新型コロナ対策で日本左派は妨害!? 朝日新聞、共産党、社民党は「国難」を乗り越える気がないのか[3/7]
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼