C言語なら俺に聞け 161

レス数が1000を超えています。これ以上書き込みはできません。
2023/04/21(金) 14:05:20.18ID:rqj2HSDF0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 160
https://mevius.5ch.net/test/read.cgi/tech/1672191630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/04/21(金) 16:20:56.29ID:cgpIrgwq0
>>1
大儀である
2023/04/21(金) 16:21:57.14ID:5coQdqNr0
久々に麻呂のクソースを見たいでおじゃるか?
2023/04/21(金) 22:04:31.33ID:euEROcVR0
久々に来たけど、C言語はもう人気が無いんかね・・・
2023/04/21(金) 22:53:09.84ID:kZ6jl2XB0
人気って
C言語で作れなんて非効率的なことする人はそういないのでは?
C言語じゃないとダメな環境を除いて
2023/04/21(金) 23:38:19.84ID:Ro9IllZr0
各分野に適したものがあるならそれを使うに越したことは無い。
C が本当に「適している」と言える分野ってそんなに広くないじゃろ……。

どういう言語が適しているのかよくわからんかちょうどよい言語なければ長い物にまかれることになるわけだけど、
様々な分野でそれぞれのよりよい言語が生まれて「長い物」の価値が薄れるならそれは喜ばしいことだと思う。
2023/04/22(土) 00:24:12.00ID:PKFQM5A+0
プログラムをする人が、コンピュータの基本的な知識が無いまましてしまうから
簡単な記述で出来る言語が登場したからかね?
単純に同じ演算を繰り返して比較すると、C言語は処理速度が一番速いとのこと
データを処理するには適しているかと
2023/04/22(土) 01:13:10.92ID:pp00Xtk80
FFTやらせたら、どの言語が一番速いだろうか
2023/04/22(土) 01:14:00.87ID:BwPMbYSuM
Cの知識はC++をする時に当然必要になる
CはTIOBE言語ランキングで2位で、C++は4位だ
逆に使えない奴はモグリだろw
2023/04/22(土) 03:04:47.05ID:WcjcWdD/0
Cを知り、アセンブラを知って、ハードアーキテクチャが分かる
2023/04/22(土) 07:44:16.17ID:rMU69DRU0
ハードの入り口に立つというだけ
Cより遙かに深い世界の
2023/04/22(土) 12:23:54.03ID:pp00Xtk80
それにしても、ネットは広大だわ。
13デフォルトの名無しさん (ワッチョイ 1146-0EuI)
垢版 |
2023/04/22(土) 16:05:32.27ID:QfqbbaWF0
Cの奥地が広いと言うならネットはなお広いではないか。
2023/04/22(土) 16:39:16.87ID:rMU69DRU0
デジタル3年
アナログ5年
高周波10年
なんて言うね

で、おまえらCはどのくらいでおぼえた?
仕事で使えるレベルになるまでに
2023/04/22(土) 18:14:06.16ID:ZOFRvMNu0
>>14
高周波は、あの分布定数の立体回路が謎に満ちていましたよね、あれ、どうやって設計するんだろう?
2023/04/22(土) 18:24:03.40ID:RQNj/O5w0
この世にはプログラミング言語はPHPとJavascriptしか無いと思ってるエンジニア()がたくさんいるから
Pythonの存在も知ってるけどあれはオシャレな感じがしないしオタクがやるものだと思ってる
2023/04/22(土) 19:05:57.81ID:Ul/bNVNnd
>>14
蟹飯の本は事前に読んでたけど、半年かかった
周りが旧帝工学系院卒ばっかだったから勉強したわ
おれ、旧帝数学だったからポインタとか分からんかった
でも、今ではわしの方が崇められる
日々「チャラい関数、マクロで被せろ」を軸に頑張っとる
18デフォルトの名無しさん (アウウィフ FF21-1cZQ)
垢版 |
2023/04/23(日) 18:42:16.06ID:y593Lq73F
PHPはホントごみ
2023/04/24(月) 12:59:52.39ID:6nEVjUPW0
親を殺されたのか
かわいそうに
2023/04/24(月) 14:15:55.03ID:U9n/COjud
https://mevius.5ch.net/test/read.cgi/tech/1672191630/436-
>>436
>>499
https://mevius.5ch.net/test/read.cgi/tech/1681777958/14
21デフォルトの名無しさん (オイコラミネオ MMb1-U1Ip)
垢版 |
2023/04/24(月) 18:03:05.84ID:IXNCOIDlM
int (func) (int n)
みたいに関数に()付けるのって何の意味(機能)ですか?
2023/04/24(月) 18:08:06.16ID:MExTF0xDd
関数ポインタ
2023/04/24(月) 20:21:25.09ID:TGYcq0jn0
違う! 関数そのもの
#define func(x) (func)(x)
マクロではない「本物の」funcを呼び出すのに使う
2023/04/24(月) 21:25:50.42ID:4M8+MweU0
int (func) (int n) となると宣言の文脈だからそれも違うだろう。

>>21 その記述だけでは a*b+c を (a*b)+c と書いたのと同じで、少なくともその括弧自体には何の効果もない。
何か意味があると思うなら書いた人に聞くしかない。
2023/04/24(月) 21:43:56.47ID:IXNCOIDlM
いやまあ愚痴なんだけど教科書や入門書ってなんでか知らんけど関数ポインタもったいつけて教えたがらないよね…
2023/04/24(月) 23:20:26.15ID:MovxHIrx0
素人さんには関数ポインタはむずいだろ
関数のポインタをベクトル化してジャンプテーブル代わりになるんもん
つまりスイッチケースが要らない、言う事
2023/04/24(月) 23:23:14.11ID:CIhFKz1G0
ジャンプテーブル使うのと、switch case と、
どちらが高速でしょうね?
2023/04/24(月) 23:32:25.83ID:RQPVcVj5M
>>23
それが上手く行くのは、マクロが再帰呼び出しされないような処理が入ってるからだろ
2023/04/24(月) 23:45:11.28ID:RQPVcVj5M
ジャンプテーブルを使うと、変数の引き渡しに手間が掛かる
構造体のポインタを渡すとか、引数を沢山渡すとかグローバル変数を使うとか
なので、switch文にして最適化でテーブルジャンプになるのを確認するのがベストかなと
2023/04/25(火) 08:47:58.80ID:2JpsSRmdd
gcc拡張機能のラベルのジャンプテーブルが速かった思い出
あれは規格に取り込むべきだと思う
2023/04/25(火) 10:23:58.24ID:dvdIAVRA0
それってどんなのだっけか
関数を配列にぶっこんだの?
2023/04/25(火) 10:35:38.43ID:VJ90Sqw80
FORTRANの算術GOTOみたいなもんかな
2023/04/25(火) 10:36:32.19ID:VJ90Sqw80
switch caseを最適化させるとジャンプテーブルになっていることはよくあるね
2023/04/25(火) 11:21:54.95ID:RcvlMMml0
開発環境の都合で C言語しか選択できず
C++ の virtual に相当する機構をなんとか捏造しようと
構造体に関数のポインタをメンバに持つ

あと qsort のまねっこ
(具体的な比較は外に丸投げして そういう関数がある前提でコードを書く
2023/04/25(火) 11:33:32.92ID:Y1VsObgtd
>>31
関数内のラベルをローカル配列の初期化て入れられて
goto labelarray[status];
見たいに飛べるやつ
2023/04/25(火) 12:02:12.18ID:zIgvDwJV0
>>28 (func)(x) に対して関数型マクロ func(x) の展開は起こらないよ。
2023/04/25(火) 12:24:03.71ID:VJ90Sqw80
調べてみた
Computed gotoってやつね

int main(void)
{
void *table[] = { &&L1, &&L2 };
goto *table[1];
L1: ;
L2: ;
}
2023/04/25(火) 12:27:03.54ID:VJ90Sqw80
参考
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
2023/04/25(火) 12:52:44.87ID:HIwqDhB5d
お、そんなん出来るんか
40デフォルトの名無しさん (スプッッ Sdea-i/u1)
垢版 |
2023/04/25(火) 14:07:55.49ID:xfobd0gld
話の流れからして

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

ってことじゃないの?
2023/04/25(火) 14:18:02.95ID:zIgvDwJV0
確かに、そういう効果はあるね。
それが必要になる状況は思い浮かばないけども。
2023/04/25(火) 18:35:24.79ID:uZ/SnCfyd
関数と同名のマクロがわざわざ定義されてるとしたらなんか事情がありそうだが

#undef func
したほうが早くね
2023/04/25(火) 18:49:03.51ID:xUlKX7o40
#undef の後に undef する前へリカバーできるようにする機構ってコンパイラの環境依存だよね

(リカバーのための仕込み)
#undef func
 :
void func()
{
}
 :
undefのリカバー (以下 func はマクロ側)
 :
2023/04/25(火) 19:09:41.44ID:uZ/SnCfyd
ひょっとして>>21って

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

みたいな書き方のこと?
この場合はカッコなし int *compar(const void *, const void *)
だとintへのポインタを返す関数の実体ということになり
引数宣言内に関数の実体を書くなと言われてしまうだろう
2023/04/25(火) 21:38:43.47ID:ZKj27A06M
>>26
そうやって教えないでいて唐突になんの前触れもなく使われて「これ何ですか?」って質問したら「関数ポインタも知らねえのかよ」
テック系あるある
2023/04/25(火) 21:43:41.07ID:ZKj27A06M
>>44
いや
int (*compar)(const void);
みたいな単独のやつだよ
てか引数に関数入れるのも教えたがらないよねえ😅
ほんと勿体つけるの大好き
2023/04/25(火) 22:14:03.47ID:OJFKrU7J0
要は関数ポインタ知らなくてバカにされただけのおじさんか
const voidだもんな
2023/04/25(火) 22:18:12.16ID:VJ90Sqw80
アホすぎて笑う価値もないな
2023/04/25(火) 22:25:14.13ID:T6e/oFBcd
>>46
それじゃエラーにならない?
具体的にどんな場面で使われてるのかわからんことには説明できないな
混乱する書き方だというのは同意するが
2023/04/25(火) 22:37:41.81ID:T6e/oFBcd
ああ、それで「関数」ではなく「関数へのポインタ」が定義できるのか
関数の型を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(...);
2023/04/25(火) 22:50:45.68ID:OJFKrU7J0
typedefがめっちゃ気持ち悪い宣言だな
普通はアスタリスクつけてポインタとしてtypedefするもんだと思うよ
sizeof(COMP_FUNC)がいくつになるのか見当がつかない不気味なオブジェクトだ
2023/04/25(火) 23:29:28.69ID:ug7UW9j70
sizeof は関数型の式に対して適用してはならないと制約されているから
関数だったときの結果は未定義で、常識的に考えればコンパイラはエラー扱いにするべきだと思うんだけど
gcc や clang だと何故かエラーにならず 1 を返すんだよな。
(警告は出るけど。)

検出が難しいはずもない (実際に警告は出せてるわけだし) のになんでこうなってんだろ。
1 でなんか便利なことある?
2023/04/26(水) 02:32:17.99ID:2SSTMM1B0
まあ、入門書は比較的難しいことを書かないほうが売れそうだけどな
でもそれを勿体つけるというのは違うかと
2023/04/26(水) 03:51:37.33ID:5gh45PFo0
>>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)
垢版 |
2023/04/26(水) 07:41:17.76ID:wJGIaQxR0
>>51
C++だとポインタじゃない方は関数メンバの宣言にも使えて便利だったりする。
2023/04/26(水) 08:44:09.62ID:dG3YoJcz0
>>54
ポイントされた関数の呼び出しで
comp_func(ptr1, ptr2); も (*comp_func)(ptr1, ptr2); も両方通るのは何でやろね
歴史的な都合?
2023/04/26(水) 08:54:20.40ID:v/InlOgJ0
前者は関数名そのものをポインタとして使い、後者はポインタを明示的に指定することで関数ポインタとして扱う
58デフォルトの名無しさん (ワッチョイ 5963-YWDm)
垢版 |
2023/04/26(水) 09:12:09.71ID:UWqGaqQz0
>>50
定義は?

COMP_FUNC comp_A
{
//ここどうやって書くんだ
}
2023/04/26(水) 09:27:27.18ID:mF8gxL160
>>58
残念ながら定義には関数型 typedef は使えない。
先に typedef を使った宣言だけ書いとけば定義の不整合を検出することはできるようになる。
2023/04/26(水) 09:46:45.42ID:UWqGaqQz0
COMP_FUNC comp_A;
COMP_FUNC comp_B;

こう書かれても仮引数や返却値の型が見えないので
可読性を落としているな
61デフォルトの名無しさん (アウアウウー Sa21-YWDm)
垢版 |
2023/04/26(水) 09:48:32.91ID:N7+hGpB4a
>>48
ほんそれ
2023/04/26(水) 10:33:18.60ID:NF11/Xrv0
>>56
* をいくつ付けても通るのは有名なネタだな。

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


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

関数ポインタに * を付けると関数指示子になるけどそれもやっぱり関数ポインタに変換されるので
* をいくつつけても結果は関数ポインタという変なことになる。
2023/04/26(水) 11:39:43.86ID:N7+hGpB4a
そもそもポインタに代入するときも
int a(int b)
{
return b + 1;
}

int (*f)(int) = &a;
じゃなくて
int (*f)(int) = a;
で通るからな
2023/04/26(水) 13:38:42.38ID:UWqGaqQz0
f(0); //こうできるしな
2023/04/26(水) 14:31:03.82ID:dG3YoJcz0
>>57
comp_func は 関数のポインタとして宣言されてる変数っすよ

まぁ >>62 だということで納得
2023/04/26(水) 17:00:12.69ID:NF11/Xrv0
余談だが >>62 はあくまでも C の場合の話で、
C++ では名前解決の話が合わさって複雑になってる。
関数呼出しのときに関数名を括弧で囲むかどうかで結果が変わってしまう場合がある。
https://wandbox.org/permlink/MO8NWeVmjoLTLly6

C のコードを C++ に持っていくことはそれなりにあることなので
変な書き方をしてると組み合わせの妙で引っかかることもあるかもね。
2023/04/26(水) 20:23:11.35ID:WMGk7nvid
正直どうでもいい
遠い昔Z80のニモニックでJP (HL)と書くけど本来はJP HLとなるはずじゃないかなと思ってたけどそれと同じw
68デフォルトの名無しさん (ワッチョイ 2a4b-ywdm)
垢版 |
2023/04/26(水) 20:32:10.51ID:XZbLdYRG0
まぁ普通は関数名をカッコで括ったりしないし
2023/04/26(水) 21:13:49.50ID:zbbRZmOB0
Cで関数のポインタガーとかやってる暇あったらC#のデレゲートとかラムダとか覚えた方がいいとおもった午後
70デフォルトの名無しさん (ワッチョイ 0afb-i/u1)
垢版 |
2023/04/26(水) 21:41:13.75ID:tw2MKSIb0
「min」と「max」の関数形式マクロをわざわざ定義する.hがあるらしい
2023/04/27(木) 00:02:52.04ID:6BBE08oV0
stdbool.hでも覗いてみればいい
2023/04/27(木) 05:12:28.80ID:sEk/rgYZ0
>>67
コンバイラ、甘やかしてはイカン
最初から攻める気持ちが大切
2023/04/27(木) 08:37:39.22ID:OthllRbe0
コンバイラ?
2023/04/27(木) 09:03:22.20ID:AVBMGEcwM
コンバトラーV
2023/04/27(木) 13:43:25.58ID:kFL/uqTX0
JP (HL)って8080だとPCHLだっけ
アセンブラがとことん楽するようなニモニックだったな…
2023/05/01(月) 16:24:43.62ID:8iWiof/XM
関数の引数リストの中で新たな構造体を定義するってことってできないの?
void func(struct X{int a;} b){
... something ...
}
みたいに?
構文上は可能だと思うんだけどどうなんですか?
2023/05/01(月) 18:21:57.14ID:sEB4u3D3d
構造体が使われる場所より前で定義する必要がある
2023/05/01(月) 19:09:18.47ID:Cn3LrXy/M
>>47
いみもなく勿体つけるオジサン
「関数ポインタは難しいから後でやろうね~オマジナイだよ~」
2023/05/01(月) 19:15:34.08ID:Cn3LrXy/M
>>53
それで後々になって質問すると
>>47,48みたいのが湧くでしょ
2023/05/01(月) 19:29:42.98ID:Cn3LrXy/M
未だに初っ端からコンソールにハローワールド表示させるとこから教えてるんだろうね勿体つけオジサンたちは
2023/05/01(月) 19:36:49.71ID:Cn3LrXy/M
勿体つけオジサンたちはChatGTPで「C言語で関数名に()付けるのって何ですか?」って聞いてみればいいよ
機械以下のゴミw
2023/05/01(月) 19:44:56.10ID:cY285a3R0
医者から処方された薬は指示通り飲まないとだめだぞ
2023/05/01(月) 20:12:14.98ID:kp1qtDVi0
配列に対してポインタでアクセスするとか、単純な者だと絵に描けば大体理解出来るが
構造体内のポインタ変数やら、さらに配列かして行くと、記述もすんなりとできなくなるし
ましてや別人が書いたソースで、それらが一体何をアクセスしているのか理解するのは大変だ
84デフォルトの名無しさん (スプッッ Sd3f-rFN3)
垢版 |
2023/05/01(月) 20:21:43.22ID:RHMPP4K9d
>>76
返り値のほうならなぜかgccでいけた
まあ型推論がないC言語じゃあ役に立たないんだけど

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

// other.c
int func(){ return 42;}
2023/05/02(火) 02:30:44.97ID:FbQbKVUa0
void func(struct {int a;} b){
b.a = 10;
printf("%d\n", b.a);
}

tccでもこれ通るな
2023/05/02(火) 11:04:32.32ID:HpVmkNB+0
>>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);
}
2023/05/02(火) 20:11:42.15ID:ovfmjnkKd
>>76
素直に最初に構造体をtypedef しとけば楽だと思うんですが
文法上で言えばstruct Xとだけ書いといて後でstruct Xの中身を定義しても正しい
もちろんそれでは関数スタックのサイズを計算できないのでエラーになるだろうが
2023/05/03(水) 14:42:04.19ID:wz1HqF7Da
Cは
struct Hoge {int a;} b;

struct {int a;} b;
を区別しない
2023/05/03(水) 15:45:19.73ID:1ndhLr9O0
>>88
名前の有無が違うし、変数名を変えて並べれば違う型になるし、明らかに違うと思うんだけど
何をもって「区別しない」なんて言うのか。
2023/05/03(水) 18:10:57.61ID:1ndhLr9O0
>>86
「内容が同じ構造体は「適合」する」について確認すると策定中の C23 から
内容に加えてタグ名まで同じ場合に限り適合する(compatible になる)ように変更されるようで、
現時点では正しくない模様。
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3037.pdf
2023/05/04(木) 00:37:13.28ID:zfmlH8qj0
>>90
厳格な方向に改定してんのね。
今までが緩すぎたからしょうがないね。
2023/05/04(木) 01:26:39.82ID:KJPnL+/P0
>>91
あ、ごめん書き方が悪かった。
これまではタグ及び内容が同じでも適合しなかったところ、 C23 から適合するようになるという話。
有効になるプログラムが増えるので、どちらかというと緩くなる変更。
2023/05/04(木) 04:12:02.40ID:W+5O3yqN0
急に凄くレベル低い話して申し訳ないんだけど
#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]);
}
なんでこれ上手く動かないんだろう
2023/05/04(木) 05:17:57.46ID:P5ZkmciJ0
このスレいつもレベル低いから大丈夫でしょ
上手く動かない?そもそもそのコードはどう動いて欲しいのか読み取れないんだよな
日頃から入出力を意識して書けって言われてない?まるで実践できてないからダメか
2023/05/04(木) 07:37:53.19ID:6SJC1K3b0
>>93
二つ目の for ループから抜ける条件の一つが「a[j]がゼロ」なのに、そのループから抜けた直後で i % a[j] とかやってて、jが2のときにa[2]が0でループから抜けるから、ゼロ除算で落ちる

それとこっちは直接の原因ではないけど、int a[101]と宣言すると a[0]~a[100]までしかアクセスできないのにa[102]までアクセスする可能性があるようなコードになってるのもダメだな
2023/05/04(木) 08:36:39.17ID:Hj8mrajJd
とりあえず初期化するとき

int a[101] = {0,1,2};
と書いたほうが楽じゃん
ちなみに初期値がない部分は0になる

後はめんどくさいから明日読むわ
2023/05/04(木) 08:46:33.13ID:Hj8mrajJd
間違えた
int a[101] = {1,2};


ちなみに int a[101] = {};
ではまったく初期化されないからこのプログラムでは[0][1]以外のところには0ではなく不定値が入ってるのでうまく動かないのはそれなんじゃね

int a[101] = {0};
と書いておけば省略した部分もすべての要素が0で初期化されるよ
2023/05/04(木) 09:36:07.29ID:GmhF7zKn0
>>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; だね
2023/05/04(木) 09:58:25.07ID:GmhF7zKn0
>>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除算は起きないから
2023/05/04(木) 10:19:34.63ID:W+5O3yqN0
>>95-99
丁寧な解説、ありがとうございます。

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

>>97
私の使ってるコンパイラだとどれでも
int a[101] = {};
でなぜか全部0が入ります。そんなものかと思って通してました。
2023/05/04(木) 11:22:57.44ID:qhvAhFwp0
初期化は自動変数と静的変数で変わるんでしょ?
2023/05/04(木) 12:22:57.41ID:gcRtXg3v0
右辺のない変数宣言だけのパターンでは変わってくるけど
静的だろうが自動だろうが 初期化の = { } は 省略部以降すべて0 → 全部0フィル でしょ
2023/05/04(木) 12:26:03.41ID:ZxdTo52k0
初期化って必ず初期値を設定するものとばかり思ってた
104デフォルトの名無しさん (スッップ Sdbf-rFN3)
垢版 |
2023/05/04(木) 12:29:51.46ID:ocVXr2wXd
配列を「={};」で初期化したときの挙動は全要素が0埋めされるとC言語規格で決まってる
2023/05/04(木) 12:50:52.53ID:zfmlH8qj0
C17 までは初期化子が 0 個の状況は規定されていない。
一個以上が必要。 0 個を許容するとしたら処理系の拡張。

C23 からは >>102 の説明で正しい。
2023/05/05(金) 01:44:39.83ID:Dgp4PAAq0
むかしニコ動で動画上げたらそのこと教えてくれた人いたな
今でも覚えてるわ
2023/05/08(月) 08:20:55.10ID:o4wr0iPb0
なので 全省略せずに = { 0 }; と書くことは多いね
2023/05/10(水) 14:54:20.05ID:Sp9BCNLV0
規制解除テスト
2023/05/12(金) 07:37:29.65ID:uK8Qnmg70
https://ideone.com/Kj806d

うちの環境(tcc)だと
ビット操作の実行時間: 0.634000秒
一時変数の利用の実行時間: 0.444000秒
ポインタの利用の実行時間: 0.471000秒
になるんですね、最適化が弱いにしても完全に想像と逆の結果になって驚いてる
2023/05/12(金) 08:42:01.03ID:7oN7jOgdd
ポインタのそれ交換できてるか?
2023/05/12(金) 08:58:12.44ID:AJ54S3Uh0
CPU の性質も考慮する必要がある。
ビット演算はメモリのロード/ストアとは並列化できない分が効いて遅くなるんじゃないかと思う。
間接参照があればその分だけ遅くなるのも自然だし、想像通りだろ。
112デフォルトの名無しさん (スップ Sd32-c8cy)
垢版 |
2023/05/12(金) 08:58:57.96ID:dEJrL9Tpd
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
2023/05/12(金) 22:24:54.99ID:josTNWjFd
ビット演算はそりゃ遅いだろ
読んで演算して書く
よりも
読んで書く
のほうが早いに決まってるじゃん
2023/05/12(金) 23:57:42.36ID:AJ54S3Uh0
ビット演算バージョンの特徴は一時的な格納場所が不要なところにある。
レジスタに空きが無いときにメモリに退避するよりはビット演算のほうが
マシということはありうると思う。

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

色々な条件が絡み合うので「決まってる」とまでは言い切れない。
2023/05/13(土) 07:20:30.86ID:q/ntHDOzd
この件の場合は
関数の形でメモリから読んで書くことは確定だからそれ以上の最適化は不可能なので決まってるのだ
2023/05/13(土) 12:31:34.66ID:scApfF3jd
大昔の技術
今使うやつはアホ

ビット演算の方が有意に速い事なんか無いよ
2023/05/13(土) 13:31:03.33ID:77gpFXkp0
論理演算はマシン語1命令だろw
2023/05/13(土) 14:34:03.15ID:ToDbeQGOM
std::swap使えばマシン語のxchgを使ってくれそうな気がするけどね
xchg使うのが最速だろう
Cにはstd::swapに相当するもんが無いな
2023/05/13(土) 15:37:18.91ID:trdeSgBWd
>>117
movだけなら演算ポートを使わないで済む

>>118
マシン語のxchgは非常に遅い
2023/05/13(土) 18:27:17.14ID:0CcYb4xxd
>>117
初心者が陥りやすい錯覚だな
「何もしない(NOPのことではない)」よりも速い命令はないのだ
2023/05/13(土) 18:39:48.47ID:Er9DBy9d0
>>117
やめとけ
言ってわかる相手じゃない

何もかも機械がやってくれるから
自分の頭で考える必要はないって手合いだぞ
2023/05/13(土) 18:43:02.66ID:trdeSgBWd
×自分の頭で考える必要はない
○アホが工夫すると遅くなる
2023/05/13(土) 18:46:13.79ID:trdeSgBWd
今では通用しない技術を偉そうに語る
老害の典型
==>はちみつ
2023/05/13(土) 18:50:59.33ID:Er9DBy9d0
身に覚えのあるやつがファビョってるね
ん~いい返事だ
2023/05/13(土) 22:00:35.83ID:8DjxrcvEM
>>119
遅いってのは、レジスタを余計に1つ消費する方法よりも更にデメリットが有るぐらい遅いのか?
2023/05/13(土) 22:53:11.07ID:w2ITJ0dJd
最適化されてもmovより遅くならない程度で決して速くなることはない
おそらくもっと複雑な処理の途中でレジスタが全て使用中の場合にレジスタをスタック等に退避することなく値を交換するテクニックとして使われたら速くなるのかもしれんが
こんなシンプルなコードでは起きないだろう
2023/05/13(土) 23:18:57.76ID:6X/C93dk0
xorスワップは昔クヌースのメモリを使わないGCのマーク&スイープ手法だかで多用されてた気がする
当時はこれが神が作りしコードかあみたいに感動しかなかった
2023/05/13(土) 23:46:50.93ID:TLDrNKkXM
>>126
普通のコードだとレジスタは常に足りてないだろ
ベンチマーク的なコードは本当の速度を表してないな
Benchmarks gameとかそれぐらい複雑なコードを複数動かしてやっと分かるもんだろうね
2023/05/13(土) 23:49:44.86ID:vqN1nVlv0
>>125
現代的な CPU だと直接的に使われるレジスタのほかに内部にはもっと多くのレジスタがあって
見かけ上はレジスタを余計に消費していても実際には一時的に割り当てられるレジスタなことがある。
いわるゆる「機械語」も CPU 内部ではさらに分解されてよりよい命令列に置き換えられるので
同じ機械語でも文脈によって違うことをしてる。
複雑すぎて詳細な挙動を事前に予測するのは無理。
xchg が存在するからには有用な場面もあるんだろうとは思うが、
結局のところは実際にやってみないとよくわからん。
2023/05/14(日) 01:15:20.67ID:XjDIggiO0
xchgはスピンロックを作るときに使うよね
2023/05/14(日) 07:12:36.39ID:YUNKAbGY0
変数のswapって、マシン語に限らずどこででも高い頻度で使うぞ
2023/05/14(日) 11:51:05.47ID:eMKrHX/5d
>>129
つまり
有用な場面を知らないわけだ
レジスタを節約するためでも微妙な高速化のためでもないから
2023/05/14(日) 19:49:42.92ID:9VZQjQ6WM
アトミックのことかな
はちみつ氏のレスは慎重で丁寧だし、噛みつく必要はないだろう
2023/05/14(日) 19:54:24.09ID:B0168DkC0
そもそもアセンブラででも書かない限りある値がレジスタに維持される期間は人間の考えとは異なるんだよなぁ
2023/05/14(日) 22:22:28.93ID:YUNKAbGY0
人間の考えw
人情っすか?
2023/05/14(日) 23:14:42.36ID:fNcGY7kH0
レジスター猫
2023/05/15(月) 07:45:53.34ID:wYJ4tfRu0
シュレーディンガーのレジスター猫猫
138デフォルトの名無しさん (ワッチョイ cf46-1d5q)
垢版 |
2023/05/15(月) 10:53:41.51ID:Ro1LlfRG0
レンジ猫?
2023/05/15(月) 11:26:46.74ID:qSKQiR6e0
猫は電子レンジで乾かせません
140デフォルトの名無しさん (ワッチョイ ffad-ZkZz)
垢版 |
2023/05/15(月) 11:51:40.11ID:Bppn4Lb30
じゃあ何なら乾かせるんですか?
2023/05/15(月) 12:00:56.43ID:Uo8X26KHM
タオルとドライヤー
2023/05/15(月) 12:22:52.88ID:L2eqquJo0
愛情を込めて暖める
2023/05/15(月) 20:16:31.37ID:8Cq/OAued
つまんないボケはどうつっこんでもつまんない
2023/05/16(火) 08:51:47.45ID:gG4dlKgfd
技術ないやつが妬みで荒らしてるだけだからな
2023/05/16(火) 15:56:44.97ID:mGp2Y9l5a
DJNZがatomicだと思っていた時期が私にもありました
2023/05/16(火) 20:31:19.40ID:afLAkRaY0
日本はC言語さえ難しいエンジニアもいるんだよな
2023/05/16(火) 20:55:13.02ID:bTPsQg7Pd
>>137
おお、読み出すまで値が確定しないレジスタ
乱数発生専用レジスタですね
わかります
2023/05/17(水) 07:09:46.32ID:s9zxu+xkd
異分野からきた地頭のいい人がCも使えるようになると
おまえら仕事取られるぞ
2023/05/17(水) 07:46:38.82ID:BUhbFeo00
外国人労働者が来たら、AI化されたら、昔から色んな業種で何度も言われてるわな。
2023/05/17(水) 13:27:27.48ID:hbqXME+r0
いろんな分野で確かに仕事を奪われている
2023/05/17(水) 16:15:47.93ID:ZA2j/mjnd
> AI化されたら

ここム板だよな
2023/05/17(水) 19:23:47.84ID:HVYpBx2Dd
>>148
恐れるに足らん
こっちは守護だぞ幕府が後ろ盾だぞ
153デフォルトの名無しさん (スププ Sdea-i/qU)
垢版 |
2023/05/24(水) 06:34:08.09ID:TwXy7dIZd
前回のこのスレの投稿で関数名に()をつける場合があるという意味がわかった。#undefを使わなく
てもいいように関数に()をつける場合がある。

ans = (sqr)(n);
という具合に。
154デフォルトの名無しさん (ワッチョイ 6746-3pER)
垢版 |
2023/05/24(水) 07:05:53.93ID:ea8bFP4r0
void laugh(笑);
2023/05/31(水) 15:57:04.61ID:fnFbD7jZM
誰か笑いをとめてやってくれ
2023/05/31(水) 16:11:38.59ID:ck+UIxN/0
abort();
2023/05/31(水) 18:02:31.09ID:vB7s5b6d0
GotoBlueScreen();
2023/05/31(水) 18:16:26.97ID:i7J0Z4vH0
__halt();
2023/05/31(水) 21:00:07.40ID:ck+UIxN/0
void a() __attribute__((naked));
void a()
{
asm(" halt");
}
int main(void)
{
a();
}
2023/05/31(水) 21:19:20.18ID:soKXUOD/0
[STOP]+[A]
161デフォルトの名無しさん (ワッチョイ 6ebb-tVFH)
垢版 |
2023/06/03(土) 19:40:08.42ID:hD2oGIQP0
文字列処理用のリングバッファ作ったんですが、同じ処理をint型でも行いたいです。
当たり前ですが、同じプログラムをint型に変えればできると思います。
ですが、処理自体は同じなので、共通化できないものでしょうか?

C++ではテンプレート関数を使えばできるようですが、純粋なC言語では難しいですか?
2023/06/03(土) 19:48:40.44ID:Pce1Bw+fd
>>161
#defineと#includeを使えばできるよ。
2023/06/03(土) 20:14:57.23ID:SlTHxzvh0
俺的には#includeよりtypedefかな
2023/06/03(土) 20:15:08.00ID:uQ0tYGRP0
もしくは void* と型の大きさにする形で型を消去してしまう (たとえば qsort のように) という選択肢もある。
間違った使い方をしても (型が消えているので) コンパイル時にエラーとして検出しづらくなる可能性があるけど。

まあどちらにしても C でやるのは煩雑。
使う型が二種類だけであることがわかっている状況だと仮定してよいなら
共通化しようとするよりもコピペしたほうがかえって楽というのもよくあること。
2023/06/03(土) 20:37:32.54ID:hD2oGIQP0
勉強目的なので、試してみます。

#defineでやるやり方は何となくわかるのですが、#includeよりtypedefとはどういうことですか?
void*もよくわからないので、こっちはまだ早そうです。
2023/06/03(土) 20:59:14.37ID:SlTHxzvh0
>>165

//fig1
#define ITERATOR int*
ITERATOR enq, deq;

//fig2
typedef int* ITERATOR;
ITERATOR enq, deq;

fig1ではdeqがポインタではなくなってしまうが
fig2ならこうした問題が起こらない
2023/06/04(日) 12:47:37.50ID:u2u7Kc0T0
あ、言い間違えてんの今気がついたw
- #include
+ #define

すまんこ
2023/06/04(日) 21:00:21.62ID:/SPLhkOjM
リストなどのコンテナ実装でデータの実態へはvoid*でポインタ指定すれば何でも格納できる
基本的にこれで汎用化できる
2023/06/04(日) 21:37:23.80ID:wPljDWped
リングバッファくらい簡単なのはその都度作ればいいんじゃないと思う
細かく改良していけばスキルアップになるぞ
2023/06/04(日) 22:10:36.35ID:AabPy4gc0
初心者質問失礼します

scanf_sやfopen_sなどの関数が含まれたソースをgcc 9.4.0でコンパイルすると失敗するのですがこれは仕様でしょうか?
これらの関数はC11で定義されていますが基本的にMSVCでしか使えないという感じでしょうか?
2023/06/04(日) 22:33:01.16ID:ktuQYTFv0
やれやれ…初心者質問あるあるだけ回答しておこうか
「失敗する」とは一体をもって判断したのか。そもそも処理系から何かメッセージは出ていなかったのか。初心者と自覚するなら質問に主観は一切不要だからそれを書きなよ
2023/06/04(日) 22:34:54.92ID:iTf1qDcyd
-std=c11
2023/06/04(日) 23:06:52.44ID:MHoxWKtY0
>>170
C11 で規定されているけれど仕様としてはオプショナルなもの。
つまり処理系はそれを提供しなくても仕様準拠を名乗れる。

ただし、提供するならばマクロ __STDC_LIB_EXT1__ も定義しておくことになってる。
そんで使うときにはヘッダのインクルード前に __STDC_WANT_LIB_EXT1__ を define しておく必要がある。

MSVC は C11 が発行される前から scanf_s などを提供していた
(というかマイクロソフトがこれらを標準に入れるように働きかけていた)
のでバージョンによっては __STDC_WANT_LIB_EXT1__ を定義するという手順を介さなくても使えるのかもしれない。
私は MSVC を使ってないのでよう知らん。
2023/06/04(日) 23:52:26.98ID:AabPy4gc0
>>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
2023/06/04(日) 23:59:42.49ID:AabPy4gc0
>>172
>>173

ありがとうございます!
アドバイスを参考に以下のように変更しましたが174と同様のエラーが出ます(T_T)

コマンドを以下のように変更
gcc -std=c11 sample.c -o sample.out

ソースファイルの先頭に以下を記述
#define __STDC_WANT_LIB_EXT1__ 1
176デフォルトの名無しさん (ワッチョイ 82ad-N/Lw)
垢版 |
2023/06/05(月) 00:18:53.38ID:6AEqxzj80
なんか人気のfopen_s関数について
https://blog.ef67daisuki.club/2017/04/%E3%81%AA%E3%82%93%E3%81%8B%E4%BA%BA%E6%B0%97%E3%81%AEfopen_s%E9%96%A2%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
2023/06/05(月) 10:37:04.03ID:ejs/048Ga
legacy_stdio_definitions.lib
2023/06/05(月) 18:03:48.62ID:7VR84C5ud
fopen_sって初めて知った
MS社内だけで通じる方言って感じでイヤな感じだな
fopenで書くようにしたほうがいい
2023/06/05(月) 18:11:20.30ID:7VR84C5ud
だいたいwinAPIはファイルを開く時はCreateFile()系を標準にする方針だと思ってたんだが
なんでfopenのパチモノを作るのか理解に苦しむ
2023/06/05(月) 18:32:16.74ID:OwVyUwPA0
世界征服に決まってるだろ
2023/06/05(月) 18:47:37.75ID:Fd2GxywXd
CreateFile はファイルロックの制御が細かくできたり、ファイルがすでに存在する場合の
処理や、セキュリティなどを考慮した処理など細かい設定ができる。
WindowsではfopenはCreateFileで実装されてるようだ。
2023/06/05(月) 19:09:52.27ID:SzwJbur+0
>>179
CreateFileなんかで書いたら移植のとき困るだろ
そもそもプラットフォーム気にせず書けるようにCライブラリとして標準化させようとしているんだし
Windowsは移植性を考慮しないならCreateFile系のほうが柔軟に高度なプログラミングが出来るからCreateFile系使えと言っているだけ
2023/06/05(月) 20:35:19.71ID:ZwQJL2Eg0
APIを使うと毎回特権リングを呼び出すから、
小さい読み書きが多いとオーバーヘッドになる
Cランタイムはバッファを使って特権リングの
呼び出しを減らしている
2023/06/05(月) 20:40:56.74ID:LsGdvfPCd
>>182
標準化しようとするなら引数や戻り値をfopenに似せるべきだ
これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
2023/06/05(月) 20:52:58.24ID:SzwJbur+0
>>184
あくまでCライブラリとして標準化
古い関数に仕様を合わせる必要はないべ

>これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
仕様を読まない初心者が悪いと思うんだが
2023/06/05(月) 20:54:52.49ID:OwVyUwPA0
委員長、読まなきゃ使えない関数は捨てられてしまうと思います!
2023/06/05(月) 20:58:18.67ID:SzwJbur+0
初めて使う関数なら一度は仕様見ろよ
2023/06/05(月) 21:10:47.13ID:OwVyUwPA0
じゃあ、使う必要が出てきたら読むことにします
当分、読むことなさそう
2023/06/05(月) 21:43:17.97ID:EJphWr1dd
>>185
必要はある
今回のようにfopen_sをfopenに書き換えようとする(または逆)場合に変なミスを誘発する
大した理由もなく戻り値を変更すべきじゃない(またはfopenの名前を使うべきじゃない)
190デフォルトの名無しさん (ワッチョイ 6ebb-tVFH)
垢版 |
2023/06/05(月) 23:26:16.43ID:wc9Gft1n0
>>168
void*について学習してきました。
キャストしないと使えないようですが、キャストする型の指定はswitch-caseや#ifなどで分岐する感じでしょうか?
それとももっと賢いやり方がありますか?
2023/06/05(月) 23:46:37.21ID:pW8wFDDTd
>>190
memcpyなら型が分からなくとも無理やりコピーできる。
192デフォルトの名無しさん (ワッチョイ 22fb-w9Bk)
垢版 |
2023/06/06(火) 00:27:27.18ID:WKo3IR4c0
void*は元の形がint*でもchar*でもとりあえず何でもありで受け付けるやつ

元の型が何だったかは結局はプログラマ側が保証しとかないといけないので取り扱いは結構危険
2023/06/06(火) 03:21:52.62ID:JM/jMtmO0
>>189
>大した理由もなく戻り値を変更すべきじゃない
関数の戻り値でエラーを返すことでグローバル変数のerrno読み出しタイミングの問題(マルチスレッド対策)に対応したいところって意図だと思うけど違うんかね?
まあ戻り値ではハンドル返してアドレス渡しでエラーを受け取るという方法もあるとは思うけど

>またはfopenの名前を使うべきじゃない
機能としては同じだし俺は別にfopen系の名前のほうが分かりやすくて良いと思う
言いたいことは分かるけどさ、初心者やベテランに関わらずちゃんと仕様を確認するってだけのことじゃね?
194デフォルトの名無しさん (スプッッ Sd02-w9Bk)
垢版 |
2023/06/06(火) 08:23:57.44ID:Wehdob+6d
fprintf_sとかの他の関数がerrnoを返さない以上、
fopen_sでだけerrnoを返しても一貫性がなくて無意味に感じられるんだよな。

結局のところerrno自体をスレッドセーフになるように作るしかなくて、
それで解消したんじゃなかったっけ?
2023/06/06(火) 08:40:25.14ID:SiwHVjTU0
>>161 を見てると
コンテナに入れたいのは int な整数なんよな
リングバッファだから 積む側と引っ張り出す側のそれぞれのインターフェースが必要になるけど
 void push(int); 実体を受けて内部で malloc してそっちに格納
 void pop(int*); malloc された内容を 引数に渡して mallocしたポインタは free しとく

この int の部分が任意の型でよしなにしようとすると
 void push(void* , size_t size);
2023/06/06(火) 08:42:43.61ID:SiwHVjTU0
途中送信してもた
void push(const void* , size_t); 実体はポインタで渡す
void pop(void* , size_t);
のように size_t で実体のサイズもらうしかないよね
2023/06/06(火) 08:43:39.37ID:TmtPJsyo0
>>193
errno は C11 以降は thread local storage ということになってる。
errno をセットした後に別のスレッドによって内容が書き換えられるということはない。
(やろうとすれば出来なくはないが……。 普通に使ってて間違ってやってしまうということはないだろう。)

C99 でも errno は変更可能な左辺値 (に展開されるマクロ) であることは要求されているが
それが関数呼出しによって得られるものであってもかまわないという記述もあり、
スレッドまわりで問題を起こさないようにする処理はその関数に入れることが出来る。
C99 ではスレッドローカルの概念は提供していないが事実上はスレッドローカル的な
実装に出来るように配慮されてる。

errno が不格好な設計であるのは確かだが、マルチスレッドでは問題にはならない。
198デフォルトの名無しさん (アウアウウー Sac5-Rr/m)
垢版 |
2023/06/06(火) 13:00:47.04ID:h4TMdgn6a
>>182
そんなのは fork を先にさっさと実装してから家
2023/06/06(火) 13:06:36.37ID:h4TMdgn6a
>>190
void *hoge は hoge++ 出来ないけど
int *i は i++ 出来るし
double *d も d++ 出来るし
i++ と d++ で足される数も違う
switch case で対応するのはおすすめしない
2023/06/06(火) 13:23:11.34ID:Ydo+/HsJM
>>198
forkは効率が悪いから必要ない
プロセスは_spawnを使ってスポーンっと産み出すもんだw
2023/06/06(火) 15:35:36.55ID:DWV+4S+md
GetLastErrorみたいにスレッドローカルにすればいいんだよ
2023/06/06(火) 21:21:59.69ID:XFiIFtrgd
>>190
そろそろそのやり方自体が賢くないって気づかないかな
2023/06/06(火) 21:26:13.17ID:9F60+Uyo0
是非賢いお手本をお願い
2023/06/06(火) 21:43:27.13ID:t5k+pzJSM
switchは良くないと思うよ

利用側でそれぞれの型用に別々の関数を書いて使う人が使い分ける感じじゃないかな
それこそ知らんけどレベルで申し訳ないが
2023/06/06(火) 22:36:35.79ID:QLr+SdPOd
>>203
毎回関数を作る
だってリングバッファだぞ
目をつぶっていても作れるぞw
2023/06/07(水) 07:49:00.73ID:uhVmgr37a
>>203
お手本の定番は qsort() だろ
2023/06/07(水) 08:29:44.13ID:MtVH7DHg0
>>205
そういうのはライブラリ化しておくべき
2023/06/07(水) 09:26:39.45ID:PykR7vOnd
fread(void *buf, size_t size, size_t n, …
の順もあれば
qsort(void *base, size_t num, size_t size, …
の順もあって
行き当たりばったり感
2023/06/07(水) 12:34:45.81ID:hQs7a5Jyd
>>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;
}

目をつぶって作ったのでバグがあっても知らない
要するにこういうことでしょ
他の人が言ってるように型チェックがまったく働かないので俺は使いたくない
2023/06/07(水) 13:05:36.32ID:xTW5tL3jd
memcpyは余計だな。ポインタを返して後は使用者(自分)に委ねるね俺は
2023/06/07(水) 14:05:23.13ID:lsOQP3og0
見てないけどCUEって時点でもう程度が知れる
212デフォルトの名無しさん (ワッチョイ 5146-rNJ6)
垢版 |
2023/06/07(水) 15:08:50.29ID:hYVl7Kw10
重箱の鬼の首をとる応用例

・(Perlを)Pearl って時点でもう程度が知れる
・(Daemon を)Demon って時点でもう程度が知れる
2023/06/07(水) 16:05:48.27ID:e1NBMLRC0
Luciferの事もたまには思い出してあげて
2023/06/07(水) 21:46:42.98ID:xi4mV2dDp
ダブルスラッシュがコメントに採用されたのどの版から?
2023/06/07(水) 22:41:36.55ID:JgjHIelbd
>>210
概念的にはgetした瞬間にリングバッファから取り除かれてるはずなので
実際にはバッファが一回りするまで残っているが
消えてるかどうか曖昧で気持ち悪いのでコピーで返したほうが望ましい
まあ好みかもしれんが
2023/06/08(木) 11:06:02.87ID:rxjbLVG0a
>>214
MSVC じゃなくて MS-C の 3 くらいからあったかも
217デフォルトの名無しさん (スプッッ Sd02-w9Bk)
垢版 |
2023/06/08(木) 12:46:07.00ID:m0+KFU8md
C99から
それ以前でもコンパイラ拡張で//コメントをサポートしてるのはあるらしいけど
以下のようなエッジケースで解釈が変わる

b=a//**/ 2
;

//コメントを認めないならb=a/2;
//コメントを認めるならb=a;
2023/06/08(木) 12:55:42.05ID:ldHYl5bi0
> 目をつぶって作ったのでバグがあっても知らない

そういうのは「作った」とは言わない
219デフォルトの名無しさん (ワッチョイ 5146-rNJ6)
垢版 |
2023/06/08(木) 13:01:02.12ID:5qYvg3Wg0
盲者のモノ作りなど認めない。
2023/06/08(木) 13:06:43.94ID:2i+h5Gbt0
目開けても何も見てない奴いるからな
2023/06/08(木) 13:39:09.53ID:JhrUsqpHd
野良審査員には餌をやらん主義
2023/06/08(木) 14:35:42.49ID:Iro3x2NJ0
>>214
C99 からだが経緯としては先に C++ で採用されていたという事情がある。
C with Classes から C++ になる 1984 年頃に BCPL 風を参考にして
スラッシュふたつで始めるコメント記法が導入され、
更に 1998 年にそのコメント記法も含めて ISO の規格として確立した。

C と C++ でプリプロセッサは共用することも多いだろうし
コメントはプリプロセッサで除去するだろうから
C++ で採用された段階で実際には C でもスラッシュふたつのコメント記法を
使えていた環境は割と有ったのだと思う。
2023/06/08(木) 14:52:55.41ID:ldHYl5bi0
マイクロソフトが独自拡張で当時C++のみのはずの//をCでも許していた
言わずと知れた屈指の大手がやっているので規格が追認することとなった
2023/06/08(木) 16:45:48.60ID:JA9B62300
gccも使えてた気がする
2023/06/10(土) 18:04:06.65ID:Yvl44ooC0
90年後半からしか実務で使ってないけどVCでは普通に書けてたな
UNIX系はベンダー製のCの制限が酷かった思い出
2023/06/10(土) 18:47:34.87ID:Yrme8ZC10
borlandやwatcomでも使えなかったっけか?
2023/06/10(土) 20:49:31.43ID:6EfmWVuRd
便利だからね
オプションで使えなくすることもできたはず
2023/06/16(金) 01:45:49.62ID:q8ApsJJ90
int a[3] = {};
int b[3] = {0};

aの初期化はgcc拡張で規格に沿っているのはbの初期化だと記憶していたんだけど、
規格の6.7.8を見るとメンバの個数より波カッコで囲まれた初期化子が少ない場合は暗黙的に静的に初期化するとあった。
この規格の文章を見る限りはaも規格に合致していると思えるんだけど、aがgcc拡張っていうのは本当ですか?
2023/06/16(金) 02:08:30.52ID:q8ApsJJ90
参照した規格はX 3010:2003 (ISO/IEC 9899:1999) です
2023/06/16(金) 08:46:04.94ID:qgM8i0iT0
>>228
本当。文法が空の {} を許していない。
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer

C23 から↓で initializer に {} が追加されてようやく通るようになる。
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2900.htm
2023/06/16(金) 16:12:05.48ID:ly+Q1cW8a
struct hoge {
char a[];
};
struct fuga {
char a[0];
};
2023/06/16(金) 16:20:37.85ID:q8ApsJJ90
>>230
なるほど構文規則ってところを見るんですね
どうもありがとう
2023/06/16(金) 17:28:57.05ID:QEmhRLek0
>>228
gcc でも -pedantic オプションを付けたら警告は出るぞ。

> warning: ISO C forbids empty initializer braces
2023/06/17(土) 21:50:15.83ID:q+Kf8pNU0
>>233
知りませんでした!
どうもありがとう
2023/06/25(日) 08:36:37.75ID:D6GgnyEK0
int main(void)って書く流派ってどこでそんなの身に着けたの?
2023/06/25(日) 09:20:49.86ID:yrM2OONq0
>>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) { /* ... */ }
237デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
垢版 |
2023/06/25(日) 10:53:26.83ID:/MLTigPj0
>>235
この指摘をしばしば見るが、int main(void) が違反だった時代はいつ頃なの。
2023/06/25(日) 10:56:42.79ID:D6GgnyEK0
C99からint main(void)と書いてもいいらしい
2023/06/25(日) 11:13:38.04ID:+vRVyhzX0
main については C89 のときから変わってないよ。
2023/06/25(日) 11:58:52.46ID:yrM2OONq0
>>237
K&R Cにはvoidというキーワードが存在しなかった
2023/06/25(日) 12:22:01.62ID:D6GgnyEK0
K&R第2版にint main(void)なんて書き方出てきた記憶がないんだよね
2023/06/25(日) 12:38:23.47ID:6RRGV0Qg0
printf(null);
2023/06/25(日) 12:38:51.73ID:+vRVyhzX0
>>241
日本語版だと 41 ページに
「リストが明らかに空であるときには,予約語 void を使うべきである」
と書かれているのを見つけた。
2023/06/25(日) 17:09:36.88ID:+vRVyhzX0
関数定義のときに仮引数がゼロ個なら void を書くのは当然の作法なんだから
main についてはどうでも良いとはいえども main だけ空にするのもなんか変じゃない?
2023/06/25(日) 19:26:05.36ID:20Xxe9+j0
処理系は引数で任意のスタートアップを指定できるからmain書きたくない需要も満たせるよ
2023/06/25(日) 22:39:44.42ID:7VFzLtX7d
>>235
めんどくさいだけだろ
2023/06/26(月) 06:14:35.93ID:F8cl0T7T0
めんどくさい流免許皆伝
248デフォルトの名無しさん (ワッチョイ 4b46-GfJH)
垢版 |
2023/06/26(月) 07:16:23.26ID:xzT4Agq20
初級、めんどくさいので略記
初段、めんどくさいので無注釈
免許皆伝、めんどくさいので無ドキュメント
2023/06/26(月) 08:07:26.96ID:5ZBA7oeF0
組み込み系ならmainに引き数なんて不用
2023/06/26(月) 08:52:43.48ID:r2qj24yMd
元々プログラムはまんどくさいを代行するものだし・・・
2023/06/26(月) 12:05:19.83ID:TXNTP2LF0
組み込みでmainか・・・
ベクタテーブル作るときのラベルがマングリングされてないから短く済むけどそれだけ
2023/06/26(月) 12:06:17.67ID:TXNTP2LF0
あ、ここCだっけ
サーセン
2023/06/26(月) 13:00:03.75ID:DZPgqn/v0
>>249
main に引数が有るか無いかの話じゃなくて、無いときに void を書くという話題だよ。
2023/06/26(月) 13:16:56.95ID:6bPwUIFfp
実際の組み込み系には、二つのmainエントリーがある
引数のある奴と、無い奴な
2023/06/26(月) 13:20:15.17ID:TXNTP2LF0
>>254
組み込みでargcとargvはどんな意味があるってんだ?
コンソールがあるって前提?
2023/06/26(月) 13:24:00.16ID:6bPwUIFfp
意味なんて知るか
ブートローダとか色々都合があるんだよ
2023/06/26(月) 13:31:08.91ID:yiohjGaX0
環境依存しまくってる部分だとは思うけど
組み込み用のコンパイラでも エントリは main のままなのね
2023/06/26(月) 13:43:40.71ID:6bPwUIFfp
組込みの真のエントリーはresetな
でも普通はそこからmainまではハード会社が提供してる
初期化処理が入るからあんまり触らない
2023/06/26(月) 16:47:50.70ID:D5GxB3wJd
リンカにわたすオプションで_startだか_resetだかを指定してるだけ(例えばld -e _start)
自分で初期化を書きたければmakefileに先頭ラベルを記述すればいい
2023/06/26(月) 17:33:04.45ID:O3f/yVVZM
割込みベクタテーブルのリセット割込みのアドレスがエントリポイント
マイコンのリセットでプログラムカウンタのアドレスが設定される
2023/06/26(月) 20:20:34.26ID:6bPwUIFfp
>>260
石によるだろそんなん
2023/06/26(月) 20:39:52.87ID:TXNTP2LF0
K&R Cで「死産だった」とされるentryというキーワードは、多分このへんの話だったんだろうな
263デフォルトの名無しさん (スプッッ Sd03-eK8M)
垢版 |
2023/06/26(月) 20:56:23.88ID:aG57g/0Md
そもそもCPU(マイコン)と、そのCPUの命令セットに翻訳するコンパイラに自由度を与えるためにC言語規格で明言することを少なめにしてる

0x100からカウンタが始まるだのブートローダーが必要だの環境依存の初期化はコンパイラが知ってれば十分。
2023/06/26(月) 21:02:50.78ID:6bPwUIFfp
コンパイラは知らないよ
スタートアップライブラリが知ってる
2023/06/26(月) 21:10:49.81ID:TXNTP2LF0
そそ
266デフォルトの名無しさん (ワッチョイ e3fb-eK8M)
垢版 |
2023/06/26(月) 21:26:51.56ID:L7dTsKCZ0
ああそうかコンパイラ自体は初期化手段知らなくてもいいのね
2023/07/07(金) 14:46:28.07ID:Cp8NbwGm0
#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で実行すると毎回結果がばらばらになる
2023/07/07(金) 14:52:43.24ID:RkflWXNN0
.textと.bssを比較すりゃさもありなん
2023/07/07(金) 15:00:57.31ID:Rpkmzd56p
プログラムとデータは別れてんだよなぁ
2023/07/07(金) 16:12:54.67ID:h0HZTRPQM
アドレス空間レイアウトのランダム化 (ASLR)だろ
差じゃなくてポインターの中身を表示してみればいいじゃん
2023/07/07(金) 16:20:17.47ID:gGTaLgTI0
>>267
64bit 版の Windows だとしたら unsigned long はポインタを表すのに十分なサイズではない。
上位バイトが丸ごと抜け落ちて意図した計算が出来てないと思う。

へんなところを引き算するよりベースアドレスを基準に観察したほうがわかりやすいよ。
歴史的事情で Windows ではインスタンスハンドルがベースアドレスそのものということになってる。
272デフォルトの名無しさん (スップ Sd22-PY2F)
垢版 |
2023/07/07(金) 16:42:49.80ID:LOYSagRvd
そういやlongはWindows環境だと32bitだっけか
size_t使ったほうが面倒がなさそう
2023/07/07(金) 16:53:06.75ID:gGTaLgTI0
Windows だとどっちでもいいけど意味の上では uintptr_t のほうが妥当だと思う。
2023/07/07(金) 16:55:15.60ID:tybFBPle0
いやもう露骨にbit数書いてくれた方がいいわ
int128とか
275デフォルトの名無しさん (ワッチョイ bb2d-ctHD)
垢版 |
2023/07/07(金) 17:07:14.08ID:Cp8NbwGm0
#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くらいでした
2023/07/07(金) 17:38:01.25ID:GxNDHmP50
>>274
#include <stdint.h> の
int64_tとかじゃあかんの?
2023/07/07(金) 17:44:32.91ID:gGTaLgTI0
ここで欲しいのは「ポインタを格納するのに適した整数型」であって
具体的に何ビットなのかをプログラム上で表現するのは筋違いだと思うんだけど
でもまあどうせ処理系に依存するなら抽象を挟んでもあまり得なことも無いかな
とも思うし、まあそこらへんは感覚的なもんやからね……。
2023/07/07(金) 17:46:08.50ID:GxNDHmP50
>>277
#include <stdint.h>の
intptr_tやuintptr_tじゃあかんの?
2023/07/07(金) 17:49:07.83ID:gGTaLgTI0
>>278
いいよ。
私は uintptr_t が妥当と述べてる。 (>>273)
2023/07/07(金) 17:55:31.01ID:GxNDHmP50
Windowsならこうなってるね
LONG_PTR SetWindowLongPtrA(
[in] HWND hWnd,
[in] int nIndex,
[in] LONG_PTR dwNewLong
);
2023/07/08(土) 09:25:06.78ID:ZG00xBJMM
それハンドルを取得する関数なのでポインタとはちょっと違う
2023/07/08(土) 11:55:06.89ID:pEcLN/B5d
>>275
それで本当にスタックサイズ計算できてるの?
MSの文書だとデフォルトでは1MBと書いてあるし
もし不足が予想されるのならリンクオプションでサイズ変更できるし
本来大きいメモリはalloc系で確保すべき
2023/07/08(土) 12:43:32.13ID:svQTfB7/0
メモリ空間は 64bit あるけどその全てに実メモリが割り当てられているわけでは当然ない。
仮想的なメモリを管理するから API の名前に Virtual とついてて、
AllocationBase は管理している一塊の単位のベースってだけ。
その単位の中の全てがスタック用とは限らないので基準にはならないと思う。

各スレッドのスタックの底は thread information block に格納されているはず。
2023/07/08(土) 19:02:15.63ID:wtJKE3gc0
>>281
????
2023/07/08(土) 19:05:04.15ID:E2jAOZHYd
>>281
違うよ。ポインタと同じサイズの整数値を設定できる関数だよん。
型キャストすればポインタも渡せる。
2023/07/09(日) 12:33:23.59ID:6bAebKnHd
井の中の蛙だったか
あーくだらん
2023/07/09(日) 18:21:47.85ID:nGZbLr+D0
#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に代入しています。
2023/07/09(日) 18:24:43.97ID:6ZzBc/+b0
>>287
p = *card;
2023/07/09(日) 18:31:02.01ID:6ZzBc/+b0
>>287
この場合に card の型は int[5][5] なんだけど
配列は配列の先頭要素を指すポインタに暗黙に型変換されるのが基本ルール
だから式中に card が出てきたら int(*)[5] として扱われる。
この型は int* と互換性のない型ということを警告は言ってる。

型が int(*)[5] であるような式に * を付けたら int[5] ということになるんだけど
上述の暗黙の型変換のルールで int* ということになって p の型と一致するようになる。
故に p = *card; で通る。
290デフォルトの名無しさん (ワッチョイ 17b3-6GCC)
垢版 |
2023/07/09(日) 18:37:18.48ID:nGZbLr+D0
サンクス
291デフォルトの名無しさん (ワッチョイ 9ffb-9JJG)
垢版 |
2023/07/09(日) 18:49:34.69ID:vTvbeyL00
この場合ってpを長さ25の1次元配列として使っていいという保証あるっけ?
`card[0]`の長さ5の配列と`card[1]`の長さ5の配列に隙間がないことが保証されてればいいんだけど
2023/07/09(日) 19:43:00.43ID:6ZzBc/+b0
>>291
二次元配列ってのは理屈の上では一次元配列を要素とする配列と解釈される。
一次元配列で要素間に詰め物が入らないなら二次元でも理屈は同じ。
2023/07/09(日) 20:21:15.21ID:DZU7rHSU0
アフォはこう書く
p = (int*)card;
先輩方に見捨てられるので気をつけて
2023/07/09(日) 20:52:22.88ID:QgBW0FA9d
>>291
心配なら
int card[5*5];
とでも宣言すれば安心だけど
パディングがもしあるなら card[5];の各要素の間にすでに挟まってるはずなので
card[5][5];も同じようにアクセスできるはず
2023/07/09(日) 23:01:01.58ID:uNLQZN7w0
>>291-292
隙間の有無とアクセス保証は関係ないでしょ。少なくとも規格上は。
2023/07/10(月) 00:28:02.91ID:EhhseXmK0
規格上の規定は要素のレイアウトの規定として私は理解してたので
そのレイアウトと矛盾しなければ一次元の配列として
扱っても仕様に反しないという解釈でいたんだが……。
直接的に書かれている演算方法を経由した場合しか許さん
と捉えたなら保証はないのかもしれない。
2023/07/10(月) 00:33:20.12ID:SSHQru750
保証がないと、困るよ・・
2023/07/10(月) 00:36:21.43ID:EhhseXmK0
解釈の余地があるときは安全側 (制約が厳しい側) で解釈しておくのが筋ではある。
2023/07/10(月) 00:53:08.94ID:SSHQru750
元々配列なんて一次元が基本だし、mallocで確保して多次元配列として扱うなんてのもよくあるし
2023/07/10(月) 01:20:39.58ID:EhhseXmK0
>>299
malloc で確保した領域はどんなオブジェクト (少なくとも仕様の範囲内で作れる型に対応するオブジェクト) に対しても適切に境界調整されている。
そこらへんは別の話。
2023/07/10(月) 08:43:48.54ID:Xrxae+evd
先頭と領域が確保されていればその間にアクセスできない部分があることはないだろう
そんな器用なことをする必然性がないわ
2023/07/10(月) 08:47:35.15ID:7JEyTvQka
#include <stdio.h>
void main(void) {
int card[5][5];
int **p1;
int *p2

p1 = card;
p2 = card[0];
}
2023/07/10(月) 09:02:15.74ID:BD2ve/J+0
>>302
こっちでやれ
https://mevius.5ch.net/test/read.cgi/tech/1427572389/
2023/07/10(月) 09:24:10.89ID:dS/bwvgRa
>>303
おまえそっちでやれ
○○のはずとかそんなんで書くぐらいなら普通に書け
2023/07/10(月) 09:29:04.81ID:BD2ve/J+0
>>304
何のことだよ?
2023/07/10(月) 09:53:48.86ID:EhhseXmK0
>>301
オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。

ポインタの演算の結果は配列の要素か配列の最後の要素を
ひとつ過ぎた位置を指さなければならない。
その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく
ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。
(C99 なら 6.5.6 の加減演算子の項目に書いてある。)

今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので
このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。

仕様に書かれている演算はその演算に相当するレイアウトで配置される
という意味で解釈することも出来ると私は考えていたが
仕様の文面に厳密に言えば駄目かもわからん。

現代的な処理系ではポインタは由来 (provenance) という概念を持っていて
演算の元になったオブジェクトを外れたら未定義であるということを
利用して最適化することもある。
これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。

仕様に厳密にしないとわけのわからないことが起こるのが C というものなので
仕様の解釈は大事だよ。
307デフォルトの名無しさん (ワッチョイ 9fad-kkOg)
垢版 |
2023/07/10(月) 10:31:52.15ID:ifz8cUKw0
>>302
p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。
2023/07/10(月) 10:34:39.51ID:BD2ve/J+0
int card[5][5]; となっているとき
&card 二次元配列全体へのポインタ
card 最初の行へのポインタ
*card 最初の要素へのポインタ
2023/07/10(月) 12:23:15.05ID:pvSg+WfU0
2次元配列なんてExcelのRangeオブジェクトが返す配列ぐらいでしかお世話になったことないわ
特に効率的でもないし構造体でええやろ
2023/07/10(月) 12:47:58.91ID:Wg7MEfSed
何でそこで構造体?
2023/07/10(月) 12:53:57.17ID:AzWw4sMa0
>>308 下2行は正しくない。
2023/07/10(月) 13:25:18.46ID:Wg7MEfSed
§6.3.2.1の段落2で定める例外にあたらない場合という但し書きが足りないね
悪かったよ
313デフォルトの名無しさん (ワッチョイ ff63-/79E)
垢版 |
2023/07/10(月) 18:04:08.51ID:SSHQru750
5ch、専用ブラウザがサポート終了し、撤退する様です。
FireFoxだと書き込める様です。
それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。
314デフォルトの名無しさん (ワッチョイ ff7c-rqKn)
垢版 |
2023/07/10(月) 18:05:43.31ID:BD2ve/J+0
ソースplz
315デフォルトの名無しさん (スップ Sd3f-9JJG)
垢版 |
2023/07/10(月) 18:24:57.71ID:EIZKDTevd
処理系が16byte境界に合うように
「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安

わざわざコンパイラがそんなことする理由は
1. 16byte境界の合わせたほうがindexの計算が速い
2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる

規格上パディングが入らないことが保証されるならこの話は忘れてくれ
316デフォルトの名無しさん (ワッチョイ ff63-/79E)
垢版 |
2023/07/10(月) 18:29:02.59ID:SSHQru750
Talk専用ブラウザ 「Jane Style」 ← 5chの記述が消えました
20230710
Version 5.00 公開
・Talk に対応しました
* 5ch.net のサポートを終了しました
http://janesoft.net/janestyle/
317デフォルトの名無しさん (アウアウウー Sa9b-HEX/)
垢版 |
2023/07/10(月) 18:54:15.08ID:ebofKpc7a
>int **p1;

無いわωωω
2023/07/11(火) 02:24:43.39ID:vn98dBP10
>>314
https://agree.5ch.net/test/read.cgi/operate/9240230711/

正確にはJaneStyleが離反した

> 00015ちゃんねる ★2023/07/11(火) 00:00:00.00ID:LokiTech
> Janestyleはもう5ch.netと提携していません。
> Janestyle以外の専用ブラウザをご利用ください。
> 旧バージョンの5chブラウザ(API前)は近く再度利用可能となります。
> (以下略)
2023/07/11(火) 11:41:03.76ID:MoKwTryZ0
>>315
おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。
2023/07/11(火) 12:37:10.33ID:UJem4sQV0
テスト

> どういう理屈か知らんけど
> chmateで『URLから開く』で見たい板のURL貼り付けして
> 「5ch」の部分を「5Ch」に変えて開くと
> 5chのスレchmateで見れて草
https://twitter.com/motokamin_/status/1678473238177783835
https://twitter.com/5chan_nel (5ch newer account)
321デフォルトの名無しさん (ワッチョイ e2ad-/jfo)
垢版 |
2023/07/17(月) 05:23:15.01ID:0PvTd+Ok0
chmate はもう対応できてないかな。俺は読み書きできるようになったよ。
今これはPCからで Siki っていうの使って書いてるが。
2023/07/17(月) 09:16:25.38ID:YifLUjyU0
旧 API を復活させて制限が緩くなったから昔の専ブラがそのままかちょっとした設定変更で使えるよ。
今のところ PC 用の専ブラとしては JaneXeno か Siki が決定版だと思われているようだ。
2023/07/17(月) 11:31:18.04ID:SG+RSRxx0
>>321
PCはAPI対応前の昔のlive2ch(live5ch)が使える
324デフォルトの名無しさん (ワッチョイ 4d46-am1z)
垢版 |
2023/07/17(月) 11:33:54.45ID:o8kBjP6A0
ninja は make を完全に置き換え可能になったでござるかニンニン?
2023/07/17(月) 11:48:18.17ID:YifLUjyU0
>>324
設計思想が異なる。
ninja は make ほど多機能ではなく、メタビルドツール (cmake など) と組み合わせるのを前提としている。

どうせメタビルドツールは使うという前提なら ninja のほうが使い勝手が良いと思うが、
そうでないなら make のほうが楽だと思う。
326デフォルトの名無しさん (ワッチョイ dfad-onGn)
垢版 |
2023/07/22(土) 17:50:40.48ID:ZqN2VkQO0
Siki はおすすめ記事が出ていた。

5chブラウザー、JaneStyle代わりのオススメは「Siki」
https://news.yahoo.co.jp/articles/adfd44b291fbc07686ea4735e1397a3287aa4045
2023/07/27(木) 01:32:04.41ID:z625zk2O0
現状専用ブラウザJaneStyle4.23を落としてきて修正パッチを当てて動かしてます。
修正パッチは有志が機械語レベルまで降りて解析し対処してます。
今まで無かった機能まで追加してます。その技術力はスゴイですね。

ただ、専用ブラウザは今後5ちゃんねるの仕様が変わったときに
開発者がメンテできるかどうかで生死が決まりそうですね。
2023/08/02(水) 10:02:23.97ID:6slkiMgF0
なんか昔「コンパイル言語は消滅してスクリプト言語が主流になる!!」って主張聞いて
オープンソースアプリはともかく商業アプリでスクリプト言語使ってたら
速攻解析されてコピーなりクラックされて(その結果どうなるかはわからんけど)商売にならないんじゃないのかと思ったけど
現状どうなのかな?

JaneStyleの 不具合発生→ねらー修正 っての見てるとバイナリーコードでもスクリプトコードでも解析難易度は変わらないのかなとも思うけど。
329デフォルトの名無しさん (ワッチョイ 1746-ZTxv)
垢版 |
2023/08/02(水) 10:53:42.75ID:19FN81hV0
>>328
事実如何を措いて、
主流以外の傍流は消滅するという理屈がそもそもおかしい。
2023/08/02(水) 11:00:33.97ID:Vv20iihFM
バイナリクラックなら開発言語そのものにはあまり意味はない気がするけどな
バイナリエディタで稼働中の実行コード覗かれれば元の言語が何であろうが同じこと
2023/08/02(水) 11:10:57.90ID:STym7Vrv0
こういうのはやはりファームやってた人は強いのだろうか?笑
2023/08/02(水) 11:11:56.50ID:Vhf3uqZN0
暗号化やら難読化やらを駆使しても
実行中には実行できる形になってるのは
どうしようもないもんな。

だからライセンスで制約を付けるんだが、
不特定多数をユーザーとするビジネスモデルだと
制約を守らせるのも難しいのだと思う。
2023/08/02(水) 11:38:35.24ID:STym7Vrv0
不具合を何度も指摘されても放置していて
痺れ切らしたユーザーが解析してパッチを公開した
これが最初だったと思う
2023/08/02(水) 11:45:48.58ID:JKibevwe0
あれ難読化してあるの?
2023/08/02(水) 11:54:41.63ID:na1pjdup0
業務用アプリならサブスクとクラウドって感じだろうけど
個人向けのだとどうなんだろうね
まあそういう海賊版はアップロードした奴を捕まえることで対処しているっぽいけど
アプリの制限取っ払われるのはもうどうしようもないんじゃないかな
2023/08/02(水) 11:55:36.50ID:na1pjdup0
難読化はしてない
いやらしいほどに丸見え
2023/08/02(水) 20:21:52.90ID:Zi22N3SKd
>>328
オープンソースを勘違いしてる?
2023/08/02(水) 20:58:10.27ID:STym7Vrv0
質問型式ではなく、自分はこう考えていると書いて
2023/08/02(水) 23:54:36.96ID:W7+oBwzNd
>>328
次元の違う問題を比較してると思う
スクリプトでコンパイル言語を代替できるようになったとしても
商業ソフトを供給するほうがスクリプトでないと実装できないことにはならないし
サーバーサイドで重要な処理を行うようにすればスクリプトでもそこは解析できないわけだし(今回の5chのAPI仕様変更みたいに)
340デフォルトの名無しさん (ワッチョイ 6aad-Z/b2)
垢版 |
2023/08/03(木) 04:03:41.71ID:/xW45k0z0
>>328
主流かどうかはわからんけどJavaのような仮想マシンで動くやつは流行ったな(Androidスマホで採用されたので思い切り流行った)。Perlとかのインタープリタの言語も内部でコンパイルしてから動くのでなんとなく似ている。
こういう風に仮想マシンで動くようにするとOSやCPUが違っても互換性を保つのが楽になる。
2023/08/03(木) 17:16:30.77ID:5KUHoXNc0
tiktokなんかjavascriptでVMを実装してその上で独自のコードが動いてるせいで解析が極めて困難になってる
342デフォルトの名無しさん (ワッチョイ 1746-ZTxv)
垢版 |
2023/08/04(金) 08:54:17.97ID:4oDPVLgw0
>>341
こわっ...
343デフォルトの名無しさん (スフッ Sd8a-KN61)
垢版 |
2023/08/04(金) 15:45:40.86ID:GMHK0FTid
/* 文字列を反転させる */
#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引かないと正しく動作しないのはなぜですか?
344デフォルトの名無しさん (スフッ Sd8a-KN61)
垢版 |
2023/08/04(金) 15:49:34.67ID:GMHK0FTid
343の訂正です
q = &cp[strlen(cp)-1]です
2023/08/04(金) 15:57:00.72ID:/AVxr1FX0
末尾の \0 を入れ替えたらあかんやろ
"AB" は strlen() == 2 になって 

0 1 2
[A][B][\0]

こういう配置や
2023/08/04(金) 16:03:23.77ID:/AVxr1FX0
strlen は文字数を返す一方で [ ] の中はオフセット量(0スタートの相対距離)だから

1文字目を指すのは オフセット0 の場所なんだわ
347デフォルトの名無しさん (スフッ Sd8a-rFCo)
垢版 |
2023/08/04(金) 16:09:46.38ID:GMHK0FTid
>>>345 >>>346 即答ありがとうございます
自分はまったく そこまで考えてstlrenを使ってませんでした。ありがとうございます。勉強になります
2023/08/04(金) 16:25:43.11ID:/AVxr1FX0
そこまで考えてというか ポインタ/配列添え字 が 0 から始まるだけの話でな
 1文字目 = (オフセット)0
 2文字目 = (オフセット)1
:
 n文字目 = (オフセット)n-1

他所言語(特に古めのBASIC) だと配列の添え字は 1から始まるのが自然だから
その感覚のままだと およよ? ってなる
2023/08/04(金) 16:33:03.37ID:h8ImZ1qQ0
COBOL, PL/I, RPG, FORTRAN, BASIC, R, Lua, Julia は、1で始まる
2023/08/04(金) 16:45:56.55ID:vdf3rEq10
BASIC はバリエーションが多いよ。
0 と 1 を切り替える機能があるやつを知ってる。
2023/08/04(金) 22:18:35.44ID:3UzK9dfoM
>>341
そのやり方だとapple審査通らないのでは?
2023/08/04(金) 22:23:16.57ID:3UzK9dfoM
環境はwebkitでvm自体dlしてくるから問題ないということなのか…
353デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
垢版 |
2023/08/05(土) 14:06:37.50ID:7Tp3cevL0
>>349
Pascal もよろしく
354デフォルトの名無しさん (ワッチョイ bb01-tyL0)
垢版 |
2023/08/05(土) 21:43:38.19ID:p8skrLMB0
>>353
Fortranは添字の開始値を指定しない場合は1から始まり、添字の開始値を指定する場合は任意の整数
(負も可)を指定できるが、Pascalは添字の開始値指定が必須で任意の整数(負も可)を指定できるから、
1から始まるとは言えない。
2023/08/05(土) 22:05:05.59ID:Rq9CiLOMd
>>350
ああOPTION BASEかあ
N88BASICの頃からあるが使ってるの見たことない
356デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
垢版 |
2023/08/05(土) 23:14:06.26ID:7Tp3cevL0
>>354
そういやそうだった。忘れてた。
2023/08/06(日) 12:09:56.49ID:SuulMMGF0
今時はExcelのセルをCellsでアクセスしたり配列に代入した場合だけ1オリジン固定でちょっと困る
歴史的経緯というよりExcelのCOMオブジェクトの仕様なんだろうけど
2023/08/06(日) 13:13:28.45ID:GDllPCgfM
配列って
array + sizeof(*array) * index
だから、0からの方が理にかなってると思う
1からの場合は、実行時にアドレスを割り出すときに絶対1引いてるよね…
そこまでしても人間の直感に合わせたかったのだろう
2023/08/06(日) 13:25:15.07ID:jxDYmhFo0
1引いているのはあくまで内部的なもの
それこそ人間の直感に合わせたインターフェイスとコンピュータの都合の良い情報に相互変換するのがプログラムじゃなかろうか
0からのほうが分かりやすいと思うのはプログラマだからだろうし
10個のデータの最後のインデックスは10というのは添え字で考える場合は分かりやすいしね
2023/08/06(日) 14:09:12.01ID:VdM0xi000
先頭をゼロと呼ぶか1と呼ぶかならまだマシよ
音楽なんて先頭要素を1と呼ぶだけじゃなく、要素間の差がない事まで、ゼロじゃなく1と呼ぶ

現代人からするとどう考えても頭おかしいが、仕方がない。ゼロの概念がなかった時代から定義が変わらず続いてるらしい
2023/08/06(日) 14:15:40.68ID:SuulMMGF0
Cはゼロに限らず何もないを示すvoidが無い頃は全部intでやってた時代もあるんだよ
頭おかしいな
2023/08/06(日) 14:37:12.68ID:jxDYmhFo0
voidが何もないことを示すならvoid*の存在のほうが気になる
363デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
垢版 |
2023/08/06(日) 14:59:14.25ID:RhhSFLLO0
void だけ特殊な型と考えるしかないのではないかな。大きさが0ビットの型と考えても良いのかも知れないが。
2023/08/06(日) 15:50:27.26ID:3R7VaRJUM
sizeof(void) → 1 だな
これって正式な仕様なのか分からんけど
2023/08/06(日) 16:40:17.07ID:Raz9Sh7o0
それgccなんかの独自仕様のはず。void*をバイト単位で計算できるから便利なんだけどね。
2023/08/06(日) 17:35:17.48ID:/aV5Am17d
それは気持ち悪いな
2023/08/06(日) 17:46:22.79ID:Mgx3ApDu0
言語仕様上は void は不完全型とする扱い、かつ sizeof に不完全型を与えることは出来ない。
2023/08/06(日) 17:48:27.27ID:/aV5Am17d
gccだとsizeof(関数名)も1なんでしょ
明らかにただの手抜き
2023/08/06(日) 17:52:12.98ID:wnylhiXb0
仕様上の問題は置いておいて
1として扱うと何か良いことあるんでしょうか?
2023/08/06(日) 17:56:04.37ID:Mgx3ApDu0
未定義な動作は規格として規格が何ら要求を課さないことを意味するが
但し書きの中に「文書化された環境に特有な方法で処理してもよい」ともある。

GNU C のドキュメントには void と関数 (関数指示子) の大きさについて記述がある。
https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html
これも規格が認める正しい動作のひとつ。
それはそうとして処理系に固有の挙動に依存するのを避けるに越したことは無いけど。
2023/08/06(日) 18:03:13.82ID:Raz9Sh7o0
>>369
>>365にも書いたけど、演算するのにいちいちchar*などにキャストする必要がない。
2023/08/06(日) 18:10:14.29ID:Mgx3ApDu0
void* は演算させないという意思表示なこともあるんで
演算できることが良いわけでもないんだけどね。
2023/08/06(日) 18:29:53.89ID:Raz9Sh7o0
どんな用途があるかな?デリファレンス先にアクセスできないってだけで十分な気もするが。
2023/08/06(日) 18:36:51.14ID:mq8IFmf1a
任意に渡ってきたポインタ間の距離?
2023/08/07(月) 01:08:17.44ID:zJXXdP4R0
アレじゃないかな?メリットあるとしたら

【struct に含めたメンバーは、サイズゼロはダメ】っていう仕様があったかと思う。
正確には【structの違うメンバーが同じアドレスになったらダメ】だったか

----
以下は蛇足

ただサイズゼロだめってのは例外があって。
structの末尾メンバーでchar[] だか char[0]ってのが、確かC99あたりでアリになった気がする。

これは…それまでも使われてたテクで
【structの最後に char [1] のメンバーを置いて、実際にはメモリ確保の時structのサイズ+可変長部のサイズでメモリ確保し、最後のメンバーを使ってstructのサイズを超えてアクセスする】という慣用句があって、
それの目的で
C言語公式仕様風では char[1] と書き
確か昔は gccだとchar[]
vcだと char[0]
ていう書き方してた。(gccとvcは逆だったかも知れない)

のが、公式仕様でもサイズゼロokになった…という話だったかと。
2023/08/07(月) 01:23:44.93ID:zJXXdP4R0
あ、メリットの言い方をすると

処理系内でstructのサイズ計算を実装するにあたって、あらゆる型がサイズ1以上である事が分かっていれば、合算処理を合理的に実装する事ができる
…よね?
2023/08/07(月) 08:18:18.04ID:SwgOJiZRd
意味不明
メンバーにvoidを含められたとしても参照すればエラーになるはずなので使いようがない
(void*はもともと正しいサイズを持つ)
unionで似たようなことはできる
2023/08/07(月) 09:11:24.17ID:U9It/DCQ0
>>375
サイズゼロをOKとすると言ってしまうと語弊があると思う。
仕様上の理屈だと「不完全型を指定できる」だし、そうした場合の動作は
いくつかの特例で成立していて「長さ 0 の配列」は現れない。

sizeof などでは「フレキシブル配列メンバは無視される」だし、
メンバにアクセスするときは

> 置き換えられた配列が要素をもたないとき,それはただ一つの要素をもつのと同じ規則で動作する。
> しかし,その要素にアクセスした場合,又はその要素を一つ越えたポインタを生成した場合,
> その動作は未定義とする。

とあって、長さ 1 として扱うけど要素にはアクセスするなという回りくどい言い回しになってる。
379デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
垢版 |
2023/08/07(月) 10:17:41.09ID:wl/Lx6N5a
>>375
typedef struct { int x; char a[1]; } A; A *p = (A *)malloc(sizeof(A) - 1 + N);
typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) + N);
typedef struct { int z; char c[0]; } C; C *r = (C *)malloc(sizeof(C) + N);
かな
380デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
垢版 |
2023/08/07(月) 10:19:25.16ID:wl/Lx6N5a
>>378 の主張だと
typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) - 1 + N);
でなければならないのかな
2023/08/07(月) 11:05:26.04ID:U9It/DCQ0
>>379
配列の大きさとして 1 を指定して可変長のように扱うやり方については
ちょっと不明瞭なんだが仕様に厳密にいうと準拠してない方法だと考えられている。
https://c-faq.com/struct/structhack.html

配列の大きさが 0 より大きくなければならないということについては
例外を見つけられないのでどこであろうと 0 を指定したら未定義と解釈していいと思う。

GNU C では構造体メンバの最後の配列要素に 0 を指定した場合は
C99 でフレキシブル配列メンバにしたときとほぼ同じような扱いになることがドキュメント化されてる。
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
つまり GNU C では 0 を指定していいわけだが……結果が同じならあえてやる必要もないな。

GNU C でも構造体の最後の要素を除いて配列の大きさに 0 を指定するのは (可能だが) 推奨されていない。
アクセスした結果は未定義なのでなんの役に立つのかようわからん。
2023/08/07(月) 11:36:51.88ID:SwgOJiZRd
>>380
-1する必要ないな
1バイト程度なら余計に取っても害はない
383デフォルトの名無しさん (ブーイモ MMf3-DyKn)
垢版 |
2023/08/07(月) 14:20:51.17ID:Xd8Y6/QgM
>>382
そういういい加減な見積もりは感心しないな
それに、この場合は-sizeof(int) が正解だと思う
2023/08/07(月) 14:26:13.65ID:U9It/DCQ0
>>382-383
どっちも間違い。 この場合は -1 をしてはいけない。
2023/08/07(月) 20:36:36.16ID:SwgOJiZRd
>>383
いい加減なのではなく無駄なことに神経を使わないのがプログラマの秘訣だ
それに他人が見て「この-1はなんだろう?」と無駄な思考時間を取られる可能性を考えたら百害あって一利なしだ


>>384
よく見たらデタラメだな
すまん
2023/08/07(月) 21:06:32.92ID:+g1cDN8+0
>>385
1バイトごときのために余計なことをしないってのは理解できる理屈だが、不必要な1バイトを確保するってのもそれはそれで無駄に考えさせられてしまう感じがする。
やろうとしていることと合致しないコードなわけだから。
害はないが役に立ってもいないということを確信するのはどういう役に立っているのかを見つけるより難しい。
387デフォルトの名無しさん (ブーイモ MMf3-DyKn)
垢版 |
2023/08/07(月) 21:30:20.59ID:6YHeZP2fM
>>384
ああ、[1]の場合のコード見てたわ、お恥ずかしい。
どっちにしろ[1]の場合もoffsetofかalignof使ってあれこれだね…sizeofじゃ正解ではない…
2023/08/07(月) 22:08:57.23ID:SwgOJiZRd
>>386
どうせmallocは1バイト単位では確保しないので正確なサイズを指定しても構造体一個につき数バイト以上の無駄な領域が確保されることになるし…
この構造体を数万個単位で使うような大規模プログラムで極力ムダを避けたいならmallocは使わず最初に大きなリニア領域を確保してそこから切り分けたほうがいいだろう

蛇足だが経験上こういう構造体を使うときはcopy=malloc(sizeof(A) + strlen(src)); strcpy(copy->a,src);のように使うことが多い
これなら正確なサイズ指定になる


>>387
どっちにしろ君は何か勘違いしてないかな
長ったらしく書くなら-sizeof(int)ではなく-sizeof(char)となる
2023/08/07(月) 22:21:06.53ID:zJXXdP4R0
どんどん蛇足的になってしまってる気はするが

1バイトの加減算ってのはインクリ・デクリの1命令で演算できるし分岐しないし、
アライメント境界を1バイト超えたらバス幅分-1の無駄ができるかもなので
しかも100万個の「3d座標型」とかがその理屈で1個につき7バイト無駄にしたら700万バイトが無駄になるので
たかが1バイトと軽視して良いか否かは、状況によります


で、はちみつさんのちみつな調査に感謝。蛇足で変な事書いて仕事増やしてごめんなさい
2023/08/07(月) 22:28:38.60ID:zJXXdP4R0
でも、ワシは(もしそれが有効だと判断したら)公式なC言語仕様上未定義になるとしても、
伝統的にgccとvcが「独自拡張」として許してきた書き方で
書くよ

もちろん責任者の許可は伺うけどね
ダメと言われたらもちろんやらない
391デフォルトの名無しさん (ワッチョイ 0547-DyKn)
垢版 |
2023/08/07(月) 22:34:55.16ID:hZrkDm/B0
>>388
ちゃんとサイズ確かめた?そんなに簡単なら[]拡張なんて要らないと思わない?
2023/08/07(月) 22:36:31.40ID:zJXXdP4R0

時には自分が、あるプロジェクトの最高責任者だったりする訳で
その環境は特定のカスタムgccの特定バージョンを使うしか選択肢がないから無用な心配は意味がなくて
次のプロジェクトではどうせ全部作り直しだったりする
2023/08/07(月) 22:48:24.16ID:SwgOJiZRd
>>391
何を確かめればいいのかね
正確に書いてくれないと答えようがないな
後半個人的には「要らない」ね
誰かが拡張したら使わないとイケないという「強迫観念」を持ってないか?
それは不要なものだよ
394デフォルトの名無しさん (ワッチョイ 0547-DyKn)
垢版 |
2023/08/07(月) 22:52:47.17ID:hZrkDm/B0
>>393
sizeof(A) != sizeof(int) + sizeof(char)
2023/08/07(月) 23:31:53.12ID:+QyISSA90
>>394
メンバの配置はきっちりつめるのから
nバイトアラインで飛び飛びにしてるのもあるしね
2023/08/07(月) 23:39:40.36ID:+QyISSA90
>>395
一番最後のメンバの後ろにパディングが足されるかどうかが焦点になる
足されないならイージーに引き算すりゃいいんだが…
2023/08/08(火) 07:56:15.14ID:QQsYUamCd
引き算とか言ってる馬鹿初めて見たわ
2023/08/08(火) 11:03:00.71ID:+jW/mKCz0
複素数使って計算すれば馬鹿にされませんよ?
2023/08/08(火) 20:31:55.04ID:sLVQKk30d
>>394
意味はわかったけど
君のコードは可搬性がないわけだね
全部作り直しになるのもうなづける
そんなのやってられないw
400デフォルトの名無しさん (ブーイモ MMf3-DyKn)
垢版 |
2023/08/08(火) 22:38:48.82ID:MjZ+EK1qM
>>399
初歩的な構造体のパッキングルールを理解していたらどうって事無いはずなのだけども…この程度で可読性とか労力とか、そういうレベルの仕事なら使用禁止で良いんじゃないかな。

あと、何か勘違いしているようだけど、[1]だとややこしいけど出来るねって言ってだけで、使うなら[]だよ。c99標準な訳だし。
2023/08/09(水) 00:47:58.70ID:3Zyc8vU6d
「-sizeof(int) が正解」とは言えないよ環境による
パッキングルールを変更できる#pragmaもあるから
それは単なる「思い込み」ということになるな
2023/08/09(水) 06:00:17.77ID:ye8eZ1o40
>>399
あなたが「君」って言ってる相手は少なくとも私と私以外の2人以上なので 何か誤解してると思う
ここは匿名掲示板なので、想像した人格じゃなくて内容に反応して欲しい
403デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
垢版 |
2023/08/09(水) 08:10:28.54ID:KudoDE9Va
言語仕様知らずに叩いてるんだから無理だろ
404デフォルトの名無しさん (ワッチョイ 915f-1PqA)
垢版 |
2023/08/11(金) 14:52:37.80ID:fYiGiCzQ0
質問失礼します
Windowsソフトが作りたく基礎を勉強したのですがここからソフトを作る道筋が見えてきません
SDKを用い制作するということまではわかったのですがそれについて解説しているサイトがなく詰まっている状態です
おすすめのサイトや参考書などあればご教示くさだい
2023/08/11(金) 15:39:30.67ID:zcS71Tbhd
https://dxlib.xsrv.jp/dxfunc.html
http://marupeke296.com/DirectXMain.html
2023/08/11(金) 15:46:47.16ID:EnF/lRSf0
モダンなフレームワークを使った方が良いが
Windows の基礎的な理念というか考え方をかなり平易に
説明したものということだと↓とかが有名だと思う。
http://www.kumei.ne.jp/c_lang/
ただ、古いので実情に合わない部分はある。

Windows には異なる系統の API があって、
現在では COM をベースにした WinRT がモダン API として
整備されているのでそちらを軸にしても良いかもしれない。
2023/08/11(金) 16:09:36.01ID:Ib19PZqn0
SDK使っての開発は30年位昔のやり方なんではないだろうか
408デフォルトの名無しさん (ワッチョイ 915f-1PqA)
垢版 |
2023/08/11(金) 16:11:15.49ID:fYiGiCzQ0
>>405
>>406
ありがとうございます
早速進めてみます
409デフォルトの名無しさん (ワッチョイ 915f-1PqA)
垢版 |
2023/08/11(金) 16:12:13.55ID:fYiGiCzQ0
>>407
基礎しかわからない初心者なものでして、、、
410デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
垢版 |
2023/08/11(金) 16:53:28.21ID:j3k4ZyED0
Windows のネイティブなプログラム作りには C というよりは C++ の方がよく使われていたと思うので、C++ も覚えた方が作り易くなるような気がする。
2023/08/11(金) 17:26:57.28ID:v1edpQDwa
>>407
使えるものは使えば良い
昔の方がシンプル

>>410
MFCやATL/WTLやCOMやQtやwxWidgets使いたいならC++だが
生WindowsAPIとSDKやCOMやOpenGLやtcl/tkとか使うならCで充分
むしろCが標準と言っても良いので勉強用ならC
412デフォルトの名無しさん (ワッチョイ e3ad-c/5M)
垢版 |
2023/08/11(金) 17:52:29.73ID:j3k4ZyED0
なるほど。
2023/08/11(金) 17:54:37.84ID:Ib19PZqn0
最初残ろは16ビットアプリだったから、
メモリーモデルやアプリが使用可能なリソースサイズなど
結構管理が大変だった記憶がある
2023/08/11(金) 17:55:37.06ID:Ib19PZqn0
最初のころは

なんて変換するんだよ・・・
2023/08/11(金) 18:22:42.78ID:WGGkjKOg0
勉強目的の縛りプレイじゃなければ最初からCじゃなくC++使う方が良いと思うが。
2023/08/11(金) 18:30:11.06ID:I7dwFhkG0
いまだにCOM ATL DirectX IDL辺りの定義見るとC知識では手に負えないイメージ
C++MFC全盛の時代は本当に嫌いだった
C#でそれらに一切関わる必要がなくなってほんと良かったわ
2023/08/11(金) 18:52:16.19ID:DMm7pQwE0
古いAPIの設計思想が時代に合わないのも多いし、フレッシュな知識を蓄積したほうがいいという意味ではWinRTかな
2023/08/11(金) 19:09:53.39ID:I7dwFhkG0
>WinRTかな
名前が終わってる
419デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
垢版 |
2023/08/11(金) 19:10:12.84ID:v1edpQDwa
DirectXはCでも使える
420デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
垢版 |
2023/08/11(金) 19:11:09.76ID:v1edpQDwa
MFCは糞だから触るな危険
421デフォルトの名無しさん (アウアウウー Sa9d-mBaV)
垢版 |
2023/08/11(金) 19:12:06.88ID:v1edpQDwa
WinRTはないな
2023/08/11(金) 19:17:33.71ID:yxSWeMo+0
とりあえず現在でWindowsアプリのプログラミングを始めるにあたり、C言語というのはやめるべき
悪いこと言わないからせめてC++にしておけ
そして楽に作りたいならC#にしておけ
2023/08/11(金) 19:26:30.18ID:EnF/lRSf0
C でやってみれば (やれるだけの知識を身に付ければ) 低レイヤで何が起こっているのかという具体的なメカニズムを理解できるという意味で悪くはないと思う。
ただ、今となっては日常的にやるもんではない。
2023/08/11(金) 19:26:45.26ID:I7dwFhkG0
C#で.NETにない事をやろうとするとpnvoke知識が必須だから
Cを適当に摘みつつC#でいいんじゃなかろうか
C++はもう時間の無駄
時間が無限にあるならどうぞ
2023/08/11(金) 19:35:56.75ID:Ib19PZqn0
Windowsの動作原理を学びたいなら、SDKやMFCは良いと思うよ
2023/08/11(金) 19:53:56.21ID:eb/xI15cM
今のWindowsの最新のUIは全てWinRTの上に構築されている
Githubでソース見れば一目瞭然
完全に今のWindowsの基礎となるAPI
無知というのは罪だな
2023/08/11(金) 19:58:54.93ID:I7dwFhkG0
まさかWinRTでマウント取ろうとする馬鹿が居ると思わないわ
2023/08/11(金) 20:00:58.18ID:xXGnDnZp0
黙NG
2023/08/11(金) 20:32:13.88ID:iNvWur52M
>>427
無知乙w
正論にキレるの図w
反応しなきゃいいのにw
2023/08/11(金) 20:35:15.14ID:iNvWur52M
>>427
WinRT終わってるとか無いわーw
2023/08/11(金) 21:00:42.88ID:Ib19PZqn0
変なのが湧いてきたね
2023/08/11(金) 23:10:37.93ID:je510yk+0
mallocの戻り値は代入先のポインタ型にキャストして使おうと言ってる入門サイトがほとんどです。
これは正しくなくて、キャスト不要が正しいと思いますが達人の皆さんの意見はどうですか。
2023/08/11(金) 23:16:31.85ID:WGGkjKOg0
void*はキャストしなきゃ使いようがないだろ
2023/08/11(金) 23:37:09.78ID:903ETN7Yd
C++ならvoid*からのキャスト必須。C言語ならキャスト不要。
2023/08/11(金) 23:43:24.35ID:ayxoKHEe0
現場猫案件。
2023/08/12(土) 00:37:36.88ID:dWTISXa3M
>>431
害悪はオマエだろ!
WinRTが終わったAPIみたいなフェイクを正したんだよ!
WinUIとかGithubでソース公開されてんだから、ソース見れば一目瞭然だろ!
2度とフェイクを書き込むなよ!
2023/08/12(土) 01:20:09.40ID:PG846lpi0
もしかしてWindowsRT(ARM版Windows8)と勘違いしてたりして
2023/08/12(土) 02:14:36.52ID:dWTISXa3M
WindowsRTは失敗したプロダクトだけど、WinRTは完全にWin32を置き換える為のモダンな基盤APIになった
ちなみにWinRTに関する情報は全然出回ってないな(少なくとも日本では)
MSも直接使うAPIじゃないと考えてるのかもしれない
実際、WinUI3とかを通して使うことになるのだろう
2023/08/12(土) 02:21:43.01ID:dWTISXa3M
MSは一時的に、DirectXやActiveXみたいにRTを流行らそうと考えてたふしがある
でも、まったく浸透せずにRTに悪いイメージだけが残ったw
440デフォルトの名無しさん (アウアウウー Sac7-DXLR)
垢版 |
2023/08/12(土) 04:30:30.39ID:XzrhAFZoa
ないわ
2023/08/12(土) 11:53:24.11ID:BlsfQ4Nv0
>>432
型変換とキャストを混同して説明していることがそれなりにある。
それとは別に不要でもキャストすべきかどうかというのは習慣の問題。 人にとっての読みやすさは仕様上の要・不用とは別の話なので明瞭な答えはない。
2023/08/12(土) 12:15:02.77ID:ufIhf+igM
UWPのWinRTでファイルアクセスなどに制約がある場合があって
APIレベルでセキュリティ上の制限があるのかと思ってたが間違いで
他のプラットフォームで呼ぶと普通に色々アクセス出来てしまう
2023/08/12(土) 14:04:01.34ID:DbL0Mu2X0
そろそろ他所でやってくれんか
普段Windowsには世話になってるけどUWPの存在には憎しみさえ感じる
444デフォルトの名無しさん (ワッチョイ 9aad-eQmn)
垢版 |
2023/08/12(土) 14:18:40.69ID:2oorck2f0
>>441
cast という単語には型変換の意味があると思うが?
で、実際にプログラミング言語では型が変換されるから、型変換で良いんじゃないの?
2023/08/12(土) 14:53:08.69ID:BlsfQ4Nv0
>>444
Cの仕様上の意味合いとしてはキャストという用語は構文 (記法) を指している。
括弧の中に型を書いたやつを式の前に置く、あの構文のことね。

キャストを使わない形でも (暗黙の) 型変換が起こることはあるし、
型を変えないキャストも出来る。 型変換とキャストは同一ではないよ。

カジュアルな場合では文脈でわかるし、ときには同一視してもいいこともあるけど >>442 の文脈では
構文のことを言っているのか型変換のことを言っているのかで事情が変わってくるので
厳密でなくても良いとは言えない。
2023/08/12(土) 14:54:12.64ID:BlsfQ4Nv0
>>445
アンカーを間違えた。 >>442 じゃなくて >>432 ね。
447デフォルトの名無しさん (ワッチョイ 9701-DXLR)
垢版 |
2023/08/12(土) 20:19:50.46ID:eS+ePZlf0
「毎日出社したい」わずか3.8% リモートワーク経験者に聞いた

学研ホールディングスのグループ会社であるベンド(東京都千代田区)は、リモートワーク
経験者を対象に「リモートワークに関するアンケート」を実施した。その結果、半数近くの
人が「週5(フルリモート)」(44.4%)をリモートワークの理想の頻度だと考えていること
が分かった。
次いで「週3〜4」(30.7%)、「週1〜2」(20.1%)と続き、96.2%の人がリモートワークの
継続を希望していることが分かった。毎日出社を希望する人は、わずか3.8%だった。
出社を希望しない理由は「通勤にかかる時間や体力がもったいない」「子どもの都合で、
リモートワークのほうが仕事と家庭のバランスが取りやすい」「職場の人と毎日顔を合わせる
のはさすがにつらい」といった意見が寄せられた。
 一方、「コミュニケーションが取りにくくなる」「出社しないとできない業務がある」
「たまには出社もいい気分転換になる」など、完全リモートだと不都合だという声もあった。
2023/08/12(土) 22:15:14.90ID:jlvbpae70
>>445
冗長 int *p = (int *)malloc(400);
簡潔 int *p = malloc(400);

ということを言うつもりで書きました。
2023/08/12(土) 22:54:57.04ID:BlsfQ4Nv0
>>448
仕様上は暗黙の型変換が適用される場面。
キャストを書かなくても型変換はされることが保証される。

ただ、 >>434 で言及されているように C++ ではキャスト必須なのでそれに合わせる (ことで C++ としてもコンパイルできるようにする) ほうが好ましいという考え方もある。 これが暗黙に変換できてしまうのは良い仕様とは言えないのは確かだからより厳しいルールの C++ に合わせるのも一応の合理性はある。

誤解の余地もない (と思う) ので私はキャストを書かない派なのだけど、以前にツイッターかどこかのアンケートで見た感じでは拮抗してて、どちらが優勢というわけでもなかった。
450デフォルトの名無しさん (アウアウウー Sac7-DXLR)
垢版 |
2023/08/13(日) 11:59:59.00ID:mxfdwtiAa
int *p = (int *)malloc(400);
冗長ではないよ
2023/08/13(日) 22:00:40.70ID:37XsjItY0
C++でnewではなくmallocをあえて使う理由って何かあるのかな?
2023/08/13(日) 23:29:06.42ID:oUeYwTCa0
>>449
くわしくありがとう。そういう見方もあるのですね。
アンケートで拮抗というのはわかる気がしていて、その理由が入門書やサイトにあるのではと思うのです。

>>450はなぜそう思いますか。
2023/08/14(月) 00:14:53.81ID:VnUPK1/b0
void *が無かった頃はmallocもintやchar *を返していた時代がある
処理系渡り歩いてきた老害ほどmallocでキャストしたがるだけだろ
大した話でも何でもない
454デフォルトの名無しさん (ワッチョイ 9aad-eQmn)
垢版 |
2023/08/14(月) 00:21:55.24ID:B5PklEie0
可読性を上げるためでもあるのでは?
2023/08/14(月) 00:30:57.60ID:sy90BXR10
>>454
可読性が上がるだろうか? 少なくとも >>448 のように変数の型がその行に書いてあるようなケースでは
誤読の余地は全然ないように見えるので同じ情報を重複して書く意味が感じられない。
456デフォルトの名無しさん (ワッチョイ 9aad-eQmn)
垢版 |
2023/08/14(月) 00:38:36.06ID:B5PklEie0
まあ確かに型がすぐ分かる場合は意味ないな。
457デフォルトの名無しさん (ワッチョイ 4e46-8Neb)
垢版 |
2023/08/14(月) 09:03:40.40ID:6kZXa4aF0
>>448
組織(会社とか)のコードだと、どんな水準の人がメンテするか分からないので、冗長を採るかな。

> 冗長 int *p = (int *)malloc(400);
2023/08/14(月) 09:28:55.46ID:4XD1xMqSM
この話が一番冗長だtoomou

kanjidenakunatta
2023/08/14(月) 10:36:19.28ID:sy90BXR10
>>452
K&R の第二版 (日本語版) でもキャストは必要だと書かれているんだよなあ……。
本の最後に仕様をまとめているところでは暗黙に変換されることも言及されているのでおそらく改定漏れなだけなんだろうけど。
かなり長く定番の入門書だったのでこの本の影響も大きいと思う。
2023/08/14(月) 11:55:47.09ID:s6PscRDz0
暗黙に変換って、プログラム書いてる本人の意図通りなら良いんだけど
意図と違った変換するとやっかいだな
2023/08/14(月) 13:20:28.84ID:JlnnwsPwM
ここがC言語スレだと思い出して欲しい
2023/08/14(月) 13:23:53.19ID:4NX3l0Vmd
Cの暗黙の型変換なんて高が知れてるだろ
2023/08/14(月) 14:02:18.88ID:XhXbjspZM
昔のmalloc()ってchar*とか返してた気がするな
最初っからvoid*って有ったのだろうか?
2023/08/14(月) 14:16:28.68ID:JlnnwsPwM
すべての戻り値はintである
ポインタかどうかは書いた人間がが判断する
2023/08/14(月) 15:03:08.99ID:s6PscRDz0
(void)main(void)
2023/08/14(月) 15:17:16.05ID:MULxLxBHd
>>464
AIが混乱するようなことを言わないでほしいも
2023/08/14(月) 16:43:05.60ID:sy90BXR10
>>464
それ LLP64 でも同じこと言えるの?
2023/08/14(月) 17:46:44.25ID:3TQy/ZGT0
>>464
それはB言語のようなミニ言語やBLISSやアセンブラのようなシステム記述言語でよくあるやつだな。
そういう血塗られたルーツを持つCが普及してしまったのがこの大災害の原因ではあるが。
2023/08/14(月) 18:03:50.08ID:s6PscRDz0
今は血を流さずに戦争ができます
2023/08/14(月) 18:07:41.52ID:WVbdJjmk0
ポインタじゃない構造体の代入はメモリコピーで、intじゃないよね
2023/08/14(月) 18:22:17.15ID:WVbdJjmk0
>>467
それですよ。

あと、実際の案件で
メモリバスが32より大きい環境でも、64ビット全部が使われてるとは限らないです。
あるビットにこう入ってたら40ビットのxxメモリ空間を指し、あるビットにこう入ってたら48ビットのyy空間を指す、とか
ポインタ値にも複数の種類がある(ように設計する事がある)

何が言いたいかというと全部intだなんてのは、分かってない証拠
2023/08/14(月) 18:39:04.59ID:s6PscRDz0
可変長のポインタって、すごいな
2023/08/14(月) 18:42:29.14ID:JlnnwsPwM
昔は関数から戻り値として構造体が返せなかった
MSか勝手に実装した
2023/08/14(月) 18:47:31.20ID:s6PscRDz0
返せなくても困らなかったけど
例えばポインタで返しているAPIはいくつかあるだろうし
呼出時に渡す構造体で返すやり方も普通にある(こちらの方が多いかも)
2023/08/14(月) 21:33:10.14ID:VCWTWKLb0
8051風のMCUにはメモリ空間が複数種類あるものがあって、どのメモリ空間をポイントするかによってポインタのサイズが1byteか2byteかに分かれるというのがありました。
2023/08/14(月) 22:08:33.35ID:sy90BXR10
>>473
K&R の初版 (1978 年) の段階では
構造体を関数の返却値に出来る仕様ではなかったのは確かだが
その制限は将来的に削除されるとも書いてある。
構造体を返せるようにするのは設計者の計画の内だ。

最初に実装したのが誰なのかは知らんが「勝手に」とは言えないだろう。
2023/08/14(月) 22:12:43.60ID:s6PscRDz0
えてして実装が先で、規格になるのは後
というのはよくある話
2023/08/15(火) 18:53:02.89ID:hBALyWzq0
規格が先行することなんて無いでしょ
出来レースみたいな例外を除けば
479デフォルトの名無しさん (ワッチョイ 4ecf-eQmn)
垢版 |
2023/08/15(火) 19:27:12.11ID:RzZaP1Xc0
仕様もクソもANSI Cが出来るまでCに仕様だの規格だの自体がなかったよ
K&Rにしても当時はあくまで標準って位置づけだったし、各処理系で互換性のない部分が結構ある時代だった
そもそもK&Rって本自体Cの言語としての仕様を示すための本じゃなくて、Cの使い方を説明するユーザーガイド的な書籍だしな
大体、当のデニスリッチーからしてK&R初版の時点で自分のコンパイラではすでに構造体のやりとりを実装させてたんだから
480デフォルトの名無しさん (ワッチョイ f358-yhDR)
垢版 |
2023/08/17(木) 17:55:25.45ID:3zgw8j7r0
K&Rはバイブルってだけ
宗教に喩えて開祖だか教祖だかが著したもの
2023/08/17(木) 17:57:11.47ID:PGwDphC60
バイブルに従え
482デフォルトの名無しさん (ワッチョイ 4e46-8Neb)
垢版 |
2023/08/17(木) 18:38:44.78ID:ZHeAFIgr0
C言語ルター派
2023/08/17(木) 19:50:44.50ID:J3LrsntM0
般若心経
2023/08/17(木) 20:29:24.71ID:o4Mq35bqd
>>481
天国が来るだろう(構造体の戻り値)って書いてあるんだから天国の到来を疑ってはいかんだろw
2023/08/19(土) 16:55:05.41ID:YiVhsdBOa
剣かK&Rか貢納か
2023/08/19(土) 21:36:28.88ID:cGpjgVdNM
天国から帰ってくるのはヨッパライくらい
2023/08/19(土) 22:45:11.13ID:/061VjvDr
なーおまえ、c言語ちゅーもんはそんなに甘いもんやおまへんのや。もっと真面目にやれー
488デフォルトの名無しさん (ワッチョイ 93ad-qLW0)
垢版 |
2023/08/20(日) 15:24:28.02ID:pbHEs6OP0
>>480
そういう感じでバイブルと呼ばれる本がいくつかあって、暫くしたら本のタイトルにバイブルって入ってるやつが出てきてアホかと思った事がある。
まあ、本のタイトルは出版社側がなんとなく売れそうな感じのものを考えて付ける事が多いらしいので仕方がない事なのかも知れないが。
489デフォルトの名無しさん (ワッチョイ 93ad-qLW0)
垢版 |
2023/08/20(日) 15:26:20.60ID:pbHEs6OP0
>>487
レコードの回転数変えるように。

などと書いて話が通じる人は年寄り。
2023/08/20(日) 16:08:23.89ID:CcD0k09aM
33回転、45回転、78回転
2023/08/20(日) 16:45:30.39ID:bQFpfsbr0
LP 33+1/3 回転を更に Long Play 化したのが LLP64 なの?
2023/08/20(日) 20:08:06.72ID:GxzweHHZ0
針ってまだ売ってるんだな、知らなかったw
2023/08/20(日) 20:37:34.57ID:qQCDJN6bM
逆に今はレコードブームだし
2023/08/20(日) 20:38:55.31ID:WX+gcEAed
>>491
なんで回転数早くなってるねんw
2023/08/20(日) 20:40:51.45ID:qQCDJN6bM
回転数が速いと情報量が増える
要するに音質が良くなるんだろ
2023/08/20(日) 21:28:54.03ID:CVtYBdI90
>>492
いまどきのレコードプレイヤーはレーザーで読み取るタイプのもあるんやが
音質や使い勝手よりも針を落とす感覚が好きな懐古趣味の人も
少なからずいそうやなと思う。
2023/08/20(日) 21:44:18.30ID:GxzweHHZ0
そのうち量子センサーなんてでてきて、
盤面を一瞬で読み取って再生する何て出てくるかもね
知らんけど
498デフォルトの名無しさん (ワッチョイ 93ad-hPrW)
垢版 |
2023/08/20(日) 22:47:50.93ID:pbHEs6OP0
盤面を写真撮影して凹凸を一度に全部読み、後は再生するだけ。なんてのはできそうだな。
2023/08/20(日) 22:56:04.52ID:pKCQsYPtM
>>498
盤面をスマホで読み取らせて、それを再生してると思わせといて、実はラベルを解析して事前に録音済みのデータを再生するという、イカサマサービスを思い付いたw
2023/08/20(日) 23:03:56.28ID:P3ytobrG0
こまわりくんはレコードの溝読めたな。
501デフォルトの名無しさん (ワッチョイ 93ad-hPrW)
垢版 |
2023/08/20(日) 23:13:57.98ID:pbHEs6OP0
>>499
OCRプログラムでラベルの写真のタイトル部分の文字列読ませれば可能だが、問題は、ラベルに似せたものの上に書いた文字でも同じように読んで成功してしまうことだ。つまりレコード不要。
2023/08/20(日) 23:16:52.12ID:GxzweHHZ0
そういえばオープンリールも速度とトラック数にこだわりがあったな
2023/08/20(日) 23:22:22.29ID:pKCQsYPtM
>>501
さすがにレコードか位は判別可能なんで、そういう誤魔化しは除外できるでしょ
つうか、インチキなんだからどうでもいいんだけどねw
2023/08/20(日) 23:46:32.25ID:WX+gcEAed
人間「このレコードかけて」
AIスピーカー「かしこまりました…あーあーはってしーないー」
人間「お前が歌うんかい!」
2023/08/21(月) 00:56:03.52ID:h/vumT/U0
>>499
ワロタ

…でも「顧客が本当に必要なもの」はそれかもしれない
2023/08/21(月) 00:58:44.27ID:EVtKvg8p0
曲を再生して、それをスマホに聴かせ、曲名やアルバム名を調べる

というのは割と使ってる
507デフォルトの名無しさん (ワッチョイ 7101-vfxM)
垢版 |
2023/08/23(水) 12:33:50.88ID:WRsTeN290
localtimeでtm型のポインタが返ってきますが
これはfreeのような後始末はしなくても良かったんでしたっけ?
以下のt1の後始末です

#include <time.h>
#include <stdio.h>
int main () {
time_t t0 = time (NULL);
struct tm *t1 = localtime (&t0);
return 0;
}
2023/08/23(水) 12:46:33.56ID:RWX4pd1L0
不要
静的な領域なんで
その代わりスレッドセーフじゃないし
次に呼び出したら値が変わっちゃうのでそのまま使うならコピー必須
2023/08/23(水) 13:08:22.64ID:d+s8esX90
時間系関数の一部では同じ型のポインタを返す他の関数が
内容を書き換えることもあるということにも気を付ける必要がある。

つまり localtime が返したポインタが指す先は
gmtime の呼び出しで内容が変わるかもしれないし変わらないかもしれない。
2023/08/23(水) 13:18:07.19ID:WRsTeN290
>>508,509
あざーす!
思い出しました! そうでした
2023/08/23(水) 13:23:04.60ID:Tm9lJ2oNd
Cの標準ライブラリはメモリ操作関係やsprintfみたいな書式出力系以外は古臭くてほぼ使い物にならないから
システムのAPIを直接呼んだ方がいいよ
ガハハ
2023/08/23(水) 13:57:11.07ID:dIB9DDlN0
>>511
えー、お名前教えて
あなたとあなたのコードが関係するプロジェクトは全部避けたいですw
2023/08/23(水) 13:59:16.75ID:WRsTeN290
>>511
以前に以下のように書いてるところを
using boost::posix_time;
using std;
cout << to_simple_string (second_clock::local_time ()) << '\n';
C++にchronoが入ったので標準ではどう書けば良いのか調べてまして
以下の例を見つけそこでstd::localtime使ってるので聞きました
https://cpprefjp.github.io/reference/chrono/time_point.html
std::system_clock::time_pointってstd::ostreamに直接出力できないんですかね?
すれ違いかもしれんですが
2023/08/23(水) 15:39:04.68ID:WRsTeN290
同じ出力になる以下を使用することにします
$ cat test.cpp
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <chrono>
#include <ctime>
#include <iomanip>
int main () {
std::cout << boost::posix_time::to_simple_string (boost::posix_time::second_clock::local_time ()) << '\n';

std::chrono::system_clock::time_point p {std::chrono::system_clock::now ()};
std::time_t t {std::chrono::system_clock::to_time_t (p)};
std::tm lt; localtime_r (&t, <);
std::cout << std::put_time (<, "%Y-%b-%d %H:%M:%S\n");
return 0;
}
$ g++ test.cpp
$ ./a.out
2023-Aug-23 15:35:01
2023-Aug-23 15:35:01
2023/08/23(水) 16:21:15.95ID:mK4fJzJ6M
>>512
Win32使ってCでコーディングするなら、Win32以外のAPIを呼び出す必要がないな
2023/08/23(水) 19:26:23.68ID:De6qHSvf0
標準入出力関数を Win32APIだけで実装しなおすのはなかなか
車輪の再発明くさい案件になるな
2023/08/23(水) 19:53:06.85ID:7GDemJR0M
残念ながらC標準ライブラリは古くて当たり前なんだ…
それを基準にして多くの人が回ってるから変えられないんだろう

でも人間の使える時間は限られてるので使えるものはうまく使ったほうがいい
メンテナンス性は知らないが
2023/08/23(水) 19:55:44.31ID:6N7MylZZd
新しく作り直したのに使い物にならないのがWIN32APIの凄いところなんだよなw
2023/08/23(水) 19:59:10.27ID:7GDemJR0M
win95ってほぼ30年前でしょ…
2023/08/23(水) 20:09:03.11ID:dIB9DDlN0
>>515
Win32?今の話の流れと全然関係ないです
私はLinux上で開発してるけど、それも関係ない

いいからお名前教えて
2023/08/23(水) 20:14:42.63ID:dIB9DDlN0
まあいいや。どうせ永遠に話通じないし、意味ないね、スレ汚しごめん> all

世界中のあらゆる人と意思疎通できる訳がない
2023/08/23(水) 20:17:30.73ID:dIB9DDlN0
>>515
あなたもごめんね、信念に従ってそのまま生きて下さい
2023/08/23(水) 20:26:41.70ID:magUjDjkM
何でWinで開発する人って標準ライブラリを毛嫌いしてるんですか?
2023/08/23(水) 20:37:13.42ID:gVkUNQKt0
システムコールとか呼んでなかったか?
たしか、目標をセンターに入れてスイッチ、だった
2023/08/23(水) 23:51:05.54ID:Ed2C94gyM
Win32とかゲーム開発する時は必須だろ
デバッグ中はprintf使ったりするけど、最終的にはバイナリに標準ライブラリのコードは含めない
2023/08/23(水) 23:56:23.25ID:6N7MylZZd
GNUみたいにそれなりの人たちがディスカッションして作ったものではなく
いかにもマイクロソフトのサラリーマンプログラマたちが適当に会議して作った仕様に見えるので信仰の対象にしてるのは気がしれんw
2023/08/24(木) 00:03:34.65ID:7wZt4qen0
>>523
Win16でmallocなんか使ってたらころされてしまいますよ
2023/08/24(木) 00:24:02.15ID:0ALYOmXL0
そこでfar pointerです
2023/08/24(木) 00:43:25.45ID:NfI5GYO1d
16ビットで十分なハンドル値をnearポインタにキャストするというのはいいアイデアだった
2023/08/24(木) 00:56:52.45ID:hEI/Eij50
あぁなるほど!
16bitの頃のMSの貧弱な開発環境で育ったせいで
標準Cに対しては屈折した気持ちのままなのねw
2023/08/24(木) 01:06:43.62ID:W+JHQ2GG0
標準ライブラリは古いつーか実環境を考慮してないだけでbit数はあまり関係ない…
理解してないのに無理に話に入ってこんでもいいぞ
2023/08/24(木) 01:26:43.52ID:WP7jiBq4M
>>526
いや、初期のマイクロソフト知らないのかよw
闘うプログラマーとか読んでみろ
めちゃくちゃおもろいよ
そんなことも知らないとか、モグリも大概にしろ
2023/08/24(木) 01:40:06.60ID:WP7jiBq4M
macOS(iOS)のアプリ作る時は、OPENSTEP由来のFoundationフレームワークを使うだろ
こうなるとprintfも使わずにNSLogばっかりだなw
534デフォルトの名無しさん (ワッチョイ 93ad-hPrW)
垢版 |
2023/08/24(木) 02:24:55.77ID:LAGetXxi0
そもそもC言語で新規開発すること自体がほとんどないので標準ライブラリ使うかどうかは今となってはどうでも良い。
2023/08/24(木) 07:36:25.07ID:6SD6OvDLd
macOS以前のmacのCはもっとひどかった黒歴史
2023/08/24(木) 12:16:23.79ID:50jyCEBUd
>>532
その手の本を本気にするなよ恥ずかしいw
小説だぞ
2023/08/24(木) 12:58:04.14ID:piehDxfAM
>>536
それで煽ってるつもりかよw
知らないなら黙ってろよ
2023/08/24(木) 13:05:10.53ID:piehDxfAM
闘うプログラマーをディスる奴が居るとはな
さすがモグリは違うw
2023/08/24(木) 16:07:54.33ID:s7pHw0+wd
お前の聖書を貶されて怒るのはわかるが
ただの宗教を他人におしつけるなw
2023/08/24(木) 17:35:21.45ID:575mCkoc0
「綺麗なのは使われてないものだけ」みたいな格言をどっかで見た。
2023/08/24(木) 22:11:17.69ID:ypVJRmCUM
闘うプログラマー懐かしいな
随分と前に上下巻の頃に読んだ

うろ覚えで申し訳ないがwinodwsのAPIセットを考えるのにカトラーと幹部がクルーザーを1~2週間借りて
湖でクルージングしながらゆっくり考えたってところが印象的

クリエイターって感じで良かった
2023/08/24(木) 22:22:10.52ID:ypVJRmCUM
残りの人生がどれだけあるか知らないけどそういう環境でそういう仕事してみたいなと思う
2023/08/24(木) 22:45:31.31ID:0ALYOmXL0
C言語の開発って、
ジャングルの中、誰からも支援を受けずに
自給自足で生き残って敵に勝つイメージがあるな
必要な道具は自分で作るみたいな
恵まれた環境で使うには難しい世の中になってきた
544デフォルトの名無しさん (ワッチョイ 9302-e/Qn)
垢版 |
2023/08/24(木) 23:08:24.66ID:egx7h1gE0
闘うプログラマー読んだことないモグリだけど
カトラーがDECから来る前からWindows APIはあったよね?
2023/08/24(木) 23:36:03.41ID:ypVJRmCUM
Windowsは1.0からあるからなあw

闘うプログラマーはNTの開発物語
カトラーが関与したのはWindowsNTのAPIセット
2023/08/24(木) 23:47:18.67ID:Nhyf7NRLM
カトラーが実装したのはカーネルレベルのAPIでしょ
Win32はその上にある
2023/08/25(金) 00:02:25.25ID:fBea/yqOM
win32はもともとWindows NTの機能だよ
それにカーネルだけ実装してWindows NTを発売したとは思えないけど

3.1とかはwin16
ついでNTでwin32
そのあと95が出てくる
2023/08/25(金) 00:08:33.68ID:NrcyVyXF0
フリーセルはWIn32sで動いていたんだよな
2023/08/25(金) 00:18:17.29ID:EDIsU9Tc0
あの頃はネット接続も一般的ではなかったから Win32s は雑誌の付録とかの形でよく入ってたのを覚えてる。
俺はテックウィンの付録CDから入れたわ。
2023/08/25(金) 07:12:39.12ID:Fur8du0o0
>>533
macOS(Mac OS X)になって、旧Mac OS由来のCarbon APIのサポートのため
Foundationの下にCoreFoundationというCの共通ライブラリが作られたよね
すなわちC言語が基礎と。おそらく今でも
Carbon亡き今、CoreFoundationを直接使う必要はほぼないけど

書式出力は文字列のクラス(NSString/CFString)に含まれるというべきかな
NSLogも書式出力を受け付けるが、元々ログ出力関数なので
551デフォルトの名無しさん (ワッチョイ 4d20-lN7b)
垢版 |
2023/08/31(木) 01:23:37.12ID:zNsdnZGD0
Cの規格書の 7.15.1.1 va̲arg には以下の記述があります。

次の実引数が実際にはない場合,又は型が実際の(既定の実引数拡張に従って拡張された)次の実引数の型と適合しない場合,次に掲げる二つの場合を除いて,その動作は,未定義とする。
− 一方の型が符号付き整数型であり,もう一方の型が対応する符号無し整数型であり,
そしてその値が,両方の型で表現可能な値である場合。
− 一方の型がvoid型へのポインタであり,もう一方の型が文字型へのポインタである場合。

これは例えば、可変長引数をとる関数にNULLポインタを渡し、呼び出された側で

 FILE *fp = va_arg(ap, FILE *);

として受け取ってはいけない、という事を指すのだと理解しています。
なぜこのような規定が設けられたのでしょう?
2023/08/31(木) 04:18:42.26ID:0tscOvRb0
>>551
実引数と適合しない型で取り出す場合の組み合わせは無数にあり、
多くは無意味でそのすべてについて結果を規定するのは大変だし必要無いので
最低限必要と思われる範囲で動作が規定されている、と考えれば自然。
553デフォルトの名無しさん (ワッチョイ 86cf-TDjq)
垢版 |
2023/08/31(木) 06:17:20.33ID:2za9g7aR0
>>551
そこで規格がしてるのは特定の事柄を想定した話じゃなくて、単に責任の所在について言及してるだけだよ
va_argで指定する型と実引数の型を合わせるのはユーザーの仕事だ、合わない場合は動作を未定義にするよってこと
C FAQ 11.34を参照のこと

また、2つの例外事項はその部分はコンパイラ側が推測して補正出来る事項なのでそこは許容するよってこと
2023/08/31(木) 08:59:50.92ID:lOSXeWouM
>>551
NULLポインターはFILE*と適合(compatible)してるから問題ない
そこに書いてあるのは適合しない場合の事
555551 (ワッチョイ 4d20-lN7b)
垢版 |
2023/08/31(木) 19:57:18.34ID:zNsdnZGD0
多数の回答ありがとうございます。
おおむね、先に挙げた例に対しては「問題ない。規格に適合している」とのご意見のようです。
しかし、先に挙げた問題を解決することを目的(の1つ)として、C23では新たに nullptr 定数が設けられる、とも聞いています。
実はそもそも「そんな問題などなかった」という事なのでしょうか?
2023/08/31(木) 21:01:54.47ID:xuZfOSNk0
「逆に」とか「実は」とか中二病は好きだよね
その規格書の文章が判りやすいとも思えないから好きに解釈していいよ
2023/08/31(木) 21:03:14.12ID:Ku+D9NQz0
クソどうでもいい。現実の問題を正しく定義しろカス
2023/08/31(木) 22:30:14.55ID:n7krQh8u0
>>554 >>555
私の解釈では規格に沿っているとは言えないと思う。

C では整数定数としての 0 は特別な地位にあって空ポインタの定数としても使えるので
#define NULL 0
といった定義でも言語仕様を満たすし実際にこういう定義になっていることも多いのだけれど
状況によっては単に整数と解釈されてしまうことが問題になる。

可変長引数で FILE* を期待しているところに空ポインタを渡すのは許されるが
NULL と書くと (それ単体では整数型なこともあるので) ポインタとは適合しないことがあり得る。
仕様に厳密に言えばその場合の実引数は (void*)0 とか (void*)NULL とか書かないといけない。

大抵の処理系では問題にならないように上手いこと調整されている。
#define NULL 0LL
みたいな感じで (その処理系における) ポインタと同じサイズの整数で定義しておけば一般的な ABI では大丈夫。
(だが言語仕様で保証しているわけではない。)

NULL は整数とポインタを兼ねる (ような定義でも許される) というのが
歴史的経緯によるあまりにもグダグダな場当たり的な規則なので常識的に考えてあかんやろという話。
2023/08/31(木) 22:30:45.52ID:zVsC0t7Ed
>>555
>として受け取ってはいけない、という事を指すのだと理解しています。

君のこの理解が間違っていた
それだけでしょ
2023/08/31(木) 22:49:56.13ID:0tscOvRb0
>>554,555
可変長引数として渡したオブジェクトポインタは実引数拡張により全部 void* になるから、
typedef void FILE; とでもなっていない限りは適合するとは言えないよ。
va_arg(ap, FILE *) として受け取ってはいけない(移植性を損ねる)ということで合ってる。

そもそも適合は型と型の関係だから「NULLポインターはFILE*と適合」はおかしい。
2023/08/31(木) 23:05:28.70ID:zNsdnZGD0
>>558
処理系によってはNULLが (void *)0 でなく、
0 と定義されているかもしれない(から駄目)という事ですね。
納得しました。ありがとうございました。
2023/08/31(木) 23:08:37.85ID:n7krQh8u0
>>560
よく確認してみたら確かにそうだわ……。
NULL が整数として解釈される可能性を考えるまでもなく
void* と FILE* は適合しないな。

ポインタが適合する条件としては同一の修飾がされていることに加えて
両者が適合する型のポインタでなければならないことになってる。
void と FILE は適合しないのだから void* と FILE* が適合することもない。
563551 (ワッチョイ 4d20-lN7b)
垢版 |
2023/08/31(木) 23:38:40.05ID:zNsdnZGD0
NULLについては納得しましたが、まだ疑問が残っています。
同じポインタ型であっても、保証されているのは、
「一方の型がvoid型へのポインタであり,もう一方の型が文字型へのポインタである場合」
だけとなっています。この制約の意図が不明です。

例えば、可変長引数をとる関数に (void *)NULL を渡し、呼び出された側で

 FILE *fp = va_arg(ap, FILE *);

として受け取るのも不適合に思えます。

この場合でも、(例えば)アライメントの問題があり、互換が保証できるのはvoid型へのポインタと文字型へのポインタだけ、といった事なのでしょうか?
2023/09/01(金) 00:09:17.26ID:EYRyaWRCM
>>560
適合しない場合ってのは、FILE*とint*とかを言うのだろう
void*とFILE*は適合しないのか?
それとNULLを0なんかに定義してたら、NULLはintとしか適合しなくなる
なのでNULLポインターは((void*)0)と想定している
2023/09/01(金) 00:20:09.48ID:gaibfzWk0
>>563
適合する型なら許されるということに「加えて」
void* と char* の組み合わせの場合でも許されるという
規定になってるのはわかってる?

>>564
ポインタの適合に関するルールは C99 なら 6.7.5.1 に規定があって
void* と FILE* は適合しない。

> それとNULLを0なんかに定義してたら、NULLはintとしか適合しなくなる
> なのでNULLポインターは((void*)0)と想定している

・ 値0をもつ整数定数式又はその定数式を型void *にキャストした式を,空ポインタ定数(null pointer constant) と呼ぶ。 (§6.3.2.3)
・ NULL は,処理系定義の空ポインタ定数に展開する。 (§7.17)

とあり、 NULL が整数的数式の 0 であることは許容される。
2023/09/01(金) 01:19:09.35ID:APE9whcz0
>>565
適合する型なら許される、という点は理解しています。
しかし「void* と FILE* は適合しない」のであれば、
>>563 の例も不適合ではないでしょうか?
また、不適合であっても void* と char* の組み合わせ
の場合なら許される理由は何でしょう?
2023/09/01(金) 01:43:08.25ID:gaibfzWk0
>>566
総合的に言って不適合という理解で正しいということになる。

void* と char* は適合の規則からすると適合ではないのだけれど、
その表現や境界調整は等しいことを保証する規則があるので
この場合に適合と同等の扱いをしても問題にならないから、
まあ出来るようにしておけば便利なこともあるんとちゃうんかなぁ。
2023/09/01(金) 02:40:24.68ID:EYRyaWRCM
>>565
ポインターに0の代入は問題ないけど、ここでの話は可変個引数に渡した時の事を言ってるので((void*)0)じゃないと不味いでしょ
2023/09/01(金) 02:50:24.64ID:EYRyaWRCM
>>565
6.7.5.1では、FILEとvoidが適合しないといけない旨の記述があるけど、voidというのは普通に比較して適合かどうか判定できる型なのか?
特別なルールが有って然るべきな気がするけどね
2023/09/01(金) 09:38:35.84ID:gaibfzWk0
>>568
不味いけど NULL が 0 のことはあるという話。
2023/09/01(金) 18:08:19.15ID:gaibfzWk0
何の話をしてたんだかよくわからんようになったので >>551 を読み返してたんだが
規定が設けられた理由が根本的な疑問ということでいいんかな。

当然だが引数を受け取る側の想定と異なるものを渡したら破綻する。
普通の関数ならコンパイル時に受け取る側と渡す側の型の間に不整合が合ったら
コンパイル時に検出できるし、条件に合えば暗黙の変換もするんだけど
可変長引数の場合は実行時にならないとわからないので
調整する必要なく渡せる条件を規定したらそうなったって感じだと思う。

整数は負数が絡まなければ同じ表現だし
void* と char* にも互換性があることも保証されているので
問題にならない。
2023/09/01(金) 19:53:17.39ID:El2JpNjt0
ポインタ苦いか塩つぱいか
そが上に熱き涙をしたたらせて
コードを書くはいづこの里のならひぞや

「まずい」や「拙い」でなく「不味い」と書かれると、つい...
573デフォルトの名無しさん (アウアウウー Sa11-sVGh)
垢版 |
2023/09/01(金) 20:42:45.29ID:5C0TsKNSa
メモリの先頭をいじっている時点で頭がおかしいが
574デフォルトの名無しさん (アウアウウー Sa11-sVGh)
垢版 |
2023/09/01(金) 21:08:05.68ID:5C0TsKNSa
ヌル文字の実体が数値のゼロということから思いついた理屈なのかな?

ポインタはアドレスで、そのアドレスに格納されている値のことではない。
2023/09/01(金) 21:13:54.66ID:APE9whcz0
>>571
色々ありがとうございました。

素朴に考えて、呼び元がポインタを渡し、
それを呼び先がポインタとして受け取れば
(それが何型へのポインタであろうとも)
普通に安全そうに見えるのに、何でこんなに厳しいのか?
そう決まった理由が知りたかった為の質問でした。

誰か、そこら辺の事情を知っている人はいないか? と。
576デフォルトの名無しさん (ワッチョイ d95f-sVGh)
垢版 |
2023/09/01(金) 21:37:10.15ID:qVeR1pY40
>>575
C言語のポインタは単にアドレス

ただし、構造体なら構造体、関数なら関数で、メモリ上に決まった配置をされるので、なんのポインタかわからないと、メモリのアドレスをずっと追いかけることになる。

コンピューターそのものにはデータ型というものは存在しない。
2023/09/01(金) 22:14:19.34ID:LLAg+6GRd
>>575
単純にアラインの問題じゃないの
char型なら1バイト単位だからどんなアドレスでもOKだが
それ以上のサイズの変数へのポインタは他のポインタへ変換できない可能性があるというのがたてまえで
2023/09/01(金) 23:22:02.51ID:gaibfzWk0
>>575
ポインタの表現は、それが指す先の型によって異なることも言語仕様としては許されるはず。
§6.2.5 でポインタの表現や境界調整要求が等しくあるべき条件が規定されていて
それ以外の条件では同じ表現または境界調整要求を持つ必要はないと書かれてる。

まあそんなアーキテクチャがどれくらい存在するのかは知らんけど
2023/09/02(土) 00:36:03.53ID:WsIZ4FVlM
いやいや、ポインター(アドレス)自体はアライメントされてない所に格納されてるかもしれんけど、中身のアドレス自体は問題ないアライメントになってることが保証されてるでしょ
オマエらは何を言ってるんだ?
580デフォルトの名無しさん (ワッチョイ ffad-5+Xn)
垢版 |
2023/09/02(土) 00:41:32.42ID:VX6uRHRw0
farポインタみたいにバイト数の違うポインタも混在していたら余計にややこしい問題に・・・
2023/09/02(土) 01:01:48.59ID:WsIZ4FVlM
例えばFILE*とshort*ならアドレスのアライメントが合わない場合があるだろうけど、これはそもそも型が適合しないわけでどうしようもない
でも、今考えたらvoid*はありとあらゆるアドレスを取る可能性が有るから、それに合うのはchar*しかないよ、ということを言いたかったのだろうなと気付いた
でも規格書を見ても、FILE*とvoid*が適合するかどうかはアンドキュメンテッドだなw
現実には((void*)0)とFILE*は完全に適合してるけどね
2023/09/02(土) 06:58:16.01ID:XjF1xIbI0
ここにこう書いてあるからには、何か(通常の関数呼び出しでは
問題にならないが)可変長引数特有の問題があり、
それを避けるためにこうしたのだろう、と思った訳です。
2023/09/02(土) 11:49:29.07ID:+azsBNOBd
>>579
そんな保証はまったくない
例えばmallocの場合戻り値は「あらゆる組み込み型に対応できるようにアラインメントされる」と特に注釈されている
逆に言えばvoid*はどんなポインタにキャストしても安全と思い込みがちだがそんなことはないということ

>>582
通常の呼び出しなら型チェックが働くが可変長呼び出しでは一切働かないという注意だろう
最近のprintfは型チェックされるようになってるけど
2023/09/02(土) 11:59:23.66ID:R1w1jy3B0
安全かどうかは、環境によるんじゃ
2023/09/02(土) 12:34:31.87ID:DeBIPPsBd
「環境による」のは安全ではないんだよ
ここで取り上げられてるのは大元の公式文書なのであらゆる環境について言えることが書いてある
2023/09/02(土) 12:59:05.22ID:R1w1jy3B0
マイナーなCPUのことなんか気にしたことがなかったな
2023/09/02(土) 13:12:11.45ID:Ng1Dtdjk0
>>584
現在の文脈では「言語仕様をそう決めた理由」が主題。

だからその前提として言語仕様が保証している範囲がどこまでかを
理解しておく必要があって、そこで見当違いの主張に反論がされている
という話の流れ。
2023/09/02(土) 14:05:43.49ID:DeBIPPsBd
>>586
「可搬性」という概念はCでは大事
マイナーなCPUのみならず将来的に登場する高性能だが制限が多いCPUでも手直しせずに動かせるということもあるかもしれない
2023/09/02(土) 14:41:25.26ID:Ng1Dtdjk0
必要なら環境依存なことをしやすいのも C の良いところだが
不必要な依存は避けるに越したことはないわな
590デフォルトの名無しさん (アウアウウー Sae7-fXI3)
垢版 |
2023/09/02(土) 14:45:40.34ID:mCX3wjBNa
FILE *fp = fopen(...);
void *hoge = (void *)fp;
FILE *fuga = (FILE *)hoge;
みたいなことは禁止されてる?
2023/09/02(土) 14:59:50.63ID:wu0IBgrgd
どうしても必要ならやるしかない
ただfopenの戻り値でFILE構造体の安全性が保証されてるのにわざわざvoid*に代入してからFILE*に戻すのは
正統な金なのに闇銀行に預けて再びマネーロンダリングするような変な手間だ
2023/09/02(土) 15:08:48.05ID:68c+QhTKM
void *型って参照する先の変数のサイズが不明なので右辺値になるのは不可能な気がするけどな
キャストは無理でしょ
2023/09/02(土) 15:12:41.39ID:Ng1Dtdjk0
>>590
オブジェクトを指す (つまり関数ポインタではない) ポインタを
void* に変換してから元の型に変換すると
元のオブジェクトと等しいことは保証されている。
594デフォルトの名無しさん (アウアウウー Sae7-fXI3)
垢版 |
2023/09/02(土) 15:26:23.14ID:mCX3wjBNa
>>592
void じゃなくてもいいや
FILE *fp = fopen(...);
char *hoge = (char *)fp;
FILE *fuga = (FILE *)hoge;
みたいなことは禁止されてる?
2023/09/02(土) 15:40:22.87ID:iw53wgLpd
>>592
なんで?
ポインタはメモリ上の一点を指すもので
インクリメントデクリメントが不可能なだけで
キャストは可能

>>594
いったい何が聞きたいんだ?
禁止はされてないよ
ただこれ見たプログラマは皆「バカだなあw」とは言うだろうw
2023/09/02(土) 15:52:38.82ID:f6/YEIJg0
言葉をちゃんと使うとプログラマ意思疎通がよくなるのでは。
「void * が右辺値になるのは無理」って何だよ。ではなく、正常動作はプログラマの責任になる、って言いたかったんじゃないの?


>>590 みたいなコードは、これだけなら疑問に思うだろうが、こういうコードが有効になる事はあるよ。その一例は

「ここで言うFILE* みたいなモノが複数種類あり」
送信側 - 中継機能 - 受信側
のプログラム構造で送受信のペアは複数あり、中継機能には 実際の中身が何なのかは意識させたくない。

----
ポインタの話から外れて恐縮だが、
例としてタグ・レングス・バリュー形式ってのがあって、「中継者は送受信データがTLV形式の連続であることだけは知っていて」「TとLのサイズは一定」「タグの種類が何種類あるかなんて知らなくていい」
----

これにさらにポインタを含むデータ構造を通信可能にするには?って話で、ポインタ型をバッファ内インデックス値に変換して、ポインタが指す中身も通信データに含める、とか、
サブ構造がポインタ持ってたら再帰的に処理する、とか話は続くが
それはいいとして

>>590 みたいなコードは、現実にはあるよ。という話
2023/09/02(土) 16:04:16.63ID:Ng1Dtdjk0
>>594
オブジェクトを指すポインタは char* (またはその他の文字型をさすポインタ) へ変換することは許されるし文字配列として読んでもよい。 (読んだ結果としてどういうレイアウトになってるかはわからんけど。)

そしてもとの型に型変換したら変換前と等しいことも保証される。
2023/09/02(土) 16:06:19.94ID:Yxb8XUhFd
たしかに言い方が悪かったので

>>592
ポインタは元々サイズは無いもので
対象オブジェクトの先頭アドレスの一点だけを指してるから
void*を含むどんなポインタもキャストすれば力づくで代入できる
ただvoid*にはサイズがないのでinc dec(加減演算)をしようとするとエラーになる

>>594
どんなキャストも禁止されてはいないが
プログラマの責任によって成される最後の手段だと思ったほうがいい
見つかりにくいバグの原因になるので
ソースにコメントで理由を明示しておいたほうがいい
2023/09/02(土) 16:12:48.48ID:f6/YEIJg0
うーん
まだまだ添削できる余地があるぞ…

ここはまあ無料掲示板だが、仕事では、自分には誤解をされやすい性質がある、と意識しなされ
2023/09/02(土) 16:50:14.84ID:JxIOKPq6d
アハハ
なんだこの人w
2023/09/02(土) 17:10:38.18ID:R1w1jy3B0
ここでお金稼ぎしている人いたっけなw
2023/09/02(土) 21:43:01.25ID:5XlbVKpsM
もりたぼ稼ごうとした人はいた
603デフォルトの名無しさん (ワッチョイ b35f-RK05)
垢版 |
2023/09/02(土) 22:10:43.72ID:9Zs5bzSj0
ポインタの宣言は、ポインタの型じゃなくて、ポインタが指しているアドレスの格納値をどう扱うつもりなのかを明示している。

void型のポインタは、ポインタだから、何型のポインタだから、64ビットだったり、32ビットだったりするものではない。
2023/09/03(日) 13:47:13.05ID:ApaaLf4l0
>>603
同じでなければならないという規定はない。
実際に異なる実装が存在するのかどうかは知らんけど。
605デフォルトの名無しさん (スププ Sd1f-ETx6)
垢版 |
2023/09/04(月) 07:48:03.87ID:63U36j7Od
>>594
void void * 登場前の C は
FILE *fp = fopen(...);
int *hoge = (int *)fp;
FILE *fuga = (FILE *)hoge;
だったんじゃないかな
2023/09/04(月) 07:53:14.39ID:YGQMN8Uj0
設計当時はアセンブラの代替言語。
2023/09/04(月) 09:48:09.59ID:R5PUsxPld
>>605

基本はcharだからchar *hoge = (char *)fp;じゃない
なんならint hoge = (int )fp;でもよかった
ほとんどの場合intとポインタのサイズが同じだった
608デフォルトの名無しさん (アウアウウー Sae7-fXI3)
垢版 |
2023/09/04(月) 10:04:32.23ID:/ASAZOX6a
>>607 みたいなのがいるから void が出来たんだよ
2023/09/04(月) 11:07:54.13ID:gab4BDOud
因果逆転だな
2023/09/04(月) 11:19:05.30ID:Ww8QJvvD0
>>607
ウソはだめだ。
俺が見逃しても、はちみつ先生に定規でケツはたかれるぞ
2023/09/04(月) 11:24:33.03ID:Ww8QJvvD0
そういえば、むかーしの情報処理試験には言語選択でマシン語ってのがあって、1メモリアドレス値が指すメモリは 8bit 幅ではなく、 16bit だったように記憶してる。
「特殊な環境を想定しやがって…」と思ったナカマいない?
2023/09/04(月) 11:27:19.73ID:YGQMN8Uj0
試験用アセンブラはCASLだったっけ?
仮想環境で実在しない環境用言語だって。
2023/09/04(月) 12:00:00.02ID:p8KSFCIf0
>>610
char* はどのポインタからも変換できるし
元の型に変換すれば元のポインタと等しいことは保証される。
好ましいとは言えないが変換自体は問題ない。
void* 登場前には (void* 的なことが必要なら) char* が使われていたのは本当だ。

ポインタから整数へも型変換できることは明記されてる。
その結果は処理系定義だが、出来る環境でやるのが悪いわけじゃない。

char* やら int やらで扱ってたら間違った取り扱いをしやすいので
可能なら避けたほうがよくは有るが、 >>607 が言及した範囲には
明瞭に間違いと言えるものは見つけられない。
2023/09/04(月) 12:00:22.47ID:5denWoTkM
メモリが8bitって何も出来ないぞw
2023/09/04(月) 12:05:38.98ID:QM+pFggQM
アドレス範囲ではなくてデータ長が16ビットだったと思う
2023/09/04(月) 12:09:35.09ID:p8KSFCIf0
>>611
C の仕様上の用語では「バイト」が 8bit とは限らない定義になっている。
C の仕様で想定する必要がある程度にはそういう環境もあったのだろうし、
主流ではないにしても特殊というほどの感じでもなかったんちゃうか?

まあ「昔」をいつ頃に想定するかにもよるだろうけど。
2023/09/04(月) 12:24:06.96ID:p8KSFCIf0
>>612
たぶんだけど >>611 が言うのは CASL の前身である CAP-X のことじゃないか?
16bit 単位でアドレスが振られる設計だったはず。
2023/09/04(月) 14:04:31.55ID:F3cE7vUV0
7bitでアルファベットは表せてたしねぇ
文字集合で完結させてた RFC822
2023/09/04(月) 20:56:26.82ID:MxCwE5tq0
実際に1バイトが8ビットじゃないマシンで仕事してた人いる?
経験談を聞いてみたい
つらそう
2023/09/04(月) 21:41:24.34ID:TqSqVDXY0
何がつらいの?
2023/09/04(月) 22:35:30.73ID:yuyUlcPSd
UNIXとか基本9ビットが見え隠れしてる気がする
ファイルのパーミッション---rwxrwxとか
C数値のデフォルトが8進数とか(9ビットなら8進数3ケタでまとまりがいい)
2023/09/04(月) 22:55:40.14ID:ljnGjc/80
あれは9ビットだったのか
2023/09/04(月) 23:38:31.34ID:5denWoTkM
1バイト9bitとか完全に都市伝説だろ…
1ワード(レジスタ)が36bitとかはLispマシーンで使われたりしてたけどね
2023/09/06(水) 06:22:01.74ID:r3vK0XzD0
char が16bitの環境なら使ったことがある
2023/09/06(水) 07:02:16.45ID:Mh27mgbM0
そういうのってどんなCPUなの?
626デフォルトの名無しさん (ワッチョイ cfcf-ATpV)
垢版 |
2023/09/06(水) 09:37:16.14ID:EGh1VJfR0
とりあえずDSPなんかはそうでしょ
ワードマシンって言っちゃっていいか知らんけど、演算の速度をあげるためにワード幅を一番使いそうなビット数にして全部ワード単位でアクセスする設計にしてる
マニュアルにアドレス、char幅、int幅全部同じ何々ビットです注意してねみたいなのがご丁寧に書いてあったりするよ
627デフォルトの名無しさん (スフッ Sd1f-ETx6)
垢版 |
2023/09/06(水) 11:10:12.82ID:QkmiSIQgd
>>622
12bit以上必要だったはず
2023/09/06(水) 11:35:53.69ID:HQrnJbDO0
>>626
勉強になります
DSP触った事ないや
2023/09/06(水) 12:07:23.88ID:TIQAYIu40
>>626
float 幅に全揃え
アドレッシングもその単位なのでどうしても細かい粒度で個別に演算処理したい時はビットシフト併用
とかあったなぁ
2023/09/06(水) 15:01:09.34ID:7li0jtwXM
よく分からんけどDSPの内部レジスタって直接浮動少数点数が扱えるのか
floatは符号1bit + 指数部8bit +仮数部23bitの32bit長だっけ?
ただ浮動少数点数でビットシフトって面倒くさそう
2023/09/06(水) 19:43:08.02ID:r3vK0XzD0
外部とやり取りが多少面倒
ファイルや通信関連

データ列をcharに8bitずつ入れるか
ケチって8bit x2 入れるか
なんかを考える必要がある
2023/09/06(水) 19:43:50.40ID:r3vK0XzD0
私が使ったのはDSPでした
2023/09/06(水) 19:45:03.72ID:r3vK0XzD0
昔の大型計算機でcharが64bitのがあったはず
2023/09/06(水) 20:55:53.98ID:6iN9QRCz0
最初のUNIX開発マシン、DECの PDP-7 は18ビットだった
2023/09/07(木) 00:34:19.14ID:n7kUX99P0
C の仕様では正数型の表現にパディングビットの存在を許しているんだけど値の表現に関わらない無意味なビット(特殊なフラグとかに使うのか?)が存在するアーキテクチャも、見たことはないけど C の仕様で想定している以上はたぶんあるんだろうな……
2023/09/07(木) 00:34:47.43ID:n7kUX99P0
誤植
正数→整数
2023/09/07(木) 08:06:18.17ID:YzioMxaL0
>>635
小数なら身近にあるね
2023/09/07(木) 12:49:26.03ID:6eZunc+30
隣で寝ている
639デフォルトの名無しさん (ワッチョイ 0f01-e7Rb)
垢版 |
2023/09/16(土) 10:51:51.48ID:S5cqLcA00
T,o,k(迷惑という方は←をあぼーんしてください。)

更に家族友人にも教えて加えて¥4000×人数をGETできます
https://i.imgur.com/dGH5X8i.jpg
640デフォルトの名無しさん (アウアウウー Sa53-HRje)
垢版 |
2023/09/16(土) 12:25:15.03ID:RATZO/gia
しね
2023/09/16(土) 12:35:05.81ID:n1ZKqkE80
>>639
PayPayに変換できるって知らなかった
2023/09/16(土) 12:38:47.03ID:NMUMDiAt0
あそこはEUから莫大な賠償金請求されたから、必死なんだろう
643デフォルトの名無しさん (ワッチョイ 3fad-xbk3)
垢版 |
2023/09/16(土) 12:48:52.21ID:8u+hT5wA0
>>639
グロ
644デフォルトの名無しさん (ワッチョイ 4fb0-gBtz)
垢版 |
2023/09/22(金) 10:15:48.77ID:wJrbx3oK0
なあ、いつから子関数内で宣言した自動変数を戻り値に使って親関数で参照してもアクセスエラーにならなくなったんだ?
特に構造体とか
2023/09/22(金) 10:51:22.61ID:tfij4Zir0
自動変数を参照渡ししてるのか?
2023/09/22(金) 11:07:25.29ID:8SLDLfd50
アクセスエラーってのが実行時の話なら動作環境教えてくれないとなんとも
2023/09/22(金) 11:08:43.04ID:X0VLPMl/0
すんません何を言ってるのか分からん
自動変数のアドレスを返す話?
OSとかコンパイラとか色々わからないと空虚な話になりそう、ってのと(特殊な環境なのでは)

エラーになって欲しいのにならなくて
同僚がアホで困ってて
強制的にエラーにしたいって話?
2023/09/22(金) 11:13:15.28ID:z1xJQo5k0
数年に1回ほぼVC++でほぼCのコード書いてコンパイルしてるけど、
なんか最新版入れる度にデフォのエラー基準厳しくなっていく・・・。

変数定義をgoto(エラー処理)ですっ飛ばからエラーって・・・昔のCみたいに関数先頭に記述を移動する羽目に・・・
警告でいいやん。
2023/09/22(金) 11:16:56.77ID:tfij4Zir0
構造体で返すにしても、呼出元って用意した変数なり構造体で受け取るんだろう
650デフォルトの名無しさん (ワッチョイ 3fad-d4nU)
垢版 |
2023/09/22(金) 11:27:24.08ID:ZXfr4S/70
>>644
構造体の変数を戻り値に使うことは結構最初の頃から出来たと思うが、昔のマイコンは遅かったのでなるべく使わないで呼ぶ側で変数作ってそのポインタ渡してそこに値入れてもらうみたいな事してたよ。

なんで遅いのかっていうと、参照などという高度なワザは使ってなくて他のintとかの変数と同様に構造体の内容をコピーしているだけだからだ。
2023/09/22(金) 11:28:55.72ID:tfij4Zir0
共用体で渡したときは、どのメンバー使ってコピーするの?
652デフォルトの名無しさん (アウアウウー Sa53-9C00)
垢版 |
2023/09/22(金) 12:01:20.53ID:dkRHHNCea
池沼か
653デフォルトの名無しさん (ワッチョイ 4fb0-gBtz)
垢版 |
2023/09/22(金) 12:15:37.49ID:wJrbx3oK0
>>650
処理系によってはポインター渡しになってたはず
自動変数はスタック上に領域確保するので
実体渡しじゃ無いとスタック壊れてるよね?
2023/09/22(金) 12:21:54.90ID:+zFc5v5MM
初期K&Rじゃ構造体returnはなくてポータブルC以降じゃね?
2023/09/22(金) 14:01:49.98ID:jd4xXbI20
構造体を返却値にするときは、
一般的なパソコンでの呼出し規約 (Windows や System V ABI) では
呼出し側で領域を用意してそのアドレスを暗黙の引数として渡す仕組みになってる。

用意された領域の上に最初から値を直接に構築できることもあるので
そういうときはコピーコストは発生しない。
単純な関数、かつモダンなコンパイラを使ってるときは余計な工夫をする必要はないよ。
656デフォルトの名無しさん (ワッチョイ 4fb0-gBtz)
垢版 |
2023/09/22(金) 14:35:59.04ID:wJrbx3oK0
戻り値に構造体を使いたいんですぅ
2023/09/22(金) 14:53:23.56ID:HzXlnxdE0
参照てか自動変数へのポインタを戻してたってこと?

struct foo * hoge()
{
  struct foo body;
  retrun &body;
}

これ未定義だからどうとでもなってしまうんじゃなかったかな…
コンパイラが気を利かしてエラーや警告にするのも
そのまま実行コードを生成して想定外の動きをするのも
658デフォルトの名無しさん (アウアウウー Sa53-9C00)
垢版 |
2023/09/22(金) 15:05:47.80ID:dkRHHNCea
>>656
これでいいだろ
struct Hoge *fuga(struct Hoge *param0, int param1, char *param2){
何かする
return param0;
}
659デフォルトの名無しさん (ワッチョイ 4fb0-gBtz)
垢版 |
2023/09/22(金) 15:07:59.94ID:wJrbx3oK0
受ける側が用意しなあかんかぁ
2023/09/22(金) 15:08:23.02ID:HzXlnxdE0
>>657 のは、OS側のメモリに対する不正アクセスに引っかかって
エラー発報になるのは少ないんじゃないかな?
(戻りの自動変数のポインタが不正アクセスになる可能性は低い)

構造体の中にさらにポインタをつかってて、ゴミなポインタ値で実体見に行ってやっと上記が発動する

struct foo {
 struct foo* next;
  int body;
};
こんなので ret->next->body; とやったら *ret の内容がゴミ = ret->next も不定な値
ret->next->body でメモリの不正アクセス
661デフォルトの名無しさん (ワッチョイ 4fb0-gBtz)
垢版 |
2023/09/22(金) 15:09:39.40ID:wJrbx3oK0
割り込み処理があると簡単に死ぬよ
2023/09/22(金) 15:10:08.95ID:HzXlnxdE0
ハイコストなのをわかってて実体をそのまま返すことはあった
複素数を取り扱う Complex 構造体で 式の形式にしたくて ね
2023/09/22(金) 15:11:28.51ID:HzXlnxdE0
>>661
割り込み想定するなら呼び出し元で器渡しとけって話にしかならんじゃろ
2023/09/22(金) 15:14:27.76ID:wMC0ce2ad
>>653
返値用にもスタックが用意されてる
特にサイズが自由に定義できる構造体では戻り値にレジスタは使えんだろう
2023/09/22(金) 15:27:37.08ID:HzXlnxdE0
ID:wJrbx3oK0 がどういう環境で愚痴ってるのかはわからんけど
「割り込みハンドラ内でいろいろやるのをCで記述してるんだけど…」とかだったら
極力スタックは少なくしたい って話に行き着くけども

それならなおさら器は呼び出し側で用意すべし になるよなぁ
最悪関数呼び出しのオーバーヘッドも嫌って きもいマクロ関数が並ぶことも
2023/09/22(金) 15:30:18.99ID:jd4xXbI20
似たような話題が出たことがあるような気がしたので思い返してみると C++ スレの話だったわ。
コピーの省略 (copy elision) が保証される場合がどう実装されているのかという話題で
オブジェクトを構築すべき場所を呼び出し側が暗黙に渡してるから
最初からそこに構築される (のでコピーする必要がない) というのが一般的な実装で、
たぶん C の構造体受け渡しで実績があったから C++ では言語仕様として取り込めたんだな。
667デフォルトの名無しさん (アウアウウー Sacf-PB4I)
垢版 |
2023/09/23(土) 10:05:20.89ID:i9fpyxKga
thisのことですか
2023/09/23(土) 10:39:49.55ID:ALqEUzvh0
>>667
返却値のこと。
コンストラクタの場合は結果的に this でもあるとは言えるけど
2023/09/23(土) 18:43:05.31ID:lGebHJu00
c言語にthisは無い
2023/09/23(土) 19:21:52.16ID:h4supWEzd
thisはポインタなので実体を返すとか言う話とは関係ない
2023/09/23(土) 21:37:44.48ID:wNThSPil0
x86-64のABIでは、16byte未満はレジスタで渡されて、それ以上はメモリコピーが発生する、それだけ
2023/09/24(日) 01:41:30.54ID:XDqOvN5B0
PODっていうんだっけ
構造体が値わたしになるやつ
これはC++だったかな?Cはよくわからん
673デフォルトの名無しさん (アウアウウー Sacf-PB4I)
垢版 |
2023/09/24(日) 09:28:36.38ID:2YTVyUlCa
レジスタが64bit=8bytes
レジスタが128bit=16bytes
たしかにレジスタで全部返せるな
2023/09/24(日) 09:55:18.81ID:D6DOZoEp0
そのうち無限長レジスタ出てくるだろ
2023/09/24(日) 11:19:45.97ID:Cw9+et/n0
映画化決定 鬼滅の刃 - 無限長レジスタ編
2023/09/24(日) 11:48:58.25ID:wtxuVbIF0
>>672
C++ 的にはクラスが一定の条件を満たすと C の構造体と互換性があるような性質を持つ。
それが POD。
C++ の POD のことも慣例で構造体と呼んでると思うので、
C の構造体 ≒ C++ の POD みたいな感じ。
POD は値渡しがどうこうとは無関係。
2023/09/24(日) 18:47:28.19ID:zJPvjQK3d
>>674
あえてマジレスすると
RISCはレジスタ減らす傾向があるのでそれはない
近年のCPUはキャッシュがバカでかいのでレジスタを大きくする必要はあんまりない
2023/09/24(日) 19:03:57.96ID:SWucSPIu0
Plain Old Data だね。
ちゃんとした英語だと、dの繰り返しを避けて Plain Ol' Data とするらしい

最新のC++はPODっていう呼び名を廃止したんじゃ無かった?
2023/09/24(日) 19:10:57.73ID:wtxuVbIF0
>>678
概念は廃止した (性質をスタンダードレイアウトとトリビアルに分割して説明している) けど std::is_pod がまだ有るので
「POD がなくなった」と言えるかどうかはちょっと微妙なところ。
2023/09/24(日) 19:39:45.99ID:iqjAJ+9f0
>>674
無限では無いけど VLIW って聞いた事無いのかw❤
2023/09/24(日) 19:54:27.01ID:9leOLZhk0
>>680
レジスタ長を関係あるか?
2023/09/24(日) 22:05:30.32ID:/fHwRuZw0
>>680
Very Long Instruction Word(超長い命令長)で、レジスタ関係無し
2023/09/24(日) 22:12:32.99ID:D6DOZoEp0
レジスターを実メモリーサイズに拡張し、実メモリーを廃止
プログラムはレジスターに直接ロード、
データは必要に応じたサイズを割り当てる
一種のチューリングマシン
2023/09/24(日) 22:31:37.22ID:fu7DWNWn0
昔、ルネサスH8だったと思うが、関数内で大きなconst配列を定義したところ、RAM不足のビルドエラーに。
constならROM領域に割り付けるんじゃないのと思いルネに聞いたところ「言語仕様上static変数はconstの有無によらずRAMに割り付けることになってる…」とかいう回答。

Cの規格では割付領域まで規定してるのですかね。


void func(void){
static const char LARGE_TABLE[1024]={...};
...
}
685デフォルトの名無しさん (ワッチョイ 07db-oBwi)
垢版 |
2023/09/25(月) 00:05:56.55ID:flE1dY0R0
Cコンパイラじゃ無くて、リンカに領域指定するんだけどなぁ
2023/09/25(月) 00:12:22.79ID:ubRrbZbh0
処理系定義も広義には言語仕様と言えなくもないんじゃね。
まあ普通は言わんが……
687デフォルトの名無しさん (ワッチョイ 07db-oBwi)
垢版 |
2023/09/25(月) 00:13:31.19ID:flE1dY0R0
section切ってアドレス指定だろ?
2023/09/25(月) 00:23:33.45ID:Sev0Fg0J0
>>684
K&Rは定数文字列書換出来るよ。
組込に向かないって言われた理由や
2023/09/25(月) 00:26:21.67ID:Sev0Fg0J0
>>681
メモリをレジスタとして扱う技術が無いなら、無関係だろうな。

マイコンだけがコンピューターのアーキテクチャじゃ無いからね
2023/09/25(月) 00:49:29.60ID:h8TBNStf0
H8のフラッシュは書き込み回数が少ないからじゃないかな
その代わり数MBのDRAMモジュール繋いで実行できたから当時のマイコンにしては組み込みlinuxが乗ったりして富豪プログラミングができた
2023/09/25(月) 07:20:40.16ID:4OYJzvHn0
>>684
そんな規定は無い。実装の都合としてもわざわざRAMに置いてうれしいこともなさそう。

「言語仕様上自動変数はconstの有無によらずRAMに割り付ける」ならありそうな話なので
あなたの記憶違いの可能性のほうが高そう。
2023/09/25(月) 08:15:02.48ID:bQMRfZQJM
組込みマイコンでconst変数をROMに割り当てるのはスタートアップルーチンの仕事
main関数呼び出し前に実行する処理なので一旦main関数を呼び出してしまった後はROM領域に変数を割り当てる手段はない
2023/09/25(月) 09:01:11.94ID:8uqw4GxL0
皆さんありがとう。

>>691
当たりでした。よく思い返したらそうでした。

void func(void){
const char LARGE_TABLE[1024]={...};
...
}

最初にこう書いたらRAM領域割付になり、結果staticをつけて対処した、のでありました。

で、>>692 のために自動変数はRAM割付なのですね。
694デフォルトの名無しさん (ワッチョイ 07db-oBwi)
垢版 |
2023/09/25(月) 09:20:03.53ID:flE1dY0R0
なんか、トンチンカンな話ばかりで笑えるなぁ
ROMに割り付けるはRAMに割り付けるかは
リンカーにどう指示するかによるだけだろ
起動後にROMからRAMにコピーするか
そのままROMに置いとくかはデータの属性によって
リンカーがグループ化してくれたものを
起動時にスタートアップルーチンが転送するだけ
695デフォルトの名無しさん (ワッチョイ 07db-oBwi)
垢版 |
2023/09/25(月) 09:24:07.97ID:flE1dY0R0
基本的に初期値を持つ変数は元の値はROMにあるから
幾らでも呼び出せるが、普通の手段では呼び出せないだけ
強制的にアドレス指定すれば幾らでも呼べる
2023/09/25(月) 09:25:15.48ID:oaSGqRXsM
メモリ空間の変数の割り当てはスタートアップルーチンのコーディングで指定する
当然C言語ではなくマイコンメーカー指定の独自言語
大体はただパラメータを設定していくだけだけど
697デフォルトの名無しさん (ワッチョイ 07db-oBwi)
垢版 |
2023/09/25(月) 09:41:12.99ID:flE1dY0R0
つか、ROM上に変数なんか置かないから、置くのは定数
698デフォルトの名無しさん (ワッチョイ 8e86-NsvJ)
垢版 |
2023/09/25(月) 09:58:06.95ID:jZAmQlvo0
>>674
まあ、プログラムの高速化的には2048bitSIMDか4096bitSIMDレジスタがあると高速化の観点ではかなり都合が良い。AVX2は256bitだから単純計算すると性能が8倍とか16倍とかになるからね。
産業用だとarmのCPUに2048bit長のsimdレジスタがあった気がする。
699デフォルトの名無しさん (ワッチョイ 0aa1-oBwi)
垢版 |
2023/09/25(月) 10:11:14.07ID:8PlaAgAt0
値を変更しない変数は〜
https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V4.01.00/CS+.chm/Compiler-CCRX.chm/Output/ccrxaac0104y.html
誰が嘘を書いたか
700デフォルトの名無しさん (ワッチョイ 0aa1-oBwi)
垢版 |
2023/09/25(月) 10:14:30.53ID:8PlaAgAt0
ああ、staticか…なら仕方ない
2023/09/25(月) 12:55:53.24ID:RmxLVxNPa
>>693 が描いたシステムは使いたくないな
2023/09/25(月) 18:22:37.93ID:4OYJzvHn0
>>693
自動変数がRAMに割り付けられるのは、再帰のたびに別アドレスとしなければならない規定があるから。
(逆に static なら同一アドレスとしなければならない。)

>692,696 (たぶん同一人物)は ROM/RAM 割り当てがスタートアップルーチンの仕事というが、
仮にそれが正しいとするとスタートアップルーチンはどこからロードするのかという、
おかしな話が出てくるので誤りと考えられる。
実際ルネサスツールでもリンカで指定するものとなっている。
https://www.renesas.com/jp/ja/document/mat/h8s-h8300-series-cc-compiler-package-ver700-users-manual
> 最適化リンケージエディタでは、入力オブジェクトプログラム内の同一セクションを結合し、
> start オプションによって指定されたアドレスに割り付けます。
2023/09/25(月) 19:02:56.98ID:ULcnNiWhM
スタートアップルーチンは内蔵フラッシュメモリ(かマスクROM)に記録されておりベクターテーブル(スタートアップの一部)にリセット割込みのエントリーアドレスを格納しておく
マイコンの電源ONでリセット割込みが発生するとスタートアップルーチン先頭からプログラムカウンタに沿って実行されメモリ変数やスタック領域、SFRの初期設定を行い最後にCのメイン関数が呼び出される
2023/09/25(月) 21:31:01.48ID:SHu1A0tUd
>>697
const って何の略でしょう
2023/09/25(月) 22:04:58.79ID:ubRrbZbh0
>>704
C の変数は const を付けても (C の用語で言うところの) 定数にはならない。
C++ では異なるし、言語仕様の定義でなく単に事前に与える値くらいのニュアンスで定数という用語を使っている解説とかもあって混乱しやすい用語ではある。
706デフォルトの名無しさん (ワッチョイ 8aad-/va4)
垢版 |
2023/09/26(火) 00:22:01.41ID:+uZUPLZA0
const の変数は値の変更が不可能なので、それを利用してコンパイラが最適化することも出来るというだけで、必ず最適化しなければならないとかROMに割り付けなければならないみたいな決まりはない筈。
707デフォルトの名無しさん (ワッチョイ 6b01-PB4I)
垢版 |
2023/09/26(火) 00:49:13.67ID:h6rxe/Hl0
RAM2KBの環境ではROMに割り付けてもらわないと非常に困る
2023/09/26(火) 01:39:36.71ID:kR568CEo0
>>707
ならそうしなさいよ、リンカスクリプトで
という話では?
2023/09/26(火) 06:43:01.34ID:9+lSh1ncM
組込みで定数を扱うならdefine定義でソースに埋め込むのが普通
constはregisterと同じ扱いなので>>706の言うとおり
710デフォルトの名無しさん (ワッチョイ 0703-oBwi)
垢版 |
2023/09/26(火) 09:03:17.82ID:HGB+okJ70
いまどきのROM化環境のC言語にゃsectionで領域グループを指定する命令は無いのけ?
2023/09/26(火) 10:31:51.31ID:HDnmN3YRM
>>699のマイコンの場合だと
スタートアップ
https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V4.01.00/CS+.chm/Compiler-CCRX.chm/Output/ccrx08c0000y.html

コーディング例
https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V4.01.00/CS+.chm/Compiler-CCRX.chm/Output/ccrx08c0400y.html#82903
2023/09/27(水) 00:11:11.81ID:mIITHIHe0
セクションの初期化を割り当てというから混乱するんだろう
割り当てはリンク時にもう全部終わってる
2023/09/27(水) 01:37:20.19ID:tguPsVh8M
静的な変数はリンク時はextern宣言で外部定義しておきスタートアップルーチンでセクション割当てすることでメモリ配置を確定させるのが一般的
リンクリストで自動変数以外のすべての使用変数を漏れなく割当てできているか確認する必要がある
714デフォルトの名無しさん (ワッチョイ 0a1f-oBwi)
垢版 |
2023/09/27(水) 09:48:51.32ID:I/ozjFX50
人間様はリンカーにセクション配置アドレスを教えるのが仕事だった時代もありました
2023/09/27(水) 10:10:54.01ID:lrg7uRD+0
ハードウェア上のメモリー配置を教えるのは、いまでも人間なんじゃないの?
716デフォルトの名無しさん (ワッチョイ 0a1f-oBwi)
垢版 |
2023/09/27(水) 10:12:59.72ID:I/ozjFX50
>>715
ワンチップマイコンなら型番から自動で割り当ててくれるよ
まあ、外付けメモリ分は手動だけどな
2023/09/27(水) 11:19:15.53ID:0hujVwVvM
静的変数と自動変数(スタック領域)の容量の割り当ての最終的な決定は人間の仕事
あまり変数に領域を取りすぎるとスタックの分が無くなる
2023/09/27(水) 11:22:42.10ID:rbbJx+dJ0
>>714
組み込みでそんな優雅なこと言ってたらバグも直せん
2023/09/27(水) 11:23:26.71ID:Rw0J2Yjq0
昔のトラブルの癖で1Mバイト以上の領域、配列が必要ならmallocで確保するようにしてる・・・。
2023/09/27(水) 11:53:58.81ID:8vHXVA1WM
mallocは64KBまでだろ……
721デフォルトの名無しさん (ワッチョイ 6a95-+EvS)
垢版 |
2023/09/27(水) 12:26:49.33ID:9Ywamwi50
・・・16bit?オフセットアドレス範囲?
722デフォルトの名無しさん (アウアウウー Sacf-PB4I)
垢版 |
2023/09/27(水) 13:10:05.87ID:OOPn+kCla
8086の時代だろ
EMSのページング
2023/09/27(水) 15:08:08.13ID:lrg7uRD+0
いやそれ以前のCPUの仕様
724デフォルトの名無しさん (アウアウウー Sacf-j351)
垢版 |
2023/09/27(水) 16:10:06.49ID:OOPn+kCla
それ以前だと本体メモリでも64kBフル積んでるの少なくないか
2023/09/27(水) 16:12:57.75ID:lrg7uRD+0
8086積んでた当時のPCは128程度は積んでたと思うが
64でフルになるのはZ80のような8ビットPCでの話
726デフォルトの名無しさん (アウアウウー Sacf-j351)
垢版 |
2023/09/27(水) 16:25:12.39ID:OOPn+kCla
それ以前のそれに8086を含んでるなら矛盾はしない
2023/09/27(水) 16:26:45.84ID:lrg7uRD+0
8086でフルに積むメモリの意味が分からん
2023/09/27(水) 16:44:44.21ID:Q9yfznPE0
この場合の「フル」はメモリ空間いっぱいのことなんじゃないの。
バンク切り換えまで含めたらいくらでも拡張の余地はあるけど
malloc でバンクを跨ぐわけにはいかんし。
2023/09/27(水) 17:00:48.31ID:lrg7uRD+0
8086のアドレスバスは20ビットだから、1MB実装できる
2023/09/27(水) 18:45:56.76ID:3YDDpoD+0
勉強になります
731デフォルトの名無しさん (ワッチョイ 1a94-oRtz)
垢版 |
2023/09/27(水) 19:57:19.01ID:3fbQ67ov0
勉強と言ってももう40年近く昔の知識だぞ
今どき役に立つことなんかあるか?
2023/09/27(水) 21:07:16.75ID:3YDDpoD+0
>>731
すいません、ないです。ただ知的好奇心が非常に満たされます。
2023/09/27(水) 22:18:54.45ID:Q9yfznPE0
レトロコンピュータの資料は探せばいくらでもあるが
面白いところだけ選んで読むというわけにはいかんからな。
読む前にどれが面白いのか判断できるわけもないし、
相互に関連があるので一部の資料だけ見ても意味がわからん。
話題に関連する形で昔の話が出てくるのは
それなりに興味深いということもあるんだろう。
2023/09/27(水) 23:14:28.73ID:zQBl5fyt0
ITの歴史を知ることは為になる
温故知新
735デフォルトの名無しさん (ワッチョイ 6a14-xAvD)
垢版 |
2023/09/28(木) 00:01:49.83ID:bZti02EO0
スレ違いだったら申し訳ない
c言語でコンパイルした実行ファイルってosのAPIを使用してなければ別々のosで動かせますか?
cpuアーキは同じ前提です。
736デフォルトの名無しさん (ワッチョイ 0716-oBwi)
垢版 |
2023/09/28(木) 00:29:26.06ID:gnUHVRPF0
>>735
そもそも実行環境自体がos依存だろ
2023/09/28(木) 00:42:44.54ID:wsjwbbNAa
CPU同じならセットアップの問題とIO関係のクリア出来てたらそこそこは動くんじゃないか
738デフォルトの名無しさん (アウアウウー Sacf-j351)
垢版 |
2023/09/28(木) 00:47:13.64ID:wsjwbbNAa
割とマジで試したいなら
Bochs とか QEMU とかで
OS 無しで動かしてみたら良い
2023/09/28(木) 00:55:43.32ID:9pgsrChg0
スタートアップ辺りにOS依存が有りそう
2023/09/28(木) 01:27:51.60ID:6irLEr1Q0
>>735
原則としては無理。
実行ファイルをメモリに展開して準備するローダがOSの一部だからOS の上で実行するならOSの機能は呼ばれることになる。
実行ファイルの形式が linuxとかだとelf が標準だけどwindowsではpeで、全く互換性はない。

ただ、複数のOSで動く実行ファイルを作るトリックは存在する。
https://justine.lol/cosmopolitan/index.html
2023/09/28(木) 06:25:35.94ID:wsjwbbNAa
>>735
大前提が違ってたな
コンパイルしただけでは実行ファイルは造られない
リンカとローダーを通して初めて実行可能なファイルになる
2023/09/28(木) 07:43:47.93ID:7Zdppbze0
>>735
質問者さんは下記の概要を知ると、参考になるかもです

「組み込み開発でベンダーロックを避けるためにマルチハードにしたい開発チームが、対象ハードごとのgccをビルドして用意する手順」

ややこしいし大変なので、ザッとで十分です

参考までに私が買った本(全部読んだとは言ってない)
「LINUX組み込みシステム」
クレイグ・ホーラボウ
ピアソンエデュケーション
2023/09/28(木) 08:41:31.76ID:VP1D2tYa0
PC-98用のDOSアプリをTOWNSやAT互換機のDOSで動かしてはいたなぁ。
BIOSコールや各ハード特有機能を使わないアプリに限定されるけど。
2023/09/28(木) 09:51:32.79ID:wMng62Lu0
>>743
OSが同じなら動くのが当然
MS-DOSがアレだから普通は動かないけどw
2023/09/28(木) 10:01:07.42ID:9pgsrChg0
MS-DOSのシステムコールって機種によらず共通でしょ
746デフォルトの名無しさん (ワッチョイ 0a1f-oBwi)
垢版 |
2023/09/28(木) 10:02:25.23ID:uRtj8fwF0
TOWNSはTownsOSだろ
747デフォルトの名無しさん (アウアウウー Sacf-j351)
垢版 |
2023/09/28(木) 10:04:03.81ID:7+/lnWbqa
NHKでタマにやってる「我が社の黒歴史」で
FM-TOWNSを取り上げて欲しいな
748デフォルトの名無しさん (ワッチョイ 0a1f-oBwi)
垢版 |
2023/09/28(木) 10:15:55.20ID:uRtj8fwF0
TownsOSはMacOSみたいなGUIを提供してたんだよな
今やWindows到来って時代にだ
2023/09/28(木) 10:16:51.88ID:9pgsrChg0
TownsOSはMS-DOSを拡張したものだし、
チャレンジ精神を評価する事はあっても
黒歴史とするのはあんまりだ
750デフォルトの名無しさん (ワッチョイ 0a1f-oBwi)
垢版 |
2023/09/28(木) 10:20:51.20ID:uRtj8fwF0
>>749
番組見たら考え方変わるよw
2023/09/28(木) 10:24:22.26ID:9pgsrChg0
「我が社の黒歴史」ってやるなら、
是非NHK自身をネタにしてください
ライブドア事件の時、
ニュースに飛びついたNHK社員が
一斉にインサイダー取引で株売買してました
家族にも教えてたそうです
弁護士による内部調査を実施しましたが
社員の多くが調査拒否してましたよ
どんだけ暇なんだろうって思いました
752デフォルトの名無しさん (ワッチョイ 5301-oBwi)
垢版 |
2023/09/28(木) 10:32:23.32ID:Ev8os2Ag0
あの番組は、黒歴史があるから今の発展がある
みたいなノリの番組だから、後がない企業は扱わないよw
2023/09/28(木) 10:41:58.54ID:XO3PoFmz0
TownsOSのこと言うならWin3.1も大して変わらないと思う
どちらもMS-DOSの上で動くGUIシェルの中のひとつ
2023/09/28(木) 10:42:15.16ID:9pgsrChg0
当時のTownsは386採用し、MS-DOSを拡張して32ビットアクセスを実装してました
DOSが64Kの壁を越えられない時代にギガ単位のメモリをリニアに使える環境を実現
これを使ったゲームが人気でしたね
今から見れば当たり前のことで、何それって時代になってしまいましたが
DOS上のゲームでもこの方式を独自に採用したのがありました
DESCENTが有名だったかな

https://ja.wikipedia.org/wiki/DOSエクステンダ
2023/09/28(木) 10:51:11.28ID:6irLEr1Q0
富士通の公式サイトに富士通の歴史の一部として Towns の記述はあるよ。
結果的に廃れたけど黒歴史ということはない。 当時はそれなりにユーザもいた。
756デフォルトの名無しさん (アウアウウー Sacf-j351)
垢版 |
2023/09/28(木) 10:56:41.79ID:7+/lnWbqa
>>751
NHKはまだ産まれ変わってないから「わが社の黒歴史」に出る資格が無い
757デフォルトの名無しさん (ワンミングク MMfa-/HEw)
垢版 |
2023/09/28(木) 10:59:08.38ID:A0Yya1hOM
スレチですね
758デフォルトの名無しさん (アウアウウー Sacf-j351)
垢版 |
2023/09/28(木) 11:02:35.02ID:7+/lnWbqa
>>755
この前はYAMAHAのFM音源が「わが社の黒歴史」に出てたよ
2023/09/28(木) 11:04:12.36ID:9pgsrChg0
16ビットの制約で64キロバイトメモリしか確保できない時代から
一気に4GBメモリがリニアにアクセスできるようになった時は感動しましたよ
64ビットでは、あんまり感動はなかったな、なんでだろう
2023/09/28(木) 12:06:18.28ID:6irLEr1Q0
勉強してなかったからテストの点数が心配だなー チラッ チラッ

みたいな番組なわけだな。
2023/09/28(木) 12:09:23.54ID:MA2VSxCx0
>>759
64KBを超える事より4GBを超えることの方が圧倒的に少ないからだな
2023/09/28(木) 12:44:49.42ID:wMng62Lu0
ちょっと本気でプログラム組みだせばコードサイズ64KBなんてすぐ超える
一方1MBなんて集団でごちゃごちゃやってないかぎり超えない
763デフォルトの名無しさん (ワッチョイ 0a1f-oBwi)
垢版 |
2023/09/28(木) 12:53:02.94ID:uRtj8fwF0
アセンブラで組めばそんな大量のデータサイズにならんよ
2023/09/28(木) 13:56:12.11ID:wMng62Lu0
データじゃなくてコードサイズの話なんだけど
ちょっと凝った仕様を入れようとすると64Kbくらいは簡単に超える
泣く泣く削るか無理して分割ロードにするか
8ビット時代はそんな感じだったな
2023/09/28(木) 14:22:46.10ID:+fR7sAVf0
コード領域の自己書き換えでやりくりやりくり
2023/09/28(木) 14:40:53.17ID:VP1D2tYa0
昔のPRGとかメニュー開くとCDアクセス始めるゲームとかあったなぁ。
メモリー足りず、フィールド、戦闘、メニュー毎にプログラム読み直してるのかと思った。
2023/09/28(木) 15:31:33.20ID:6irLEr1Q0
Turbo C++ の MS-DOS 版にダイナミックロードを補助するライブラリが付いてなかったっけ?
うろおぼえだけど。
768デフォルトの名無しさん (スフッ Sdaa-TrDt)
垢版 |
2023/09/28(木) 18:41:56.40ID:KRBURPw6d
あったよ
うろ覚えだけど
2023/09/28(木) 19:15:05.82ID:0dpaiugf0
>Turbo C++
TurboがC++だった頃なんてあったかな
2023/09/28(木) 19:19:34.33ID:9pgsrChg0
あった
>1990年5月、ボーランドは Turbo C から Turbo C++ へと移行し、アマチュア向け・ローエンド製品を
>Turbo C++、プロ向け・ハイエンド製品を Borland C++ として2系統に展開した。

https://ja.wikipedia.org/wiki/Turbo_C
2023/09/28(木) 20:46:13.07ID:O4GqiEoW0
DOSでも増設メモリに32bitレジスタでアクセス出来たのなら・・・
2023/09/28(木) 22:44:00.88ID:qNYo9AZZ0
それがDOSエクステンダだろ
GO32には世話になった
773デフォルトの名無しさん (ワッチョイ 23ad-2pcI)
垢版 |
2023/10/02(月) 02:12:15.10ID:hWT/DRlk0
X68000 もよろしく
774デフォルトの名無しさん (アウアウウー Sa89-5C2y)
垢版 |
2023/10/05(木) 17:17:30.86ID:WXXGTjkDa
黒歴史度はFM-TOWNSとX68000とどっちがどっち?
2023/10/05(木) 19:38:38.95ID:k4EJU+WL0
何が黒歴史だ
どっちも国産パソコンに革命起こしたんだよ
2023/10/05(木) 19:43:14.40ID:4Dr5MGJz0
TOWNSやX68000の話というのは、
PCやOSの話題にはなってもC言語の話題ではない
2023/10/06(金) 19:26:21.98ID:0FrwfOPH0
>>775
パソコンでありながらゲームしか宣伝してなくて当時発達著しかったゲーム機に負けただけで革命もクソもねえw
2023/10/06(金) 19:35:07.48ID:UFkJ0Gsc0
ゲーム機とPCで切磋琢磨してたんだろ
ゲーム機にだって栄枯盛衰はあぅたよ
そういえばプレステにLinux入れてアプリ作って動かしてた人いたなあ
プレステは高性能すぎて、特定国への輸出が規制を受けてた
2023/10/06(金) 19:43:43.15ID:UFkJ0Gsc0
PlayStation3に採用されたCPUはCell、ソニーとIBM、東芝の共同開発だった。
この辺もWikiを読むと面白い
780デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/07(土) 05:34:11.31ID:mvcCmF0H0
あー。沢山繋げてスパコンみたいな。知らんけど。
2023/10/07(土) 12:37:19.06ID:2aizzJpQ0
>>778
PCがグラフィックボードに力を入れだすのはウィンドウズ普及以降になる
ゲーム機にはニンテンドー64のRDRAMとかセガサターンのシンクロナスDRAMとかアーケードやシリコングラフィックCGマシンから取り入れられた新技術が投入されX68000やタウンズのかなう相手ではなかった
2023/10/07(土) 12:51:58.85ID:TufJ0SRx0
X68やTOWNSはMD/SFCとの争い・・・
・・・PS1 ジャンピングフラッシュの元になったゲームはX68で作られたんだっけ?あとワイヤーフレームのスターウォーズも。
2023/10/07(土) 13:51:13.10ID:c4CFtcBt0
(それって昔のPC板やレトロゲー板の範疇だからそろそろやめてくんないかなここはC言語スレ・・・)
2023/10/07(土) 14:41:36.91ID:/93XcW4W0
年寄りは人の話を聞かないからな
785デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/07(土) 15:09:15.52ID:mvcCmF0H0
68000は素晴らしい。8086のようなセグメントのあるCPUはクソだ。

と当時は思ったものです。
2023/10/07(土) 15:34:43.34ID:BCZCKqNS0
むしろ、そう言う話に持って行きたかった
787デフォルトの名無しさん (ワッチョイ 3ded-Jvcl)
垢版 |
2023/10/07(土) 15:55:47.74ID:9cx0ijSo0
X68000は素でgccが動いてうらやましかった。
一方86はgo32で無理矢理動かしてた。
Cに戻してみた。
2023/10/07(土) 15:58:51.83ID:BCZCKqNS0
レジスター数は羨ましかったな
あんだけあればレジスターだけでプログラム動かせそう、とか
789デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/07(土) 16:46:51.81ID:mvcCmF0H0
アセンブラやるとね、バイトの並びが上位桁が先に来るので人間に分かり易くて良い、みたいな話もあった。
68000 だけじゃなく 6809 とか 6800 とかの 8 bit CPU の頃からいわゆる68系はそうだったな。
Sun の Sparc もそうか。
2023/10/07(土) 16:55:51.01ID:tqmAUUbt0
なんでリトルエンディアンになるの?
791デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/07(土) 17:19:33.66ID:mvcCmF0H0
80系は昔からリトルエンディアンだったな。アドレスの小さい方が桁の小さい方にした方がコンピュータ的には自然だと考えたのかも知れない。
2023/10/07(土) 17:30:29.12ID:2aizzJpQ0
リトルエンディアンは同じアドレスから読み取ると
16ビットデータを8ビットレジスタで読んでもちゃんと下位8ビットが読める
ビッグエンディアンは上位8ビットが読み込まれてしまう
さらに68000は16ビット以上は奇数アドレスから読み込めないという制限があるのでハマることもある
2023/10/07(土) 17:36:03.54ID:qAlp08tM0
リトルエンディアンの場合は、図を描くときに右から左、下から上に番地が増えるようにすると合理的なのよね

ダニーコーエンの、エンディアンの語源になった文書にもそんな図があったと思う。アスキーアートだけど

https://ja.m.wikipedia.org/wiki/ダニー・コーエン_(計算機科学者)
2023/10/07(土) 17:36:48.91ID:OGJgvxVr0
8bitCPUの頃のCPUの加算器は16bit+16bitしかできなかった、32bitの加算は分割してやるしかない
加算を分割してやる時は下の桁からやる
上の桁からやると、下の桁で繰り上がりが発生したら上の桁に戻って繰り上がり処理することになるから
下の桁が前にあるのがリトルエンディアン、こっちの方が自然だと思う
ビッグエンディアンはデータを後ろから前にアクセスしていくことになる、それだけだって言えばそうだけど
2023/10/07(土) 17:43:26.56ID:pov02R//0
キャストしやすさもあるな。
メモリ上にある int 型のデータを char にキャストするみたいなとき
リトルエンディアンなら単にその場所から 1 バイトを読みだせばいいだけだが、
ビッグエンディアンだとアドレスをずらして読みだすか
読みだしてからマスクするかになる。

まあそのへんは効率的に処理できる命令があったりするんだろうけど
そんなこと最初から考えずに済むならそのほうがいい。
796デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/07(土) 18:12:07.87ID:mvcCmF0H0
まあでもネットワークバイトオーダーはビッグエンディアンになっちゃってるんだよね。
これはこれで理由があるのかも知れないが、とにかく80系CPUだとひっくり返さねばならなくなった。
結局C言語だとそういったCPUの違いを吸収するために htonl(), ntohl() のようなマクロまたは関数を使うことになると。
2023/10/07(土) 18:15:49.27ID:BCZCKqNS0
それは、そういう風に決めないと、処理出来ないからだろう
2023/10/07(土) 18:24:53.16ID:pov02R//0
通信系はなぁ……。 結局は通信相手と同じ規約を使うしか仕方がないから
個々のコンピュータ (アーキテクチャ) にとっては不自然になることもある。

モダンなプロトコルはリトルエンディアンを採用している事例もそれなりにあるよ。
2023/10/07(土) 18:45:29.52ID:2aizzJpQ0
そのエンディアン変換が68000は面倒で
例えばZ80なら16ビットを上位バイト下位バイトレジスタ間で3命令で交換できるのに
68000はメモリに16ビット書き込み、8ビットシフト、メモリから8ビット読み出しという手順をしなければならない(確か)
万能のCPUなんてないものだと思ったよ
2023/10/07(土) 19:39:28.37ID:TKUMh5Zod
「インディアン」は何かの差別用語に該当しないのな
戦争に負けるとはこういう事だぞお前ら
2023/10/07(土) 19:41:36.75ID:BCZCKqNS0
由来はガリバー旅行記
2023/10/07(土) 19:50:37.92ID:BCZCKqNS0
アメリカ発見したとき(これも本当はおかしいことなんですが)、
そこがインドだって思いこんた白人がつけた呼び方だから
本当は間違いなんですけどね
そのインディアンと、エンディアンは別の言葉です
2023/10/07(土) 21:15:26.02ID:dXS7C+xF0
算用数字もリトルエンディアンだとよかったなあ
2023/10/07(土) 21:15:43.32ID:dXS7C+xF0
算用数字もリトルエンディアンだとよかったなあ
2023/10/07(土) 22:44:07.58ID:S3fYgflU0
>>799
68000で16bitのd0.wの値をエンディアン変換
ror.w #8,d0

68000で32bitのd0.lの値をエンディアン変換
ror.w #8,d0
swap d0
ror.w #8,d0
806デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/08(日) 00:21:50.43ID:GlkvWXsG0
そういや Oh! X が復刊するんだってよ。(単発で1冊出すだけだとは思うが)。
https://kibidango.com/project/2285/action/17185?ui_source=action&ui_campaign=177822&ui_medium=email

X68000Z 用のソフトを付けるそうだが8800円と妙に高い。完全にマニア向け(というか信者向け)の本だな。
807デフォルトの名無しさん (アウアウウー Sa39-OOOs)
垢版 |
2023/10/08(日) 10:00:50.20ID:CrdCteTPa
SJISがBEじゃないのはなんでだろうね
MSはアホだったのか?
808デフォルトの名無しさん (アウアウウー Sa39-OOOs)
垢版 |
2023/10/08(日) 10:01:26.67ID:CrdCteTPa
間違えた
SJISがLEじゃないのはなんでだろうね
漏れがアホだった
2023/10/08(日) 10:27:48.16ID:yFmeE5YY0
質問の意味が分からなかったんだが
2バイト文字の上位、下位の順番のことかな?
2023/10/08(日) 10:44:57.38ID:Ss9cPRopM
もともと日本メーカー(多分NEC)が策定したような気がする
2023/10/08(日) 11:24:23.52ID:tCGlxsdd0
JIS コードでの概念としては第一バイトが区、第二バイトが点に対応するようには設計されてる。
2バイト整数の上位と下位ではなく「第1バイト(区)」「第2バイト(点)」の組なんだよ。

Shift_JIS はアスキーコードと共存できるように JIS の配置をずらした。 (だから Shift と名前がついてる。)
812デフォルトの名無しさん (ワンミングク MMea-nQTY)
垢版 |
2023/10/08(日) 12:24:35.99ID:hexAHbw2M
分かったから他のスレ行けよ
2023/10/08(日) 13:05:45.22ID:SlOLtELZ0
ここはCを知り尽くした老害の集いとみなせ
常に話題に新鮮さが求められる
流れを変えたくば新鮮なC言語の話を振ればよい
814デフォルトの名無しさん (アウアウウー Sa39-OOOs)
垢版 |
2023/10/08(日) 13:16:39.02ID:CrdCteTPa
wchar_t は何bit?
2023/10/08(日) 14:46:20.48ID:tCGlxsdd0
>>814
処理系定義。
816デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/08(日) 16:18:18.23ID:c7bH/Jal0
>>813
新鮮なCの話なんて、あるのか?w
2023/10/08(日) 16:26:29.67ID:tCGlxsdd0
C23 の話題なら……。
今回の変更は割とデカいし。
2023/10/08(日) 18:52:25.18ID:IT1htqzv0
C11も大して使われてる気がしないところでC23なぁ
2023/10/08(日) 19:56:42.76ID:hVEDEpG10
いつだったかコミケの第何回かの略称と紛らわしかった思い出
2023/10/08(日) 22:56:49.03ID:bFy9tmBW0
SJISにエンディアンの問題なんかねーしw
2023/10/09(月) 00:16:32.12ID:v5yIEMGi0
>>820
まあ強いて言うならSJISはビッグエンディアン固定だよね
2023/10/09(月) 00:31:56.49ID:J9meIr3U0
>>821
エンディアンというのは数値にしか成り立たない概念でしょ
UTF-16はエンディアンの区別があるけど、これは16bitの数値だからあって当然だけど、SJISは単なるバイトストリームでしょ
なのでエンディアンの区別は無いはずだけどね
SJISが16bitの数値として定義されてんなら、何かソースを教えてくれよ
823デフォルトの名無しさん (ワッチョイ 7a11-kEni)
垢版 |
2023/10/09(月) 01:36:54.19ID:Epzok5Ad0
C言語はOSの仕様とセットだから、どのOSのC言語か書かないと意味がない。
2023/10/09(月) 07:56:20.38ID:JBACiIYd0
SJISにしろJISにしろ98/88で使おう(テキストVRAM書き込みや漢字ROMからの読み出し)
とするときはなんかよくわからん変換やらされた思い出・・・。
2023/10/09(月) 18:41:50.35ID:iynFVAFm0
>>817
constexpr、nullptr、auto
C++で便利だったやつが追加されるんだ
2023/10/09(月) 18:42:02.61ID:iynFVAFm0
>>817
constexpr、nullptr、auto
C++で便利だったやつが追加されるんだ
2023/10/09(月) 19:19:32.46ID:v5yIEMGi0
>>822
文字コードは数値だと思ってたけど違うの?
ソースに似てるけどソートは出来るよ
2023/10/09(月) 19:24:49.57ID:v5yIEMGi0
アナル可変長形式は数値じゃあないのか
勉強になったわセンキュー>>882
2023/10/09(月) 19:30:25.37ID:Slr0Hoys0
コーヒーふきそうだった
責任取ってよね
2023/10/09(月) 19:34:22.38ID:Oqw93GGy0
アナル可変長形式ってどんな形式だべ?
太さによって広がりはするけど長さは……
2023/10/09(月) 19:58:17.35ID:U5VU0viZ0
SJISって1stバイトの最上位ビットが立ってるのをもって
後続バイトがペアになるわけだが
ここからエンディアンへの繋がりを見出だせない
2023/10/09(月) 20:01:41.10ID:Slr0Hoys0
>最上位ビットが立ってる

もうちょっと複雑だったと思う
UJISとは違う
2023/10/09(月) 23:50:22.00ID:G12VbuWM0
SJISはコード表見てて文字列を1バイトづつ見て行って
0x81~0x98、0xe0~0xeeが出てきたらSJIS文字だと判断するコード書いてた。
2023/10/09(月) 23:55:28.00ID:G12VbuWM0
あと文字列操作コード書きやすいように1文字2バイトに変換(?)するコードも書いてた。
2023/10/10(火) 00:04:28.27ID:vFMCesii0
>>827
> SJISが16bitの数値として定義されてんなら、
と書いてあるだろ
数値だと思ってたけどとか、読解力が無さすぎて泣けてくる…
JISコードは16bitの数値(2byteコード)としても定義されてるけど、SJISはそれを巧妙にエンコードしたものと言えるだろう
なのでやはりバイトストリームだな
2023/10/10(火) 00:41:46.82ID:WRpVvMtq0
テキストファイルの形式としてSJISはビッグエンディアンでなければならないって程度の認識。
2023/10/10(火) 00:44:51.87ID:WRpVvMtq0
SJISを文字と数値の相対表と見るか、
テキストのファイル形式を含めた規格とみるか。
838デフォルトの名無しさん (ワッチョイ 5a7f-FHep)
垢版 |
2023/10/10(火) 01:54:11.03ID:hSg/mMq/0
いまどきキャラクタセットの操作を自作してしまうのはヤバいプログラマ
2023/10/10(火) 09:46:25.05ID:jpaIozT30
昔書いたunicode対応のソースが最新コンパイラでエラー、ワーニングが山程出てきて心折れるんや・・・。
840デフォルトの名無しさん (ワッチョイ ae8f-HisN)
垢版 |
2023/10/10(火) 10:47:51.74ID:0SFeJAzN0
文字列としてリトルエンデアンだと可変長文字コードが面倒な事になるでしょうに
841デフォルトの名無しさん (アウアウウー Sa39-OOOs)
垢版 |
2023/10/10(火) 10:58:37.96ID:vCJOXgr3a
>>824
漢字ROMとVRAMはエンディアンというより(エンディアン)もあるが
ややこしかったのは右半分と左半分とかな
2023/10/10(火) 11:36:08.74ID:k8E2nUhl0
>>840
"Aア"は0x41 0x83 0x41だけどこれがもし0x41 0x41 0x83だったら、0x41 0x41まで読んだところでこれが"AA"なのかどうかを次のバイトまで読まないと確定出来なくなるわけだよね
2023/10/10(火) 14:45:56.30ID:lY2q8v9P0
>>835
どのあたりが巧妙なのか ついでに解説をお願い思案す
844デフォルトの名無しさん (アウアウウー Sa39-OOOs)
垢版 |
2023/10/10(火) 15:06:58.22ID:vCJOXgr3a
x 巧妙に
o 泥臭く

EUC-JPで良かったんだよ
2023/10/10(火) 17:44:06.68ID:JaQe+SGi0
EUC-JPにすると半角カナ文字が全滅するんだよな
2023/10/10(火) 20:02:21.46ID:SBkOlj5r0
半角カナは全滅してほしかったし
今すぐにも全滅してほしい
847デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/10(火) 22:25:54.11ID:8PzXep7k0
もう面倒だから Unicode を UTF-8 で使え。
2023/10/11(水) 00:45:18.47ID:m71rV3Zb0
euc-jpの半角カナは全滅じゃなくて、バイト数が多くなる、だったような。3バイトとか
2023/10/11(水) 01:29:28.77ID:cflt71CU0
>>843
JIS X 0208はいわゆる半角文字も2byteコードで定義されてるが、それと半角カナをエスケープシーケンス無しで混在させる方法を定義したんだよ!
ほぼWikipediaの受け売りだw
詳しいことはWikipediaを見ろよ
つうかそんなことも分からん若造が増えたんだな…
850デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/11(水) 03:32:09.53ID:RVlIgJ7N0
>>848
2バイト。 0x8e が最初にあって、その次にシフトJISの半角仮名と同じコードが来る。
2023/10/11(水) 09:52:13.46ID:LeQSJgup0
1バイトアルファベットも2バイト化して
852デフォルトの名無しさん (ワッチョイ 0a0d-HisN)
垢版 |
2023/10/11(水) 10:14:54.69ID:NQyPw3h00
文字コードも、32bitとか、64bitとか、メモリーアクセス単位に見合うサイズにしたらいいだけだよなぁ
可変長にする必要が全く無い
2023/10/11(水) 10:43:08.13ID:ZfRV8AUK0
80年代プログラマ「1バイト、1ビットでも無駄にするんじゃねぇよ!!」
2023/10/11(水) 11:58:33.24ID:cflt71CU0
1文字に見える絵文字もUTF-8で41byteになったりするんで、1文字64bitにしようが可変長になる
なのでUTF-8かUTF-16にしておくのが無難
UTF-16は主な漢字は2byteで済むんで、何気にバランスが良い文字コードだと思えるようになってきた
2023/10/11(水) 21:17:47.06ID:DBrOrPS60
>>824
表示コードだろ
SJISにしろJISにしろ表にすると空白部分がいっぱいあってROM容量がもったいない(当時は)から
2023/10/11(水) 21:21:23.81ID:DBrOrPS60
>>852
まあ数百文字しか文章を書かないプログラマーの発想だねえw
数万文字や数万ページの文書になると保存や検索にリソース食ってもったいない
857デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/11(水) 22:12:46.43ID:RVlIgJ7N0
>>853
2KBに無理矢理詰め込むみたいなことを昔やったことあるな。ROMの容量に合わせてビット単位で詰め込む。

そういえば Apple ][ のモニタプログラムが2KB丁度で6502のアセンブラのソース見て物凄い詰め込み具合に感動した。
1バイトも無駄がなく2KBピッタリだった。
2023/10/11(水) 23:09:10.07ID:Oo4KNMoV0
> 1バイトも無駄がなく2KBピッタリだった。

そんなことない。まだ詰めれるし空きもあった。
859デフォルトの名無しさん (ワッチョイ daad-iLfk)
垢版 |
2023/10/11(水) 23:34:38.65ID:RVlIgJ7N0
>>858
えー。なかったと思ったがなあ。それって Apple ][ plus とか、後に出た少し変えたやつでは?
2023/10/11(水) 23:40:13.44ID:m71rV3Zb0
>>850
おお、指摘サンキューです

アップル2とか
マニアック過ぎて付いて行け
2023/10/11(水) 23:42:44.40ID:UuDrjcXU0
アリスソフトのゲームはひらがながカタカナで入っててうふ~んだったな
862デフォルトの名無しさん (ワッチョイ 9120-5icV)
垢版 |
2023/10/12(木) 02:28:41.65ID:5xqSIwyk0
>>859
https://6502disassembly.com/a2-rom/OrigF8ROM.html
> feae: ea nop
> feaf: ea nop

↑空きの例
863デフォルトの名無しさん (ワッチョイ 7a26-vQFs)
垢版 |
2023/10/12(木) 06:14:09.61ID:YEvWoXVk0
linuxのファイルディスクリプタの操作に関する質問です。
別デバイスとのシリアル通信制御にselect関数を使用しています。
受信可能かタイムアウトかを判断しているんですが、別デバイスから電文が送られてからselect関数が受信可能を検知するまでに20msほどかかり、その後のreadしたサイズは32ビットほどです。
理想は5ms以内で受信可能を検知してほしいです。
ボーレートは80000bps(カスタム)
システムコールを使っている以上、デバイスドライバ。いじらないと難しいですかね?
2023/10/12(木) 07:17:12.28ID:oHsanHa80
むむむ
20msは遅いですね 特殊な環境?
865デフォルトの名無しさん (ワッチョイ 7a6e-vQFs)
垢版 |
2023/10/12(木) 08:00:06.42ID:YEvWoXVk0
>>864
ラズパイです
32ビットではなく32バイトです
送っている電文も32バイトです
866デフォルトの名無しさん (ワッチョイ 7a6e-vQFs)
垢版 |
2023/10/12(木) 08:06:20.25ID:YEvWoXVk0
ちなみにselect置かずに、ノンブロッキングでループでreadした場合も、少しずつreadできるわけではなく、20ms後に送った電文全てがreadで読み取れます
2023/10/12(木) 08:47:57.58ID:qyteNpVi0
rawモードにしてないとかじゃないの
2023/10/12(木) 09:10:29.66ID:qyteNpVi0
後は低遅延カーネルが使えるなら使うとか
869デフォルトの名無しさん (ワントンキン MMea-nQTY)
垢版 |
2023/10/12(木) 09:28:19.79ID:aDAtXVNfM
そもそもデータは実際どれくらいで到着してんのか確認はしたんだよな?
送信側が20ms毎にしか動いてないかとかその辺も
870デフォルトの名無しさん (アウアウウー Sa39-OOOs)
垢版 |
2023/10/12(木) 10:25:26.89ID:u59ybXeVa
16bit sensation 観てるけど
https://16bitsensation-al.com/
出て来るPC画面の編集中のアセンブラが
32bit用のコードじゃん
2023/10/12(木) 10:58:22.07ID:ULGeIkC90
どの画面かよく分からなかった
使ってるPCはどうやら9801VMみたいだ

https://twitter.com/16bit_anime/status/1708133347308818759/photo/1

5インチフロッピーなんて、なつかし
https://twitter.com/thejimwatkins
872デフォルトの名無しさん (ワッチョイ b6e6-vQFs)
垢版 |
2023/10/12(木) 11:22:56.30ID:m8bqtWD+0
>>869
それは確認してます。
873デフォルトの名無しさん (ワッチョイ b6e6-vQFs)
垢版 |
2023/10/12(木) 11:23:04.80ID:m8bqtWD+0
>>869
それは確認してます。
2023/10/12(木) 12:24:11.74ID:CHwK2zqJ0
>>870
アセンブラスレッドでやれ
875デフォルトの名無しさん (ワッチョイ b62e-vQFs)
垢版 |
2023/10/12(木) 17:39:39.42ID:m8bqtWD+0
>>865
200バイト送ってみましたが、検知の時間差はあまりありませんでしたが、read1回で200バイト全部取れました…
2023/10/12(木) 21:33:07.79ID:ZXm8+EHB0
ラズパイのスタックがバグってるだけだろ
他の環境でも試したのか?
877デフォルトの名無しさん (ワッチョイ 4677-HisN)
垢版 |
2023/10/13(金) 21:33:40.39ID:9i9XasLe0
パケットサイズ貯まるまで送信しないか
貯まらなくても時間で送信だったかなぁ
2023/10/13(金) 21:48:20.10ID:tPyDzWZ1M
>>877
その辺は設定で変えられるんだよ
rawモードにすれば両方無効になる
2023/10/13(金) 22:00:39.18ID:vGVgbb2n0
1人日5万円くれたら解決してあげるよ
2023/10/14(土) 01:22:13.59ID:tQyeYAE20
つ5万円
2023/10/14(土) 01:23:14.75ID:Z8feDlim0
プロになると、Linux は3回 shutdown しろと言う香具師がいるw

Windows に至っては、
shutdown はダメ、再起動しろってさw

どういうシステムやねんw
882デフォルトの名無しさん (ワッチョイ 13ad-Fhx2)
垢版 |
2023/10/14(土) 02:10:30.63ID:BgrcFKKf0
>>862
それ何かの都合でどうしても必要だから NOP にしてあるのでは? まあでも開いてると言えば開いてるな。
とすると2KB未満であの機能が詰め込まれていることになって、余計に凄い感じするわけだが。

まあでも逆アセンブルが出来るのにその文字がソースに入ってなくて、一体どうやっているのかと延々と
プログラムを読んで、確か2バイトに3文字詰め込んでて(f9c0, fa00 の辺り)、当時それを見つけて驚いたな。
初心者だったからね。
883デフォルトの名無しさん (ワッチョイ 7b27-S8Dy)
垢版 |
2023/10/14(土) 12:58:59.76ID:FvSW4+JI0
3回shutdownは初めて聞いた
3回syncのことかな?

1回目が依頼、2回目が実行、3回目は祈り・・・
884デフォルトの名無しさん (ワッチョイ 13ad-62ca)
垢版 |
2023/10/14(土) 23:20:34.47ID:BgrcFKKf0
2回以上連続syncはやったことないなあ
2023/10/15(日) 00:37:55.29ID:1GgH9uvV0
スマン。3回shutdown じゃないわ。
3回sync だった

Windows は高速スタートアップがあるから、
shutdownはメモリの内容をSSD に保持するから、復元されてしまうので、
再起動するのが正解らしい
2023/10/15(日) 06:23:13.62ID:RYkKDVjT0
説明がヘタで何言ってるのかわからんが
このスレッドのテーマと関係ないだろ他でやれ
2023/10/15(日) 21:52:14.34ID:nkdZTM470
一回目の sync に時間がかかるとその間にメモリの書き換えが起きてしまう可能性があるから、二度目の sync をする。ふつうはそこで満足する。どうしても心配ならもう一度 sync するわけだけど、そこまで心配なら別の方法を考えた方がいい。
2023/10/15(日) 21:54:23.57ID:WV6g/2dS0
888888888888888888888888888888888888888
888888う8888888888ん88888888888888888こ88
888888888888888888888888888888888888888
889デフォルトの名無しさん (アウアウウー Sadd-f0fU)
垢版 |
2023/10/16(月) 10:05:31.11ID:kgcCjrnKa
CでWindowsのデバドラ描くなら
shutdownが高速スタートアップかそうじゃないかは重要じゃないか
cmd 起動して shutdown -s -t 0 をよくやる
これだけじゃなくて hybernate をあらかじめ off にしておく必要もある
powercfg.exe /hibernate
890デフォルトの名無しさん (ワッチョイ 29b7-S8Dy)
垢版 |
2023/10/17(火) 10:35:23.04ID:QQA0GvA50
>>887
1回目のsyncはコマンド実行後にすぐ返るけど、
2回目のsyncは1回目が終わるまでブロックされるんよ
だから書き込み保証の代わりになってたってわけ
3回目は祈り・・・
2023/10/17(火) 10:47:53.72ID:+MFXb2Fe0
祈りは聞き届けられました!
2023/10/17(火) 12:31:38.91ID:y7v373yJ0
三菱UFJ銀行など10金融機関で約250万件の送金が滞った全国銀行データ通信システム(全銀システム)の障害は、各金融機関と同システムをつなぐ機器の容量(メモリー)不足が要因だったことがわかった。機器の更新で処理量が増え、想定の容量を超えてパンクした。事前のテストが不十分だった可能性もあり、検証が求められる。
2023/10/17(火) 12:35:48.82ID:y7v373yJ0
記事読んでると、素人が作ったのかと思うほど粗雑に感じるが、
単に記事を書いた記者が素人だからかもしれない。
894デフォルトの名無しさん (ワントンキン MM4b-ELGK)
垢版 |
2023/10/17(火) 13:14:23.15ID:XZGXsIC3M
またスレチかよわざとやってんのか?w
895デフォルトの名無しさん (アウアウウー Sadd-f0fU)
垢版 |
2023/10/17(火) 14:30:57.88ID:vCPpyEw2a
ルーターのNATテーブルが貧弱で
定期的に再起動しないといけないルーターがあったのを思い出した
896デフォルトの名無しさん (ワッチョイ 0bc2-T9H3)
垢版 |
2023/10/20(金) 15:45:46.46ID:Ipe4ElpV0
それなんてcorega?

ってフレーズも懐かしい・・・。
2023/10/20(金) 15:48:07.37ID:v1uIJG0f0
最近じゃ組み込み系もPythonになってるらしいな
898デフォルトの名無しさん (ワッチョイ 13ad-62ca)
垢版 |
2023/10/20(金) 18:19:30.36ID:Zfs7dH680
初耳だ
899デフォルトの名無しさん (ワッチョイ 13ad-62ca)
垢版 |
2023/10/20(金) 18:19:46.73ID:Zfs7dH680
初耳だ
2023/10/20(金) 19:00:07.60ID:OBgHVD6WM
ArduinoとかはまだC/C++が使われているけどRaspberryPiあたりではPythonが使われている
901デフォルトの名無しさん (ワッチョイ c134-eijK)
垢版 |
2023/10/20(金) 20:37:45.65ID:iiycX8pJ0
ラズパイが組み込みって言われてもなぁ
2023/10/20(金) 20:52:13.36ID:WNS0tsmN0
コンパクトなバイナリーが作れるんだろうか
それともライブラリーが別途必要?
903デフォルトの名無しさん (ワッチョイ 2bb6-AzOG)
垢版 |
2023/10/20(金) 22:48:36.74ID:gDJgEYng0
Cでつくったもので自慢のものある?
2023/10/21(土) 12:56:21.39ID:Auba50wB0
ラズパイの話するならPicoか否か書けよ
2023/10/21(土) 13:34:03.99ID:ifbOBJO10
ラズパイの話するな
2023/10/21(土) 13:40:58.48ID:m23W7dra0
>>903
通信プロクシとテストデータ作成ツール^^
しょうもない物しか作ってないわスマンな
2023/10/21(土) 21:29:19.14ID:t2gg/cweM
作ったものは数々あるが、
自慢できるものはない
908デフォルトの名無しさん (ワッチョイ 9946-5z4m)
垢版 |
2023/10/21(土) 22:19:05.57ID:9n8k9yEZ0
恥の多いプログラムを作って来ました。
909デフォルトの名無しさん (アウアウウー Sa09-6i8i)
垢版 |
2023/10/22(日) 11:30:49.85ID:GXjFDCr1a
そもそも業務で造ったものは守秘義務あるからな
2023/10/22(日) 12:04:50.59ID:7Lbl94Rb0
>>908
プログラマー失格やな!
2023/10/22(日) 12:08:40.64ID:+M4dXZ790
作っていて、恥ずかしさを感じないとすれば、それこそ失格だ
人は失敗の中から多くを学ぶ
2023/10/22(日) 12:41:16.58ID:WtUZjflvd
恥とかそんなのとは違う
ビジネスとはスピードと品質のトレードオフ
そのバランスを考えられないのがプロとして恥
2023/10/22(日) 12:41:36.43ID:DsuvifSY0
>>911
太宰治の人間失格とかけてんだろ
気付いてやれよ
914デフォルトの名無しさん (ワッチョイ 7aad-CfcT)
垢版 |
2023/10/22(日) 13:27:44.71ID:lT9uYjte0
>>900
それってLinuxではないOSで動く場合?
Linux入れちゃったらドライバとそれに対するライブラリだけの問題で言語は関係なくなるよね。
2023/10/22(日) 13:30:41.44ID:7Lbl94Rb0
自分で調べろよそれぐらい…お前もプログラマー失格やな!
2023/10/22(日) 19:09:03.13ID:1z8BeiKk0
生まれてすみません
2023/10/22(日) 19:19:12.31ID:+M4dXZ790
いいってことよ
918デフォルトの名無しさん (ワイーワ2 FF62-6i8i)
垢版 |
2023/10/24(火) 16:01:52.72ID:ju9L4gE1F
おかえり
919デフォルトの名無しさん (ワッチョイ ba7c-Habm)
垢版 |
2023/10/26(木) 00:49:54.03ID:89nTklyv0
C23でC11ぶりに更新ってC標準化委員会(?)だかはサボり過ぎじゃねーか。
C++なみとは言わんが5年ぐらいごとに見直せや。
nullptrとか入るの遅過ぎる。
deferも無いとかアホすぎる。
2023/10/26(木) 02:57:54.97ID:q3UKhsX80
いつまでも未完成のサグラダファミリアみたいなC++とは違ってCは生まれた時から完成してるから
後々機能追加したところでそいつの自己満でしかない
未完成のC++から逆輸入されて良かったことなんて行コメント程度しかない
921デフォルトの名無しさん (スフッ Sd9a-dytz)
垢版 |
2023/10/26(木) 08:37:00.27ID:FkoAeS+Vd
コンパイラがC11のgets_s()関数に対応してないんですが、どうすればいいですか?
922デフォルトの名無しさん (スフッ Sd9a-dytz)
垢版 |
2023/10/26(木) 08:37:12.14ID:FkoAeS+Vd
コンパイラがC11のgets_s()関数に対応してないんですが、どうすればいいですか?
2023/10/26(木) 09:02:33.67ID:nJ6kaeWr0
あきら🍈
924デフォルトの名無しさん (スフッ Sd9a-9f78)
垢版 |
2023/10/26(木) 09:08:02.65ID:FkoAeS+Vd
>>923 あきらめてvisual studioでgets_s()関数を使えていますが、vscodeの普段使っているコンパイラでは
使えません
925デフォルトの名無しさん (スフッ Sd9a-9f78)
垢版 |
2023/10/26(木) 09:08:14.78ID:FkoAeS+Vd
>>923 あきらめてvisual studioでgets_s()関数を使えていますが、vscodeの普段使っているコンパイラでは
使えません
2023/10/26(木) 09:11:27.20ID:oN20rU1J0
自分で書いたってそんなに時間はかからんだろう。
行がバッファより長いときや引数が条件を満たさないときに
制約ハンドラを呼ぶってだけだぞ。
927デフォルトの名無しさん (スフッ Sd9a-9f78)
垢版 |
2023/10/26(木) 09:13:48.45ID:FkoAeS+Vd
>>926 結局gets()関数の代用はfgets()しかないというこですね
2023/10/26(木) 09:38:07.39ID:G4ruVh0t0
自分で作れよ
Cってそういうもんだ
929デフォルトの名無しさん (スフッ Sd9a-9f78)
垢版 |
2023/10/26(木) 10:11:10.35ID:FkoAeS+Vd
>>928 自分で書きました 
930デフォルトの名無しさん (スッップ Sd9a-Habm)
垢版 |
2023/10/26(木) 11:50:48.14ID:ZES507rzd
>>920
そんなんだからリーナスだってぶち切れるんだぞ。
2023/10/26(木) 13:16:49.71ID:62xlwgird
winでguiアプリ作る時とかCランタイムなんて全く使わないでしよ
今更Cで作るかは置いといて
2023/10/26(木) 13:20:48.32ID:S8nCpIo20
(σ・∀・)σゲッツ!!
2023/10/26(木) 14:24:42.99ID:Qn92XRBA0
文字列周りのあれこれは Cランタイムのお世話も併用することが
934デフォルトの名無しさん (スフッ Sd9a-Cy5w)
垢版 |
2023/10/26(木) 15:12:00.43ID:ES29OdTad
TCHAR無視でASCIIzしか使わないならいけるかな
memcpyとかmallicとかも普通に使えるしな
TCHARのUNICODE版の文字列処理ってもうCランタイムと言うのは無理ありそう
末尾にに_s付いたのとか先頭にl付いたのとか
もう亜種増え過ぎで覚えられんくなった
あれはCランタイムじゃなくてwin32apiだわ
2023/10/26(木) 17:56:31.84ID:SEjxiCyL0
C言語でGC実装したライブラリあったよね
あれって今でも使われてんの?
2023/10/26(木) 18:27:34.63ID:oN20rU1J0
>>935
Boehm GC のこと?
2023/10/26(木) 21:04:51.64ID:SEjxiCyL0
>>936
そうそうそれそれ
思い出したけど w3m とかで使ってたよな
w3mが現役ってことはboehmgcも現役なんかね
2023/10/26(木) 23:37:41.65ID:S8nCpIo20
Boehm GC使ってるぞ
つうかUnityのランタイムはBoehm GCが使われてる
2023/10/26(木) 23:41:25.14ID:S8nCpIo20
Unity使ってるゲームはごまんとあるけど、敢えてGCを切ってるゲームも中には有るかも知れんが、ほとんどのゲームは裏でBoehm GCが動いている
要するに知らないだけで、Boehm GCはメチャクチャ使われてる
無知は罪だなw
2023/10/26(木) 23:50:27.25ID:S8nCpIo20
> ほとんどのゲーム
ほとんどのUnity使ったゲームでだな
それと最近UnityのBoehm GCにインクリメンタルGCが追加された
それまではStop The World(STW)のインパクトが凄くて、みんな最後にはなるべくGCが発生しないようにするチューニングが待っていたw
2023/10/27(金) 00:08:08.21ID:heVGcbpM0
Boehm GC はマシンスタックも走査するようなデザインだからアーキテクチャに依存する部分がいっぱいあるし、メンテナンスもし続けないとすぐ実情にあわなくなって破綻すると思う。
逆に言えば採用されてちゃんと動いているのはちゃんとメンテナンスされてるからだろう。
それなりに活発に利用も開発もされてると言えるんじゃないか。

プログラミング言語処理系のいくつかで採用事例を見たことはある。
2023/10/27(金) 00:26:28.28ID:u2CdPYGW0
今も活発に開発されてるよ
まぁリリースは半年とか年一ぐらいだけどね
2023/10/27(金) 11:18:26.71ID:dEbuX89/0
そうなのかUnityすげーな
そもそもUnityがC言語だったのも知らんかったわ
C言語でGUIなゲーム作れるならやってみるわ
ありがとう
2023/10/27(金) 11:33:41.42ID:9P66tx0i0
ゲームのMOD管理や改造ツール探してると結構間違ってソース配布ページへ飛ばされる。
ファイル拡張子が*.cなトコは無いにしても、*.cppなとこは多いね。
2023/10/27(金) 12:18:24.77ID:heVGcbpM0
>>943
dotNET が Unity の基礎にあるからユーザが使うレイヤでは C# が前提だよ。
ただ、それを実行するランタイムサポートの中には低レイヤ寄りの部分も当然あるし、
そこで Boehm GC が使われているって話。

C で書いたモジュールを呼び出すことは出来るんだけど…。
「C でゲームを作る」のがやりたいなら Unity は全然向いてない。
2023/10/27(金) 12:22:07.63ID:gE38RsN70
そもそもC言語でGUIゲーム作れるじゃんUnityじゃなくても
947デフォルトの名無しさん (ワッチョイ fade-UUkb)
垢版 |
2023/10/27(金) 13:36:32.37ID:DWeOppJn0
公開して
2023/10/27(金) 13:59:41.03ID:CZ4Htjtu0
後悔しました
2023/10/27(金) 15:35:27.52ID:sXR1+sXw0
航海します
950デフォルトの名無しさん (ワッチョイ c18f-BTDU)
垢版 |
2023/10/27(金) 21:03:53.47ID:nBxrDXuS0
Cでゲームかぁ
面倒くさそう
2023/10/27(金) 21:16:42.74ID:qIG6QpEs0
Cじゃなくてもめんどくさそうって言い出しそう
2023/10/27(金) 21:30:02.47ID:t+LCPq2M0
Windowsのクロンダイク作ろうぜ
あれならもともとCのはず
2023/10/27(金) 21:37:13.50ID:qIG6QpEs0
MS-DOSの頃はアマチュアの作ったゲームがたくさんあったな
ゲームメーカーの商品より優秀なのもあったし、
メーカーから訴えられた個人もいたな。
メーカー側が取り下げた様だが、
もしかしたら訴えた事実がなかったかも知れない
その後倒産したという噂を聞いた
Windowsになってからは、VBで作る人が多かった
2023/10/27(金) 21:44:44.21ID:heVGcbpM0
アマチュアが作っているゲーム作品の数で言えば今のほうがずっと多いと思うが。
2023/10/27(金) 22:25:12.50ID:qIG6QpEs0
そうなのか・・・
最近はゲームしてないので知らないんだw
2023/10/27(金) 22:28:08.93ID:M9GgCmOO0
今はvやutuberに媚びたゲーム作れば配信で遊んでくれるから一気にプレイヤー数も増えるよ
2023/10/28(土) 11:42:50.19ID:vcHM6tqr0
>>953
すっごい適当なことばっかり言うねw
2023/10/28(土) 12:43:38.00ID:p7wdBTPe0
>>957
Bio_100%とかタカリスなんて知らないせだいなんだろうな
2023/10/28(土) 13:20:46.38ID:CS7+IID10
ゲームエンジンもライブラリもろくになかった時代にC言語とアセンブラを駆使して
高レベルなゲームを作れるアマチュアプログラマがたくさんいた
(Unityで作るより高スキルが求められる)という話であって、
アマチュア/インディーズゲームのリリース数が論点というわけじゃないんじゃね?w
2023/10/28(土) 13:35:13.59ID:t5G+utQT0
1997年あたりにワイヤフレームだけどゴリゴリの3Dで8台で競艇するゲームは当時かなりオーパーツ感あった
波でグラグラゆれたり、あの当時でステージメイキングも確か出来たし、誰か知ってる人おらんじゃろうか
961デフォルトの名無しさん (ワッチョイ 5351-zW/F)
垢版 |
2023/10/28(土) 14:14:38.32ID:wcF/YB9E0
よそできけよ
962デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/29(日) 00:56:56.68ID:GrwAVmld0
C言語標準規格、せめて5年毎ぐらいに見直してくれればなぁ。
そしたらとっくにnullptrは入ってただそうし。もしかしたら deferや lambdaも入ってたかもしれん。
963デフォルトの名無しさん (ワッチョイ 5351-zW/F)
垢版 |
2023/10/29(日) 08:16:14.69ID:d4XtWcMl0
規格に対してまあそういう考えの人がいるのも分かるが、全体としては改定に対しての需要というか声は小さかったってことでしょ
2023/10/29(日) 08:37:00.25ID:x+5RB5aB0
どれも今更すぎていらんわ
そういうの絶対必要って奴はとっくにC言語ではない何かを使ってるでしょ
2023/10/29(日) 09:22:00.09ID:C0ma4yse0
>>962
C17 がわずかな保守で終わってることから察しなよ。
見直した結果として変更が要らんという判断をしたんだ。

C に defer を入れる意味はない。
提案として出ている以上は欲しいと思う人もいるんだろうけど。
あれは panic とかがあっても後始末するというところが価値なので
そういうのがない C で関数の終わりに後始末したけりゃ関数の終わりに書けばいい。
例外処理も含めて入れるってのだとなおさら無理だと思うし。
いまさらランタイムを分厚くする方向の機能を言語コアに入れるのは賛成を得られるはずがなさそう。

ラムダ式はまだ可能性がなくもなさそうに思うが……
C++ のラムダ式は暗黙のクラス定義の構文糖として定義することで詳細な規定を
大幅に別項目に丸投げ出来ている。
C で理屈をきちんと整理するのはちょっと難しくない?
キャプチャを全く諦めるならあり得そう。
2023/10/29(日) 09:22:16.65ID:+KTUg2vO0
継続メンテナンスが必要なのはだいたいC89の頃のプロダクトだったりするので
C言語自体の規格アップデートはさほど必要とされていないのね
2023/10/29(日) 10:51:27.53ID:C0ma4yse0
モダンな機能が必要なら C++ を使えばいいって言えてしまうってのもあるしな。
C23 は刷新が大きいけど、新しい機能を入れるというよりは
あまりにも駄目すぎるところを (C++ の後追いをする形で) 改良するって感じだし。
2023/10/29(日) 15:22:27.72ID:YxpLOPna0
C99 からの無名構造体は廃止してほしいねえ、あれでC++との互換が失われた。
構造体にコンストラクタを記述できるようにした方がマシだったと思う…
2023/10/29(日) 15:22:33.47ID:YxpLOPna0
C99 からの無名構造体は廃止してほしいねえ、あれでC++との互換が失われた。
構造体にコンストラクタを記述できるようにした方がマシだったと思う…
2023/10/29(日) 15:24:11.31ID:V/yNBYFm0
コンストラクタ用意したら、それはもはやCではない
2023/10/29(日) 16:10:21.42ID:C0ma4yse0
>>968
コンストラクタこそ要らないだろ。
関数として書けば済む話だから。

ああいうのは色んな機能と連携して便利になるので
個々に見てしまうとたいして便利ではない。
2023/10/29(日) 17:23:22.94ID:x+5RB5aB0
>>968
Cでtypedef+無名構造体/共用体のペアはstruct tag書式より使われてると思うが
これはstructをいちいち書かされるC固有の仕様の問題であって、C++では最初から型宣言自体のやり方が違う
つまりCの仕様をC++に合わせる意味は無く、C++との互換性はどうでもいい
2023/10/29(日) 22:25:46.25ID:ce2BuRgD0
>>965
例外の無いCでのdeferの意味は、単に後処理(デストラクタ)をコンストラクタ(Cではmallocや初期化関数)の直下に書けるという意味がある
関数の下に書けばいいといっても、gotoで飛ばしてんじゃ、プログラミング言語として欠陥が有ると思うよ
goto使うな→エラー処理で使えば綺麗に書けるよ!って、やっぱおかしいだろw
2023/10/29(日) 23:50:43.25ID:eMkvRHiW0
defer って分からんのですが、関数単位での atexit() みたいなもの?
2023/10/30(月) 00:11:39.03ID:2SouKz/I0
double* q = malloc(something);
defer { free(q); }
↑これ見れば一目瞭然だな
exitと関数やブロックを抜ける時に発動する
けど、Cは書かれた通りに動くという前提を少し逸脱してんだよね
それでも絶対便利ではある
難しい問題だな
2023/10/30(月) 00:12:01.02ID:hHEGE8Ol0
合ってるよね、うん

それ(他言語の defer 相当機能)って、問題解決にC言語を採用する環境では、OS上のプロセスの切り出し単位の設計、にマッピングすれば済む事ではないのかな?

建設的な議論の参考ネタとして:
perl言語が嫌われた理由の一つに「同じ事をいろんな書き方で書ける」言語設計ポリシーがあって、それは他人が書いたコードをメンテする立場だと「あらゆる書き方に精通してないとメンテできない」デメリットになり

pythonはそれを反面教師として「同じ事はだいたいみんな同じ書き方になるような言語設計を目指す」ポリシーにした、と認識してます
2023/10/30(月) 00:33:24.74ID:hHEGE8Ol0
ああ、ブロック単位なのね…

とすると、上手なC言語のプログラマー達が習慣的にやってきた方法は以下ですよね:

■実装すべき処理を関数にマッピングするとき(主処理、失敗時処理を)細かく分ける
■関数をイベントハンドラとして「登録する」流儀の ミドルレイヤを書いて、そのミドルシステム上で 実装対象の「意味のある処理単位」を書くよう、プロジェクト単位でコーディングルールを定め、守り&守らせ
■◯◯失敗時には△△を行う、を明確に設計し実装して、それが分かりやすい納入プログラムとする

で解決してきた、と思います。

つまり defer 機能がなくても同じ事をやる手法は既に確立している。
前のレスでの主張と合わせ、defer 機能を追加しないのが正解、と言いたいです
2023/10/30(月) 01:02:35.88ID:tKZ3J0Lw0
breakでいつでもブロックを離脱できればgotoより明確でスムーズでかっこよくdeferっぽいことできるよな
979デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/30(月) 01:09:19.67ID:SHIqNVOV0
かっこいいかなぁ、、、
2023/10/30(月) 01:25:52.81ID:hHEGE8Ol0
>>978

{int rc=0; do{ ★始め
処理
rc=1; break; ★失敗した
処理
break; ★成功した
} while(0); if(rc) { ★
異常時処理
}} ★終り


とかそういう話?

こういうのを #define で「エセ構文糖」みたいに定義する人もいますよね。(自分はあまり好きじゃない。格好悪いと思う)

C言語用の単体テストフレームワークで unity ってのがあります。unity ではテストコード内で 独自の try ~ catch 風文法を書けるのですが、それがまさに (setjmp longjmp も使って) #define でエセ構文糖風に実装してました。需要があれば再度調べてここで概要報告しますw
2023/10/30(月) 09:24:19.57ID:I7fISnX+0
>>975
Go の defer に倣うなら defer 文に書けるのは関数かメソッドの呼出し。
(式一般、文一般を書けるわけではない。)
呼出しは関数の末尾だが引数は書いてある場所で評価されるというルール。
C 風の文法で書くなら

double* q = malloc(something);
defer free(q);
q=NULL;
return;

というように書いても malloc した場所はちゃんと free されることになる。
このルールのおかげで前準備と後始末を近い場所に書けて「対応関係は」一目瞭然と言えるが、
そのために変則的な評価規則が入ってるわけ。
式単位での順序が入れ替わるってだけじゃなくて引数の評価と関数の呼び出しが
分離されるってだいぶん変な仕組みだよな。
982デフォルトの名無しさん (アウアウウー Sad5-g+2W)
垢版 |
2023/10/30(月) 10:15:21.12ID:xnp7PI6ya
>>973-974
Nim の defer 良いよね
983デフォルトの名無しさん (アウアウウー Sad5-g+2W)
垢版 |
2023/10/30(月) 10:15:44.95ID:xnp7PI6ya
>>973-974
Nim の defer 良いよね
2023/10/30(月) 10:17:23.47ID:hHEGE8Ol0
正常ルートは終わる時 q==NULL なのに、その前の
defer free(q) したときのqの値でfree() するんですね

うへぇ…
誤解釈してバグ出しそう

てかこれは、ひねり出された意地悪サンプルで…実際のプログラミングでdefer式が効果的となる使用例ではない、ですよね?
2023/10/30(月) 10:34:41.68ID:hHEGE8Ol0
この話で改めてあぶり出されるのは、
あるプログラミング言語を深く理解して「書ける」「読める」ようになることには「自分なりの 上手なエラー処理の書き方 を探して身に付ける」事が含まれる、って事ですよね。

それは人類の資産なんだけど、実際の存在場所は あまたのプログラマー達の脳内 であって、一朝一夕に書き換えられる物じゃない。
だから言語仕様を改定して新機能を足すのは、新言語を作る時よりは慎重になる必要がある、と解釈しました
986デフォルトの名無しさん (スプッッ Sd73-cQ99)
垢版 |
2023/10/30(月) 11:45:07.40ID:Ccd5zWuDd
nullptrはもっと早く入れるべきだった。
2023/10/30(月) 11:57:46.53ID:I7fISnX+0
>>984
Go でどうだか知らんけど C に defer を入れたとしたらというテーマでの話なら
malloc と free を対応づけるのは考えられる用途の筆頭でしょ。

逆にこういう変則的な評価規則を持ち込まないとしたら、
つまり defer 文に書いたものが単に return の直前に評価されるだけということにしたら
途中で書き換えられる可能性が出てきて
前準備と後始末が対応づいているかどうか一目瞭然とはいかなくなる。

どこかしらでなんか汚い感じにはなるよ。
そういう汚さを受け入れてもなお欲しいほどの利便性かというとやっぱり疑問は残る。
汚さを受け入れていいなら goto の汚さを受け入れるのとそんなに差があるとも思えないし。
2023/10/30(月) 12:40:32.59ID:2SouKz/I0
>>980
意地でもgoto使いたくない時にはそれでもいいけど、それの欠点は中にswitch文を書くと、breakで抜けれるのはswitch文からだけになる事だな
自分ではwhileを抜けた気になって実は抜けてないという、微妙なバグを生み出す可能性があるなw
2023/10/30(月) 16:19:29.96ID:hHEGE8Ol0
>>988
do {...} while(0)
なので、必ず1回実行し、2回目はないです
2023/10/30(月) 16:52:46.78ID:bW5EQkS/0
>>989
適当だけどこういうことでは?

{int rc=0; do{ ★始め
 処理1
 siwtch(x){
  case 0: rc=1; break; ★失敗した  ※siwtchから抜けるだけでwhileからは抜け出せていない
  case 1: break; ★成功だけど処理2は実行しない ※siwtchから抜けるだけでwhileからは抜け出せていない
  case 2: break; ★成功で処理2も行う
 }
 処理2
 break; ★成功した
 } while(0); if(rc) { ★
 異常時処理
}} ★終り
2023/10/30(月) 16:58:35.91ID:hHEGE8Ol0
>>990
おっしゃる事、分かります。具体的に書いてくれてありがとうm(_ _)m
2023/10/30(月) 17:01:08.71ID:hHEGE8Ol0
>>987
はい…
mallocとfreeを確保と解放の例とするのは異論ないです

deferより一つ上位の話は、エラー処理をバグなく、分かりやすく書こうというテーマだ、で合ってますよね。
その上で、deferがないとこんな面倒なのが、deferがあるとこんなに分かりやすい 例がよいのです

確保と解放の書き方検討で、私が検討するのは例えばこんな感じです:

■(1)ある意味のある処理単位が、リソースを 2個以上使う 場合を考えると、1個の場合より検討がよく進む。特に、
■■(1a)初期化が途中で失敗した場合、すでに確保が成功してしまった資源をどう解放するか
■■(1b)資源の変数は最初に、確保処理のエラー戻り値と同じ値で初期化をすると、スッキリする事が多い

■(2)正常ルートでの解放と、エラールートでの解放で、コードを共通とするか、別とするか。
■■(2a)確保、主、開放 の処理を、同じ「関数」で書くのと、別の「関数」に分けるのはどちらが良いか
■■(2b)「goto エラーラベル;」を好きか嫌いか

■(3)プログラマーによる解放処理の前の 「if(確保済みなら)」のガードが、必要なもの(fcloseなど)と、不要なもの(free)があるので、マニュアル確認は要る

もっと語りたいけど、レス分けます、というか時間を置きます。あまり一人が語りすぎると、嫌がる人もいますよね
2023/10/30(月) 17:09:39.89ID:hHEGE8Ol0
てかキータで書いて、皆さんの意見を聞いて修正していったり、してみようかな…
2023/10/30(月) 17:17:16.34ID:hHEGE8Ol0
とりあえず次スレ立てました。即死防止の保守書き込みは要らない、で良いのかな?

C言語なら俺に聞け 162
https://mevius.5ch.net/test/read.cgi/tech/1698653580/
995デフォルトの名無しさん (スプッッ Sd73-cQ99)
垢版 |
2023/10/30(月) 18:42:32.58ID:Ccd5zWuDd
>>994
乙。
あなたの男気に女気に惚れました。
2023/10/30(月) 22:27:42.13ID:I7fISnX+0
Golang の defer はあくまで関数の終わりまで遅延させる (ブロックの終わりではない) ので
呼び出される defer の個数が動的になりうるんだな。
https://go.dev/tour/flowcontrol/13
この挙動も C には馴染まなさそうだな。
2023/10/30(月) 22:37:34.66ID:n3VNJX5I0
俺は某画像ライブラリのリソーストラッカーみたいに開放が必要な物を全部紐付けて後で開放する仕掛けを使ってる
まあCには何にも縛られないのが良いんだし好きにしたらいいよ
2023/10/30(月) 23:34:44.67ID:2SouKz/I0
構文的にはC#っぽく
using (double* p = malloc(...); free(p)) {
p を使う
}
でも良いかも知れない
これだと1ループのforに似ててCに良く馴染むな
もちろんreturnとかexitで脱出してもfreeは呼ばれる
999デフォルトの名無しさん (ワントンキン MM53-wL8D)
垢版 |
2023/10/31(火) 10:19:02.32ID:i2gAy2CGM
そんなもんが規格に入るわけないんだから無駄話だろ
1000デフォルトの名無しさん (ワントンキン MM53-wL8D)
垢版 |
2023/10/31(火) 10:19:24.66ID:i2gAy2CGM
うめ
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 192日 20時間 14分 5秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。

▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/

▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login
レス数が1000を超えています。これ以上書き込みはできません。