C言語なら俺に聞け 159at TECH
C言語なら俺に聞け 159 - 暇つぶし2ch1:デフォルトの名無しさん
22/08/04 23:32:27.83 yWVViPyIM.net
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
URLリンク(paiza.io)
URLリンク(ideone.com)
URLリンク(codepad.org)
C17
URLリンク(www.open-std.org)
C11
URLリンク(www.open-std.org)
C2x ドラフト
URLリンク(www.open-std.org)
C99
URLリンク(www.open-std.org)
URLリンク(kikakurui.com)
C FAQ 日本語訳
URLリンク(www.kouno.jp)
JPCERT C コーディングスタンダード
URLリンク(www.jpcert.or.jp)
※前スレ
C言語なら俺に聞け 158
スレリンク(tech板)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

2:はちみつ餃子
22/08/04 23:46:06.88 hPtMGH660.net
現時点んでの C2x 最新ドラフトはこっち
URLリンク(www.open-std.org)

3:デフォルトの名無しさん
22/08/04 23:50:16.33 nIz8Ddm70.net
訂正ありがとう

4:デフォルトの名無しさん
22/08/08 01:13:34.41 /9Y6mnF30.net
n3047がC23の投票に掛けられる模様

5:はちみつ餃子
22/08/08 01:16:49.11 JJ3NlnG00.net
おっ、こないだの会議の結果が反映されたドラフトが出てたのか。

6:デフォルトの名無しさん
22/08/13 08:01:13.53


7:2Qk1ejrP0.net



8:デフォルトの名無しさん
22/08/13 08:05:10.38 2Qk1ejrP0.net
>>6
あれ?
-std=c11 つけてコンパイルしてもエラーにならないな
>>6は一応C標準てことでいいのかな?

9:はちみつ餃子
22/08/13 09:53:55.13 RGh4OO0V0.net
>>6-7
言語仕様を確認してみたら、変数が静的記憶域期間を持つときは
初期化子に現れる全ての式が定数式でなければならない (変数を含められない) という制限はある。
自動記憶域期間なら初期化子に変数を使っても問題ない。
GCC でもそのような挙動になる。

10:デフォルトの名無しさん
22/08/13 09:54:36.52 F6UXSz0Jd.net
>>6
staticやグローバルにすると・・・

11:はちみつ餃子
22/08/13 10:02:52.43 RGh4OO0V0.net
関連する挙動を色々と試してたんだけど、
GCC では const 付きの変数の挙動が少し C++ 寄りに拡張されているっぽい。
C++ では const 付き変数の初期化子が定数式である場合にはその変数も定数式になるが、
C では単に代入できない変数という扱いのはずなんだけど、
GCC では定数式っぽい振る舞いをする場合がある (全面的に定数式扱いというわけではない) ように見える。

12:デフォルトの名無しさん
22/08/13 17:52:01.55 D+zbBXbXd.net
>>9
それが静的記憶域っちゅうこっちゃがなーー

13:デフォルトの名無しさん
22/08/13 20:18:21.81 F6UXSz0Jd.net
>>11
だからそれを言ってる

14:デフォルトの名無しさん
22/08/14 00:23:10.64 yTFzwOo0d.net
もう>>8に書いてあるじゃん

15:デフォルトの名無しさん
22/08/14 00:37:06.28 E4oXLohw0.net
あーなるほどstaticかぁ
お前らありがとん

16:デフォルトの名無しさん
22/08/14 08:08:18.99 BqkowVN+d.net
K&R Cでは配列の初期化子にも同様の制限があって
その理由は合理的だった
その後ある事情で無理が通って道理が引っ込んだ

17:デフォルトの名無しさん
22/08/14 11:44:40.04 VI2zLni0a.net
staticには意味が複数あるのがC言語の挫折ポイントのひとつ

18:はちみつ餃子
22/08/14 12:08:31.19 vdIvBFYd0.net
予約語を増やさないという方針自体は互換性を損なわないために真っ当なものだと思うけど、
名前がかぶったら単に一括置換で対処できる程度のことでもあるしなぁ……。

19:デフォルトの名無しさん
22/08/14 12:20:02.25 1rNkdimaa.net
>>16
そんなので挫折するならもっと前に挫折するだろw

20:デフォルトの名無しさん
22/08/14 12:34:09.99 +OkjgujJ0.net
挫折自慢大会が開催されました

21:ハノン
22/08/14 13:14:34.32 GttZqyyI0.net
Scheme 手習い、を挫折しました、いつ再トライしようかしら?

22:はちみつ餃子
22/08/14 15:10:21.65 vdIvBFYd0.net
自分の性分に合ったものは気合いを入れなくても割とスルっと出来ちゃったりするし、
そういうところから周りに広げていく形でやってけばいいんでないかな。
業務で必要とかならそうも言っておれんだろうけど。

23:デフォルトの名無しさん
22/08/14 16:55:08.09 YzvfyuVN0.net
Kotlinもよろしく

24:デフォルトの名無しさん
22/08/14 17:14:45.00 b9F5IowR0.net
完全な文脈自由文法で設計されていれば、コンパイラも簡単に作れるけどな。
しかし、Javaのその特性は完全に無視され、誰にも気づかれなかった。
お前らも気づいていない。

25:はちみつ餃子
22/08/14 21:52:34.16 vdIvBFYd0.net
構文解析だけ簡単でもコンパイラが簡単なわけではないが……。
部分的にでも簡単であるに越したことは無いけどさ。

26:デフォルトの名無しさん
22/08/15 06:53:02.58 m+99U1QQd.net
いや宣言文→実行部のように決まっている文脈ガチガチのほうがコンパイラは作りやすい

27:デフォルトの名無しさん
22/08/15 08:31:44.94 zxOEKBbO0.net
今時字句解析とか構文解析で難しいとかないでしょ
それなりのツールもあるからBNF書ければ自動生成できたりするし

28:はちみつ餃子
22/08/15 09:21:08.58 DfKndVH30.net
>>26
言語仕様のほうも処理しやすいように寄せてきてるからだよ。
パーサジェネレータを前提として設計された言語仕様ならパーサジェネレータで処理しやすいのは当たり前の話。

29:デフォルトの名無しさん
22/08/15 09:27:22.60 zxOEKBbO0.net
>>27
難しいって一体どんな言語仕様を想定してるんだ?w

30:はちみつ餃子
22/08/15 09:47:41.49 DfKndVH30.net
>>28
FORTRAN 77

31:デフォルトの名無しさん
22/08/15 10:35:55.74 zxOEKBbO0.net
>>29
字句解析と構文解析を一体でやらないといけないから面倒ではあるけど難しいという程じゃなくね?
そもそも人間にとっても分かりにくい言語仕様を採用するのもどうかと思うが

32:はちみつ餃子
22/08/15 11:11:29.28 DfKndVH30.net
>>30
今の主要なプログラミング言語はそう (処理段階の分離が極端に難しい仕様には) ならなかったという話をしてる。
だから昔のものから例になりそうなものを抽出しただけで、この頃の知見のまま設計された大きな言語があったら
現代的なツールでも扱いにくいだろうということ。

33:デフォルトの名無しさん
22/08/15 11:28:00.05 zxOEKBbO0.net
>>31
だから多少面倒なだけだろ
そもそもスペース無視するとか予約語を識別子に使えるとか人間側にも優しくない仕様ででかい言語仕様とか頭おかしい

34:はちみつ餃子
22/08/15 11:39:32.94 DfKndVH30.net
>>32
漠然と変だとは思ってたとしても、知見の確立がなかったとしたらそのまま進むしかしょうがないだろう。
まあ、そうなっていない世界でのもしもの話、実際に無かった以上は想像でしかないけどな。

35:デフォルトの名無しさん
22/08/15 12:01:53.74 zxOEKBbO0.net
>>33
そもそもFORTRAN77以前でも
DO 100 I = 1. 5
なんて言う「代入文」を書く奴なんてほとんどいなかったわけで知見が確立しないまま言語仕様だけでかくなるとかまずありえんわ
まあ妄想に浸りたいだけなら勝手にやっててくださいな

36:デフォルトの名無しさん
22/08/15 12:48:46.30 RzREpsfh0.net
ほとんどいない笑
たまにはいたんですね?

37:デフォルトの名無しさん
22/08/15 13:28:30.95 zxOEKBbO0.net
>>35
タイプミスとか、難読大会とか
想像力ないの?

38:デフォルトの名無しさん
22/08/16 10:07:24.32 6bNCuhdm0.net
割り込みルーチン内で速度を稼ぐためにグローバル変数をローカル変数にコピーして
それを元に色々処理しようとするとうまくいかない
グローバル変数を直接使って処理するとうまくいく
こういうことはありえるのかな?

39:デフォルトの名無しさん
22/08/16 10:11:26.14 wezFOLPc0.net
・・・グローバル変数の書き戻し忘れとか?

40:デフォルトの名無しさん
22/08/16 11:20:38.26 2x3mrzZQa.net
ポインタ便利ですね

41:デフォルトの名無しさん
22/08/16 11:58:39.88 dXh796NKd.net
すっごく抽象的でさっぱりわからんw
なんの割り込み?
どううまくいかない?

42:はちみつ餃子
22/08/16 14:05:35.67 +o+ePBjP0.net
>>37
書いたプログラムのロジックは誤ってないと仮定して、
コンパイラによる最適化が割り込みに配慮しないなら思ったような動作にならないということはあり得る。
ある変数が途中で変更されることはないと確信できる状況なら
レジスタにロード済みの値を使いまわしたりするのはごく普通の動作。
場合によっては定数にまで畳み込まれることもある。
だけど、割り込みはそうしたメインの流れと関係なく問答無用でどこにでも割り込むから齟齬が生じる。
C99 までは割り込みや平行については言語仕様ではあまり取り決めず、
動作の詳細な部分は処理系まかせなものの volatile キーワードを付けた変数は最適化が抑制されるとか、
処理系の拡張で属性指定を付けれるとかいった機能を利用してどうにかしてきた。
(たぶん POSIX にはもうちょっと詳しい規定がありそうだと思うけど私はよく知らない。)
C11 以降はスレッドまわりの整備が進んだので割り込みでも活用できる部分は多いと思うんだけど、
オプショナルな仕様なので C11 の処理系として必須なわけではないんよ。
おそらくは使っている処理系・実行環境で使っているお決まりのパターンがあると思うからそういうのを探して
真似するのが手っ取り早いと思う。

43:デフォルトの名無しさん
22/08/16 19:21:50.20 7tUZ32LZd.net
そういやそんな問題に悩んでた奴でvolatileの存在知らない奴がいたな
…大丈夫だよね?

44:デフォルトの名無しさん (アウアウウー Saa5-oUG4)
[ここ壊れてます] .net
volatile で全ての問題が解決する訳じゃないけどな
知らないのはまずいな

45:デフォルトの名無しさん
22/08/17 15:44:25.95 VZh9Cr0g0.net
switch文がポンコツ過ぎて二分探索のif文で記述したくなります
case設定がへたくそなのでしょうか?

46:デフォルトの名無しさん
22/08/17 16:18:24.97 vNydwVZ40.net
C++にすらないoperator switch caseでも欲しいのかな

47:デフォルトの名無しさん
22/08/17 16:34:24.35 mlh+/a6xd.net
またも抽象化し過ぎの質問…
switchが上手くはまらなかったらelse if地獄でいいんだよ

48:はちみつ餃子
22/08/17 18:48:10.50 ito9w61P0.net
>>44
具体的に何が不満なの?

49:デフォルトの名無しさん
22/08/17 19:06:06.04 cXiq2BCR0.net
スキルを磨く以外に、王道はありません

50:デフォルトの名無しさん
22/08/17 19:37:59.93 GqH3uV+md.net
具体的にどうポンコツなのかわからんけど
例えばaが1だったら処理1、2だったら処理2、3-15だったら処理3、16なら処理4
それ以外は処理default
if( a == 1 ){
  処理1
}else if( a == 2 ){
  処理2
}else if( a <= 15 ){
  処理3
}else if( a == 16 ){
  処理4
}else{
  処理default
}
こんなんで充分だよ

51:デフォルトの名無しさん
22/08/17 21:42:31.43 ZlUvKbke0.net
流れを綺麗にしたいなら
enumやマクロでシンボリックな定数を定義、ロジックはビット演算に埋め込め

52:デフォルトの名無しさん
22/08/17 22:05:39.48 ISeM0IbeH.net
>>42
volatile で保証された気分になっている方が問題、ちゃんと pthread を使えよ

53:はちみつ餃子
22/08/17 22:10:35.67 ito9w61P0.net
割り込みは並行 (または並列) とは違うので pthread ほどの保証は過剰だと思う。

54:デフォルトの名無しさん
22/08/17 22:19:02.41 vZEBwtyc0.net
フォールスルーしないなら if else if else if .... って重ねてってもたいして変わらんしね

55:デフォルトの名無しさん
22/08/17 22:23:36.57 ZlUvKbke0.net
パーサとか書くなら抽象化のコストに見合うけど、もしそれほど複雑でないなら
caseラベルは各分枝に付き一つにしてしまい、分類は外部委託してしまうが楽
switch(var)→switch(CLASSFY(var))
case 'A': actionA;...
パターン: アクション

の並びに落とし込むのが難しいなら、多分switchを使うべき問題ではない

56:デフォルトの名無しさん
22/08/17 22:32:08.07 cXiq2BCR0.net
swich case は条件に応じて分岐するジャンプテーブルなのでどの条件に対しても同じ重さ
if else if は書かれた順に評価し、実行するので、起こりそうな条件を前に持ってくると効率化できる、かも

57:デフォルトの名無しさん
22/08/17 23:03:29.34 YK1jCeWgM.net
>>55
switchも連続比較する事が基本で、caseラベルの値の最小値と最大値が一定の範囲内だったら最適化でジャンプテーブルになるかもってだけでしょ
絶体にテーブルジャンプさせたければ、自前でやるしかない

58:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 813e-5Ix7)
[ここ壊れてます] .net
リッチな処理系なら switch も常にただのテーブルということはない。 状況に応じて最適化は入る。
ただ、頻出する分岐がどれなのか予測してくれるほど十分に賢くは無いので
条件があり得る頻度によってチューニングが必要なら if に置き換えるしかしょうがないな。

GCC だとプロファイルを取ってその成果をもとに最適化することも出来る。
頻出する条件を __builtin_expect で指定するとその分岐を優先的に検査する (ようなコードを生成する) という便利機能もある。
手作業で微調整するのは不毛な感じがするから使えるものならコンパイラの賢い機能に頼るのもアリだと思う。
(試したことがないから細かいことは知らない。 たいした効果は無いかもしれない。)

59:デフォルトの名無しさん
22/08/18 04:30:48.90 X/mZUHYK0.net
まあ確かに>>49
switch(a){
case 1:
 処理1; break;
case 2:
 処理2; break;
case 3..15:
 処理3; break;
case 16:
 処理4; break;
default:
 処理default
}
みたいに書ければなぁって思わなくもない

60:デフォルトの名無しさん
22/08/18 11:21:05.54 ZfnRi5ov0.net
>>58
GCCの拡張だけどあるよ
Clangでも使える
URLリンク(wandbox.org)

61:デフォルトの名無しさん
22/08/18 11:23:58.91 C4YsUD/kd.net
たまーに、いちいちbreak文を書かなきゃいけないのがダルいなって思うことはあるな
ちょっと自分が作業中断すべきときかなって

62:デフォルトの名無しさん
22/08/18 11:41:19.30 DF4FCk1vd.net
>>59
コンパイル時定数なら利益なくね?
case:3 case:4...case:15に展開するRANGE(3, 15)マクロで十分

63:デフォルトの名無しさん
22/08/18 11:44:02.06 u9P7LJR3a.net
>>59
なるほどさすが GCC やね、標準に取り込んで欲しいわ

64:デフォルトの名無しさん
22/08/18 11:49:28.51 DF4FCk1vd.net
caseラベルの値を数値(範囲)として扱うという発想が無かった
もう素直に比較しろよ

65:デフォルトの名無しさん
22/08/18 11:52:35.74 p/limWqpa.net
Ruby厨登場


66:デフォルトの名無しさん
22/08/18 13:33:09.96 FzMciMIo0.net
caseは単なるラベル

67:デフォルトの名無しさん (テテンテンテン MM26-6e26)
[ここ壊れてます] .net
for文の中でswitch使うと、forを抜けるbreakを書けないのがクソ
気付かず使うとデバッグ困難なバグになる落とし穴
switchをifにするか、forの外にgotoで飛ばすしかない
switch文はC言語最大の設計ミス

68:デフォルトの名無しさん
22/08/18 15:55:41.52 C4YsUD/kd.net
gotoは悪って前提だな
gotoレス原理主義者?

69:デフォルトの名無しさん
22/08/18 15:58:47.22 X/mZUHYK0.net
そもそも多重ループからの脱出もできないし、ややこしい奴は素直にgoto使えってことだろ

70:デフォルトの名無しさん
22/08/18 20:24:47.46 +rK0/pUYd.net
switchからの脱出がbreakなのがおかしい

71:デフォルトの名無しさん
22/08/18 20:48:40.52 SQwD8GPSH.net
>>69
for からの脱出が break
while/do while からの脱出が break
で、あれば、
switch からの脱出も break であっても不適当とはいえないのではないですか?

72:デフォルトの名無しさん
22/08/18 23:03:17.54 1nHnTkCL0.net
行儀良くまじめなんてできやしなかった
夜の校舎窓ガラス壊してまわった
逆らい続けあがき続けた早く自由になりたかった
ひとつだけわかっていたこと
この支配からの~break♪

73:デフォルトの名無しさん
22/08/18 23:06:15.16 4f/YBTxPM.net
Javaのswitch式を逆輸入して欲しい
評判が良いのかどうか分からんけど

74:デフォルトの名無しさん
22/08/19 00:43:51.91 Djh9jYCCa.net
endfor とか endwhile とか endcase とか悪夢でしかない

75:デフォルトの名無しさん
22/08/19 01:50:19.99 FEOcjYNtd.net
>>70
switchはループ制御文ではないのになんでwhileやforと同じなのか

76:デフォルトの名無しさん (ワッチョイ c202-mhOm)
[ここ壊れてます] .net
break は今いるブロック (波括弧といてもいい) から一つ外のブロックに出る
という意味を持つ

77:はちみつ餃子
22/08/19 09:19:24.91 FT/EuRcZ0.net
>>75
そんなわけないだろ。

78:デフォルトの名無しさん
22/08/19 10:12:45.49 FEOcjYNtd.net
それならif文からも脱出できるはずだができない
あくまでswitchが特例でループ文扱いされてるので脱出できる

79:はちみつ餃子
22/08/19 10:34:49.15 FT/EuRcZ0.net
switch やループ構文はブロックとは独立した構文で、
これらを使うときにブロックを作らないことも出来るし、
逆に関係ないところでブロックを作ることも出来るので
break をブロックと対応付けさせると変なことになるんだよな。
たとえば以下のコードでの break は実際には switch を抜けるだけなので printf は実行されるが、
ブロックを抜けるほうが自然だと思うか?
#include <stdio.h>
int main(void) {
{
switch(1) case 1: break;
printf("hello\n");
}
}

80:デフォルトの名無しさん
22/08/19 12:00:39.57 FEOcjYNtd.net
そんな極端な例でなくても…
case 1:
if( x < 4 ){
………
break;
}
………
break;
普通によく書くと思うが
このif文の中のbreakでもちゃんと一番内側のswitch文の外に飛んでいく
switch(k){
case 1:
{
int tmp_x; //この中だけで使う一時変数
………
break;
}
case 2:
………
}
こんな書き方でも(あまりよくないけど)ブロックは無視してswitch文の外に飛んでいく

81:デフォルトの名無しさん
22/08/19 18:10:20.82 opjWCie4a.net
for の中の if の中の break で単に if から脱出されても
おまえなにしとんねん
開いた口が塞がらない状態になる罠

82:デフォルトの名無しさん
22/08/19 18:16:48.08 opjWCie4a.net
do{
やりたいこと
}while(0);
っていう構造に変換するマクロは良く使われるが
switch(0) default: {
やりたいこと
}
なんかもアリなんだな

83:デフォルトの名無しさん
22/08/20 00:31:59.15 YrrCECg9M.net
>>81
switchの方は初めて見た!
知らずに見たらちょっと考えちゃうよw

84:デフォルトの名無しさん
22/08/20 13:41:46.51 DoG0cN1P0.net
考えるな
感じるんだ

85:デフォルトの名無しさん
22/08/20 13:47:51.88 zH67Kdp1d.net
俺は()で囲むな

86:デフォルトの名無しさん
22/08/21 07:14:13.14 sPdtHxRX0.net
エロい人「割り込みの中で関数呼ぶな
なぜ??

87:デフォルトの名無しさん
22/08/21 07:26:44.64 calK6kMNd.net
バカな会社で働いてるから

88:デフォルトの名無しさん
22/08/21 07:46:27.87 3JIuIXQv0.net
>>85
環境によるけど割り込みに専用のスタック使ってるシステムとかだとそのスタックサイズはそれほど大きくなかったりするからかもね
てかそのエロい人に聞けよ

89:デフォルトの名無しさん
22/08/21 08:14:56.03 lk6Yo6Bld.net
再入可能でない関数ならわかるな

90:デフォルトの名無しさん
22/08/21 09:42:18.04 j3ukytx2a.net
stack8段しか無いcpuか

91:デフォルトの名無しさん
22/08/21 10:25:51.63 calK6kMNd.net
割込はなるべく速く返さないといけないので
関数呼び出しのオーバーヘッドを嫌うというのもある

92:デフォルトの名無しさん
22/08/21 16:28:21.98 lk6Yo6Bld.net
だとすると>>86でFAだな

93:デフォルトの名無しさん
22/08/22 09:18:01.26 rymTPk3V0.net
微妙なタイミング調整の_nop()マクロをオプティマイザが勝手に除去するのだがwwwwwwwwww
どうすりゃいいのよ

94:デフォルトの名無しさん (ワッチョイ 7f01-cac/)
[ここ壊れてます] .net
>>92
インラインアセンブラ
そもそも今時命令実行タイミングに依存する構成にするなよ...

95:デフォルトの名無しさん
22/08/22 10:11:25.02 xRj4VImad.net
Z80や6800でそんなことしてたけど
今時のCPUはnopでさえ速度が変動するからな

96:はちみつ餃子
22/08/22 10:15:31.51 /BwQkwng0.net
インラインアセンブラも最適化の対象になることがある。
現代的な開発環境なら intrinsic 関数が提供されてないか?

97:デフォルトの名無しさん
22/08/22 11:43:22.34 sosiPY3F0.net
最適化するなよw
そういうのを消すための最適化だろw

98:デフォルトの名無しさん
22/08/22 13:53:48.03 KX6mg0Ola.net
最適化したら >>96 が消えました

99:デフォルトの名無しさん
22/08/25 11:33:41.80 sT5+wQDE0.net
インライン記述じゃなく別個にアセンブラソースファイルに書いてアセンブルしろってことだな。

100:デフォルトの名無しさん
22/08/25 11:49:07.60 iqB4j8J+0.net
スカイネット 「環境の最適化のため、人類を消去しました」

101:デフォルトの名無しさん
22/08/25 13:23:55.27 sT5+wQDE0.net
環境の最適化のためにスカイネット自身の消去が最適だとなったら実行するのかね。

102:デフォルトの名無しさん
22/08/25 16:20:32.32 WIrE9pd90.net
組み込みでは下みたいに使った
__asm__ __volatile__()

103:デフォルトの名無しさん
22/08/25 20:06:49.61 PyYJPp//d.net
>>99
スカイネット「あれっ、誰に報告してんだろ…私ったら(テヘ)

104:デフォルトの名無しさん
22/08/26 06:44:51.10 DLmHAhGrd.net
>>100
i cannot self-terminate.て言ってたね

105:デフォルトの名無しさん
22/09/04 05:09:23.47 wx4H3U1ta.net
Learn C Programming with Dr. Chuck (feat. classic book by Kernighan and Ritchie)
freeCodeCamp.org
チャンネル登録者数 619万

106:デフォルトの名無しさん
22/09/04 10:23:39.44 RQxkFcRFa.net
>>104
1本で9時間超えてるのかすげー

107:デフォルトの名無しさん
22/09/04 19:10:32.17 Rodv+P070.net
C言語のサンプルコードで関数内で関数プロトタイプ宣言するコードに出くわしました。
コンパイル通らないだろうと思って、clangで下記のような関数内に関数プロトタイプ宣言する
コードをコンパイルするとエラーなく通りました。
C言語において関数内でプロトタイプ宣言をする利点というか理由というのはどういうものがあるのでしょうか。
#include<stdio.h>
void hello(void)
{
printf("%s\n","hello world");
}
int main(void)
{
void hello(void);
hello();
return 0;
}

108:デフォルトの名無しさん
22/09/04 21:54:56.70 moKhjs2Z0.net
>>106
私見だけど、その関数内でのみ呼び出すことを強調しているのかもしれない。
あと余計なこと。お遊びのネタ。本番で使うなキケン。
GCC拡張には関数の中で関数を定義できる機能がある。clangはこの先もおそらくサポートしない。
詳細が気になるなら gcc trampoline nested function で調べてね。

109:デフォルトの名無しさん
22/09/04 22:27:57.67 KVirSSMD0.net
main内の void hello(void); てプロトタイプ宣言(?)意味あんの?

110:デフォルトの名無しさん
22/09/05 01:27:33.63 TNrcEOZR0.net
具体的に言うと、ここの
『UMLの状態遷移図をC言語のStateパターンで実装&単体テストしてみる』というタイトルのブログの
void init_last_substate(FSM *fsm);
関数のプロトタイプ宣言です。State.c内でプロトタイプ宣言すればいいのに
なぜかState.c内のState_init関数内でプロトタイプ宣言しているのはなんでかなと。
実装自体はSubState.c内で定義されているのでState.c内で使うのであれば
プロトタイプ宣言が必要であることはわかるんですが、なんで関数内でプロトタイプ
宣言しているのかなと。

111:はちみつ餃子
22/09/05 01:31:45.75 QNR7HRCU0.net
>>106
言語仕様にもある有効な文法だけれど、それほど使われることはない。
宣言はそのスコープで有効になるから直接的な理由としては >>107 が述べている通り限られた範囲での使用を想定しているということだと思う。
範囲を限りたいのが何故かなのかというのはプログラム全体の構成によるので全体を見ないと意図を推し量ることは出来ない。
なので正確な事情はわからないけども、あえて一例として私がそういう書き方をするとしたらという前提で空想すると
 ・ あまり色々なところで呼ばれたくない関数がある
 ・ しかし呼び出し箇所は他の翻訳単位にあるので内部リンケージにすることも出来ない
というようなときにはヘッダにもファイルスコープにも宣言を書きたくないと思うことはあるかもしれない。

112:デフォルトの名無しさん
22/09/05 01:40:28.48 TNrcEOZR0.net
>>110
確かにそのコードはstatic宣言を各所に織り交ぜており、他ファイルからは関数が
呼び出せないようにしてありました。公開する関数は最小限にという感じ。
関数内でも関数のプロトタイプ宣言できるというのも、C言語の中では単なる変数宣言
double p;
と同じ扱いみたいに考えればいいのかもしれないと思いました。
typedef で関数型定義できますが、それと同じような扱いということです。
とりあえず納得しました。ありがとうございます。

113:デフォルトの名無しさん
22/09/05 04:58:10.54 YC0Agv6v0.net
>>106
理由は昔のいわゆるK%R Cの名残だ
main(argc, argv)
char **argv;
{
extern printf(), exit();
auto i 0;
for ( ; i < argc; i =+ 1)
printf("%s\n", argv[i]);
exit(0);
}

114:デフォルトの名無しさん
22/09/05 04:59:26.44 YC0Agv6v0.net
今そんなことをする必要は皆無
関数の実体がグローバルなのに
宣言がローカルなのは合理性を欠くだけ

115:デフォルトの名無しさん (ワッチョイ 27bb-Iguz)
[ここ壊れてます] .net
staticじゃなけりゃどこからでも呼べるからな

116:はちみつ餃子
22/09/05 11:16:15.22 QNR7HRCU0.net
そこらへんはプログラム的な都合だけでなく読む人に対しての意思表示という場合もあるから必要性だけで解釈することは出来ないよ。
今から書くプログラムではやめといたほうが良いが、この場合は今、目の前に実際にそう書かれているものがあるという話だから……。

117:デフォルトの名無しさん
22/09/05 12:45:24.21 NIl1ZTkW0.net
何か古い記述方法だった気がする

118:デフォルトの名無しさん
22/09/05 17:10:39.70 BqjHubPk0.net
何十年も前の機種依存C言語かもな

119:デフォルトの名無しさん
22/09/05 21:43:16.79 WAs1jsMo0.net
古い表記を引っ張ってきたのか
意思表示としてそう記述した(可能性が高い)のか
全て俯瞰してみないとい結論は出ないだろうが
そうできたところで、自分が使うことはないだろうといった代物

120:デフォルトの名無しさん
22/09/05 22:13:22.67 hTc6qxUq0.net
うむ。ないなあ。

121:デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
[ここ壊れてます] .net
namespace ってイマドキの C にあるの?

122:デフォルトの名無しさん
22/09/06 10:01:27.84 8iFyZ+3k0.net
ない

123:デフォルトの名無しさん
22/09/06 20:11:23.99 OXwnsseu0.net
今度の規格には static_assert は入るのでしょうか?

124:はちみつ餃子
22/09/06 20:15:43.73 TAdoM7Dg0.net
>>122
C23 に static_assert は入る。
C11 から _Static_assert が有ったけどこれも Alternative Spelling として残る。

125:デフォルトの名無しさん
22/09/07 01:40:32.73 nFqp2Ghc0.net
構造体の一括初期化の仕組みがよくわかりません。
#include<stdio.h>
enum Flag { First = 1, Second = 2, Third = 3, Finish = 4 };
typedef struct _FSM {
size_t eof;
size_t bytes;
size_t flags;
} FSM;
static FSM initState = { 0, 0, First};
void FSM_init(FSM *self) {
self = &initState;
}
int main(void) {
FSM fsm;
FSM_init(&fsm);
printf("%zu", fsm.flags);
return 0;
}
とFSM_initでFSM構造体のメンバの初期化を行おうとしたのですが、fsm.flagsにはゴミの値が入ってしまいます。
&self = initState;ではなく一つ一つ所属物を初期化すればちゃんと初期化できるのですが、
できればこの一括で初期化する方法のどこがまずいのか教えてほしいです。

126:デフォルトの名無しさん
22/09/07 01:42:03.54 nFqp2Ghc0.net
肝は
static FSM initState = { 0, 0, First};
でここの初期化がまずいみたいですがよくわかりません。

127:デフォルトの名無しさん
22/09/07 01:45:22.24 n6FjKa3l0.net
*self = initState;

128:デフォルトの名無しさん
22/09/07 02:03:29.87 nFqp2Ghc0.net
>>126
うまくいきましたが、すいません。
*self=initState;

self = &initState;
の違いがわかりません。
ポインタに対してなんでアドレスを渡す形だとまずいことが理解できません。

129:デフォルトの名無しさん
22/09/07 02:27:51.81 FvUlSDCrd.net
>>127
>self = &initState;
selfはアドレスをコピーした仮引数

130:デフォルトの名無しさん
22/09/07 03:14:26.39 7wpEGaL10.net
*selfはselfの実体の参照
&initStateはアドレスの参照

131:デフォルトの名無しさん
22/09/07 07:32:36.16 UR0dF6Y90.net
>>127
self = &initState;
これはポインタ変数selfにinitStateのアドレスを代入するが
このままFSM_init関数から戻っているので、代入結果が即座に破棄され
何もしていないに等しい
*self = initState;
これはポインタ変数selfが指し示す先つまり構造体変数fsmに
構造体変数initStateの内容を転記する
FSM_init関数から戻ってもmainの変数fsmは残っているので
後続のprintf関数の実行結果に反映される

132:デフォルトの名無しさん
22/09/07 09:54:43.70 S6Oj2ikO0.net
void func(int a) { a = 10; }



133: int b = 50; func(a); とやっても a は 10 にならず a は 50 のまま 関数引数の型のままの書き戻しは 呼び出し元に反映されない これを int → int * に読み替えた場合が質問のケース



134:デフォルトの名無しさん
22/09/07 10:01:21.59 S6Oj2ikO0.net
訂正
 int b = 50;
 func(b);
 とやっても b は 10 にならず b は 50 のまま

135:デフォルトの名無しさん
22/09/07 10:16:34.68 S6Oj2ikO0.net
・ポインタを渡して関数内ではその指し先を利用して内容を書き換える (scanf みたいな感じ)
・戻り値で内容をどかっと戻す (=呼び出し元で代入してね)
Cの文法ではこの2パターン

136:ハノン
22/09/07 20:35:02.84 DxyXj8J8H.net
>>127
参照 & は「ポインタで書くやりかた」の見せ方を変えただけ、と考えるのがいい
すなわち、ポインタを使った書き方に習熟しないかぎり、参照の意味はわからない
参照をポインタから切り離して理解するのは不可能
参照がわからなければ、まず、ポインタを使った書き方ばかりで書きまくり、ポインタなら自信がある、くらいになるのがいい
参照はポインタを理解してからはじめて使い始めるべきもの

137:デフォルトの名無しさん
22/09/07 21:11:00.47 nFqp2Ghc0.net
>>134
いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。

138:デフォルトの名無しさん
22/09/07 22:08:19.73 nFqp2Ghc0.net
FILE *fp;
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。

139:デフォルトの名無しさん (ワッチョイ e710-q8Yd)
[ここ壊れてます] .net
ポインタに入ってる数値を書き換えるからそうじゃなきゃ変えられないでしょ
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの

140:ハノン ◆QZaw55cn4c (US 0Hff-KcK1)
[ここ壊れてます] .net
もっとも、私は pascal から入ったから、ポインタなくして参照を理解していた人なのではありますが‥‥うーむ

141:デフォルトの名無しさん
22/09/07 22:31:50.29 gjYyI5to0.net
ポインタのアドレス取ったときとかポインタのポインタでごちゃごちゃになる人は
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの

142:デフォルトの名無しさん
22/09/07 23:04:25.54 nFqp2Ghc0.net
>>137
なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。

143:デフォルトの名無しさん
22/09/07 23:32:06.28 zeO2o007M.net
int hoge(int *a) { *a = 1; }
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した

144:デフォルトの名無しさん
22/09/07 23:35


145::11.50 ID:nFqp2Ghc0.net



146:デフォルトの名無しさん
22/09/07 23:39:24.34 nFqp2Ghc0.net
何回も質問しているものです。
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
URLリンク(ideone.com)

147:はちみつ餃子
22/09/07 23:39:37.84 51dNe1to0.net
>>142
それは C++ の機能の話ね。
機械語にされたときの実体としては参照はポインタと同じことをしている。

148:デフォルトの名無しさん
22/09/07 23:41:02.70 nFqp2Ghc0.net
最初の付近はうまくエンコードされているんですが、途中でごみの値が入ってくる
ようでずれてきます。どこにゴミが入っているのかわかりません。

149:デフォルトの名無しさん
22/09/08 00:50:34.87 0dKPxAYF0.net
tmpfile()で作られる作業ファイルはどこに作られますか?
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint

150:はちみつ餃子
22/09/08 01:00:19.58 MG9wnc1h0.net
>>146
glibc だと P_tmpdir が使われた上で失敗したら /tmp に作る。
musl だと /tmp に決め打ち。
作ったファイルはクローズするかプロセスが終了したら削除される。

151:143
22/09/08 02:30:52.24 MgWIrRAL0.net
コードの構造が自分でもわかり難かったので、フルスクラッチで書き直しました。
URLリンク(ideone.com)
でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。

152:デフォルトの名無しさん
22/09/08 02:56:32.93 m+If4M0FM.net
>>148
上から下までスクロールしたら一瞬で分かったw

153:デフォルトの名無しさん
22/09/08 08:55:08.15 0dKPxAYF0.net
>>147
サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな

154:はちみつ餃子
22/09/08 09:15:06.66 MG9wnc1h0.net
>>150
3.11 以降の Linux カーネル、かつファイルシステムのサポートがあれば名前のないファイルを作るということらしい。
他のプロセスからは観測することが出来ない。

155:デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
[ここ壊れてます] .net
>>143
3の倍数と4の倍数でずれるから
穴埋め方法の仕様嫁

156:デフォルトの名無しさん (ワッチョイ e769-9TNW)
[ここ壊れてます] .net
8bit目が立ってるデータだと char を size_t にキャストするとよろしくない可能性
あと末尾のパディング処理

最新は rfc4648 か

157:デフォルトの名無しさん
22/09/08 10:12:47.05 dSUuwrfW0.net
>>148
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw

158:デフォルトの名無しさん
22/09/08 10:22:53.70 dSUuwrfW0.net
>>150
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
URLリンク(sonic)
64.com/2004-12-07.html

159:はちみつ餃子
22/09/08 10:30:42.77 MG9wnc1h0.net
>>148
主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。

160:デフォルトの名無しさん
22/09/08 10:34:35.91 0dKPxAYF0.net
>>150
>>155
ありがとう!すっきりした

161:デフォルトの名無しさん
22/09/08 10:35:11.25 0dKPxAYF0.net
>>150>>151

162:デフォルトの名無しさん
22/09/08 23:34:00.51 QimgDhZ1M.net
>>148
解決したのか知らんけど、freadが必ずBUFSIZE分読み込むとは限らんぞ
なので、直後のforループはnreadまでにしないとゴミを処理してしまう

163:デフォルトの名無しさん
22/09/09 00:38:56.32 eFldOldK0.net
>>159
ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。

164:148
22/09/09 01:45:37.54 eFldOldK0.net
読み込むデータによってゴミデータが入ったり入らなかったりすることがわかった。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
URLリンク(ideone.com)
読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。

165:148
22/09/09 01:56:18.41 eFldOldK0.net
わかった。日本語部分が処理できてなかったことが原因だ。
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?

166:148
22/09/09 01:57:45.15 eFldOldK0.net
1バイトで読み込んでるから2バイト文字がうまく読み込めないということかな?

167:148
22/09/09 02:04:19.38 eFldOldK0.net
1バイトづつバイナリデータを読み込みしたかったので、fread(buf,...)の
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
URLリンク(ideone.com)
010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?

168:デフォルトの名無しさん
22/09/09 02:19:22.29 V/M3y8c30.net
>>153が正しい
size_t stack = (size_t)(unsigned char)c;

169:デフォルトの名無しさん
22/09/09 02:52:44.78 eFldOldK0.net
>>165
スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。

170:148
22/09/09 02:53:47.99 eFldOldK0.net
>>153
読み返してみると鮮やかですね。昨日の段階では何のことやら?って感じでしたが。
ありがとうございます。

171:デフォルトの名無しさん
22/09/09 03:37:48.54 JkEyHRIQ0.net
>>166
>unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要

172:デフォルトの名無しさん
22/09/09 06:49:36.79 Cx7xgzBv0.net
>>168
char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
URLリンク(www.jpcert.or.jp)

173:デフォルトの名無しさん
22/09/09 10:32:00.65 PQbAFFlG0.net
数値と文字コードの認識の違いはどこらへんに出てくるのでしょうか?

174:デフォルトの名無しさん
22/09/09 16:58:25.15 ZqL3j+SP0.net
環境依存によるとこが多すぎて、その都度環境に応じて調べるしかない
プログラム全般に言える事

175:デフォルトの名無しさん
22/09/09 20:26:03.68 wh55t5+tM.net
文字はutf-8でも一文字が数バイト必要な事があるので、charはもはや要らない子と言える
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね

176:デフォルトの名無しさん
22/09/09 20:34:47.77 AfgZ2PrAM.net
なお中国や日本、韓国などに限る

177:デフォルトの名無しさん
22/09/09 21:21:58.31 CwUslwUl0.net
wchar_tこそ要らない子やん
お前一体何バイトなんだよ

178:デフォルトの名無しさん
22/09/09 23:02:27.43 JkEyHRIQ0.net
>>169
>char は 8bit とは限らん、
うん、その指摘はされると思ってた。
>charはsigned charやunsigned charとは違う型だよ
なるほど、その認識はなかったは。

179:デフォルトの名無しさん
22/09/09 23:22:11.84 qKP12tcq0.net
自分はvb→C言語→機械語だけど
機械語知らないとダメだよなって思ったわ
大体CPUの仕様と合わせるんだよな
8bitも昔のCPUの慣習出しさ
だからプレステのCPU大好きとかライゼンサイコー、いやいややはりインテルだろう
なんて言う自作オタがやり始めるとかなり速いんだよな
自作PCの構造はCPUの中身に似てるから

180:デフォルトの名無しさん
22/09/10 00:37:03.60 d6i83HiwM.net
>>174
Windowsだと2byteでLinuxだと4byteだな
しかしバイト数を気にしてはいけない
気にしなければ可搬性のあるコードを書ける

181:148
22/09/10 02:16:33.70 bSy2C3T30.net
文字化けのところは手に負えないですが、おかげさまでbase64エンコーディングプログラムが完成しました。
ここで言われたことは全部含めてみました。
構造体のタグ、enum型、charじゃなくてuint8_t、終端処理など。
URLリンク(ideone.com)
コードが汚いなど直すところありましたらどしどしご意見ください。
とりあえず、最初に使ってみる言語はbase64エンコーディングプログラムを組んでみて
なれてみようという方針なので。
次はVBAで組んでみるか、sha256プログラムをC言語で組んでみようか考えてます。

182:デフォルトの名無しさん (ワッチョイ adc2-+Wio)
[ここ壊れてます] .net
struct tmって、冗長な設計になってるよね
たとえば tm_mon == 1 && tm_mday == 1 なら tm_yday == 0 のはずだけど tm_yday >= 1 にもなれる
こういう矛盾がある場合の扱いって規格票のどっかに書いてあったっけ?

183:デフォルトの名無しさん
22/09/11 14:26:36.00 Y1sYJFelM.net
たとえば規格書のmktimeにはカレンダー時間で表現できなければ-1を返すって書いてあるかそう実装するのが正しそうだけども

184:はちみつ餃子
22/09/11 14:31:15.93 D/VbhUuk0.net
>>180
tm_yday は無視するとも書いてあるぞ。

185:デフォルトの名無しさん
22/09/11 14:32:58.51 LP1WepGR0.net
レス㌧x
カレンダー時間で表現できるか否かということは
tm_year, tm_mon, tm_mdayのことで、tm_ydayには該当しない議論だよね
逆にtm_ydayに合わせるように補正はしないとなると
ここに優先順位があるのかな

186:デフォルトの名無しさん
22/09/11 14:34:54.92 LP1WepGR0.net
すまん、ちょっと外出する
夜には戻る

187:デフォルトの名無しさん
22/09/11 14:37:22.22 Y1sYJFelM.net
あらほんとだ。戻り値の説明しか見てなかったわ

188:デフォルトの名無しさん
22/09/11 15:00:19.15 hGIJSvzu0.net
>>182
そもそもtm_wdayとtm_ydayは更新されるって書いてあるし
関係ないけど
・tm_mday: 1 から 31 の範囲の日付。
・tm_mon: 1 月からの月数 (0 から 11 の範囲)。
なのは毎回もやるわ、なぜ両方0スタートじゃないのか...

189:はちみつ餃子
22/09/11 15:04:45.97 D/VbhUuk0.net
>>185
月は (英語では) 月の名前に置き換える (配列から名前を引く) という都合から自然にそうなったという説は聞いたことがあるな。
日は番号をそのまま表示するもんだから最初から番号通りのほうが都合がいいし。

190:デフォルトの名無しさん
22/09/15 17:53:22.84 gNCVLuZy0.net
ローカル変数の宣言で、宣言しようとしているポインタの初期化子に、同じ文で
宣言された変数を参照するのは規格上OKですか?
/* test1.c */
1 | int main(int argc, char **argv)
2 | {
3 | char s[100] = {'A'}, *p = s;
4 | int i = 10, *a[10] = {&i};
5 | return 0;
6 | }
最新の gcc で試したところ、-std=c89 -pedantic の場合に下記の警告が出ます。
特に3行目が OK で、4行目が駄目な理由がよく分からないです。
どちらもスタック上の相対位置はコンパイル時に決まると思うのですが。
Cの文法について詳しい方、教えてください。
gcc --version
gcc (GCC) 12.2.1 20220819 (Red Hat 12.2.1-1)
gcc -O0 -std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
test1.c: In function ‘main’:
test1.c:4:27: warning: initializer element is not computable at load time [-Wpedantic]
4 | int i = 10, *a[10] = {&i};
|            ^
gcc -O0 -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
警告なし

191:デフォルトの名無しさん
22/09/15 20:06:58.44 C6syfEgyd.net
C99より前は集成体(配列、構造体)に対する初期化子定数式(アドレス定数式)でスタックは認められていないっぽい
3行目の初期化対象は配列じゃないでしょ

192:デフォルトの名無しさん
22/09/16 06:50:50.62 jyhWPRLZ0.net
int main(void)
{
int a = a;
}
これもOKなんだが

193:デフォルトの名無しさん (スッププ Sd0a-39XR)
[ここ壊れてます] .net
>>189
スタック上のアドレスを使ってポインタを初期化できるかって話だろ

194:デフォルトの名無しさん
22/09/16 19:31:34.25 alBs0lLWd.net
>>187
{&i}だけだったら初期化は簡単だけど
その書き方だと本来{&i,&グローバル変数,NULL...}などと書けるのでそうなると特殊な初期化が必要になるんじゃないかな

195:デフォルトの名無しさん
22/09/16 19:59:25.14 u2ZYVkG20.net
一見
スタックに実体をもつ配列の先頭はセーフで (3行目)
スタックに実体をもつ変数のポインタはアウトというふうに見えるけど (4行目)
{ } の中か否かの差もあるんやね

196:デフォルトの名無しさん
22/09/17 00:57:57.08 GfZyyjDu0.net
>>190
そんなん言い出したら自動変数をポインタで指せるのかさえ怪しくなってくるな

197:デフォルトの名無しさん
22/09/17 12:49:57.03 fh691Hyrd.net
スコープ内でアドレスが参照されたならば
自動変数はレジスタ変数にはならなくなる
「自動」の意味

198:デフォルトの名無しさん
22/09/17 19:52:14.52 fgoWI+8da.net
win10(以下win)
strawberry perl入れた時一緒にいれたgcc
wsl
ubuntu22.04 gcc
どっかでみた配列関係のサンプルで
(間違えるとnull見つかるまで一生探し続けるよ的なコード)
で試したら
winで値がおかしい
linuxで正しい
とりあえずwin側でgdbで見ると
winで格納アドレスが逆順になってました
例えばコード上で
array1うんたら
array2かんたら
とあって
array2がアドレス100番台
array がアドレス200番台
みたいになってました
この挙動は環境依存なのかバグなのか知りたいです
まぁ結局両方windowsなんですが

199:デフォルトの名無しさん
22/09/17 19:56:51.12 ZRyqS0700.net
ネットワークオーダーとかエンディアンとかが絡んでる可能性はあるけど、コードを見ないとなんとも

200:デフォルトの名無しさん
22/09/17 20:03:08.34 PxOaZq6Kd.net
>>195
抽象的すぎて全然わからんw

201:デフォルトの名無しさん
22/09/17 20:04:45.56 fgoWI+8da.net
コードは
URLリンク(www.delftstack.com)
手入力でミスってたらごめんなさい

202:デフォルトの名無しさん
22/09/17 20:08:18.29 fgoWI+8da.net
因みにこっちのwin環境だと
上サイトで24byteになるはずの所が10byteになります

203:デフォルトの名無しさん
22/09/17 20:22:45.77 ZRyqS0700.net
strlenのことか?
文字列と違ってchar配列の末尾には自動的にnull挿入されたりしないから、nullまで数え上げるstrlenが何を返すかわからないし、環境によってはメモリアクセス違反で落ちるかも

204:デフォルトの名無しさん
22/09/17 20:26:08.77 fgoWI+8da.net
いや多分違います
アドレスが逆
多分ここが重要なんですがその原因が
と言うところです

205:デフォルトの名無しさん
22/09/17 20:44:25.86 LY5v/fLv0.net
環境依存です
ゼロで終端されていないものにstrlenを呼んではいけません
そのコードが誤り

206:デフォルトの名無しさん
22/09/17 20:51:16.94 I+4Vfslra.net
うーん
そう言うことじゃなくて・・・
なんでメモリアドレスの格納が逆になるの?
と言うところです
cの規格的な話じゃなくてですね・・・

207:デフォルトの名無しさん
22/09/17 20:58:26.77 LY5v/fLv0.net
そのページを作った人の環境(コンパイラとバージョン)ではarr,arr2の順で
あなたの環境ではarr2,arrの順なんでしょ
たまたまそうなっただけです

208:デフォルトの名無しさん
22/09/17 21:10:35.35 I+4Vfslra.net
文系脳で行き着く先っていつもそうなんですよね
でも残念ながら「それ」がないんですよ
この世界
たまたま
なんかわかんないけど
偶然
楽しけりゃいいじゃん
なんで生きてるのお前?
馬鹿は嫌い 回線で首でも吊ってろカスが
ジパング馬鹿しかいないからもう寝る

209:デフォルトの名無しさん
22/09/17 21:15:00.75 W7nqA9Zmd.net
オタクくん怒って寝ちゃったw

210:デフォルトの名無しさん
22/09/17 21:44:56.47 njcq0eeLa.net
スタックはアドレス高位から低位の方向に積まれることが多いから、arr2のアドレスがarrのそれより小さくなるとかですかね

211:デフォルトの名無しさん
22/09/17 21:46:48.25 aOSn8JHC0.net
そういう人を落とし込める記述はやめよう

212:デフォルトの名無しさん
22/09/17 23:27:39.41 eA0eWCp60.net
スタックの方向などは環境依存だろ
環境依存は他にも、little/big endian とか、
char が、0~255, -128~127 のどちらなのかとか
文字コードが、BOM 無しUTF-8 以外とか

213:デフォルトの名無しさん
22/09/18 01:46:10.06 3xNGEVex0.net
gdbの使い方、ここで質問してもいいですか?

214:デフォルトの名無しさん
22/09/18 02:19:18.49 OVhdQ/fk0.net
>>210
大きく言語自体から脱線するようだとあまりよくないかなと思うけど、
ささいなことなら多少は良かろうと思うし、程度次第じゃね。

215:デフォルトの名無しさん
22/09/18 02:40:43.36 3nFqfKLUH.net
>>209
UTF-8 に BOM は本質的に不要です
なぜならば BOM = Byte Order Mark ですが、UTF にバイトオーダーなど存在しません
BOM なし、と断ること自体、頭が悪い証拠を如実に表出していると愚考させていただきます
馬鹿は死ね

216:デフォルトの名無しさん
22/09/18 02:43:34.57 Z+lYrLLqa.net
はじめてのC言語完全入門!【Hello World〜ポインタまで徹底解説】
91,121 回視聴
freeCodeチャンネル

217:デフォルトの名無しさん
22/09/18 03:28:52.56 OVhdQ/fk0.net
>>212
BOM はエンコード方式の識別に使われる場合もあると公式 (unicode consortium) の資料に書かれている。
BOM が BOM という名前である以上は本来の用途からの転用ではあるが、
バイトオーダーだけを根拠にして不要と断じるのはエンジニアリング的に良い姿勢ではないな。

218:デフォルトの名無しさん
22/09/18 04:26:41.31 GkyrVNWr0.net
>>212
いい大人がバカとか4ねとか言ってるの見ると悲しくなってくるわ
人付き合いをろくにしてこなかった精神的にガキのおっさん痛すぎる

219:デフォルトの名無しさん
22/09/18 05:15:19.35 fdsnSmbGd.net
>>205
めちゃくちゃだよアンタw
文系ポエムは他でやんなさい

220:デフォルトの名無しさん
22/09/18 05:26:48.38 fdsnSmbGd.net
>>205
よく見るとそのページ内容がむちゃくちゃだなw
データが格納される順番はコンパイラ依存なのでそんなサンプルコードは作ってはいけない
「まず、arr のオブジェクトサイズは 24 バイトと表示されますが、」じゃねえよw
「内部の詳細を無視してしまうと恐ろしいエラーが発生する可能性があります。」もう起こっているw
以上

221:デフォルトの名無しさん
22/09/18 10:38:22.56 kY5VkQwD0.net
>>198
そもそも上のコード
size = 24 bytes
size = 17 bytes
この2つはどこから出てきたんだ?
printCharArray のあとの printf("size = %lu bytes \n", ... ); はひとつしかないのに
>>195
array1とarray2がそれぞれスタックに積まれるなら array2、array1の順は正しいし
array1とarray2がリテラルとしてコード上に存在するならarray1、array2の順は正しい
ただの最適化の問題じゃないのか

222:デフォルトの名無しさん
22/09/18 13:53:49.44 KpBP36NGa.net
文系は全称と単称の区別が出来ない
大抵の馬鹿はこれで判別出来る

223:デフォルトの名無しさん
22/09/18 14:04:23.72 CIgAfYZs0.net
そういう表現も、大体根拠が希薄
血液型占いと同程度

224:デフォルトの名無しさん
22/09/18 14:12:29.01 Rev08jtKa.net
>>203
規格では一切順序の保証はないので
同じ結果が欲しければそのぺーじと同じ環境を用意してください

225:デフォルトの名無しさん
22/09/18 18:22:49.00 JcdidFMxd.net
機械翻訳まるだしだし
Pythonのおまけで載ってるだけだから
そんなページあてにするなとしか

226:デフォルトの名無しさん
22/09/18 18:23:22.20 rN2/Bhfe0.net
>>212
Windowsのメモ帳でUTF-8で保存するとBOMが先頭に入った状態になるよね。
そういう変な出力をするソフトがあるせいでUTF-8なのにBOMの有無を意識しなきゃいけなくなるんだよ。

227:デフォルトの名無しさん
22/09/18 19:08:21.37 OVhdQ/fk0.net
>>223
UTF-8 ではない形で保存されている可能性はいつでもあるわけだが……。

228:デフォルトの名無しさん
22/09/18 19:35:00.75 CIgAfYZs0.net
メモ帳で保存する場合、選択はこの中から
URLリンク(i.imgur.com)

229:デフォルトの名無しさん
22/09/18 20:14:09.21 tcByEu8Hd.net
wcharはutf8圧に負けて廃れるんかね
Cのようなロートル言語使ってると固定幅(但し幅は決まっていない)エンコの有り難みをひしひしと感じる

230:デフォルトの名無しさん
22/09/18 21:11:58.46 /3elu/X80.net
ストレージはutf-8
メモリーはwchar_t
じゃね?

231:デフォルトの名無しさん
22/09/18 22:03:00.04 rN2/Bhfe0.net
>>225
それでBOM付き選んじゃうやつが居るんだろうな。選択肢無くして欲しいものだ。

232:デフォルトの名無しさん
22/09/18 22:05:23.89 rN2/Bhfe0.net
>>226
入出力でJavaみたいに変換すれば良いじゃん。
iconvライブラリとか使って。

233:デフォルトの名無しさん
22/09/18 22:23:37.69 zhWgY60z0.net
>>229
ふぇふふ…

234:デフォルトの名無しさん (ワッチョイ 9f2c-ret5)
[ここ壊れてます] .net
メモ帳は、BOM 付きUTF-8 になるから、ダメ

BOM無しUTF-8は、VSCode, サクラエディタなどを使う。
TeraPad は、新し目の文字に対応していないので、ダメ

235:デフォルトの名無しさん (ワッチョイ 9f63-E+l9)
[ここ壊れてます] .net
メモ帳、デフォルトでBOM無しで保存する
BOM付けるにはセレクトで一番下を選ぶ操作が必要

236:デフォルトの名無しさん (テテンテンテン MM3f-2Jl6)
[ここ壊れてます] .net
UnicodeのBOMはUTF-{8, 16, 32}で並び順が違うから判別に使える
逆に無いと推測に頼るしかない
メモ帳はSJISのテキストを開かれることもあるから、BOM無しUTF-8の場合は推測している
BOMが有れば確実に判別出来る
なのでBOM付きUTF-8は悪くない

237:デフォルトの名無しさん (ワッチョイ 5701-dv3E)
[ここ壊れてます] .net
WindowsではBOM付きのほうが便利だけどね。

238:デフォルトの名無しさん
22/09/18 23:12:31.63 a87PubfG0.net
gccもBOMに対応したことですし。

239:デフォルトの名無しさん
22/09/18 23:23:26.35 CUVLEdWC0.net
UTF-8にBOMが要らないと主張しているのは今の現実について言っているわけじゃなくて
「UTF-8しか存在しない美しい世界」を目指している活動家だからな。
説明したところで話が?み合わない。

240:212
22/09/19 00:00:08.46 hV59E8S+H.net
>>236
よくわかっていますね、実はそうなんですよね

241:デフォルトの名無しさん
22/09/19 00:15:30.26 YVA4ZVOh0.net
自覚したなら今度からはバイトオーダーにかこつけたアホな主張はやめとけよ。

242:ハノン
22/09/19 00:18:28.74 hV59E8S+H.net
美しい世界(爆笑)のために、今後も活動を続けていきます!

243:デフォルトの名無しさん
22/09/19 02:37:34.04 Z9ZARiSG0.net
ユニコードの上位セットであるGB18030もあるんだけど。

244:デフォルトの名無しさん
22/09/19 11:10:12.09 NE4NRLG3F.net
>>236
そんなあなたに Nim がおすすめ

245:デフォルトの名無しさん
22/09/19 11:11:36.70 NE4NRLG3F.net
>>233
ASCII (8bit以内) しかないテキストに BOM 付いてたらさすがにうざいと思う

246:ハノン
22/09/19 11:21:09.68 PpMrjNAJH.net
>>242
ですよね!
コードは普通コメントも英語で書くし、なんで BOM がつかなきゃならないのか意味不明なんですよ、ましてや UTF-8 に BOM つけてもいい規約なんて後付けなんでしょう?
美しい世界(爆笑)のために今日もがんばります!

247:デフォルトの名無しさん
22/09/19 11:40:57.93 YVA4ZVOh0.net
>>241
まさに今、話が噛み合わないことを痛感した。

248:デフォルトの名無しさん
22/09/19 11:41:54.30 zeLiCYh20.net
なくても使えるなら、ない方が良い

249:はちみつ餃子
22/09/19 11:43:27.96 npVSxydm0.net
どれでもいいけど規格で決めないという対処には愚痴を言いたくもなる。

250:デフォルトの名無しさん
22/09/19 11:55:32.42 M3xsgC0JM.net
>>242
ウザいの定義を言え
普通にテキストエディタで編集してるだけなら気付きもしないだろう

251:デフォルトの名無しさん
22/09/19 12:00:13.75 zeLiCYh20.net
気付かなかったあなたはたぶん幸せ者です

252:デフォルトの名無しさん
22/09/19 12:13:35.24 b1CdxAyP0.net
10年前ならともかく今時BOMの有無で困ることなんてほぼなくね?

253:デフォルトの名無しさん
22/09/19 12:30:39.37 /08McGz80.net
BOMなしUTF-8のデータを読ませるとエラーになるプログラムを作ったやつがいる。
こういうやつをどうするべきか?

254:デフォルトの名無しさん
22/09/19 12:33:02.11 zeLiCYh20.net
市中引き回しのうえ、磔獄門で

255:デフォルトの名無しさん
22/09/19 13:00:37.09 YVA4ZVOh0.net
仕様で読めることになっているのにエラーになるならバグだがそうでないなら読ませる方が悪い。
日本語Windows向けアプリの大半はそうだな。

256:デフォルトの名無しさん
22/09/19 13:09:05.53 /08McGz80.net
仕様ではUTF-8と書いてあるだけ。ならばBOMの有無に関係なく読めるようにするべき。

257:デフォルトの名無しさん
22/09/19 13:13:10.64 zeLiCYh20.net
仕様ではUTF-8と書いてあるなら、あったら読み飛ばせば良いだけだな

258:デフォルトの名無しさん
22/09/19 13:29:40.55 /08McGz80.net
にも関わらずBOMがないとわざわざエラーを出して終わる

259:デフォルトの名無しさん
22/09/19 13:40:15.70 b1CdxAyP0.net
単なるバグだろ、とっとと直させろよ

260:デフォルトの名無しさん
22/09/19 14:03:09.97 Y3ojWtlT0.net
> こういうやつ
BOMなしUTF-8のデータそのものを修正したいのか
BOMなしUTF-8のデータを読めるようにプログラムを修正したいのか
プログラムを作ったやつに復讐したいのか
どれだ

261:ハノン
22/09/19 15:32:18.43 PpMrjNAJH.net
BOM はもともと UTF-16 のためのものでしょう?
それを、UTF-8 に対しても無条件に BOM をつけてしまうウンコエディターを量産している奴等に問題があるん�


262:ナすよ… また、正直にいって、規格で決めればいいとかいう思考停止にも我慢ならないんですよ 美しい世界(爆笑)のために今日もがんばります!



263:デフォルトの名無しさん
22/09/19 15:34:28.84 Z9ZARiSG0.net
HTMLもBOM推奨してなかったっけ。

264:デフォルトの名無しさん
22/09/19 15:56:49.87 zeLiCYh20.net
HTMLの場合、「BOM」付けると、PHP で謎の空白ができてしまう など動作や表示に不具合が出る可能性があるそうです。

265:デフォルトの名無しさん
22/09/19 16:04:04.51 Z9ZARiSG0.net
それは、BOM付けるのがPHPの仕事だからじゃないの?

266:デフォルトの名無しさん
22/09/19 16:20:33.07 x76VqF340.net
PHPは中途半端に歴史が古いから、Unicodeといえば、UTF-16なんだよな。
でもそのおかげでWindowsとの相性は悪くない。

267:デフォルトの名無しさん
22/09/19 16:20:51.69 zeLiCYh20.net
そもそも UTF-8 には、エンディアンの違いがなく、BOM(バイトオーダーマーク)を付ける必要がないんだそうだ

268:デフォルトの名無しさん
22/09/19 16:22:57.02 zeLiCYh20.net
HTMLの場合はHEADに使っている文字コード情報が入っているのでそれを見れば良い事になる

269:デフォルトの名無しさん
22/09/19 16:25:44.76 Z9ZARiSG0.net
>>264
たしか規格でBOMを優先することになってなかったっけ?

270:デフォルトの名無しさん
22/09/19 16:33:42.03 zeLiCYh20.net
文字列としてバイトオーダーが実際に問われるのは、
UTF-16やUTF-32のケースだけです
その場合は必要ですね

271:デフォルトの名無しさん
22/09/19 16:34:41.81 Z9ZARiSG0.net
確認したところ、なってたわ。
HTMLパーサー書いたことがあるから、おぼろげに覚えてた。

272:デフォルトの名無しさん
22/09/19 16:46:36.41 Z9ZARiSG0.net
・BOMがある場合、BOMに従う。
・ない場合、500ms、あるいは1024バイト読み込むまで待機し、エンコーディング走査アルゴリズムを呼び出す。
エンコーディング走査アルゴリズム内で、ヘッダー内の情報が読み取られる場合もある。
(このアルゴリズムでも、他に優先される情報がある。)
やはり、HTMLにおいては、BOMをつけるべきだな。
読み込みが速くなるし、文字コードの違いを利用した攻撃を避けることが出来るし。

273:デフォルトの名無しさん
22/09/19 16:47:54.37 zeLiCYh20.net
HTMLの場合は、HEADに使用するcharsetが記述されてますから心配ありません

274:デフォルトの名無しさん
22/09/19 16:48:57.21 Z9ZARiSG0.net
昔の外国映画で「ふにゃちん野郎が!」という悪口があったよね。
今後は「BOM無し野郎が!」と言うことを提案いたします。

275:デフォルトの名無しさん
22/09/19 16:49:03.30 zeLiCYh20.net
それにUTF-8にはバイトオーダーがありません

276:デフォルトの名無しさん
22/09/19 16:50:38.05 Z9ZARiSG0.net
>>269
規格上、BOMのほうが優先される。
BOMがある場合、エンコーディング走査アルゴリズムは呼び出されない。
BOMをつけましょう。

277:デフォルトの名無しさん
22/09/19 16:52:03.62 Z9ZARiSG0.net
BOMをつけないとセキュリティ上の問題がある。

278:デフォルトの名無しさん
22/09/19 16:52:15.94 zeLiCYh20.net
付けたWebサイトをここで公開して下さい
楽しみにしています

279:デフォルトの名無しさん
22/09/19 17:25:06.78 UNULYZvbM.net
すべてのUTF-8にBOMがついてたらSJISはもっと早く消えてくれたと思うんだよね

280:デフォルトの名無しさん
22/09/19 17:31:57.08 Z9ZARiSG0.net
この話題は、BOMをつけましょうということで、良いのでは?

281:ハノン
22/09/19 18:02:53.27 PpMrjNAJH.net
>>276
違います
BOM を付けるべき正統な理由がある時には付け、特に理由がなく惰性で付けてるんだったらやめよう、です

282:デフォルトの名無しさん
22/09/19 18:05:47.85 Z9ZARiSG0.net
BOMを付けていない人を見かけたら、注意して差し上げましょう。
ということで、良いのでは?

283:デフォルトの名無しさん
22/09/19 18:12:09.41 iQkZER0Ad.net
テキストファイルを開いたとき最初の三文字がゴミかどうかいちいち判断するの?
2つのテキストファイルを結合するときゴミをひとつにまとめる処理するの?
BOMという考えが誤りなんだよ

284:デフォルトの名無しさん
22/09/19 18:14:42.87 Z9ZARiSG0.net
法令でBOMを義務付けるべきでは?
BOMが無かったら通報するみたいな。

285:デフォルトの名無しさん
22/09/19 18:15:00.74 zeLiCYh20.net
Windowsの一部アプリでBOMがないと動作不具合起こすんだよ
Officeとか、Officeとか、その辺
この辺への思いやりが必要な時は付けてあげると良い

286:デフォルトの名無しさん
22/09/19 18:19:47.40 BENNO3a0H.net
>>278
それに加えて BOM を無駄につけている人を見かけたら、注意して差し上げましょう、も追加してください。

287:デフォルトの名無しさん
22/09/19 18:20:53.56 BENNO3a0H.net
>>280
その法令は間違っていますね
正直いって、規格で決めればいいとかいう思考停止にも我慢ならないんですよ
美しい世界(爆笑)のために今日もがんばります!

288:はちみつ餃子
22/09/19 18:22:38.11 npVSxydm0.net
>>279
ふたつのテキストファイルが Unicode である保証もない。
メタ情報で保証があるなら BOM があっても困らないし、
保証がないなら BOM があろうがなかろうが困る。

289:デフォルトの名無しさん
22/09/19 18:23:22.11 BENNO3a0H.net
>>281
たしかに office とか office とか office とか office とかに思いやりを示す寛大な処置ということであれば、付けて差し上げることにやぶさかではないのですけれどもね

290:デフォルトの名無しさん
22/09/19 18:27:12.50 YVA4ZVOh0.net
>>277
後半に関して言えば、そのテキストがどのエンコードを用いているかが他の手段で示されているなら
BOMは用いるべきではないとされているからそれに従えばいい話だね。
「俺が扱うテキストは全部UTF-8に決まってるんだからBOMは要らない」という自己中心的な主張と
混同してくれなければいい。

291:デフォルトの名無しさん
22/09/19 18:28:42.31 Z9ZARiSG0.net
まあ私はどちらでも良いんですけれども。
(レイヤード・ストリームをつこてますので)
gccがBOMに対応したのだから、BOM付ける陣営の勝利では?

292:デフォルトの名無しさん
22/09/19 18:33:34.93 Z9ZARiSG0.net
ところで明日は地下鉄が止まるかもしれないので、調べておいた方が良いですよ。

293:デフォルトの名無しさん
22/09/19 18:35:51.09 Z9ZARiSG0.net
わたくし思うのですが、BOMに対応しないソフトウェアを企画してしまう技術者って、もはや技術者で無いのでは?
ユーザーが必要としてるわけですからね。

294:デフォルトの名無しさん
22/09/19 19:59:29.61 x76VqF340.net
WindowsはBOMがあった方が判別しやすいが、LinuxやUNIXはBOMがあると余計なものが付いているという感じになる。
マルチバイト圏への配慮が足らなかったマイクロソフトが一番悪い。
だいたい2バイトで漢字がすべて収まると思ったアメリカ人に対して、早く日本人が漢字は何万字もあると教えなかったのが失敗だった。

295:デフォルトの名無しさん
22/09/19 20:35:04.98 EmjBwTYRd.net
BOMキチガイども

296:デフォルトの名無しさん
22/09/19 20:42:51.60 F9okSTEiM.net
MS-DOSの頃は、これで十分って思ってたからな。

297:デフォルトの名無しさん
22/09/19 21:05:32.45 BENNO3a0H.net
>>290
>だいたい2バイトで漢字がすべて収まると思ったアメリカ人
CJK 漢字統合なんて醜い仕様のひと言に尽きますよね
>>286
自己中心的、という言葉の使い方が間違っていますよ
その昔は Shift-JIS, JIS, EUC が入り乱れまくっていましたが、だれもテキストデータにエンコードを示すプリフィックスを付けようなどとは思わなかった事実があります
UTF-8 にバイトオーダーマークなんか絶対に不要なのにバイトオーダーマークを安易につける発想そのものが自己中心的なのでは?
美しい世界(爆笑)のために今日もがんばります!

298:デフォルトの名無しさん
22/09/19 22:08:36.69 YVA4ZVOh0.net
「俺が扱うテキストは全部UTF-8に決まってるんだからBOMは要らない」というのが自己中心的な主張だと言ったんだが?
こんな単純な日本語の文章すらまともに読解できない奴に間違ってるとか言われても困惑するわ。

299:デフォルトの名無しさん
22/09/19 22:24:33.90 BENNO3a0H.net
>>294
同じことを繰り返しますが、
①過去、エンコードの違うテキストを各種取り扱っていたからといって、「テキストの内部に恣意的にエンコードを示すマークを入れる」などという自己中心的なことをした歴史はなかったのです。
 特にそういうことをしたいときは、ソースコードにその言語のコメントでエンコードを示す、くらいの配慮をしていたものです
②UTF-8 でエンコードされている限り、そのコンテンツがアスキーコードのみで構成されているのならば、特にバイトオーダーコードは不要で、as is で使えるように、欧米諸国に配慮した設計です
特に②が重要で、バイトオーダーコードを要れずとも、C のソースコードは UTF-8 であれば普通にコンパイルできる、はず、なのに、なぜわざわざバイトオーダーコードを付加して既存の処理系がそのままでは使えなくなってしまったのか?
コンパイラは MS-VC だけではなく、gcc も clang も lsi-c (w)もあるというのに、既存のコンパイラの動作を妨害してまで、バイトオーダーコードを付加するエディター側の方が自己中心的といえるのではないでしょうか?
そしてエンコードを示すマークなどではないバイトオーダーマークをエンコード種を示すマークに乱用するしている二重の矛盾も指摘しなければなりますまい
私の言っていることがわかりますか?

300:デフォルトの名無しさん
22/09/19 23:05:07.14 /08McGz80.net
>>264
そのHEADの箇所に行くまでエンコードが分からないのだよな?
そこまでどうやって読むのか?
まあ、現実問題としてASCIIで入れておきゃいいわけだけど、厳密にはそれじゃいかんよな。

301:はちみつ餃子
22/09/19 23:10:53.08 npVSxydm0.net
>>290
エンコード切り替えの規格は ISO/IEC 2022 がある。
PC-9801 時代あたりにはマニュアルで KI/KO コードという名前で説明されていた。
ヨーロッパ言語も ISO/IEC 8859 として十種類以上の文字セットが定義されているんだ。
日本での事情以上に混在は深刻な問題であって、対処する規格は当然ある。

302:デフォルトの名無しさん
22/09/19 23:18:33.90 a+e8LTLZH.net
>>296
おっしゃるとおり、そこまでは、ただのアスキー7bit で記述するんですよ
大概は第一行目にエンコード種をアスキーで書くものでしたけれどもね
厳密っていうけれども、あなたのおっしゃる厳密の意味がよくわかりませんね

303:デフォルトの名無しさん
22/09/19 23:19:31.82 a+e8LTLZH.net
>>297
英語が一番簡単で、ウムラウトとか苦労していたと思いますよ、ウムラウトは確か 7 ビット領域に侵食していたような気が

304:デフォルトの名無しさん
22/09/19 23:23:44.77 a+e8LTLZH.net
>>297
おっと、私のいっていたことが少し不正確でしたね、たしかに KI/KO は生 JIS にありましたね

305:はちみつ餃子
22/09/19 23:40:42.70 npVSxydm0.net
自然言語なんて数千年単位の歴史的経緯の塊だ。 その文字も。
綺麗に整理しようとしたって元がグダグダなんだからどこかしらでグダグダになる。
そんでそのグダグダをひとつに寄せ集めたのが Unicode なんだぞ。
そりゃグダグダで当たり前だし、そういうもんだと思うしかしょうがないだろ。
そんでもって Unicode がかなり広まったといっても従来の文字コードが消滅したわけでもない。
URLリンク(xkcd.com)

306:デフォルトの名無しさん
22/09/19 23:43:18.98 a+e8LTLZH.net
>>240
チャイナ規格ですか‥‥(差別意識満々)
調べてみましたが基本的に4ビット固定長であり、UTF-8 を包含してはいないようですね、UTF-8 の上位規格というのはどういう根拠でそういっているのですか?
どっちかというと 現行中国漢字エンコード規格の上位規格でしょう
私の理解
・7 ビット圏は 1 バイト
・拡張部分は可変長ではなく 4 バイト固定
・現行の中国の漢字エンコード規格 GBK(シフトJIS と同じ仕組み)を包含するように第二・第四バイトの範囲を GBK と被らない範囲に制限している。

307:デフォルトの名無しさん
22/09/19 23:48:55.05 Z9ZARiSG0.net
>>302
ユニコード・コードポイント全てを内蔵したうえで、さらに少数民族の文字を追加してあるからでしょ。
そういう生い立ちなんだから。

308:デフォルトの名無しさん
22/09/19 23:52:42.86 A/Pc+E3NH.net
>>301
How standards have been overproducted とか易しい英語にしてほしいなあ

309:デフォルトの名無しさん
22/09/19 23:55:05.42 A/Pc+E3NH.net
>>303
コードポイントの数は十分確保している、って言う意味で「ユニコードの上位規格だ」と主張しているわけですか
この理解で正しいですか?

310:デフォルトの名無しさん
22/09/19 23:55:54.72 zeLiCYh20.net
EBCDIC なんていうコード体系もあるんだよな
これはASCIIよりも古い
このコードで動いていたPCもあった(今もあるかは知らない)

311:デフォルトの名無しさん
22/09/20 05:35:11.57 JyAf+et+0.net
N5200か

312:デフォルトの名無しさん
22/09/20 05:38:15.50 AtHbCf2+0.net
>>290
2千字の常用漢字で済ませという時代だったから。
> だいたい2バイトで漢字がすべて収まると思ったアメリカ人に対して、早く日本人が漢字は何万字もあると教えなかったのが失敗だった。

313:デフォルトの名無しさん (ワッチョイ ffb0-okD4)
[ここ壊れてます] .net
>>295
ここまでくると狂気しか感じないが。>>286で自己中心的と書いた内容と全然関係ない内容を
延々と繰り返すのはなんでだろう。
ついでに>>295の内容について言えば、規格で定めているもののどこがどう自己中心的なんだか。
この場合の「自己」って誰のこと?

314:デフォルトの名無しさん
22/09/20 09:59:52.88 2fXkGtCja.net
>>270
PHP+SJIS全盛の頃にBOMの代わりに「美乳」が使われてた時代があったな

315:デフォルトの名無しさん
22/09/20 10:02:30.30 2fXkGtCja.net
>>275
そうかな
全てのファイル名にBOM付いてたら嫌だな

316:デフォルトの名無しさん
22/09/20 10:04:55.52 Sk0Tcp2N0.net
MSならやりかねない

317:デフォルトの名無しさん
22/09/20 10:08:20.39 x6uHKNFtM.net
>>311
asciiなら不要だよ

318:デフォルトの名無しさん
22/09/20 10:19:31.19 2fXkGtCja.net
>>313
BOM付けろ派はASCIIかどうかもBOM付いてないと判らないみたいだし

319:デフォルトの名無しさん
22/09/20 10:27:10.48 Sk0Tcp2N0.net
MSの事だから、UTF-16使いそう

320:デフォルトの名無しさん
22/09/20 22:46:15.84 oGqR16NY0.net
>>309
>>286で自己中心的と書いた内容と全然関係ない内容
>>286
>「俺が扱うテキストは全部UTF-8に決まってるんだからBOMは要らない」という自己中心的な主張と混同してくれなければいい。
まあ、活動家のなりきりをしているので、そういうスタンスをとっているけれども、本質的には
>>295
1. 過去、エンコードの違うテキストを各種取り扱っていたからといって、「テキストの内部に恣意的にエンコードを示すマークを入れる」などという自己中心的なことをした歴史はなかった
2. UTF-8 でエンコードされている限り、そのコンテンツがアスキーコードのみで構成されているのならば、特にバイトオーダーコードは不要で、as is で使えるように、欧米諸国に配慮した設計
が言いたいことですね
UTF-8 ならば通常は as is で使えるんですよ、特に C/C++ のコード(コメントは英語・これって普通でしょ?)をそのまま使えるのに、どこぞのエディターが勝手につけるバイトオーダーマークまで正当化する風潮に苛立ちを感じているんですよ
長いものに巻かれよ、みたいなみっともない風潮を正当化するあさましさにあきれ果てているのです
あなたがそうだ、とはいいませんけれどもね

321:デフォルトの名無しさん
22/09/20 22:50:52.98 an1sf52Dd.net
どこでも演説をおっぱじめるガキにいらだちを感じてる

322:デフォルトの名無しさん
22/09/20 23:07:44.32 Sk0Tcp2N0.net
多国語が混在しても扱えるところが気に入ってる

323:デフォルトの名無しさん
22/09/21 00:15:08.73 z4iK/HUS0.net
gdbについて質問いいですか?
ステップ


324:実行でfopenを通過しようとすると  "iofopen.c: そのようなファイルやディレクトリはありません" とメッセージがでて先に進めません。どうすれば回避できますか? OS:Linux



325:デフォルトの名無しさん
22/09/21 00:17:32.94 z4iK/HUS0.net
ちなみにソースは以下の感じです
fopenで開くファイルは実行ファイル(a.out)と同じ場所に置いてあります。
#include <stdio.h>
void main(void){
 FILE *fp;
 fp =fopen("aa.txt", "r");
 fclose(fp);
}

326:デフォルトの名無しさん
22/09/21 00:45:37.65 itvuUNqP0.net
このあたり参考にしてください
URLリンク(doss.eidos.ic.i.u-tokyo.ac.jp)

327:デフォルトの名無しさん
22/09/21 06:00:40.75 z4iK/HUS0.net
>>321
サンクス

328:デフォルトの名無しさん
22/09/21 06:25:52.07 tW9j9RfF0.net
includeガードって割と使われてるように思いますが、エラい人の批評とかありません?
依存関係を把握しきれてないヤバい状態の発覚を先延ばしにするだけのハックだと個人的な経験から思うのですが…

329:デフォルトの名無しさん
22/09/21 06:39:05.65 6JiKBcvPd.net
とりあえず各ソースファイルの実行部、なければinit_xxxみたいなエントリーポイント作って
#ifdef XXX perror("xxx loaded twice"); exit(XXX);
みたいの置いたりしてます

330:デフォルトの名無しさん
22/09/21 06:47:28.88 6JiKBcvPd.net
init_xxxを呼び忘れると無意味なので、文法エラーで落とせたら良いと思うんですが、分かりやすいメッセージ吐いて落ちてくれる違法構文(あるいはそうするときの標準的なイディオム)あったら教えて欲しいです

331:デフォルトの名無しさん
22/09/21 07:18:22.65 sLC8V8J20.net
>>323
エロい人の批判ねえ。。。
#pragma onceなんか色んなコンパイラの中の人が真似してるけど?
依存関係を把握っていうけど、じゃあ
#include <stddef.h>
#include <stdio.h>
なんて書かされたいわけ?
ライブラリだって-lstdcじゃなく
fputc.o iobuf.o fprintf.o printf.oなんて書くべきだと思う?
何かを使いたいときの窓口を1つにまとめておくのは
作る側として行儀のいいことだと思うぞ

332:デフォルトの名無しさん (スフッ Sdbf-MXZj)
[ここ壊れてます] .net
>>326
むしろグッドプラクティスとされてる感じですか、確かにシステムヘッダにも見掛けますね

標準ライブラリは使うものを共通ヘッダにまとめてますね
ライブラリとして公開する場合は当然慣習に従うべきだと思いますが、書いてる時には丁度必要十分でなく、余計なヘッダがあると何処に何があったか混乱したりしません?

コードを弄らずスタティックアナライザとか道具に頼った方がいいのかな

333:はちみつ餃子
22/09/21 09:18:02.72 tPUkcfIa0.net
>>323
ライブラリはそのライブラリの使用者に対して
インターフェイス部分だけを公開したいのが普通で、
細かい依存関係が見えてしまうのは悪い設計だろ。
でも C のヘッダファイルの仕組みは隠蔽しきれない部分が出てしまうので
そもそも C の言語としての仕組みが悪い。
C を使う以上は悪い部分ともつきあわないとしょうがないし、
インクルードガードは比較的マシな解決方法だと誰もが考えているからこそそうなってる。
C++ にはモジュールが導入されたけど今のところはヘッダファイルとも共存し続ける必要があるから
完全な移行にかかる時間は数十年単位かもしれんな……。

334:デフォルトの名無しさん
22/09/21 09:58:34.67 hjFc1SVt0.net
新言語作った方が早いw

335:デフォルトの名無しさん
22/09/21 18:18:19.49 E8IgYMeHa.net
>>327
>余計なヘッダがあると何処に何があったか混乱したり
へたくそなライブラリだとそういうの見掛けるが
上手なライブラリはすっきりしてるイメージ

336:デフォルトの名無しさん
22/09/21 18:19:32.68 E8IgYMeHa.net
>>328
FILE * とかって結局使う方からしたら void * でも動くしな

337:デフォルトの名無しさん
22/09/21 18:21:06.66 E8IgYMeHa.net
>>329
Nimがある

338:デフォルトの名無しさん (ワッチョイ d7b3-rZTD)
[ここ壊れてます] .net
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>

typedef struct {
int year;
int mon;
int mday;
int hour;
int min;
double high;
double open;
double close;
double low;
} CSV_T;

void f(CSV_T *csv){
CSV_T *work;

for(int i=1; i<1001; i++){ //★
work = realloc(csv, sizeof(CSV_T)*i);
if(work == NULL){
puts("error");
exit(0);
}
if(work != csv) {
puts("ココ通過でアウト"); //▲
csv = work;
}
}

339:デフォルトの名無しさん (ワッチョイ d7b3-rZTD)
[ここ壊れてます] .net
csv[0].year = 1;
csv[0].low = 1.1;
csv[998].year = 9;
csv[998].low = 9.9;

printf("%d %f\n", csv[0].year, csv[0].low);
printf("%d %f\n", csv[998].year, csv[998].low);
}

void main(void){
CSV_T *csv;

csv = realloc(NULL, 1);
f(csv);

printf("%d %f\n", csv[0].year, csv[0].low);
printf("%d %f\n", csv[998].year, csv[998].low);

free(csv);
}

340:デフォルトの名無しさん (ワッチョイ d7b3-rZTD)
[ここ壊れてます] .net
・やりたいこと
CSVファイルを1行読み込むごとに構造体のエリアをreallocで拡張して格納
元のソースをそのままアップするには長いのでファイルの読み込み部分を削除したソースが上のやつです

・悩んでいるところ
コメント★のとこのループが1000程度なら動きます。
しかし10000を超えるループにするとコメント▲部分を通過するようになり
mainのprintfが正しい値を表示しなくなります。

なぜ?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch