C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
2021/12/25(土) 12:11:46.61ID:xxeaCAplM
!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

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言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/05/27(金) 17:20:28.72ID:HNJHF6TRd
それは構造体メンバーの中にその構造体自身へのポインタを含めさせるためのトリックじゃなかったかな
struct HOGE{
  色々なメンバー…
  struct HOGE *next;
};
とやろうとするとHOGEの定義はまだ終わってないのでundefinedエラーになる

typedef struct HOGE STRUCT_HOGE;
struct HOGE{
  色々なメンバー…
  STRUCT_HOGE *next;
};
これなら通るはず(?)
552デフォルトの名無しさん (ワッチョイ 9aad-SjAR)
垢版 |
2022/05/27(金) 17:23:59.27ID:Dxs4BKy40
え?それ大丈夫じゃなかったっけ?
2022/05/27(金) 17:32:35.88ID:Dxs4BKy40
struct でメンバの定義がない不完全型はポインタ変数のみ宣言出来るので再帰的なやつも大丈夫だ。
ポインタはサイズが分かるから。
ポインタでない普通の変数はサイズが分からないので作れない。
2022/05/27(金) 17:59:48.73ID:/qASUmj+0
>>550
その場合の typedef struct X X; の struct X は C99 の 6.7.2.3 にある
「不完全構造体型又は不完全共用体型を宣言し,その型のタグとして識別子を宣言する」
に該当する。
つまり struct X の宣言にもなっているという解釈で正しい。

あえて typedef を先に書く必然性はないんだが……
仕様にはこういう形でも書けるという例が載っているので考えなしに真似してるだけかもしれん。
555デフォルトの名無しさん (ワッチョイ daf1-XNUb)
垢版 |
2022/05/27(金) 18:06:40.28ID:01BAkppM0
>>554
詳しい説明ありがとうございました
確かによくよく考えると
typedef struct X { ... some fields ... } X;
と同じでしたね
こちらは違和感ないんですけど確かにこちらもいきなりtypedefのdeclspec内でstruct X { ... some fields ... }初めて使ってますね
2022/05/27(金) 20:53:33.56ID:v5HQQ34i0
struct Y;
struct X {
struct Y* next;
};

struct Y は struct X と同じでした
2022/05/27(金) 22:59:30.30ID:Uk6q3si00
エアプ使いばかり
558デフォルトの名無しさん (ワッチョイ 2b2c-2OYr)
垢版 |
2022/05/28(土) 11:23:05.30ID:81XaDMLN0
typedef struct X {
struct X *hage;
char a[0];
} X;
これはokだが

typedef struct X {
X *hage;
char a[0];
} X;
これはだめやろ
2022/05/28(土) 13:26:19.91ID:CfHVy9pGa
よくてもよさそうだけどなあ
2022/05/28(土) 15:18:56.42ID:IqCM7SI40
C++ ではアリだが、それはそれとして配列の大きさは 0 は駄目だよ。
2022/05/28(土) 18:03:45.61ID:2wkU6YYXa
配列要素0個はgccの拡張やね、標準規格に取り込んで欲しいわ
2022/05/28(土) 18:11:56.00ID:I3uIL+k90
いっそのこと要素数指定無しの配列も認めて欲しい
2022/05/28(土) 18:22:29.20ID:GsM4WAAy0
>>562
それはポインタと何が違うのん?
もしかして自動reallocとか?
2022/05/28(土) 18:26:01.93ID:HcUv+NxjH
>>560-561
C99 ではすでに取り入れられた可変長構造体ですが、C++ ではまだなんですかね?
http://www.kouno.jp/home/c_faq/c2.html#6
565デフォルトの名無しさん (ワッチョイ d901-2OYr)
垢版 |
2022/05/28(土) 18:53:41.27ID:6Sv+ENTH0
NFTゲームでのユーザー活動が20倍増加 DappRadarレポート

分散型アプリデータ企業DappRadarは20日、Blockchain Game Alliance(BGA)と共同で、
ブロックチェーンゲームについてのレポートを発表。2022年第1四半期(1−3月期)は、
前年同期と比べて、ユーザーの活動が2,000%増加したという。その他、様々な角度
からデータを報告した。
ブロックチェーン/NFTゲームへの第1四半期の投資総額は、約3,200億円(25億ドル)に
到達した。レポートは、もしこのペースが維持されれば、2022年全体の投資額は約1.3兆
円(100億ドル)に達する可能性もあると予測している。なお、2021年の年間投資総額は
約5,100億円(40億ドル)であった。
レポートによると、22年1Qの全ブロックチェーンアクティビティのうち、分散型ゲームアプリ
ケーションによるものが半分以上(52%)を占めていたという。ゲームをプレイすることで
お金を稼ぐことが出来る「Play-to-Earn(P2E)」のゲームもこれを牽引している。
2022/05/28(土) 19:27:23.65ID:72vE6z5l0
>>564
VLAはC++ではいらない子
2022/05/28(土) 20:00:35.42ID:VWmT0B4pa
>>564
だからそこで[1]を指定しないとならないのがダメダメって話
namestr[100]を確保するコード書いてみ
568デフォルトの名無しさん (ワッチョイ 13f1-VznW)
垢版 |
2022/05/28(土) 20:00:39.40ID:TcgqTRp90
>>565
NFTはゲームに絡んでいる部分だけは面白そう
2022/05/28(土) 20:13:20.50ID:q7Q7UvgS0
struct Header {
int total_size;
char naemestr[1];
};

本質的には int total_size + naemestr可変としたいが
sizeof(struct Header) は char naemestr[1]; を含むのでキモいことになる
2022/05/28(土) 20:21:20.88ID:IqCM7SI40
>>567 >>569
二個以上のメンバからなる構造体である場合に最後の要素は不完全型であることが許される。
つまり char a[]; と書く分には OK だし、 sizoef で構造体の大きさを調べたときにはこのメンバを抜いた大きさが返ってくる。

だけど、規格を総合的に解釈すると (動的に) 割り当てる大きさが 0 であってはならないと思う。

>>564
C11 以降だと VLA はオプショナルだぞ。
2022/05/28(土) 20:46:38.14ID:HcUv+NxjH
>>566
VLA は可変長配列の話、>>564 は可変長構造体の話、全然違うし可変長構造体は C99 で是認されましたよ
ちょっと遅れているんじゃないですか?
2022/05/28(土) 20:47:26.50ID:HcUv+NxjH
>>567
[1]だろうと[0] だろうとどうでもよくて、問題は可変長構造体がC++では認められているか否かの話なのでは?
2022/05/28(土) 20:48:11.40ID:HcUv+NxjH
>>570
>>571
2022/05/28(土) 21:12:45.84ID:CfHVy9pGa
動的に変わらんのに可変長っていうの違和感あるわ
2022/05/28(土) 21:12:59.17ID:q7Q7UvgS0
>>570
最後の要素が 不完全型な some-type [ ] に限り sizeof は そのメンバを含まない大きさを返すけど
some-type [1] の場合にはそのメンバを含んじゃう

https://ideone.com/7GmZkR
2022/05/28(土) 21:34:55.35ID:IqCM7SI40
>>575
「よりよい方法があるのであえて 1 を書く必要はないじゃろ」というのが主旨。
2022/05/28(土) 22:06:06.45ID:q7Q7UvgS0
了解
2022/05/28(土) 22:46:10.65ID:Fu9mRLk6H
>>574
確かに、静的可変長とかいい言葉はありませんかね
でも存在自体は昔から知られていましたよ http://www.kouno.jp/home/c_faq/c2.html#6
2022/05/29(日) 00:52:18.99ID:TsbfhcxCd
まあキモいけどサイズが実際より大きすぎるぶんには問題は起きない
2022/05/29(日) 01:10:06.53ID:9R680m3FH
>>579
キモい?アセンブラでは普通にやりますよ‥‥
2022/05/29(日) 01:18:23.26ID:J7SFw8MM0
そうだね、アセンブラを使えば良い
2022/05/29(日) 02:00:28.40ID:MBI5r2Hn0
最後が可変の構造体はchar naemestr[1]; なんて定義せずに
#definne Header_getNaemestr(p) (char *)((struct Header*)(p) + 1)
みたいに書く方法もあるよ
2022/05/29(日) 05:45:19.04ID:7E0AvYTo0
>>571
配列と構造体を間違えたのは悪かったが
なんで遅れてるって話になるんだ?
2022/05/29(日) 08:46:06.37ID:+aZOCBrD0
C++ の提案としては出てる。
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1039r0.html
今のところ C++ に取り入れられる見込みはない模様。

C で実績があるわけだし、変な矛盾はないと思うんだが
仕様として整合性をとるのは別の大変さがあるんかね?
2022/05/29(日) 12:15:20.33ID:IcJAaUL30
ビットマップのカラーテーブル部
データフォーマットの中間部分に鎮座してる可変
2022/05/29(日) 12:46:49.46ID:vh7xwuy0a
データ部の位置が変なリンクリスト嫌いだわ
2022/05/29(日) 12:59:38.36ID:J7SFw8MM0
XEvent にはとてもお世話になりました
今は使う機会が無くなりましたが
2022/05/29(日) 13:00:08.05ID:lS+LcIfWM
リンクリストでlist_head使ってないってこと?
2022/05/29(日) 13:33:49.79ID:9R680m3FH
>>583
遅れてるからですよ、C89 から話題になっていたことを理解していないからそんな間違いをするのです‥‥
2022/05/31(火) 11:53:16.64ID:B+MkXCVE0
>>589
C89から話題って何のことだ?
理解してるかどうかどうやって確認したんだ?

ああ、しどろもどろってやつかw
2022/06/01(水) 11:41:44.19ID:+HI81M8pd
>>546
そういえば愛用のtccはストリームからも読み込めるけど
まあ全部内部バッファに溜めればワンパスに見えるし、結局のところはわからんぬ
すくなくとも論理的に2パスする必要のある言語仕様的は思い浮かばない
2022/06/01(水) 16:22:13.14ID:UJNXiTT3d
プリプロセッサで一度マクロ展開してからコンパイラに渡してるから2パスと言えなくもない
2022/06/01(水) 21:59:27.44ID:8/80xBhO0
>>592
プリプロはパスに勘定しません
pascal こそ最高の正義、でも pascal 以降、おしなべてすべての言語は堕落してしまいましたね‥‥
2022/06/01(水) 23:11:11.40ID:vvQTEkHX0
pascalってキラーアプリとかあったっけ
2022/06/01(水) 23:13:36.43ID:f45OwcOU0
Janeなんたらは有名かもだが、他は知らない
2022/06/02(木) 05:56:20.78ID:mFaN5Fu80
Cはpascalへのアンチテーゼでもある
2022/06/02(木) 06:19:33.58ID:My4Fa6/ja
>>594
TeX
2022/06/02(木) 18:56:01.53ID:5oSm2G9pd
>>593
アセンブラ以外のすべての言語は退廃と怠惰の産物と心得よ
2022/06/02(木) 19:27:29.17ID:M0/peWx+0
怠惰は美徳なり
2022/06/02(木) 20:43:06.06ID:9S2EfN690
プログラマー三大美徳
怠惰、短気、傲慢
2022/06/03(金) 06:04:19.89ID:2JsQlaOH0
傲慢か
既存のコード無視して上書き的なメンテするやつか?
2022/06/03(金) 06:39:00.03ID:2JsQlaOH0
>>598
コーディングシート使って機械語を直打ちしてた俺に言わせると
アセンブラも贅沢品だぞ
2022/06/03(金) 07:54:41.09ID:nRSHAlo70
DOS時代にコプロセッサとか言うのあったけど、実際に使われてたの?
解説書を見ること無くWin時代に入っちゃって。
2022/06/03(金) 08:05:52.15ID:4GI8EAsla
FPUはあるとないで全然違ったよ
2022/06/03(金) 08:08:00.81ID:AsLopwGrM
今でもARMのFPUとかいろいろ使われてるよ
2022/06/03(金) 09:38:08.46ID:ysQR9TY90
>>592
Tiny C Compiler はプリプロセスも含めてワンパスで処理するよ。
処理が各段階に分離されてないのでコンパイラのソースコードが読みづらいらしい。
2022/06/03(金) 10:19:43.88ID:ysQR9TY90
GPU もある種のコプロセッサと言えなくもない。 そういう分類の仕方はあまりしないが……。
2022/06/03(金) 13:47:50.04ID:jxOrvhuY0
当時、コプロセッサを「子プロセッサ」だと思ってたのを思い出す。
2022/06/03(金) 19:52:40.79ID:tmTTQ0Rod
>>603
486から標準でCPUに組み込まれて
今では自動的に使われていることになる
2022/06/03(金) 19:59:24.89ID:jmq+XGTN0
PentiumのFPUバグ…
2022/06/03(金) 20:14:45.52ID:sSA68QUoa
487とは
2022/06/03(金) 20:48:03.52ID:LlSBEtTM0
かつてのARMはFPUどころかMMU、Cacheまでコプロ命令で制御してたな。
2022/06/03(金) 20:53:33.97ID:/AcAT3MUa
>>611
487は468SX(486DXの浮動小数点ユニット無し版)用のコプロやね
実態は486DXで装着すると468SXを乗っ取って全部487で実行しちゃうからCo-って感じじゃないけど
2022/06/05(日) 02:34:40.58ID:YsWbAm+I0
『コプロ』なるLSIを追加すると、掛け算を割り算が使えるようになる。

8~16ビット全盛時代、その文句の意味が分からなかったなあ。
BASICで普通に四則演算していたから。
2022/06/05(日) 05:54:10.62ID:7J0TRviH0
コプロラグニー
2022/06/05(日) 06:54:01.45ID:pIMmlsGTd
>>614
何もかも間違ってるw
2022/06/05(日) 07:36:26.69ID:AvwHMxMpa
>>614
未だに分かってないな
2022/06/05(日) 07:41:32.89ID:7J0TRviH0
CPUが電卓を使うというのが何ともミステリアスだった
2022/06/06(月) 16:32:55.98ID:qbvku5vVd
**が理解できない
教えてくだちい
2022/06/06(月) 21:07:32.00ID:1f/zEEFPd
ポインタのポインタ?
2022/06/06(月) 21:24:19.81ID:7xDnzGS8M
間接参照の間接参照だろ
経験豊富なら余裕で見分けられる
2022/06/06(月) 21:37:13.48ID:v7exk6pA0
ポインタは記法が悪いよ
関数ポインタはもっと悪い
2022/06/06(月) 22:15:21.61ID:uQ+SySK50
宣言のときの * と、指し先の実体を求める *
2022/06/06(月) 23:45:42.93ID:9jLV7J2l0
a***b
625デフォルトの名無しさん (ワッチョイ caad-+66E)
垢版 |
2022/06/08(水) 02:10:57.84ID:KYIfcmSY0
c=a/*b;
2022/06/08(水) 07:54:23.07ID:CNk0rgMY0
int a=1;
int *b=&a;
int **c=&b;
int d=0;
d=**c; /* d == a */
2022/06/08(水) 08:41:18.56ID:NWnFU//jd
少しわかった気がします
試してみて理解します
皆さんありがとうございます
628デフォルトの名無しさん (アウアウウー Sa11-fRoS)
垢版 |
2022/06/08(水) 16:31:44.77ID:KT22GtKja
関数のポインタとか
関数のポインタを引数に持つ関数のポインタとか
2022/06/08(水) 17:05:53.27ID:V/Z/RpWDF
typedefすればいい

typedef int AAA_FUNC( int, char *, ...);

int AAA_caller( int, AAA_FUNC*);
2022/06/09(木) 11:32:24.20ID:ZhHr/cTg0
>**
なんで char **argv が思い浮かばなかったかなぁ・・・。
2022/06/09(木) 13:06:08.29ID:0WQEetb00
char *argv[]という初心者をいたぶる陰険な罠を避けたかったんじゃね?
632デフォルトの名無しさん (ワッチョイ a968-esN/)
垢版 |
2022/06/09(木) 15:57:22.96ID:lMNj+E1f0
GNU MakeよりCMakeが優れてるのはどの辺でしょうか?
2022/06/09(木) 16:49:53.93ID:k8dtcEck0
>>632
CMake はメタビルドツールなので make と比較するようなものではない。
CMake を使う多くの場合で make も使う。
2022/06/09(木) 17:00:06.87ID:lMNj+E1f0
>>633
そうなんですね。ありがとうございます
2022/06/10(金) 11:33:59.29ID:rZTjX0hE0
宣言/デリファレンスの記法が悪いというより、=が悪い
両辺を等値(あるいはそうする=代入)というセマンティクスと解離してる
2022/06/10(金) 11:41:37.01ID:rZTjX0hE0
初期化の=は左辺ではなく、左辺で宣言されるものを指してるわけで、頭の中で=以外の記号に置き換えて読むといいかも
2022/06/10(金) 13:18:43.35ID:PT4Yy0z80
=と==は、はっきり区別されてるだろ
連動して常に等しいという規則ならマクロでやればいいし
2022/06/10(金) 13:19:17.11ID:HL4tZsFs0
A=1
B=2
C=3
A=B=C
PRINT A,B,C
2022/06/10(金) 16:02:05.50ID:5CLHXu7x0
>>638
BとCが等しいかの比較結果が A に入る
2022/06/10(金) 22:32:37.38ID:ExBywScCd
C言語ではA=B=C;でAとBにCの値が入るはずだが
2022/06/11(土) 02:33:23.42ID:yqb/24klr
Cの比較は==だからね
2022/06/11(土) 04:29:30.42ID:3J9oG0Sq0
BASICだろ
2022/06/11(土) 08:08:56.72ID:5lUjqa1id
なんのスレ
2022/06/11(土) 08:27:12.87ID:TYekU7UkM
C
A=1, B=1, C=1
BASIC
A=-1, B=1, C=1
645デフォルトの名無しさん (ワッチョイ 03ad-b0/F)
垢版 |
2022/06/11(土) 15:01:54.40ID:s3NqXqGx0
ちょー初心者

引数付きの関数で引数が空のときにも意味を持たせたい
nanntoka(char adress)なんて関数で
呼び出し側がnantoka()と書いたときも意味を持たせる場合どうすりゃいいの?
null判定でいいんですか?
2022/06/11(土) 15:07:25.17ID:D3tfzU/30
>>645
C では出来ない。
647デフォルトの名無しさん (ワッチョイ 03ad-b0/F)
垢版 |
2022/06/11(土) 15:15:18.40ID:s3NqXqGx0
だよねー
やっぱ数値は工夫のしようがないから無理なのかー
やー助かりました
2022/06/11(土) 15:45:32.03ID:NTE9LoY80
C++なら出来るんだっけ。
649デフォルトの名無しさん (ワッチョイ 63d2-asUV)
垢版 |
2022/06/11(土) 15:48:15.36ID:nZnmEekY0
C++にはデフォルト引数があるし
オーバーロードもできる
Cでできるかは知らん

int f(const char*s = nullptr);
2022/06/11(土) 16:27:10.38ID:dptRvNRm0
普通にはできないからやるな

(1) printfみたいにやる方法
(2) __VA_ARGS__でやる方法
があるぞい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況