[過去ログ] C言語なら俺に聞け 160 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
903: (ワッチョイ 02ad-Ay2p) 2023/04/12(水)02:52 ID:1sJZVfCp0(2/3) AAS
画像リンク[jpg]:www.shinjuku-i-land.jp
904: (ワッチョイ 02ad-Ay2p) 2023/04/12(水)02:53 ID:1sJZVfCp0(3/3) AAS
とても長くて太くて大きくて重そう
905: (ワッチョイ 2d63-r2C4) 2023/04/12(水)06:48 ID:NgkNjGWQ0(1/7) AAS
>>899
それってあなたの感想ですよね
906: (ワッチョイ bd02-oFYy) 2023/04/12(水)08:59 ID:HQz+hF5G0(1) AAS
もうそれ秋田
907
(3): (アウアウウー Sa05-9cWA) 2023/04/12(水)11:42 ID:+8HledSTa(1/2) AAS
0終端の良い所は可変長でどんなに長い文字列でもメモリが許す限り文字列を続けられる
もちろんデメリットは長さがすぐに判らない
逆に長さを持って struct {size_t len; char hoge[0]} Str; みたいな構成にするのもありだが
例えば Str *s = (Str *)malloc(len + sizeof(Str)); で確保して使う
後者のデメリットは size_t len の最大値までしか文字を格納出来ないこと
struct {short len; char hoge[0]} Str; みたいな実装もたまに観るからあなどれない
908
(1): (アウアウウー Sa05-9cWA) 2023/04/12(水)11:51 ID:+8HledSTa(2/2) AAS
>>838
C++だと
vector の size() が size_t を還して
for(int i = 0; i < v.size(); ++i)
って描くと警告出るので
for(int i = 0; i < (int)v.size(); ++i)
にするとさらに警告出て鬱陶しいから
for(size_t i = 0; i < v.size(); ++i)
にするアホな例はよく観るってどっかのサイトに描いてあった
909
(1): (テテンテンテン MM66-xOzU) 2023/04/12(水)12:32 ID:81IdaWl4M(1) AAS
C++ならイテレーター使えよ…
910: (ワッチョイ 495f-cPl8) 2023/04/12(水)12:42 ID:Q+QfGKpq0(1) AAS
vectorはランダムアクセスがウリだからイテレータ使わないこともよくあるね
911: (スプープ Sd82-VdbI) 2023/04/12(水)13:01 ID:N6w93SJGd(1) AAS
>>899
「文字列の終端までの長さ」ですが何か?
912: (ワッチョイ c5c9-hq/O) 2023/04/12(水)13:23 ID:3jp3M04i0(1) AAS
(文字列の)文字数
913: (ワッチョイ c69a-gTA8) 2023/04/12(水)13:42 ID:dS1BcMQZ0(1) AAS
>>909
コードによってはインデックスでアクセスしたいこともあるから...
914: (アウアウウー Sa05-Ay2p) 2023/04/12(水)13:57 ID:gJHWYvs7a(1/3) AAS
「アホな例」と書く意味が分からん
ちゃん型を使うべきだろ
915: (アウアウウー Sa05-Ay2p) 2023/04/12(水)13:57 ID:gJHWYvs7a(2/3) AAS
ちゃんと型を使うべきだろ
916: (アウアウウー Sa05-Ay2p) 2023/04/12(水)13:59 ID:gJHWYvs7a(3/3) AAS
そもそも「アホな例」じゃないとLP64でおかしなことになるよね
917
(2): (ワッチョイ 2d63-r2C4) 2023/04/12(水)14:05 ID:NgkNjGWQ0(2/7) AAS
struct X;
void func(struct X[]); //error

struct Y { int a; };
void func(struct Y[]); //ok

不完全型の場合、仮引数の[]はポインタにならない??
ちな、gccではエラー、clでは通る
918: (スップ Sd82-qF+M) 2023/04/12(水)14:17 ID:mayblUPzd(1) AAS
C++だと通ったね
gcc/clangのCだとX[]は許されないけどX*は許される

関数宣言より前にX型の定義がないとコンパイルが通らなかった
919
(1): (ワッチョイ 2d63-r2C4) 2023/04/12(水)14:55 ID:NgkNjGWQ0(3/7) AAS
どっちが正しいのかね
920: 2023/04/12(水)15:04 ID:219MxBT/0(1/2) AAS
>>907
馬鹿な私に少しだけアドバイスを

それってsize_tのビット幅 < システム(OS)のビット幅と言う条件下での話なんでしょうか?
size_tがシステム(OS)のビット幅と同じならメモリで管理できるものは必然的にsize_tでも表現できると思うのですが
メモリ上で管理できているゼロ終端文字列をsize_tで表現できない場合ってあるんですか?
まあ一部の組み込みとかならあるかも知れませんが……
けどそういう環境の場合strlenなどのsize_tで返す場合でも表現できなくなるわけで、結局size_tに依存することになってどっちでも同じじゃないかと思うんですがどうなんでしょうか?
921
(1): (ワッチョイ 6ecf-Rzwh) 2023/04/12(水)15:07 ID:gccG0Jwg0(1/2) AAS
>>919
規格は知らんけど配列とポインタは違うんだからエラーで弾くのは正論だと思うけどね
通す処理系はその後の整合性をユーザーが担保する前提の思想なんでしょ
922
(1): (ワッチョイ 2d63-r2C4) 2023/04/12(水)15:09 ID:NgkNjGWQ0(4/7) AAS
>>921
仮引数に限っては*と[]は同じはず
不完全型だけ例外というのは気持ち悪い
923: 2023/04/12(水)15:15 ID:219MxBT/0(2/2) AAS
>>908
もう一つ無知なる私にアドバイスをお願いします

size_t len までは文字を格納出来ると>>907から読み取りましたが
sizeof(size_t)==sizeof(int) の場合
vector v のサイズがINT_MAX以上だった場合、 i < (int)v.size() ではプログラマーが予期しない動作になりませんか?
924: (ワッチョイ 412d-dXWb) 2023/04/12(水)15:27 ID:7SV2gFKB0(1) AAS
size_t が符号なし整数型
int が符号付き整数型
925
(1): (ワッチョイ 6ecf-Rzwh) 2023/04/12(水)15:34 ID:gccG0Jwg0(2/2) AAS
>>922
はずだかなんだか知らねーけど、そんなことはどうでも良くてサイズの分からないオブジェクトの配列は作れんって言ってんだよ
操作上の違いはともかく配列として宣言したんなら関数内では配列として扱うってことを示唆してるわけだろ
仮にそのfuncだかって名前の関数の中にX[3]とかX+5って書かれたらどうやってアドレス出すんだってことよ
動作に違いがあるってことは規格がそれを許してる箇所なんだろうけど弾いてる処理系はそういう考えなんだろう
926: (ワッチョイ 2d63-r2C4) 2023/04/12(水)15:53 ID:NgkNjGWQ0(5/7) AAS
>>925
仮引数はその場に配列を作り出したりはしないという基本が合意できない以上
これ以上おまえさんと話すのは無駄だな
927: (ワッチョイ 2d63-r2C4) 2023/04/12(水)15:53 ID:NgkNjGWQ0(6/7) AAS
> 規格は知らんけど

この時点で気付くべきだった
928: (ワッチョイ a910-Ay2p) 2023/04/12(水)15:55 ID:1mphmeyq0(1) AAS
Cはアセンブラの代用言語。
929
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/aea) 2023/04/12(水)16:36 ID:bThMVtxz0(1) AAS
>>917
規格的には (関数定義の一部ではない) 宣言の段階なら不完全型であることを許しているように読める。
C99 だと 6.7.5.3 の第 12 段落に書かれている。

> If the function declarator is not part of a definition of that function,
> parameters may have incomplete type and may use the [*] notation in their sequences of
> declarator specifiers to specify variable length array types.

> 関数宣言子が関数定義の一部ではない場合,仮引数の型は不完全型でもよく,
> また宣言指定子列に [*] を使って可変長配列型を指定してもよい。

ちなみに GCC だと以下のようなものもエラーだが MSVC だと通る。

struct X;
省1
930: (ワッチョイ 2d63-r2C4) 2023/04/12(水)16:59 ID:NgkNjGWQ0(7/7) AAS
>>929
㌧X

安心した
931
(1): (ワッチョイ 495f-/aea) 2023/04/12(水)23:57 ID:ysjFLZAD0(1) AAS
>>917
Cではエラーになるのが規格準拠の動作。
ただし宣言の形式を変えるだけで通る理不尽な制約でありC++では許されるように改められている。
外部リンク:stackoverflow.com
932
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-/aea) 2023/04/13(木)00:37 ID:y5cvZaYN0(1) AAS
>>931
そこでも言及されてるけど
型調整 (配列がポインタに読み替えられる) が優先されるか配列宣言子としての解釈が優先されるかって曖昧じゃない?
読み替えより先に配列宣言子として解釈すべきと確信できるような記述ってある?
常識的には曖昧なら厳しい側の制約で解釈すべきだわなーとは思うけど陽には書かれてないように思う。
1-
あと 70 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.016s