C言語なら俺に聞け 161at TECH
C言語なら俺に聞け 161 - 暇つぶし2ch2:デフォルトの名無しさん (ワッチョイ a702-em59)
23/04/21 16:20:56.29 cgpIrgwq0.net
>>1
大儀である

3:デフォルトの名無しさん (ワッチョイ 87da-S3w6)
23/04/21 16:21:57.14 5coQdqNr0.net
久々に麻呂のクソースを見たいでおじゃるか?

4:デフォルトの名無しさん (ワッチョイ 87da-S3w6)
23/04/21 22:04:31.33 euEROcVR0.net
久々に来たけど、C言語はもう人気が無いんかね・・・

5:デフォルトの名無しさん (ワッチョイ 5fad-soEM)
23/04/21 22:53:09.84 kZ6jl2XB0.net
人気って
C言語で作れなんて非効率的なことする人はそういないのでは?
C言語じゃないとダメな環境を除いて

6:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-S3w6)
23/04/21 23:38:19.84 Ro9IllZr0.net
各分野に適したものがあるならそれを使うに越したことは無い。
C が本当に「適している」と言える分野ってそんなに広くないじゃろ……。

どういう言語が適しているのかよくわからんかちょうどよい言語なければ長い物にまかれることになるわけだけど、
様々な分野でそれぞれのよりよい言語が生まれて「長い物」の価値が薄れるならそれは喜ばしいことだと思う。

7:デフォルトの名無しさん (ワッチョイ 6dda-ASru)
23/04/22 00:24:12.00 PKFQM5A+0.net
プログラムをする人が、コンピュータの基本的な知識が無いまましてしまうから
簡単な記述で出来る言語が登場したからかね?
単純に同じ演算を繰り返して比較すると、C言語は処理速度が一番速いとのこと
データを処理するには適しているかと

8:デフォルトの名無しさん (ワッチョイ 6663-RykB)
23/04/22 01:13:10.92 pp00Xtk80.net
FFTやらせたら、どの言語が一番速いだろうか

9:デフォルトの名無しさん (テテンテンテン MM3e-HodF)
23/04/22 01:14:00.87 BwPMbYSuM.net
Cの知識はC++をする時に当然必要になる
CはTIOBE言語ランキングで2位で、C++は4位だ
逆に使えない奴はモグリだろw

10:デフォルトの名無しさん (ワッチョイ 7502-PEO9)
23/04/22 03:04:47.05 WcjcWdD/0.net
Cを知り、アセンブラを知って、ハードアーキテクチャが分かる

11:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/22 07:44:16.17 rMU69DRU0.net
ハードの入り口に立つというだけ
Cより遙かに深い世界の

12:デフォルトの名無しさん (ワッチョイ 6663-RykB)
23/04/22 12:23:54.03 pp00Xtk80.net
それにしても、ネットは広大だわ。

13:デフォルトの名無しさん (ワッチョイ 1146-0EuI)
23/04/22 16:05:32.27 QfqbbaWF0.net
Cの奥地が広いと言うならネットはなお広いではないか。

14:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/22 16:39:16.87 rMU69DRU0.net
デジタル3年
アナログ5年
高周波10年
なんて言うね

で、おまえらCはどのくらいでおぼえた?
仕事で使えるレベルになるまでに

15:◆QZaw55cn4c (ワッチョイ 5eba-gzP0)
23/04/22 18:14:06.16 ZOFRvMNu0.net
>>14
高周波は、あの分布定数の立体回路が謎に満ちていましたよね、あれ、どうやって設計するんだろう?

16:デフォルトの名無しさん (ワッチョイ 5d2d-YWDm)
23/04/22 18:24:03.40 RQNj/O5w0.net
この世にはプログラミング言語はPHPとJavascriptしか無いと思ってるエンジニア()がたくさんいるから
Pythonの存在も知ってるけどあれはオシャレな感じがしないしオタクがやるものだと思ってる

17:デフォルトの名無しさん (スッププ Sd0a-kSx0)
23/04/22 19:05:57.81 Ul/bNVNnd.net
>>14
蟹飯の本は事前に読んでたけど、半年かかった
周りが旧帝工学系院卒ばっかだったから勉強したわ
おれ、旧帝数学だったからポインタとか分からんかった
でも、今ではわしの方が崇められる
日々「チャラい関数、マクロで被せろ」を軸に頑張っとる

18:デフォルトの名無しさん (アウウィフ FF21-1cZQ)
23/04/23 18:42:16.06 y593Lq73F.net
PHPはホントごみ

19:デフォルトの名無しさん (ワッチョイ aa97-+JPf)
23/04/24 12:59:52.39 6nEVjUPW0.net
親を殺されたのか
かわいそうに

20:デフォルトの名無しさん (スププ Sd0a-hOeP)
23/04/24 14:15:55.03 U9n/COjud.net
スレリンク(tech板:436番)-
>>436
>>499
スレリンク(tech板:14番)

21:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip)
23/04/24 18:03:05.84 IXNCOIDlM.net
int (func) (int n)
みたいに関数に()付けるのって何の意味(機能)ですか?

22:デフォルトの名無しさん (スプッッ Sd6d-LN7w)
23/04/24 18:08:06.16 MExTF0xDd.net
関数ポインタ

23:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/24 20:21:25.09 TGYcq0jn0.net
違う! 関数そのもの
#define func(x) (func)(x)
マクロではない「本物の」funcを呼び出すのに使う

24:デフォルトの名無しさん (ワッチョイ c55f-ASru)
23/04/24 21:25:50.42 4M8+MweU0.net
int (func) (int n) となると宣言の文脈だからそれも違うだろう。

>>21 その記述だけでは a*b+c を (a*b)+c と書いたのと同じで、少なくともその括弧自体には何の効果もない。
何か意味があると思うなら書いた人に聞くしかない。

25:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip)
23/04/24 21:43:56.47 IXNCOIDlM.net
いやまあ愚痴なんだけど教科書や入門書ってなんでか知らんけど関数ポインタもったいつけて教えたがらないよね…

26:デフォルトの名無しさん (ワッチョイ 7502-kSx0)
23/04/24 23:20:26.15 MovxHIrx0.net
素人さんには関数ポインタはむずいだろ
関数のポインタをベクトル化してジャンプテーブル代わりになるんもん
つまりスイッチケースが要らない、言う事

27:デフォルトの名無しさん (ワッチョイ 6663-RykB)
23/04/24 23:23:14.11 CIhFKz1G0.net
ジャンプテーブル使うのと、switch case と、
どちらが高速でしょうね?

28:デフォルトの名無しさん (テテンテンテン MM3e-HodF)
23/04/24 23:32:25.83 RQPVcVj5M.net
>>23
それが上手く行くのは、マクロが再帰呼び出しされないような処理が入ってるからだろ

29:デフォルトの名無しさん (テテンテンテン MM3e-HodF)
23/04/24 23:45:11.28 RQPVcVj5M.net
ジャンプテーブルを使うと、変数の引き渡しに手間が掛かる
構造体のポインタを渡すとか、引数を沢山渡すとかグローバル変数を使うとか
なので、switch文にして最適化でテーブルジャンプになるのを確認するのがベストかなと

30:デフォルトの名無しさん (スプッッ Sdea-8Xzj)
23/04/25 08:47:58.80 2JpsSRmdd.net
gcc拡張機能のラベルのジャンプテーブルが速かった思い出
あれは規格に取り込むべきだと思う

31:デフォルトの名無しさん (ワッチョイ 5e5f-RykB)
23/04/25 10:23:58.24 dvdIAVRA0.net
それってどんなのだっけか
関数を配列にぶっこんだの?

32:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/25 10:35:38.43 VJ90Sqw80.net
FORTRANの算術GOTOみたいなもんかな

33:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/25 10:36:32.19 VJ90Sqw80.net
switch caseを最適化させるとジャンプテーブルになっていることはよくあるね

34:デフォルトの名無しさん (ワッチョイ 11c9-+rDk)
23/04/25 11:21:54.95 RcvlMMml0.net
開発環境の都合で C言語しか選択できず
C++ の virtual に相当する機構をなんとか捏造しようと
構造体に関数のポインタをメンバに持つ

あと qsort のまねっこ
(具体的な比較は外に丸投げして そういう関数がある前提でコードを書く

35:デフォルトの名無しさん (スフッ Sd0a-8Xzj)
23/04/25 11:33:32.92 Y1VsObgtd.net
>>31
関数内のラベルをローカル配列の初期化て入れられて
goto labelarray[status];
見たいに飛べるやつ

36:デフォルトの名無しさん (ワッチョイ c55f-ASru)
23/04/25 12:02:12.18 zIgvDwJV0.net
>>28 (func)(x) に対して関数型マクロ func(x) の展開は起こらないよ。

37:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/25 12:24:03.71 VJ90Sqw80.net
調べてみた
Computed gotoってやつね

int main(void)
{
void *table[] = { &&L1, &&L2 };
goto *table[1];
L1: ;
L2: ;
}

38:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/25 12:27:03.54 VJ90Sqw80.net
参考
URLリンク(gcc.gnu.org)

39:デフォルトの名無しさん (スップ Sdea-kSx0)
23/04/25 12:52:44.87 HIwqDhB5d.net
お、そんなん出来るんか

40:デフォルトの名無しさん (スプッッ Sdea-i/u1)
23/04/25 14:07:55.49 xfobd0gld.net
話の流れからして

#define func(arg) hoge(arg)
みたいな関数形式マクロがいた場合、
単に void func(int a){} と書くと void hoge(int a){}に置換されて死ぬ。
回避策で void (func)(int a){} としとけば展開されないよ

ってことじゃないの?

41:デフォルトの名無しさん (ワッチョイ c55f-ASru)
23/04/25 14:18:02.95 zIgvDwJV0.net
確かに、そういう効果はあるね。
それが必要になる状況は思い浮かばないけども。

42:デフォルトの名無しさん (スップ Sd0a-cnX/)
23/04/25 18:35:24.79 uZ/SnCfyd.net
関数と同名のマクロがわざわざ定義されてるとしたらなんか事情がありそうだが

#undef func
したほうが早くね

43:デフォルトの名無しさん (ワッチョイ 7d01-+rDk)
23/04/25 18:49:03.51 xUlKX7o40.net
#undef の後に undef する前へリカバーできるようにする機構ってコンパイラの環境依存だよね

(リカバーのための仕込み)
#undef func
 :
void func()
{
}
 :
undefのリカバー (以下 func はマクロ側)
 :

44:デフォルトの名無しさん (スップ Sd0a-cnX/)
23/04/25 19:09:41.44 uZ/SnCfyd.net
ひょっとして>>21って

void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));

みたいな書き方のこと?
この場合はカッコなし int *compar(const void *, const void *)
だとintへのポインタを返す関数の実体ということになり
引数宣言内に関数の実体を書くなと言われてしまうだろう

45:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip)
23/04/25 21:38:43.47 ZKj27A06M.net
>>26
そうやって教えないでいて唐突になんの前触れもなく使われて「これ何ですか?」って質問したら「関数ポインタも知らねえのかよ」
テック系あるある

46:デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip)
23/04/25 21:43:41.07 ZKj27A06M.net
>>44
いや
int (*compar)(const void);
みたいな単独のやつだよ
てか引数に関数入れるのも教えたがらないよねえ😅
ほんと勿体つけるの大好き

47:デフォルトの名無しさん (ワッチョイ 66cf-/HYv)
23/04/25 22:14:03.47 OJFKrU7J0.net
要は関数ポインタ知らなくてバカにされただけのおじさんか
const voidだもんな

48:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/25 22:18:12.16 VJ90Sqw80.net
アホすぎて笑う価値もないな

49:デフォルトの名無しさん (スップ Sd0a-cnX/)
23/04/25 22:25:14.13 T6e/oFBcd.net
>>46
それじゃエラーにならない?
具体的にどんな場面で使われてるのかわからんことには説明できないな
混乱する書き方だというのは同意するが

50:デフォルトの名無しさん (スップ Sd0a-cnX/)
23/04/25 22:37:41.81 T6e/oFBcd.net
ああ、それで「関数」ではなく「関数へのポインタ」が定義できるのか
関数の型をtypedefしてからやったほうがわかりやすくない?
WindowsAPIでは大体そんな形になってるから真似してるけど

宣言
typedef int COMP_FUNC(const void *, const void *);

COMP_FUNC comp_A;
COMP_FUNC comp_B;

COMP_FUNC *comp_func = comp_A;


切り替える時
comp_func = comp_B;

呼び出す時
comp_func(...);

51:デフォルトの名無しさん (ワッチョイ 66cf-/HYv)
23/04/25 22:50:45.68 OJFKrU7J0.net
typedefがめっちゃ気持ち悪い宣言だな
普通はアスタリスクつけてポインタとしてtypedefするもんだと思うよ
sizeof(COMP_FUNC)がいくつになるのか見当がつかない不気味なオブジェクトだ

52:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-ASru)
23/04/25 23:29:28.69 ug7UW9j70.net
sizeof は関数型の式に対して適用してはならないと制約されているから
関数だったときの結果は未定義で、常識的に考えればコンパイラはエラー扱いにするべきだと思うんだけど
gcc や clang だと何故かエラーにならず 1 を返すんだよな。
(警告は出るけど。)

検出が難しいはずもない (実際に警告は出せてるわけだし) のになんでこうなってんだろ。
1 でなんか便利なことある?

53:デフォルトの名無しさん (ワッチョイ c55f-uFYM)
23/04/26 02:32:17.99 2SSTMM1B0.net
まあ、入門書は比較的難しいことを書かないほうが売れそうだけどな
でもそれを勿体つけるというのは違うかと

54:デフォルトの名無しさん (ワッチョイ eaad-WJN6)
23/04/26 03:51:37.33 5gh45PFo0.net
>>50
WINAPIの書き方はこうじゃない?

typedef int (WINAPI *COMP_FUNC)(const void *, const void *);
int WINAPI comp_A(const void *, const void *);
COMP_FUNC comp_func = comp_A;

55:デフォルトの名無しさん (ワッチョイ a5cf-aV8w)
23/04/26 07:41:17.76 wJGIaQxR0.net
>>51
C++だとポインタじゃない方は関数メンバの宣言にも使えて便利だったりする。

56:デフォルトの名無しさん (ワッチョイ 11c9-+rDk)
23/04/26 08:44:09.62 dG3YoJcz0.net
>>54
ポイントされた関数の呼び出しで
comp_func(ptr1, ptr2); も (*comp_func)(ptr1, ptr2); も両方通るのは何でやろね
歴史的な都合?

57:デフォルトの名無しさん (ワッチョイ 5d2d-YWDm)
23/04/26 08:54:20.40 v/InlOgJ0.net
前者は関数名そのものをポインタとして使い、後者はポインタを明示的に指定することで関数ポインタとして扱う

58:デフォルトの名無しさん (ワッチョイ 5963-YWDm)
23/04/26 09:12:09.71 UWqGaqQz0.net
>>50
定義は?

COMP_FUNC comp_A
{
//ここどうやって書くんだ
}

59:デフォルトの名無しさん (ワッチョイ c55f-ASru)
23/04/26 09:27:27.18 mF8gxL160.net
>>58
残念ながら定義には関数型 typedef は使えない。
先に typedef を使った宣言だけ書いとけば定義の不整合を検出することはできるようになる。

60:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/26 09:46:45.42 UWqGaqQz0.net
COMP_FUNC comp_A;
COMP_FUNC comp_B;

こう書かれても仮引数や返却値の型が見えないので
可読性を落としているな

61:デフォルトの名無しさん (アウアウウー Sa21-YWDm)
23/04/26 09:48:32.91 N7+hGpB4a.net
>>48
ほんそれ

62:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-ASru)
23/04/26 10:33:18.60 NF11/Xrv0.net
>>56
* をいくつ付けても通るのは有名なネタだな。

#include <stdio.h>
int main(void) {
(**********printf)("hello, world\n");
}


関数指示子 (結果が関数型であるような式) は sizeof や & の
オペランドであるときを除いて関数ポインタに (暗黙に) 型変換されるという規則があって、
普通に printf("hello, world\n"); とか書いてあるときでもこの printf は関数ポインタに変換されてる。
関数呼出しは関数に対してではなく関数ポインタに対して行われる。

関数ポインタに * を付けると関数指示子になるけどそれもやっぱり関数ポインタに変換されるので
* をいくつつけても結果は関数ポインタという変なことになる。

63:デフォルトの名無しさん (アウアウウー Sa21-YWDm)
23/04/26 11:39:43.86 N7+hGpB4a.net
そもそもポインタに代入するときも
int a(int b)
{
return b + 1;
}

int (*f)(int) = &a;
じゃなくて
int (*f)(int) = a;
で通るからな

64:デフォルトの名無しさん (ワッチョイ 5963-/Rus)
23/04/26 13:38:42.38 UWqGaqQz0.net
f(0); //こうできるしな

65:デフォルトの名無しさん
23/04/26 14:31:03.82 dG3YoJcz0.net
>>57
comp_func は 関数のポインタとして宣言されてる変数っすよ
まぁ >>62 だということで納得

66:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-ASru)
23/04/26 17:00:12.69 NF11/Xrv0.net
余談だが >>62 はあくまでも C の場合の話で、
C++ では名前解決の話が合わさって複雑になってる。
関数呼出しのときに関数名を括弧で囲むかどうかで結果が変わってしまう場合がある。
URLリンク(wandbox.org)

C のコードを C++ に持っていくことはそれなりにあることなので
変な書き方をしてると組み合わせの妙で引っかかることもあるかもね。

67:デフォルトの名無しさん (スップ Sd0a-cnX/)
23/04/26 20:23:11.35 WMGk7nvid.net
正直どうでもいい
遠い昔Z80のニモニックでJP (HL)と書くけど本来はJP HLとなるはずじゃないかなと思ってたけどそれと同じw

68:デフォルトの名無しさん (ワッチョイ 2a4b-ywdm)
23/04/26 20:32:10.51 XZbLdYRG0.net
まぁ普通は関数名をカッコで括ったりしないし

69:デフォルトの名無しさん (ワッチョイ ea79-lTfL)
23/04/26 21:13:49.50 zbbRZmOB0.net
Cで関数のポインタガーとかやってる暇あったらC#のデレゲートとかラムダとか覚えた方がいいとおもった午後

70:デフォルトの名無しさん (ワッチョイ 0afb-i/u1)
23/04/26 21:41:13.75 tw2MKSIb0.net
「min」と「max」の関数形式マクロをわざわざ定義する.hがあるらしい

71:デフォルトの名無しさん (ワッチョイ 5d2d-YWDm)
23/04/27 00:02:52.04 6BBE08oV0.net
stdbool.hでも覗いてみればいい

72:デフォルトの名無しさん (ワッチョイ 7502-kSx0)
23/04/27 05:12:28.80 sEk/rgYZ0.net
>>67
コンバイラ、甘やかしてはイカン
最初から攻める気持ちが大切

73:デフォルトの名無しさん (ワッチョイ a902-V++f)
23/04/27 08:37:39.22 OthllRbe0.net
コンバイラ?

74:デフォルトの名無しさん (テテンテンテン MM3e-HodF)
23/04/27 09:03:22.20 AVBMGEcwM.net
コンバトラーV

75:デフォルトの名無しさん (ワッチョイ 2a7c-fzJl)
23/04/27 13:43:25.58 kFL/uqTX0.net
JP (HL)って8080だとPCHLだっけ
アセンブラがとことん楽するようなニモニックだったな…

76:デフォルトの名無しさん (テテンテンテン MM8f-HoNx)
23/05/01 16:24:43.62 8iWiof/XM.net
関数の引数リストの中で新たな構造体を定義するってことってできないの?
void func(struct X{int a;} b){
... something ...
}
みたいに?
構文上は可能だと思うんだけどどうなんですか?

77:デフォルトの名無しさん (スフッ Sdbf-oZQI)
23/05/01 18:21:57.14 sEB4u3D3d.net
構造体が使われる場所より前で定義する必要がある

78:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9)
23/05/01 19:09:18.47 Cn3LrXy/M.net
>>47
いみもなく勿体つけるオジサン
「関数ポインタは難しいから後でやろうね~オマジナイだよ~」

79:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9)
23/05/01 19:15:34.08 Cn3LrXy/M.net
>>53
それで後々になって質問すると
>>47,48みたいのが湧くでしょ

80:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9)
23/05/01 19:29:42.98 Cn3LrXy/M.net
未だに初っ端からコンソールにハローワールド表示させるとこから教えてるんだろうね勿体つけオジサンたちは

81:デフォルトの名無しさん (オイコラミネオ MM4f-ylw9)
23/05/01 19:36:49.71 Cn3LrXy/M.net
勿体つけオジサンたちはChatGTPで「C言語で関数名に()付けるのって何ですか?」って聞いてみればいいよ
機械以下のゴミw

82:デフォルトの名無しさん (ワッチョイ 3702-ITaW)
23/05/01 19:44:56.10 cY285a3R0.net
医者から処方された薬は指示通り飲まないとだめだぞ

83:デフォルトの名無しさん (ワッチョイ ff63-fitb)
23/05/01 20:12:14.98 kp1qtDVi0.net
配列に対してポインタでアクセスするとか、単純な者だと絵に描けば大体理解出来るが
構造体内のポインタ変数やら、さらに配列かして行くと、記述もすんなりとできなくなるし
ましてや別人が書いたソースで、それらが一体何をアクセスしているのか理解するのは大変だ

84:デフォルトの名無しさん (スプッッ Sd3f-rFN3)
23/05/01 20:21:43.22 RHMPP4K9d.net
>>76
返り値のほうならなぜかgccでいけた
まあ型推論がないC言語じゃあ役に立たないんだけど

// main.c
struct {int a;} func();
int main(){
printf("%d\n", func());
}

// other.c
int func(){ return 42;}

85:デフォルトの名無しさん (ワッチョイ 572d-wHlW)
23/05/02 02:30:44.97 FbQbKVUa0.net
void func(struct {int a;} b){
b.a = 10;
printf("%d\n", b.a);
}

tccでもこれ通るな

86:はちみつ餃子
23/05/02 11:04:32.32 HpVmkNB+0.net
>>76
私が知る限りにおいて文法上は正しい。
しかし X の有効範囲 (スコープ) は関数内だけなので
関数の外で struct X に対応する値を生成できず、
まともな方法では適切な実引数を与えることができない。
内容が同じ構造体は「適合」するし引数が適合する関数も適合するはずなので
強引にキャストして呼出しても言語仕様に反しないと思うのだけど
適合の概念をちゃんと理解できてる自信はない……
void func(struct X{int a;} b){}
int main(void) {
struct X{int a;} b = {1};
// このキャストはたぶんアリだと思うけど自信はない
void (*f)(struct X) = (void(*)(struct X))func;
f(b);
}

87:デフォルトの名無しさん (スップ Sdbf-s2+g)
23/05/02 20:11:42.15 ovfmjnkKd.net
>>76
素直に最初に構造体をtypedef しとけば楽だと思うんですが
文法上で言えばstruct Xとだけ書いといて後でstruct Xの中身を定義しても正しい
もちろんそれでは関数スタックのサイズを計算できないのでエラーになるだろうが

88:デフォルトの名無しさん (アウアウウー Sa1b-wHlW)
23/05/03 14:42:04.19 wz1HqF7Da.net
Cは
struct Hoge {int a;} b;

struct {int a;} b;
を区別しない

89:デフォルトの名無しさん (ワッチョイ 975f-By2c)
23/05/03 15:45:19.73 1ndhLr9O0.net
>>88
名前の有無が違うし、変数名を変えて並べれば違う型になるし、明らかに違うと思うんだけど
何をもって「区別しない」なんて言うのか。

90:デフォルトの名無しさん (ワッチョイ 975f-By2c)
23/05/03 18:10:57.61 1ndhLr9O0.net
>>86
「内容が同じ構造体は「適合」する」について確認すると策定中の C23 から
内容に加えてタグ名まで同じ場合に限り適合する(compatible になる)ように変更されるようで、
現時点では正しくない模様。
URLリンク(www.open-std.org)

91:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-By2c)
23/05/04 00:37:13.28 zfmlH8qj0.net
>>90
厳格な方向に改定してんのね。
今までが緩すぎたからしょうがないね。

92:デフォルトの名無しさん
23/05/04 01:26:39.82 KJPnL+/P0.net
>>91
あ、ごめん書き方が悪かった。
これまではタグ及び内容が同じでも適合しなかったところ、 C23 から適合するようになるという話。
有効になるプログラムが増えるので、どちらかというと緩くなる変更。

93:デフォルトの名無しさん
23/05/04 04:12:02.40 W+5O3yqN0.net
急に凄くレベル低い話して申し訳ないんだけど
#include <stdio.h>
int main()
{
int a[101] = {};
a[0] = 2;
a[1] = 3;
for (int i = 4; i < 1000; i++) {
int r = 1, j;
for (j = 0; j <= 100 && a[j] != 0; j++) {
if ((i % a[j]) == 0) {
r = 0;
break;
}
}
printf("%d %d %d %d %d \n", i, j, a[j], i % a[j], r);
if (r)
a[j + 1] = i;
}
for (int i = 0; i < 100; i++)
printf("%d ", a[i]);
}
なんでこれ上手く動かないんだろう

94:デフォルトの名無しさん
23/05/04 05:17:57.46 P5ZkmciJ0.net
このスレいつもレベル低いから大丈夫でしょ
上手く動かない?そもそもそのコードはどう動いて欲しいのか読み取れないんだよな
日頃から入出力を意識して書けって言われてない?まるで実践できてないからダメか

95:デフォルトの名無しさん
23/05/04 07:37:53.19 6SJC1K3b0.net
>>93
二つ目の for ループから抜ける条件の一つが「a[j]がゼロ」なのに、そのループから抜けた直後で i % a[j] とかやってて、jが2のときにa[2]が0でループから抜けるから、ゼロ除算で落ちる
それとこっちは直接の原因ではないけど、int a[101]と宣言すると a[0]~a[100]までしかアクセスできないのにa[102]までアクセスする可能性があるようなコードになってるのもダメだな

96:デフォルトの名無しさん
23/05/04 08:36:39.17 Hj8mrajJd.net
とりあえず初期化するとき
int a[101] = {0,1,2};
と書いたほうが楽じゃん
ちなみに初期値がない部分は0になる
後はめんどくさいから明日読むわ

97:デフォルトの名無しさん
23/05/04 08:46:33.13 Hj8mrajJd.net
間違えた
int a[101] = {1,2};

ちなみに int a[101] = {};
ではまったく初期化されないからこのプログラムでは[0][1]以外のところには0ではなく不定値が入ってるのでうまく動かないのはそれなんじゃね
int a[101] = {0};
と書いておけば省略した部分もすべての要素が0で初期化されるよ

98:デフォルトの名無しさん
23/05/04 09:36:07.29 GmhF7zKn0.net
>>93
i と j  ってわかりづらいから j は k に置き換えて言うけど
i=4 のとき k=0 で 4%2 となり割り切れるため、何もせずに次
i=5 のとき k=2 で a[k]==0 なので k のループを抜ける(このときk==2でa[2])
抜けた後のif (r) a[k + 1] = i; で a[3] = 5 になっていて a[2] は 0 のまま
で0除算でドボン
まずはif (r) a[k + 1] = i; ではなく if (r) a[k] = i; だね

99:デフォルトの名無しさん
23/05/04 09:58:25.07 GmhF7zKn0.net
>>93
それとこれって素数を見つけるプログラムと思うけど、 1000までの間に163個あるっぽい
a の要素数はそれ以上必要
(0除算している部分のprintfがデバッグ用のように、デバッグで100までに制限しているのかもしれないけど)
一応言っておくと0除算でドボンは本質とはちょっと違うからね
if (r) a[j] = i;
printf("%d %d %d %d %d \n", i, j, a[j], i % a[j], r);
とa[j] への代入とデバッグ用のprintfの位置を入れ替えれば0除算は起きないから

100:デフォルトの名無しさん (ワッチョイ 572d-wHlW)
23/05/04 10:19:34.63 W+5O3yqN0.net
>>95-99
丁寧な解説、ありがとうございます。

>>95,99
printfの中で0で割ってる可能性に気づいてなかったです。
a[k + 1]に代入しておかしくなってたので、原因を突き止めようとしたら
新しいバグを作ってしまっていました。

>>97
私の使ってるコンパイラだとどれでも
int a[101] = {};
でなぜか全部0が入ります。そんなものかと思って通してました。

101:デフォルトの名無しさん
23/05/04 11:22:57.44 qhvAhFwp0.net
初期化は自動変数と静的変数で変わるんでしょ?

102:デフォルトの名無しさん
23/05/04 12:22:57.41 gcRtXg3v0.net
右辺のない変数宣言だけのパターンでは変わってくるけど
静的だろうが自動だろうが 初期化の = { } は 省略部以降すべて0 → 全部0フィル でしょ

103:デフォルトの名無しさん
23/05/04 12:26:03.41 ZxdTo52k0.net
初期化って必ず初期値を設定するものとばかり思ってた

104:デフォルトの名無しさん
23/05/04 12:29:51.46 ocVXr2wXd.net
配列を「={};」で初期化したときの挙動は全要素が0埋めされるとC言語規格で決まってる

105:はちみつ餃子
23/05/04 12:50:52.53 zfmlH8qj0.net
C17 までは初期化子が 0 個の状況は規定されていない。
一個以上が必要。 0 個を許容するとしたら処理系の拡張。
C23 からは >>102 の説明で正しい。

106:デフォルトの名無しさん
23/05/05 01:44:39.83 Dgp4PAAq0.net
むかしニコ動で動画上げたらそのこと教えてくれた人いたな
今でも覚えてるわ

107:デフォルトの名無しさん
23/05/08 08:20:55.10 o4wr0iPb0.net
なので 全省略せずに = { 0 }; と書くことは多いね

108:デフォルトの名無しさん (ワッチョイ 9354-ouLR)
23/05/10 14:54:20.05 Sp9BCNLV0.net
規制解除テスト

109:デフォルトの名無しさん
23/05/12 07:37:29.65 uK8Qnmg70.net
URLリンク(ideone.com)
うちの環境(tcc)だと
ビット操作の実行時間: 0.634000秒
一時変数の利用の実行時間: 0.444000秒
ポインタの利用の実行時間: 0.471000秒
になるんですね、最適化が弱いにしても完全に想像と逆の結果になって驚いてる

110:デフォルトの名無しさん
23/05/12 08:42:01.03 7oN7jOgdd.net
ポインタのそれ交換できてるか?

111:はちみつ餃子
23/05/12 08:58:12.44 AJ54S3Uh0.net
CPU の性質も考慮する必要がある。
ビット演算はメモリのロード/ストアとは並列化できない分が効いて遅くなるんじゃないかと思う。
間接参照があればその分だけ遅くなるのも自然だし、想像通りだろ。

112:デフォルトの名無しさん
23/05/12 08:58:57.96 dEJrL9Tpd.net
gcc(-O2)で見てみたら核の部分はswap_bitsが6命令、swap_tempが4命令になってるね
swap_bits:
.LFB0:
.cfi_startproc
endbr64
cmpq %rsi, %rdi
je .L1
movl (%rdi), %eax
xorl (%rsi), %eax
movl %eax, (%rdi)
xorl (%rsi), %eax
movl %eax, (%rsi)
xorl %eax, (%rdi)
.L1:
ret
.cfi_endproc
swap_temp:
.LFB1:
.cfi_startproc
endbr64
cmpq %rsi, %rdi
je .L4
movl (%rdi), %eax
movl (%rsi), %edx
movl %edx, (%rdi)
movl %eax, (%rsi)
.L4:
ret
.cfi_endproc

113:デフォルトの名無しさん
23/05/12 22:24:54.99 josTNWjFd.net
ビット演算はそりゃ遅いだろ
読んで演算して書く
よりも
読んで書く
のほうが早いに決まってるじゃん

114:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 123e-tcUg)
23/05/12 23:57:42.36 AJ54S3Uh0.net
ビット演算バージョンの特徴は一時的な格納場所が不要なところにある。
レジスタに空きが無いときにメモリに退避するよりはビット演算のほうが
マシということはありうると思う。

素朴なアーキテクチャだとメモリの読み書きが (レジスタと比べて) だいぶん遅かったり
レジスタの数が少なかったりするし。

色々な条件が絡み合うので「決まってる」とまでは言い切れない。

115:デフォルトの名無しさん (スプープ Sd1f-Ynfg)
23/05/13 07:20:30.86 q/ntHDOzd.net
この件の場合は
関数の形でメモリから読んで書くことは確定だからそれ以上の最適化は不可能なので決まってるのだ

116:デフォルトの名無しさん (スッップ Sd1f-paFp)
23/05/13 12:31:34.66 scApfF3jd.net
大昔の技術
今使うやつはアホ

ビット演算の方が有意に速い事なんか無いよ

117:デフォルトの名無しさん (ワッチョイ 335f-eWQc)
23/05/13 13:31:03.33 77gpFXkp0.net
論理演算はマシン語1命令だろw

118:デフォルトの名無しさん (テテンテンテン MM7f-PaoB)
23/05/13 14:34:03.15 ToDbeQGOM.net
std::swap使えばマシン語のxchgを使ってくれそうな気がするけどね
xchg使うのが最速だろう
Cにはstd::swapに相当するもんが無いな

119:デフォルトの名無しさん (スッップ Sd1f-paFp)
23/05/13 15:37:18.91 trdeSgBWd.net
>>117
movだけなら演算ポートを使わないで済む

>>118
マシン語のxchgは非常に遅い

120:デフォルトの名無しさん (スプープ Sd1f-Ynfg)
23/05/13 18:27:17.14 0CcYb4xxd.net
>>117
初心者が陥りやすい錯覚だな
「何もしない(NOPのことではない)」よりも速い命令はないのだ

121:デフォルトの名無しさん (ワッチョイ cf34-TSnC)
23/05/13 18:39:48.47 Er9DBy9d0.net
>>117
やめとけ
言ってわかる相手じゃない

何もかも機械がやってくれるから
自分の頭で考える必要はないって手合いだぞ

122:デフォルトの名無しさん (スッップ Sd1f-paFp)
23/05/13 18:43:02.66 trdeSgBWd.net
×自分の頭で考える必要はない
○アホが工夫すると遅くなる

123:デフォルトの名無しさん (スッップ Sd1f-paFp)
23/05/13 18:46:13.79 trdeSgBWd.net
今では通用しない技術を偉そうに語る
老害の典型
==>はちみつ

124:デフォルトの名無しさん (ワッチョイ cf34-TSnC)
23/05/13 18:50:59.33 Er9DBy9d0.net
身に覚えのあるやつがファビョってるね
ん~いい返事だ

125:デフォルトの名無しさん (テテンテンテン MM7f-PaoB)
23/05/13 22:00:35.83 8DjxrcvEM.net
>>119
遅いってのは、レジスタを余計に1つ消費する方法よりも更にデメリットが有るぐらい遅いのか?

126:デフォルトの名無しさん
23/05/13 22:53:11.07 w2ITJ0dJd.net
最適化されてもmovより遅くならない程度で決して速くなることはない
おそらくもっと複雑な処理の途中でレジスタが全て使用中の場合にレジスタをスタック等に退避することなく値を交換するテクニックとして使われたら速くなるのかもしれんが
こんなシンプルなコードでは起きないだろう

127:デフォルトの名無しさん
23/05/13 23:18:57.76 6X/C93dk0.net
xorスワップは昔クヌースのメモリを使わないGCのマーク&スイープ手法だかで多用されてた気がする
当時はこれが神が作りしコードかあみたいに感動しかなかった

128:デフォルトの名無しさん
23/05/13 23:46:50.93 TLDrNKkXM.net
>>126
普通のコードだとレジスタは常に足りてないだろ
ベンチマーク的なコードは本当の速度を表してないな
Benchmarks gameとかそれぐらい複雑なコードを複数動かしてやっと分かるもんだろうね

129:はちみつ餃子
23/05/13 23:49:44.86 vqN1nVlv0.net
>>125
現代的な CPU だと直接的に使われるレジスタのほかに内部にはもっと多くのレジスタがあって
見かけ上はレジスタを余計に消費していても実際には一時的に割り当てられるレジスタなことがある。
いわるゆる「機械語」も CPU 内部ではさらに分解されてよりよい命令列に置き換えられるので
同じ機械語でも文脈によって違うことをしてる。
複雑すぎて詳細な挙動を事前に�


130:\測するのは無理。 xchg が存在するからには有用な場面もあるんだろうとは思うが、 結局のところは実際にやってみないとよくわからん。



131:デフォルトの名無しさん
23/05/14 01:15:20.67 XjDIggiO0.net
xchgはスピンロックを作るときに使うよね

132:デフォルトの名無しさん
23/05/14 07:12:36.39 YUNKAbGY0.net
変数のswapって、マシン語に限らずどこででも高い頻度で使うぞ

133:デフォルトの名無しさん
23/05/14 11:51:05.47 eMKrHX/5d.net
>>129
つまり
有用な場面を知らないわけだ
レジスタを節約するためでも微妙な高速化のためでもないから

134:デフォルトの名無しさん
23/05/14 19:49:42.92 9VZQjQ6WM.net
アトミックのことかな
はちみつ氏のレスは慎重で丁寧だし、噛みつく必要はないだろう

135:デフォルトの名無しさん
23/05/14 19:54:24.09 B0168DkC0.net
そもそもアセンブラででも書かない限りある値がレジスタに維持される期間は人間の考えとは異なるんだよなぁ

136:デフォルトの名無しさん (ワッチョイ cf34-TSnC)
23/05/14 22:22:28.93 YUNKAbGY0.net
人間の考えw
人情っすか?

137:デフォルトの名無しさん (ワッチョイ cf63-ZkZz)
23/05/14 23:14:42.36 fNcGY7kH0.net
レジスター猫

138:デフォルトの名無しさん (ワッチョイ 0310-ZkZz)
23/05/15 07:45:53.34 wYJ4tfRu0.net
シュレーディンガーのレジスター猫猫

139:デフォルトの名無しさん (ワッチョイ cf46-1d5q)
23/05/15 10:53:41.51 Ro1LlfRG0.net
レンジ猫?

140:デフォルトの名無しさん (ワッチョイ 3302-Cej3)
23/05/15 11:26:46.74 qSKQiR6e0.net
猫は電子レンジで乾かせません

141:デフォルトの名無しさん (ワッチョイ ffad-ZkZz)
23/05/15 11:51:40.11 Bppn4Lb30.net
じゃあ何なら乾かせるんですか?

142:デフォルトの名無しさん (ラクッペペ MM7f-fulC)
23/05/15 12:00:56.43 Uo8X26KHM.net
タオルとドライヤー

143:デフォルトの名無しさん (ワッチョイ ff97-7xmi)
23/05/15 12:22:52.88 L2eqquJo0.net
愛情を込めて暖める

144:デフォルトの名無しさん (スプープ Sd1f-Ynfg)
23/05/15 20:16:31.37 8Cq/OAued.net
つまんないボケはどうつっこんでもつまんない

145:デフォルトの名無しさん (スプッッ Sd07-zj+H)
23/05/16 08:51:47.45 gG4dlKgfd.net
技術ないやつが妬みで荒らしてるだけだからな

146:デフォルトの名無しさん
23/05/16 15:56:44.97 mGp2Y9l5a.net
DJNZがatomicだと思っていた時期が私にもありました

147:デフォルトの名無しさん (ワッチョイ c301-Np+b)
23/05/16 20:31:19.40 afLAkRaY0.net
日本はC言語さえ難しいエンジニアもいるんだよな

148:デフォルトの名無しさん
23/05/16 20:55:13.02 bTPsQg7Pd.net
>>137
おお、読み出すまで値が確定しないレジスタ
乱数発生専用レジスタですね
わかります

149:デフォルトの名無しさん (スプッッ Sd1f-zj+H)
23/05/17 07:09:46.32 s9zxu+xkd.net
異分野からきた地頭のいい人がCも使えるようになると
おまえら仕事取られるぞ

150:デフォルトの名無しさん (ワッチョイ 0310-ZkZz)
23/05/17 07:46:38.82 BUhbFeo00.net
外国人労働者が来たら、AI化されたら、昔から色んな業種で何度も言われてるわな。

151:デフォルトの名無しさん
23/05/17 13:27:27.48 hbqXME+r0.net
いろんな分野で確かに仕事を奪われている

152:デフォルトの名無しさん
23/05/17 16:15:47.93 ZA2j/mjnd.net
> AI化されたら
ここム板だよな

153:デフォルトの名無しさん
23/05/17 19:23:47.84 HVYpBx2Dd.net
>>148
恐れるに足らん
こっちは守護だぞ幕府が後ろ盾だぞ

154:デフォルトの名無しさん (スププ Sdea-i/qU)
23/05/24 06:34:08.09 TwXy7dIZd.net
前回のこのスレの投稿で関数名に()をつける場合があるという意味がわかった。#undefを使わなく
てもいいように関数に()をつける場合がある。

ans = (sqr)(n);
という具合に。

155:デフォルトの名無しさん (ワッチョイ 6746-3pER)
23/05/24 07:05:53.93 ea8bFP4r0.net
void laugh(笑);

156:デフォルトの名無しさん (ワンミングク MMbf-4z7j)
23/05/31 15:57:04.61 fnFbD7jZM.net
誰か笑いをとめてやってくれ

157:デフォルトの名無しさん
23/05/31 16:11:38.59 ck+UIxN/0.net
abort();

158:デフォルトの名無しさん
23/05/31 18:02:31.09 vB7s5b6d0.net
GotoBlueScreen();

159:デフォルトの名無しさん
23/05/31 18:16:26.97 i7J0Z4vH0.net
__halt();

160:デフォルトの名無しさん
23/05/31 21:00:07.40 ck+UIxN/0.net
void a() __attribute__((naked));
void a()
{
asm(" halt");
}
int main(void)
{
a();
}

161:デフォルトの名無しさん
23/05/31 21:19:20.18 soKXUOD/0.net
[STOP]+[A]

162:デフォルトの名無しさん
23/06/03 19:40:08.42 hD2oGIQP0.net
文字列処理用のリングバッファ作ったんですが、同じ処理をint型でも行いたいです。
当たり前ですが、同じプログラムをint型に変えればできると思います。
ですが、処理自体は同じなので、共通化できないものでしょうか?
C++ではテンプレート関数を使えばできるようですが、純粋なC言語では難しいですか?

163:蟻人間
23/06/03 19:48:40.44 Pce1Bw+fd.net
>>161
#defineと#includeを使えばできるよ。

164:デフォルトの名無しさん (ワッチョイ 916e-aXLw)
23/06/03 20:14:57.23 SlTHxzvh0.net
俺的には#includeよりtypedefかな

165:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c23e-N/Lw)
23/06/03 20:15:08.00 uQ0tYGRP0.net
もしくは void* と型の大きさにする形で型を消去してしまう (たとえば qsort のように) という選択肢もある。
間違った使い方をしても (型が消えているので) コンパイル時にエラーとして検出しづらくなる可能性があるけど。

まあどちらにしても C でやるのは煩雑。
使う型が二種類だけであることがわかっている状況だと仮定してよいなら
共通化しようとするよりもコピペしたほうがかえって楽というのもよくあること。

166:>>161
23/06/03 20:37:32.54 hD2oGIQP0.net
勉強目的なので、試してみます。
#defineでやるやり方は何となくわかるのですが、#includeよりtypedefとはどういうことですか?
void*もよくわからないので、こっちはまだ早そうです。

167:デフォルトの名無しさん
23/06/03 20:59:14.37 SlTHxzvh0.net
>>165
//fig1
#define ITERATOR int*
ITERATOR enq, deq;
//fig2
typedef int* ITERATOR;
ITERATOR enq, deq;
fig1ではdeqがポインタではなくなってしまうが
fig2ならこうした問題が起こらない

168:163
23/06/04 12:47:37.50 u2u7Kc0T0.net
あ、言い間違えてんの今気がついたw
- #include
+ #define
すまんこ

169:デフォルトの名無しさん
23/06/04 21:00:21.62 /SPLhkOjM.net
リストなどのコンテナ実装でデータの実態へはvoid*でポインタ指定すれば何でも格納できる
基本的にこれで汎用化できる

170:デフォルトの名無しさん
23/06/04 21:37:23.80 wPljDWped.net
リングバッファくらい簡単なのはその都度作ればいいんじゃないと思う
細かく改良していけばスキルアップになるぞ

171:デフォルトの名無しさん
23/06/04 22:10:36.35 AabPy4gc0.net
初心者質問失礼します
scanf_sやfopen_sなどの関数が含まれたソースをgcc 9.4.0でコンパイルすると失敗するのですがこれは仕様でしょうか?
これらの関数はC11で定義されていますが基本的にMSVCでしか使えないという感じでしょうか?

172:デフォルトの名無しさん
23/06/04 22:33:01.16 ktuQYTFv0.net
やれやれ…初心者質問あるあるだけ回答しておこうか
「失敗する」とは一体をもって判断したのか。そもそも処理系から何かメッセージは出ていなかったのか。初心者と自覚するなら質問に主観は一切不要だからそれを書きなよ

173:蟻人間
23/06/04 22:34:54.92 iTf1qDcyd.net
-std=c11

174:はちみつ餃子
23/06/04 23:06:52.44 MHoxWKtY0.net
>>170
C11 で規定されているけれど仕様としてはオプショナルなもの。
つまり処理系はそれを提供しなくても仕様準拠を名乗れる。
ただし、提供するならばマクロ __STDC_LIB_EXT1__ も定義しておくことになってる。
そんで使うときにはヘッダのインクルード前に __STDC_WANT_LIB_EXT1__ を define しておく必要がある。
MSVC は C11 が発行される前から scanf_s などを提供していた
(というかマイクロソフトがこれらを標準に入れるように働きかけていた)
のでバージョンによっては __STDC_WANT_LIB_EXT1__ を定義するという手順を介さなくても使えるのかもしれない。
私は MSVC を使ってないのでよう知らん。

175:デフォルトの名無しさん
23/06/04 23:52:26.98 AabPy4gc0.net
>>171
失礼しました
gccでコンパイルしたところfopen_sという関数は定義されていないという趣旨のエラーが出た形です
以下詳細になります

環境:WSL2 Ubuntu
コマンド(bash):gcc sample.c -o sample.out
出力:
/home/hoge/Code/sample.c:17:13: warning: implicit declaration of function ‘fopen_s’; did you mean ‘fopen’? [-Wimplicit-function-declaration]
17 | if((error=fopen_s(&fp,filename,"r")) != 0){
| ^~~~~~~
| fopen
/usr/bin/ld: /tmp/ccIXo3dN.o: in function `main':
/home/hoge/Code/sample.c:17: undefined reference to `fopen_s'
collect2: error: ld returned 1 exit status

176:デフォルトの名無しさん
23/06/04 23:59:42.49 AabPy4gc0.net
>>172
>>173
ありがとうございます!
アドバイスを参考に以下のように変更しましたが174と同様のエラーが出ます(T_T)
コマンドを以下のように変更
gcc -std=c11 sample.c -o sample.out
ソースファイルの先頭に以下を記述
#define __STDC_WANT_LIB_EXT1__ 1

177:デフォルトの名無しさん
23/06/05 00:18:53.38 6AEqxzj80.net
なんか人気のfopen_s関数について
URLリンク(blog.ef67daisuki.club)

178:デフォルトの名無しさん
23/06/05 10:37:04.03 ejs/048Ga.net
legacy_stdio_definitions.lib

179:デフォルトの名無しさん
23/06/05 18:03:48.62 7VR84C5ud.net
fopen_sって初めて知った
MS社内だけで通じる方言って感じでイヤな感じだな
fopenで書くようにしたほうがいい

180:デフォルトの名無しさん
23/06/05 18:11:20.30 7VR84C5ud.net
だいたいwinAPIはファイルを開く時はCreateFile()系を標準にする方針だと思ってたんだが
なんでfopenのパチモノを作るのか理解に苦しむ

181:デフォルトの名無しさん
23/06/05 18:32:16.74 OwVyUwPA0.net
世界征服に決まってるだろ

182:蟻人間
23/06/05 18:47:37.75 Fd2GxywXd.net
CreateFile はファイルロックの制御が細かくできたり、ファイルがすでに存在する場合の
処理や、セキュリティなどを考慮した処理など細かい設定ができる。
WindowsではfopenはCreateFileで実装されてるようだ。

183:デフォルトの名無しさん (ワッチョイ 82ad-rilk)
23/06/05 19:09:52.27 SzwJbur+0.net
>>179
CreateFileなんかで書いたら移植のとき困るだろ
そもそもプラットフォーム気にせず書けるようにCライブラリとして標準化させようとしているんだし
Windowsは移植性を考慮しないならCreateFile系のほうが柔軟に高度なプログラミングが出来るからCreateFile系使えと言っているだけ

184:デフォルトの名無しさん
23/06/05 20:35:19.71 ZwQJL2Eg0.net
APIを使うと毎回特権リングを呼び出すから、
小さい読み書きが多いとオーバーヘッドになる
Cランタイムはバッファを使って特権リングの
呼び出しを減らしている

185:デフォルトの名無しさん
23/06/05 20:40:56.74 LsGdvfPCd.net
>>182
標準化しようとするなら引数や戻り値をfopenに似せるべきだ
これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ

186:デフォルトの名無しさん
23/06/05 20:52:58.24 SzwJbur+0.net
>>184
あくまでCライブラリとして標準化
古い関数に仕様を合わせる必要はないべ
>これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
仕様を読まない初心者が悪いと思うんだが

187:デフォルトの名無しさん
23/06/05 20:54:52.49 OwVyUwPA0.net
委員長、読まなきゃ使えない関数は捨てられてしまうと思います!

188:デフォルトの名無しさん
23/06/05 20:58:18.67 SzwJbur+0.net
初めて使う関数なら一度は仕様見ろよ

189:デフォルトの名無しさん
23/06/05 21:10:47.13 OwVyUwPA0.net
じゃあ、使う必要が出てきたら読むことにします
当分、読むことなさそう

190:デフォルトの名無しさん (スッププ Sda2-KKRM)
23/06/05 21:43:17.97 EJphWr1dd.net
>>185
必要はある
今回のようにfopen_sをfopenに書き換えようとする(または逆)場合に変なミスを誘発する
大した理由もなく戻り値を変更すべきじゃない(またはfopenの名前を使うべきじゃない)

191:デフォルトの名無しさん
23/06/05 23:26:16.43 wc9Gft1n0.net
>>168
void*について学習してきました。
キャストしないと使えないようですが、キャストする型の指定はswitch-caseや#ifなどで分岐する感じでしょうか?
それとももっと賢いやり方がありますか?

192:蟻人間
23/06/05 23:46:37.21 pW8wFDDTd.net
>>190
memcpyなら型が分からなくとも無理やりコピーできる。

193:デフォルトの名無しさん
23/06/06 00:27:27.18 WKo3IR4c0.net
void*は元の形がint*でもchar*でもとりあえず何でもありで受け付けるやつ
元の型が何だったかは結局はプログラマ側が保証しとかないといけないので取り扱いは結構危険

194:デフォルトの名無しさん (ワッチョイ 82ad-rilk)
23/06/06 03:21:52.62 JM/jMtmO0.net
>>189
>大した理由もなく戻り値を変更すべきじゃない
関数の戻り値でエラーを返すことでグローバル変数のerrno読み出しタイミングの問題(マルチスレッド対策)に対応したいところって意図だと思うけど違うんかね?
まあ戻り値ではハンドル返してアドレス渡しでエラーを受け取るという方法もあるとは思うけど

>またはfopenの名前を使うべきじゃない
機能としては同じだし俺は別にfopen系の名前のほうが分かりやすくて良いと思う
言いたいことは分かるけどさ、初心者やベテランに関わらずちゃんと仕様を確認するってだけのことじゃね?

195:デフォルトの名無しさん
23/06/06 08:23:57.44 Wehdob+6d.net
fprintf_sとかの他の関数がerrnoを返さない以上、
fopen_sでだけerrnoを返しても一貫性がなくて無意味に感じられるんだよな。
結局のところerrno自体をスレッドセーフになるように作るしかなくて、
それで解消したんじゃなかったっけ?

196:デフォルトの名無しさん
23/06/06 08:40:25.14 SiwHVjTU0.net
>>161 を見てると
コンテナに入れたいのは int な整数なんよな
リングバッファだから 積む側と引っ張り出す側のそれぞれのインターフェースが必要になるけど
 void push(int); 実体を受けて内部で malloc してそっちに格納
 void pop(int*); malloc された内容を 引数に渡して mallocしたポインタは free しとく
この int の部分が任意の型でよしなにしようとすると
 void push(void* , size_t size);

197:デフォルトの名無しさん
23/06/06 08:42:43.61 SiwHVjTU0.net
途中送信してもた
void push(const void* , size_t); 実体はポインタで渡す
void pop(void* , size_t);
のように size_t で実体のサイズもらうしかないよね

198:はちみつ餃子
23/06/06 08:43:39.37 TmtPJsyo0.net
>>193
errno は C11 以降は thread local storage ということになってる。
errno をセットした後に別のスレッドによって内容が書き換えられるということはない。
(やろうとすれば出来なくはないが……。 普通に使ってて間違ってやってしまうということはないだろう。)
C99 でも errno は変更可能な左辺値 (に展開されるマクロ) であることは要求されているが
それが関数呼出しによって得られるものであってもかまわないという記述もあり、
スレッドまわりで問題を起こさないようにする処理はその関数に入れることが出来る。
C99 ではスレッドローカルの概念は提供していないが事実上はスレッドローカル的な
実装に出来るように配慮されてる。
errno が不格好な設計であるのは確かだが、マルチスレッドでは問題にはならない。

199:デフォルトの名無しさん
23/06/06 13:00:47.04 h4TMdgn6a.net
>>182
そんなのは fork を先にさっさと実装してから家

200:デフォルトの名無しさん
23/06/06 13:06:36.37 h4TMdgn6a.net
>>190
void *hoge は hoge++ 出来ないけど
int *i は i++ 出来るし
double *d も d++ 出来るし
i++ と d++ で足される数も違う
switch case で対応するのはおすすめしない

201:デフォルトの名無しさん
23/06/06 13:23:11.34 Ydo+/HsJM.net
>>198
forkは効率が悪いから必要ない
プロセスは_spawnを使ってスポーンっと産み出すもんだw

202:デフォルトの名無しさん
23/06/06 15:35:36.55 DWV+4S+md.net
GetLastErrorみたいにスレッドローカルにすればいいんだよ

203:デフォルトの名無しさん
23/06/06 21:21:59.69 XFiIFtrgd.net
>>190
そろそろそのやり方自体が賢くないって気づかないかな

204:デフォルトの名無しさん
23/06/06 21:26:13.17 9F60+Uyo0.net
是非賢いお手本をお願い

205:デフォルトの名無しさん
23/06/06 21:43:27.13 t5k+pzJSM.net
switchは良くないと思うよ
利用側でそれぞれの型用に別々の関数を書いて使う人が使い分ける感じじゃないかな
それこそ知らんけどレベルで申し訳ないが

206:デフォルトの名無しさん
23/06/06 22:36:35.79 QLr+SdPOd.net
>>203
毎回関数を作る
だってリングバッファだぞ
目をつぶっていても作れるぞw

207:デフォルトの名無しさん
23/06/07 07:49:00.73 uhVmgr37a.net
>>203
お手本の定番は qsort() だろ

208:デフォルトの名無しさん
23/06/07 08:29:44.13 MtVH7DHg0.net
>>205
そういうのはライブラリ化しておくべき

209:デフォルトの名無しさん
23/06/07 09:26:39.45 PykR7vOnd.net
fread(void *buf, size_t size, size_t n, …
の順もあれば
qsort(void *base, size_t num, size_t size, …
の順もあって
行き当たりばったり感

210:デフォルトの名無しさん
23/06/07 12:34:45.81 hQs7a5Jyd.net
>>207
じゃあ、ほい
struct CUE{
int size;
int max;
int inp;
int out;
char buf[1];
};
struct CUE *create_cue(int size, int max)
{
struct CUE *cue =malloc(sizeof(struct CUE)+size*max);
if(cue){
cue->size=size;
cue->max=max;
cue->inp=cue->out=0
}
return cue;
}
int cue_get(struct CUE *cue, void*data)
{
if( cue->inp ==cue->out )
return 0;//buffer empty
memcpy(data,&cue->buf[cue->out* cue->size],cue->size);
if(++cue->out>=cue->max) cue->out=0;
return 1;
}
int cue_add(struct CUE *cue, void*newdata)
{
int index = cue->inp;
if(++index>=cue->max) index=0;
if( index ==cue->out ) return 0;//buffer full
memcpy(&cue->buf[cue->inp* cue->size],newdata,cue->size);
cue->inp=index;
return 1;
}
目をつぶって作ったのでバグがあっても知らない
要するにこういうことでしょ
他の人が言ってるように型チェックがまったく働かないので俺は使いたくない

211:デフォルトの名無しさん (スッップ Sda2-NC7J)
23/06/07 13:05:36.32 xTW5tL3jd.net
memcpyは余計だな。ポインタを返して後は使用者(自分)に委ねるね俺は

212:デフォルトの名無しさん
23/06/07 14:05:23.13 lsOQP3og0.net
見てないけどCUEって時点でもう程度が知れる

213:デフォルトの名無しさん
23/06/07 15:08:50.29 hYVl7Kw10.net
重箱の鬼の首をとる応用例
・(Perlを)Pearl って時点でもう程度が知れる
・(Daemon を)Demon って時点でもう程度が知れる

214:デフォルトの名無しさん
23/06/07 16:05:48.27 e1NBMLRC0.net
Luciferの事もたまには思い出してあげて

215:デフォルトの名無しさん
23/06/07 21:46:42.98 xi4mV2dDp.net
ダブルスラッシュがコメントに採用されたのどの版から?

216:デフォルトの名無しさん
23/06/07 22:41:36.55 JgjHIelbd.net
>>210
概念的にはgetした瞬間にリングバッファから取り除かれてるはずなので
実際にはバッファが一回りするまで残っているが
消えてるかどうか曖昧で気持ち悪いのでコピーで返したほうが望ましい
まあ好みかもしれんが

217:デフォルトの名無しさん
23/06/08 11:06:02.87 rxjbLVG0a.net
>>214
MSVC じゃなくて MS-C の 3 くらいからあったかも

218:デフォルトの名無しさん (スプッッ Sd02-w9Bk)
23/06/08 12:46:07.00 m0+KFU8md.net
C99から
それ以前でもコンパイラ拡張で//コメントをサポートしてるのはあるらしいけど
以下のようなエッジケースで解釈が変わる

b=a//**/ 2
;

//コメントを認めないならb=a/2;
//コメントを認めるならb=a;

219:デフォルトの名無しさん (ワッチョイ 916e-aXLw)
23/06/08 12:55:42.05 ldHYl5bi0.net
> 目をつぶって作ったのでバグがあっても知らない

そういうのは「作った」とは言わない

220:デフォルトの名無しさん (ワッチョイ 5146-rNJ6)
23/06/08 13:01:02.12 5qYvg3Wg0.net
盲者のモノ作りなど認めない。

221:デフォルトの名無しさん (ワッチョイ 4297-UW6r)
23/06/08 13:06:43.94 2i+h5Gbt0.net
目開けても何も見てない奴いるからな

222:デフォルトの名無しさん
23/06/08 13:39:09.53 JhrUsqpHd.net
野良審査員には餌をやらん主義

223:はちみつ餃子
23/06/08 14:35:42.49 Iro3x2NJ0.net
>>214
C99 からだが経緯としては先に C++ で採用されていたという事情がある。
C with Classes から C++ になる 1984 年頃に BCPL 風を参考にして
スラッシュふたつで始めるコメント記法が導入され、
更に 1998 年にそのコメント記法も含めて ISO の規格として確立した。
C と C++ でプリプロセッサは共用することも多いだろうし
コメントはプリプロセッサで除去するだろうから
C++ で採用された段階で実際には C でもスラッシュふたつのコメント記法を
使えていた環境は割と有ったのだと思う。

224:デフォルトの名無しさん
23/06/08 14:52:55.41 ldHYl5bi0.net
マイクロソフトが独自拡張で当時C++のみのはずの//をCでも許していた
言わずと知れた屈指の大手がやっているので規格が追認することとなった

225:デフォルトの名無しさん
23/06/08 16:45:48.60 JA9B62300.net
gccも使えてた気がする

226:デフォルトの名無しさん
23/06/10 18:04:06.65 Yvl44ooC0.net
90年後半からしか実務で使ってないけどVCでは普通に書けてたな
UNIX系はベンダー製のCの制限が酷かった思い出

227:デフォルトの名無しさん
23/06/10 18:47:34.87 Yrme8ZC10.net
borlandやwatcomでも使えなかったっけか?

228:デフォルトの名無しさん
23/06/10 20:49:31.43 6EfmWVuRd.net
便利だからね
オプションで使えなくすることもできたはず

229:デフォルトの名無しさん (ワッチョイ c1bb-s+nx)
23/06/16 01:45:49.62 q8ApsJJ90.net
int a[3] = {};
int b[3] = {0};
aの初期化はgcc拡張で規格に沿っているのはbの初期化だと記憶していたんだけど、
規格の6.7.8を見るとメンバの個数より波カッコで囲まれた初期化子が少ない場合は暗黙的に静的に初期化するとあった。
この規格の文章を見る限りはaも規格に合致していると思えるんだけど、aがgcc拡張っていうのは本当ですか?

230:228 (ワッチョイ c1bb-s+nx)
23/06/16 02:08:30.52 q8ApsJJ90.net
参照した規格はX 3010:2003 (ISO/IEC 9899:1999) です

231:デフォルトの名無しさん (ワッチョイ e95f-2rqm)
23/06/16 08:46:04.94 qgM8i0iT0.net
>>228
本当。文法が空の {} を許していない。
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer
C23 から↓で initializer に {} が追加されてようやく通るようになる。
URLリンク(www.open-std.org)

232:デフォルトの名無しさん (アウアウウー Sadd-g1CP)
23/06/16 16:12:05.48 ly+Q1cW8a.net
struct hoge {
char a[];
};
struct fuga {
char a[0];
};

233:デフォルトの名無しさん (ワッチョイ c1bb-s+nx)
23/06/16 16:20:37.85 q8ApsJJ90.net
>>230
なるほど構文規則ってところを見るんですね
どうもありがとう

234:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c13e-2rqm)
23/06/16 17:28:57.05 QEmhRLek0.net
>>228
gcc でも -pedantic オプションを付けたら警告は出るぞ。
> warning: ISO C forbids empty initializer braces

235:デフォルトの名無しさん (ワッチョイ 0dbb-p8ty)
23/06/17 21:50:15.83 q+Kf8pNU0.net
>>233
知りませんでした!
どうもありがとう

236:デフォルトの名無しさん (ワッチョイ a52d-wYA+)
23/06/25 08:36:37.75 D6GgnyEK0.net
int main(void)って書く流派ってどこでそんなの身に着けたの?

237:デフォルトの名無しさん (ワッチョイ 856e-gmRT)
23/06/25 09:20:49.86 yrM2OONq0.net
>>235
ISO/IEC 9899:2011
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }

238:デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
23/06/25 10:53:26.83 /MLTigPj0.net
>>235
この指摘をしばしば見るが、int main(void) が違反だった時代はいつ頃なの。

239:デフォルトの名無しさん (ワッチョイ a52d-wYA+)
23/06/25 10:56:42.79 D6GgnyEK0.net
C99からint main(void)と書いてもいいらしい

240:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
23/06/25 11:13:38.04 +vRVyhzX0.net
main については C89 のときから変わってないよ。

241:デフォルトの名無しさん (ワッチョイ 856e-gmRT)
23/06/25 11:58:52.46 yrM2OONq0.net
>>237
K&R Cにはvoidというキーワードが存在しなかった

242:デフォルトの名無しさん (ワッチョイ a52d-wYA+)
23/06/25 12:22:01.62 D6GgnyEK0.net
K&R第2版にint main(void)なんて書き方出てきた記憶がないんだよね

243:デフォルトの名無しさん (ワッチョイ a397-HUf/)
23/06/25 12:38:23.47 6RRGV0Qg0.net
printf(null);

244:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
23/06/25 12:38:51.73 +vRVyhzX0.net
>>241
日本語版だと 41 ページに
「リストが明らかに空であるときには,予約語 void を使うべきである」
と書かれているのを見つけた。

245:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
23/06/25 17:09:36.88 +vRVyhzX0.net
関数定義のときに仮引数がゼロ個なら void を書くのは当然の作法なんだから
main についてはどうでも良いとはいえども main だけ空にするのもなんか変じゃない?

246:デフォルトの名無しさん (ワッチョイ 1b79-SnHJ)
23/06/25 19:26:05.36 20Xxe9+j0.net
処理系は引数で任意のスタートアップを指定できるからmain書きたくない需要も満たせるよ

247:デフォルトの名無しさん (スッププ Sd43-W+UZ)
23/06/25 22:39:44.42 7VFzLtX7d.net
>>235
めんどくさいだけだろ

248:デフォルトの名無しさん (ワッチョイ 955f-bte+)
23/06/26 06:14:35.93 F8cl0T7T0.net
めんどくさい流免許皆伝

249:デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
23/06/26 07:16:23.26 xzT4Agq20.net
初級、めんどくさいので略記
初段、めんどくさいので無注釈
免許皆伝、めんどくさいので無ドキュメント

250:デフォルトの名無しさん (ワッチョイ ad5f-9QlF)
23/06/26 08:07:26.96 5ZBA7oeF0.net
組み込み系ならmainに引き数なんて不用

251:デフォルトの名無しさん (スプッッ Sd03-+QuN)
23/06/26 08:52:43.48 r2qj24yMd.net
元々プログラムはまんどくさいを代行するものだし・・・

252:デフォルトの名無しさん (ワッチョイ 856e-gmRT)
23/06/26 12:05:19.83 TXNTP2LF0.net
組み込みでmainか・・・
ベクタテーブル作るときのラベルがマングリングされてないから短く済むけどそれだけ

253:デフォルトの名無しさん (ワッチョイ 856e-gmRT)
23/06/26 12:06:17.67 TXNTP2LF0.net
あ、ここCだっけ
サーセン

254:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx)
23/06/26 13:00:03.75 DZPgqn/v0.net
>>249
main に引数が有るか無いかの話じゃなくて、無いときに void を書くという話題だよ。

255:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
23/06/26 13:16:56.95 6bPwUIFfp.net
実際の組み込み系には、二つのmainエントリーがある
引数のある奴と、無い奴な

256:デフォルトの名無しさん (ワッチョイ 856e-gmRT)
23/06/26 13:20:15.17 TXNTP2LF0.net
>>254
組み込みでargcとargvはどんな意味があるってんだ?
コンソールがあるって前提?

257:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
23/06/26 13:24:00.16 6bPwUIFfp.net
意味なんて知るか
ブートローダとか色々都合があるんだよ

258:デフォルトの名無しさん (ワッチョイ 9dc9-3ptY)
23/06/26 13:31:08.91 yiohjGaX0.net
環境依存しまくってる部分だとは思うけど
組み込み用のコンパイラでも エントリは main のままなのね

259:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
23/06/26 13:43:40.71 6bPwUIFfp.net
組込みの真のエントリーはresetな
でも普通はそこからmainまではハード会社が提供してる
初期化処理が入るからあんまり触らない

260:デフォルトの名無しさん (スッププ Sdab-W+UZ)
23/06/26 16:47:50.70 D5GxB3wJd.net
リンカにわたすオプションで_startだか_resetだかを指定してるだけ(例えばld -e _start)
自分で初期化を書きたければmakefileに先頭ラベルを記述すればいい

261:デフォルトの名無しさん (ラクッペペ MM4b-d+Ca)
23/06/26 17:33:04.45 O3f/yVVZM.net
割込みベクタテーブルのリセット割込みのアドレスがエントリポイント
マイコンのリセットでプログラムカウンタのアドレスが設定される

262:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
23/06/26 20:20:34.26 6bPwUIFfp.net
>>260
石によるだろそんなん

263:デフォルトの名無しさん (ワッチョイ 856e-gmRT)
23/06/26 20:39:52.87 TXNTP2LF0.net
K&R Cで「死産だった」とされるentryというキーワードは、多分このへんの話だったんだろうな

264:デフォルトの名無しさん (スプッッ Sd03-eK8M)
23/06/26 20:56:23.88 aG57g/0Md.net
そもそもCPU(マイコン)と、そのCPUの命令セットに翻訳するコンパイラに自由度を与えるためにC言語規格で明言することを少なめにしてる

0x100からカウンタが始まるだのブートローダーが必要だの環境依存の初期化はコンパイラが知ってれば十分。

265:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF)
23/06/26 21:02:50.78 6bPwUIFfp.net
コンパイラは知らないよ
スタートアップライブラリが知ってる

266:デフォルトの名無しさん (ワッチョイ 856e-gmRT)
23/06/26 21:10:49.81 TXNTP2LF0.net
そそ

267:デフォルトの名無しさん (ワッチョイ e3fb-eK8M)
23/06/26 21:26:51.56 L7dTsKCZ0.net
ああそうかコンパイラ自体は初期化手段知らなくてもいいのね

268:デフォルトの名無しさん (ワッチョイ bb2d-ctHD)
23/07/07 14:46:28.07 Cp8NbwGm0.net
#include <stdio.h>

void stack_size_estimate()
{
int dummy; // スタック上に確保するダミー変数

// スタック上のポインタとダミー変数の差を計算
unsigned long stack_size = (unsigned long)&dummy - (unsigned long)&stack_size_estimate;

printf("Estimated stack size: %lu bytes\n", stack_size);
}

int main()
{
stack_size_estimate();
return 0;
}

Windowsで実行すると毎回結果がばらばらになる

269:デフォルトの名無しさん (ワッチョイ e26a-3VO7)
23/07/07 14:52:43.24 RkflWXNN0.net
.textと.bssを比較すりゃさもありなん

270:デフォルトの名無しさん (ササクッテロラ Sp5f-SBEo)
23/07/07 15:00:57.31 Rpkmzd56p.net
プログラムとデータは別れてんだよなぁ

271:デフォルトの名無しさん (テテンテンテン MM8e-OS6S)
23/07/07 16:12:54.67 h0HZTRPQM.net
アドレス空間レイアウトのランダム化 (ASLR)だろ
差じゃなくてポインターの中身を表示してみればいいじゃん

272:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
23/07/07 16:20:17.47 gGTaLgTI0.net
>>267
64bit 版の Windows だとしたら unsigned long はポインタを表すのに十分なサイズではない。
上位バイトが丸ごと抜け落ちて意図した計算が出来てないと思う。

へんなところを引き算するよりベースアドレスを基準に観察したほうがわかりやすいよ。
歴史的事情で Windows ではインスタンスハンドルがベースアドレスそのものということになってる。

273:デフォルトの名無しさん (スップ Sd22-PY2F)
23/07/07 16:42:49.80 LOYSagRvd.net
そういやlongはWindows環境だと32bitだっけか
size_t使ったほうが面倒がなさそう

274:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
23/07/07 16:53:06.75 gGTaLgTI0.net
Windows だとどっちでもいいけど意味の上では uintptr_t のほうが妥当だと思う。

275:デフォルトの名無しさん (ワッチョイ 0e79-p0MK)
23/07/07 16:55:15.60 tybFBPle0.net
いやもう露骨にbit数書いてくれた方がいいわ
int128とか

276:デフォルトの名無しさん (ワッチョイ bb2d-ctHD)
23/07/07 17:07:14.08 Cp8NbwGm0.net
#include <stdio.h>
#include <Windows.h>

void stack_size_estimate()
{
int dummy; // スタック上に確保するダミー変数
SIZE_T stack_size;

// ダミー変数のアドレスを取得
LPVOID dummy_addr = &dummy;

// メモリ領域の情報を取得
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(dummy_addr, &mbi, sizeof(mbi));

// スタックサイズを計算
stack_size = (SIZE_T)dummy_addr - (SIZE_T)mbi.AllocationBase;

printf("Estimated stack size: %lu bytes\n", stack_size);
}

int main()
{
stack_size_estimate();
return 0;
}

2096444 bytes
になります、予想の5分の1くらいでした

277:デフォルトの名無しさん (ワッチョイ c67c-mdfO)
23/07/07 17:38:01.25 GxNDHmP50.net
>>274
#include <stdint.h> の
int64_tとかじゃあかんの?

278:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
23/07/07 17:44:32.91 gGTaLgTI0.net
ここで欲しいのは「ポインタを格納するのに適した整数型」であって
具体的に何ビットなのかをプログラム上で表現するのは筋違いだと思うんだけど
でもまあどうせ処理系に依存するなら抽象を挟んでもあまり得なことも無いかな
とも思うし、まあそこらへんは感覚的なもんやからね……。

279:デフォルトの名無しさん (ワッチョイ c67c-mdfO)
23/07/07 17:46:08.50 GxNDHmP50.net
>>277
#include <stdint.h>の
intptr_tやuintptr_tじゃあかんの?

280:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP)
23/07/07 17:49:07.83 gGTaLgTI0.net
>>278
いいよ。
私は uintptr_t が妥当と述べてる。 (>>273)

281:デフォルトの名無しさん (ワッチョイ c67c-mdfO)
23/07/07 17:55:31.01 GxNDHmP50.net
Windowsならこうなってるね
LONG_PTR SetWindowLongPtrA(
[in] HWND hWnd,
[in] int nIndex,
[in] LONG_PTR dwNewLong
);

282:デフォルトの名無しさん (ラクッペペ MM8f-VHD8)
23/07/08 09:25:06.78 ZG00xBJMM.net
それハンドルを取得する関数なのでポインタとはちょっと違う

283:デフォルトの名無しさん (スプープ Sd3f-4U7T)
23/07/08 11:55:06.89 pEcLN/B5d.net
>>275
それで本当にスタックサイズ計算できてるの?
MSの文書だとデフォルトでは1MBと書いてあるし
もし不足が予想されるのならリンクオプションでサイズ変更できるし
本来大きいメモリはalloc系で確保すべき

284:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/08 12:43:32.13 svQTfB7/0.net
メモリ空間は 64bit あるけどその全てに実メモリが割り当てられているわけでは当然ない。
仮想的なメモリを管理するから API の名前に Virtual とついてて、
AllocationBase は管理している一塊の単位のベースってだけ。
その単位の中の全てがスタック用とは限らないので基準にはならないと思う。

各スレッドのスタックの底は thread information block に格納されているはず。

285:デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
23/07/08 19:02:15.63 wtJKE3gc0.net
>>281
????

286:蟻人間 ◆T6xkBnTXz7B0 (スフッ Sdbf-yJMt)
23/07/08 19:05:04.15 E2jAOZHYd.net
>>281
違うよ。ポインタと同じサイズの整数値を設定できる関数だよん。
型キャストすればポインタも渡せる。

287:デフォルトの名無しさん (スップ Sd3f-hfg2)
23/07/09 12:33:23.59 6bAebKnHd.net
井の中の蛙だったか
あーくだらん

288:デフォルトの名無しさん (ワッチョイ 17b3-S1Rn)
23/07/09 18:21:47.85 nGZbLr+D0.net
#include <stdio.h>
void main(void) {
int card[5][5];
int *p;
p = card;
}
gccでコンパイルすると
aa.c:7:11: warning: assignment to ‘int *’ from incompatible pointer type ‘int (*)[5]’ [-Wincompatible-pointer-types]
7 | p = card;
となります。
エラーではないので動くのですが・・・この警告はどうすれば消えますか?
やりたいことは、2次元で宣言してる変数cardを2次元を意識することなくアクセスしたくて*pに代入しています。

289:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/09 18:24:43.97 6ZzBc/+b0.net
>>287
p = *card;

290:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/09 18:31:02.01 6ZzBc/+b0.net
>>287
この場合に card の型は int[5][5] なんだけど
配列は配列の先頭要素を指すポインタに暗黙に型変換されるのが基本ルール
だから式中に card が出てきたら int(*)[5] として扱われる。
この型は int* と互換性のない型ということを警告は言ってる。
型が int(*)[5] であるような式に * を付けたら int[5] ということになるんだけど
上述の暗黙の型変換のルールで int* ということになって p の型と一致するようになる。
故に p = *card; で通る。

291:デフォルトの名無しさん (ワッチョイ 17b3-6GCC)
23/07/09 18:37:18.48 nGZbLr+D0.net
サンクス

292:デフォルトの名無しさん (ワッチョイ 9ffb-9JJG)
23/07/09 18:49:34.69 vTvbeyL00.net
この場合ってpを長さ25の1次元配列として使っていいという保証あるっけ?
`card[0]`の長さ5の配列と`card[1]`の長さ5の配列に隙間がないことが保証されてればいいんだけど

293:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/09 19:43:00.43 6ZzBc/+b0.net
>>291
二次元配列ってのは理屈の上では一次元配列を要素とする配列と解釈される。
一次元配列で要素間に詰め物が入らないなら二次元でも理屈は同じ。

294:デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
23/07/09 20:21:15.21 DZU7rHSU0.net
アフォはこう書く
p = (int*)card;
先輩方に見捨てられるので気をつけて

295:デフォルトの名無しさん (スプープ Sd3f-4U7T)
23/07/09 20:52:22.88 QgBW0FA9d.net
>>291
心配なら
int card[5*5];
とでも宣言すれば安心だけど
パディングがもしあるなら card[5];の各要素の間にすでに挟まってるはずなので
card[5][5];も同じようにアクセスできるはず

296:デフォルトの名無しさん (ワッチョイ 175f-kkOg)
23/07/09 23:01:01.58 uNLQZN7w0.net
>>291-292
隙間の有無とアクセス保証は関係ないでしょ。少なくとも規格上は。

297:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/10 00:28:02.91 EhhseXmK0.net
規格上の規定は要素のレイアウトの規定として私は理解してたので
そのレイアウトと矛盾しなければ一次元の配列として
扱っても仕様に反しないという解釈でいたんだが……。
直接的に書かれている演算方法を経由した場合しか許さん
と捉えたなら保証はないのかもしれない。

298:デフォルトの名無しさん (ワッチョイ ff63-kkOg)
23/07/10 00:33:20.12 SSHQru750.net
保証がないと、困るよ・・

299:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/10 00:36:21.43 EhhseXmK0.net
解釈の余地があるときは安全側 (制約が厳しい側) で解釈しておくのが筋ではある。

300:デフォルトの名無しさん (ワッチョイ ff63-kkOg)
23/07/10 00:53:08.94 SSHQru750.net
元々配列なんて一次元が基本だし、mallocで確保して多次元配列として扱うなんてのもよくあるし

301:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/10 01:20:39.58 EhhseXmK0.net
>>299
malloc で確保した領域はどんなオブジェクト (少なくとも仕様の範囲内で作れる型に対応するオブジェクト) に対しても適切に境界調整されている。
そこらへんは別の話。

302:デフォルトの名無しさん (スプープ Sd3f-4U7T)
23/07/10 08:43:48.54 Xrxae+evd.net
先頭と領域が確保されていればその間にアクセスできない部分があることはないだろう
そんな器用なことをする必然性がないわ

303:デフォルトの名無しさん (アウアウウー Sa9b-8N3f)
23/07/10 08:47:35.15 7JEyTvQka.net
#include <stdio.h>
void main(void) {
int card[5][5];
int **p1;
int *p2

p1 = card;
p2 = card[0];
}

304:デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
23/07/10 09:02:15.74 BD2ve/J+0.net
>>302
こっちでやれ
スレリンク(tech板)

305:デフォルトの名無しさん (アウアウウー Sa9b-8N3f)
23/07/10 09:24:10.89 dS/bwvgRa.net
>>303
おまえそっちでやれ
○○のはずとかそんなんで書くぐらいなら普通に書け

306:デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
23/07/10 09:29:04.81 BD2ve/J+0.net
>>304
何のことだよ?

307:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg)
23/07/10 09:53:48.86 EhhseXmK0.net
>>301
オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。
ポインタの演算の結果は配列の要素か配列の最後の要素を
ひとつ過ぎた位置を指さなければならない。
その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく
ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。
(C99 なら 6.5.6 の加減演算子の項目に書いてある。)
今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので
このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。
仕様に書かれている演算はその演算に相当するレイアウトで配置される
という意味で解釈することも出来ると私は考えていたが
仕様の文面に厳密に言えば駄目かもわからん。
現代的な処理系ではポインタは由来 (provenance) という概念を持っていて
演算の元になったオブジェクトを外れたら未定義であるということを
利用して最適化することもある。
これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。
仕様に厳密にしないとわけのわからないことが起こるのが C というものなので
仕様の解釈は大事だよ。

308:デフォルトの名無しさん (ワッチョイ 9fad-kkOg)
23/07/10 10:31:52.15 ifz8cUKw0.net
>>302
p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。

309:デフォルトの名無しさん (ワッチョイ ff7c-DxV6)
23/07/10 10:34:39.51 BD2ve/J+0.net
int card[5][5]; となっているとき
&card 二次元配列全体へのポインタ
card 最初の行へのポインタ
*card 最初の要素へのポインタ

310:デフォルトの名無しさん (ワッチョイ bf79-CBkq)
23/07/10 12:23:15.05 pvSg+WfU0.net
2次元配列なんてExcelのRangeオブジェクトが返す配列ぐらいでしかお世話になったことないわ
特に効率的でもないし構造体でええやろ

311:デフォルトの名無しさん (スップ Sd3f-hfg2)
23/07/10 12:47:58.91 Wg7MEfSed.net
何でそこで構造体?

312:デフォルトの名無しさん (ワッチョイ 175f-kkOg)
23/07/10 12:53:57.17 AzWw4sMa0.net
>>308 下2行は正しくない。

313:デフォルトの名無しさん (スップ Sd3f-hfg2)
23/07/10 13:25:18.46 Wg7MEfSed.net
§6.3.2.1の段落2で定める例外にあたらない場合という但し書きが足りないね
悪かったよ

314:デフォルトの名無しさん (ワッチョイ ff63-/79E)
23/07/10 18:04:08.51 SSHQru750.net
5ch、専用ブラウザがサポート終了し、撤退する様です。
FireFoxだと書き込める様です。
それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。

315:デフォルトの名無しさん (ワッチョイ ff7c-rqKn)
23/07/10 18:05:43.31 BD2ve/J+0.net
ソースplz

316:デフォルトの名無しさん (スップ Sd3f-9JJG)
23/07/10 18:24:57.71 EIZKDTevd.net
処理系が16byte境界に合うように
「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安
わざわざコンパイラがそんなことする理由は
1. 16byte境界の合わせたほうがindexの計算が速い
2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる
規格上パディングが入らないことが保証されるならこの話は忘れてくれ

317:デフォルトの名無しさん (ワッチョイ ff63-/79E)
23/07/10 18:29:02.59 SSHQru750.net
Talk専用ブラウザ 「Jane Style」 ← 5chの記述が消えました
20230710
Version 5.00 公開
・Talk に対応しました
* 5ch.net のサポートを終了しました
URLリンク(janesoft.net)

318:デフォルトの名無しさん (アウアウウー Sa9b-HEX/)
23/07/10 18:54:15.08 ebofKpc7a.net
>int **p1;
無いわωωω

319:デフォルトの名無しさん (ワッチョイ 9fad-OD6X)
23/07/11 02:24:43.39 vn98dBP10.net
>>314
スレリンク(operate板)
正確にはJaneStyleが離反した
> 00015ちゃんねる ★2023/07/11(火) 00:00:00.00ID:LokiTech
> Janestyleはもう5ch.netと提携していません。
> Janestyle以外の専用ブラウザをご利用ください。
> 旧バージョンの5chブラウザ(API前)は近く再度利用可能となります。
> (以下略)

320:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-/79E)
23/07/11 11:41:03.76 MoKwTryZ0.net
>>315
おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。

321:デフォルトの名無しさん (ワッチョイ b702-VAl4)
23/07/11 12:37:10.33 UJem4sQV0.net
テスト
> どういう理屈か知らんけど
> chmateで『URLから開く』で見たい板のURL貼り付けして
> 「5ch」の部分を「5Ch」に変えて開くと
> 5chのスレchmateで見れて草
URLリンク(twitter.com)
(deleted an unsolicited ad)

322:デフォルトの名無しさん (ワッチョイ e2ad-/jfo)
23/07/17 05:23:15.01 0PvTd+Ok0.net
chmate はもう対応できてないかな。俺は読み書きできるようになったよ。
今これはPCからで Siki っていうの使って書いてるが。

323:デフォルトの名無しさん (ワッチョイ 163e-MI76)
23/07/17 09:16:25.38 YifLUjyU0.net
旧 API を復活させて制限が緩くなったから昔の専ブラがそのままかちょっとした設定変更で使えるよ。
今のところ PC 用の専ブラとしては JaneXeno か Siki が決定版だと思われているようだ。

324:デフォルトの名無しさん (ワッチョイ 3279-EJzg)
23/07/17 11:31:18.04 SG+RSRxx0.net
>>321
PCはAPI対応前の昔のlive2ch(live5ch)が使える

325:デフォルトの名無しさん (ワッチョイ 4d46-am1z)
23/07/17 11:33:54.45 o8kBjP6A0.net
ninja は make を完全に置き換え可能になったでござるかニンニン?

326:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 163e-MI76)
23/07/17 11:48:18.17 YifLUjyU0.net
>>324
設計思想が異なる。
ninja は make ほど多機能ではなく、メタビルドツール (cmake など) と組み合わせるのを前提としている。
どうせメタビルドツールは使うという前提なら ninja のほうが使い勝手が良いと思うが、
そうでないなら make のほうが楽だと思う。

327:デフォルトの名無しさん (ワッチョイ dfad-onGn)
23/07/22 17:50:40.48 ZqN2VkQO0.net
Siki はおすすめ記事が出ていた。
5chブラウザー、JaneStyle代わりのオススメは「Siki」
URLリンク(news.yahoo.co.jp)

328:デフォルトの名無しさん (ワッチョイ 7f63-cTWz)
23/07/27 01:32:04.41 z625zk2O0.net
現状専用ブラウザJaneStyle4.23を落としてきて修正パッチを当てて動かしてます。
修正パッチは有志が機械語レベルまで降りて解析し対処してます。
今まで無かった機能まで追加してます。その技術力はスゴイですね。
ただ、専用ブラウザは今後5ちゃんねるの仕様が変わったときに
開発者がメンテできるかどうかで生死が決まりそうですね。

329:デフォルトの名無しさん (ワッチョイ 7310-X/lp)
23/08/02 10:02:23.97 6slkiMgF0.net
なんか昔「コンパイル言語は消滅してスクリプト言語が主流になる!!」って主張聞いて
オープンソースアプリはともかく商業アプリでスクリプト言語使ってたら
速攻解析されてコピーなりクラックされて(その結果どうなるかはわからんけど)商売にならないんじゃないのかと思ったけど
現状どうなのかな?
JaneStyleの 不具合発生→ねらー修正 っての見てるとバイナリーコードでもスクリプトコードでも解析難易度は変わらないのかなとも思うけど。

330:デフォルトの名無しさん (ワッチョイ 1746-ZTxv)
23/08/02 10:53:42.75 19FN81hV0.net
>>328
事実如何を措いて、
主流以外の傍流は消滅するという理屈がそもそもおかしい。

331:デフォルトの名無しさん (ラクッペペ MMe6-Fuds)
23/08/02 11:00:33.97 Vv20iihFM.net
バイナリクラックなら開発言語そのものにはあまり意味はない気がするけどな
バイナリエディタで稼働中の実行コード覗かれれば元の言語が何であろうが同じこと

332:デフォルトの名無しさん (ワッチョイ be63-1j9t)
23/08/02 11:10:57.90 STym7Vrv0.net
こういうのはやはりファームやってた人は強いのだろうか?笑

333:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b73e-yh3V)
23/08/02 11:11:56.50 Vhf3uqZN0.net
暗号化やら難読化やらを駆使しても
実行中には実行できる形になってるのは
どうしようもないもんな。
だからライセンスで制約を付けるんだが、
不特定多数をユーザーとするビジネスモデルだと
制約を守らせるのも難しいのだと思う。

334:デフォルトの名無しさん (ワッチョイ be63-1j9t)
23/08/02 11:38:35.24 STym7Vrv0.net
不具合を何度も指摘されても放置していて
痺れ切らしたユーザーが解析してパッチを公開した
これが最初だったと思う

335:デフォルトの名無しさん (ワッチョイ 4af0-0TAO)
23/08/02 11:45:48.58 JKibevwe0.net
あれ難読化してあるの?

336:デフォルトの名無しさん (ワッチョイ 6aad-kNqZ)
23/08/02 11:54:41.63 na1pjdup0.net
業務用アプリならサブスクとクラウドって感じだろうけど
個人向けのだとどうなんだろうね
まあそういう海賊版はアップロードした奴を捕まえることで対処しているっぽいけど
アプリの制限取っ払われるのはもうどうしようもないんじゃないかな

337:デフォルトの名無しさん (ワッチョイ 6aad-kNqZ)
23/08/02 11:55:36.50 na1pjdup0.net
難読化はしてない
いやらしいほどに丸見え

338:デフォルトの名無しさん (スッププ Sdb6-FXAW)
23/08/02 20:21:52.90 Zi22N3SKd.net
>>328
オープンソースを勘違いしてる?

339:デフォルトの名無しさん (ワッチョイ be63-1j9t)
23/08/02 20:58:10.27 STym7Vrv0.net
質問型式ではなく、自分はこう考えていると書いて

340:デフォルトの名無しさん (スッププ Sdb6-FXAW)
23/08/02 23:54:36.96 W7+oBwzNd.net
>>328
次元の違う問題を比較してると思う
スクリプトでコンパイル言語を代替できるようになったとしても
商業ソフトを供給するほうがスクリプトでないと実装できないことにはならないし
サーバーサイドで重要な処理を行うようにすればスクリプトでもそこは解析できないわけだし(今回の5chのAPI仕様変更みたいに)

341:デフォルトの名無しさん (ワッチョイ 6aad-Z/b2)
23/08/03 04:03:41.71 /xW45k0z0.net
>>328
主流かどうかはわからんけどJavaのような仮想マシンで動くやつは流行ったな(Androidスマホで採用されたので思い切り流行った)。Perlとかのインタープリタの言語も内部でコンパイルしてから動くのでなんとなく似ている。
こういう風に仮想マシンで動くようにするとOSやCPUが違っても互換性を保つのが楽になる。

342:デフォルトの名無しさん (ワッチョイ 5b2d-IPSQ)
23/08/03 17:16:30.77 5KUHoXNc0.net
tiktokなんかjavascriptでVMを実装してその上で独自のコードが動いてるせいで解析が極めて困難になってる

343:デフォルトの名無しさん (ワッチョイ 1746-ZTxv)
23/08/04 08:54:17.97 4oDPVLgw0.net
>>341
こわっ...

344:デフォルトの名無しさん (スフッ Sd8a-KN61)
23/08/04 15:45:40.86 GMHK0FTid.net
/* 文字列を反転させる */
#include <stdio.h>
#include <string.h>
void reverse(char *);
void reverse(char *cp)
{
char *p, *q, wk;
p = cp;
q = &cp[strlen(cp)]-1; // strlen()は'\0'を数えないのに1引かないと正しく動作しない
while (p < q) {
wk = *p;*p = *q;*q = wk;
p++;
q--;
}
}

int main(void)
{
char ss[] = "Program123456789";
reverse(ss);
printf("%s\n", ss);
return 0;
}
上記プログラムでstrlenは'\0'文字をカウントしないのに、1引かないと正しく動作しないのはなぜですか?

345:デフォルトの名無しさん (スフッ Sd8a-KN61)
23/08/04 15:49:34.67 GMHK0FTid.net
343の訂正です
q = &cp[strlen(cp)-1]です

346:デフォルトの名無しさん (ワッチョイ 17c9-NYH+)
23/08/04 15:57:00.72 /AVxr1FX0.net
末尾の \0 を入れ替えたらあかんやろ
"AB" は 


347:strlen() == 2 になって  0 1 2 [A][B][\0] こういう配置や



348:デフォルトの名無しさん (ワッチョイ 17c9-NYH+)
23/08/04 16:03:23.77 /AVxr1FX0.net
strlen は文字数を返す一方で [ ] の中はオフセット量(0スタートの相対距離)だから
1文字目を指すのは オフセット0 の場所なんだわ

349:デフォルトの名無しさん (スフッ Sd8a-rFCo)
23/08/04 16:09:46.38 GMHK0FTid.net
>>>345 >>>346 即答ありがとうございます
自分はまったく そこまで考えてstlrenを使ってませんでした。ありがとうございます。勉強になります

350:デフォルトの名無しさん (ワッチョイ 17c9-NYH+)
23/08/04 16:25:43.11 /AVxr1FX0.net
そこまで考えてというか ポインタ/配列添え字 が 0 から始まるだけの話でな
 1文字目 = (オフセット)0
 2文字目 = (オフセット)1
:
 n文字目 = (オフセット)n-1
他所言語(特に古めのBASIC) だと配列の添え字は 1から始まるのが自然だから
その感覚のままだと およよ? ってなる

351:デフォルトの名無しさん (ワッチョイ be63-1j9t)
23/08/04 16:33:03.37 h8ImZ1qQ0.net
COBOL, PL/I, RPG, FORTRAN, BASIC, R, Lua, Julia は、1で始まる

352:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b73e-yh3V)
23/08/04 16:45:56.55 vdf3rEq10.net
BASIC はバリエーションが多いよ。
0 と 1 を切り替える機能があるやつを知ってる。

353:デフォルトの名無しさん (ブーイモ MMe6-rA3N)
23/08/04 22:18:35.44 3UzK9dfoM.net
>>341
そのやり方だとapple審査通らないのでは?

354:デフォルトの名無しさん (ブーイモ MMe6-rA3N)
23/08/04 22:23:16.57 3UzK9dfoM.net
環境はwebkitでvm自体dlしてくるから問題ないということなのか…

355:デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
23/08/05 14:06:37.50 7Tp3cevL0.net
>>349
Pascal もよろしく

356:デフォルトの名無しさん (ワッチョイ bb01-tyL0)
23/08/05 21:43:38.19 p8skrLMB0.net
>>353
Fortranは添字の開始値を指定しない場合は1から始まり、添字の開始値を指定する場合は任意の整数
(負も可)を指定できるが、Pascalは添字の開始値指定が必須で任意の整数(負も可)を指定できるから、
1から始まるとは言えない。

357:デフォルトの名無しさん (スプープ Sdc3-EMqx)
23/08/05 22:05:05.59 Rq9CiLOMd.net
>>350
ああOPTION BASEかあ
N88BASICの頃からあるが使ってるの見たことない

358:デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
23/08/05 23:14:06.26 7Tp3cevL0.net
>>354
そういやそうだった。忘れてた。

359:デフォルトの名無しさん (ワッチョイ c379-IXit)
23/08/06 12:09:56.49 SuulMMGF0.net
今時はExcelのセルをCellsでアクセスしたり配列に代入した場合だけ1オリジン固定でちょっと困る
歴史的経緯というよりExcelのCOMオブジェクトの仕様なんだろうけど

360:デフォルトの名無しさん (テテンテンテン MM17-2Tt6)
23/08/06 13:13:28.45 GDllPCgfM.net
配列って
array + sizeof(*array) * index
だから、0からの方が理にかなってると思う
1からの場合は、実行時にアドレスを割り出すときに絶対1引いてるよね…
そこまでしても人間の直感に合わせたかったのだろう

361:デフォルトの名無しさん (ワッチョイ ebad-9S8H)
23/08/06 13:25:15.07 jxDYmhFo0.net
1引いているのはあくまで内部的なもの
それこそ人間の直感に合わせたインターフェイスとコンピュータの都合の良い情報に相互変換するのがプログラムじゃなかろうか
0からのほうが分かりやすいと思うのはプログラマだからだろうし
10個のデータの最後のインデックスは10というのは添え字で考える場合は分かりやすいしね

362:デフォルトの名無しさん (ワッチョイ 7510-WTQk)
23/08/06 14:09:12.01 VdM0xi000.net
先頭をゼロと呼ぶか1と呼ぶかならまだマシよ
音楽なんて先頭要素を1と呼ぶだけじゃなく、要素間の差がない事まで、ゼロじゃなく1と呼ぶ
現代人からするとどう考えても頭おかしいが、仕方がない。ゼロの概念がなかった時代から定義が変わらず続いてるらしい

363:デフォルトの名無しさん (ワッチョイ c379-IXit)
23/08/06 14:15:40.68 SuulMMGF0.net
Cはゼロに限らず何もないを示すvoidが無い頃は全部intでやってた時代もあるんだよ
頭おかしいな

364:デフォルトの名無しさん (ワッチョイ ebad-9S8H)
23/08/06 14:37:12.68 jxDYmhFo0.net
voidが何もないことを示すならvoid*の存在のほうが気になる

365:デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
23/08/06 14:59:14.25 RhhSFLLO0.net
void だけ特殊な型と考えるしかないのではないかな。大きさが0ビットの型と考えても良いのかも知れないが。

366:デフォルトの名無しさん (テテンテンテン MM17-2Tt6)
23/08/06 15:50:27.26 3R7VaRJUM.net
sizeof(void) → 1 だな
これって正式な仕様なのか分からんけど

367:デフォルトの名無しさん (ワッチョイ 87cf-n4fA)
23/08/06 16:40:17.07 Raz9Sh7o0.net
それgccなんかの独自仕様のはず。void*をバイト単位で計算できるから便利なんだけどね。

368:デフォルトの名無しさん (スッププ Sd03-EMqx)
23/08/06 17:35:17.48 /aV5Am17d.net
それは気持ち悪いな

369:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0)
23/08/06 17:46:22.79 Mgx3ApDu0.net
言語仕様上は void は不完全型とする扱い、かつ sizeof に不完全型を与えることは出来ない。


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