!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
C言語なら俺に聞け 161
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0f63-sFbk)
2023/04/21(金) 14:05:20.18ID:rqj2HSDF0527デフォルトの名無しさん (ワッチョイ 4102-DaUO)
2023/08/24(木) 00:03:34.65ID:7wZt4qen0 >>523
Win16でmallocなんか使ってたらころされてしまいますよ
Win16でmallocなんか使ってたらころされてしまいますよ
528デフォルトの名無しさん (ワッチョイ 2b63-/QKx)
2023/08/24(木) 00:24:02.15ID:0ALYOmXL0 そこでfar pointerです
529デフォルトの名無しさん (スップ Sdb3-jt3B)
2023/08/24(木) 00:43:25.45ID:NfI5GYO1d 16ビットで十分なハンドル値をnearポインタにキャストするというのはいいアイデアだった
530デフォルトの名無しさん (ワッチョイ 7101-vfxM)
2023/08/24(木) 00:56:52.45ID:hEI/Eij50 あぁなるほど!
16bitの頃のMSの貧弱な開発環境で育ったせいで
標準Cに対しては屈折した気持ちのままなのねw
16bitの頃のMSの貧弱な開発環境で育ったせいで
標準Cに対しては屈折した気持ちのままなのねw
531デフォルトの名無しさん (ワッチョイ db79-wKkg)
2023/08/24(木) 01:06:43.62ID:W+JHQ2GG0 標準ライブラリは古いつーか実環境を考慮してないだけでbit数はあまり関係ない…
理解してないのに無理に話に入ってこんでもいいぞ
理解してないのに無理に話に入ってこんでもいいぞ
532デフォルトの名無しさん (テテンテンテン MM4b-0mpE)
2023/08/24(木) 01:26:43.52ID:WP7jiBq4M533デフォルトの名無しさん (テテンテンテン MM4b-0mpE)
2023/08/24(木) 01:40:06.60ID:WP7jiBq4M macOS(iOS)のアプリ作る時は、OPENSTEP由来のFoundationフレームワークを使うだろ
こうなるとprintfも使わずにNSLogばっかりだなw
こうなるとprintfも使わずにNSLogばっかりだなw
534デフォルトの名無しさん (ワッチョイ 93ad-hPrW)
2023/08/24(木) 02:24:55.77ID:LAGetXxi0 そもそもC言語で新規開発すること自体がほとんどないので標準ライブラリ使うかどうかは今となってはどうでも良い。
535デフォルトの名無しさん (スフッ Sdb3-G+yN)
2023/08/24(木) 07:36:25.07ID:6SD6OvDLd macOS以前のmacのCはもっとひどかった黒歴史
536デフォルトの名無しさん (スッププ Sdb3-jt3B)
2023/08/24(木) 12:16:23.79ID:50jyCEBUd537デフォルトの名無しさん (テテンテンテン MM4b-0mpE)
2023/08/24(木) 12:58:04.14ID:piehDxfAM538デフォルトの名無しさん (テテンテンテン MM4b-0mpE)
2023/08/24(木) 13:05:10.53ID:piehDxfAM 闘うプログラマーをディスる奴が居るとはな
さすがモグリは違うw
さすがモグリは違うw
539デフォルトの名無しさん (スッププ Sdb3-jt3B)
2023/08/24(木) 16:07:54.33ID:s7pHw0+wd お前の聖書を貶されて怒るのはわかるが
ただの宗教を他人におしつけるなw
ただの宗教を他人におしつけるなw
540はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 893e-glFA)
2023/08/24(木) 17:35:21.45ID:575mCkoc0 「綺麗なのは使われてないものだけ」みたいな格言をどっかで見た。
541デフォルトの名無しさん (オイコラミネオ MM1d-YAjS)
2023/08/24(木) 22:11:17.69ID:ypVJRmCUM 闘うプログラマー懐かしいな
随分と前に上下巻の頃に読んだ
うろ覚えで申し訳ないがwinodwsのAPIセットを考えるのにカトラーと幹部がクルーザーを1~2週間借りて
湖でクルージングしながらゆっくり考えたってところが印象的
クリエイターって感じで良かった
随分と前に上下巻の頃に読んだ
うろ覚えで申し訳ないがwinodwsのAPIセットを考えるのにカトラーと幹部がクルーザーを1~2週間借りて
湖でクルージングしながらゆっくり考えたってところが印象的
クリエイターって感じで良かった
542デフォルトの名無しさん (オイコラミネオ MM1d-YAjS)
2023/08/24(木) 22:22:10.52ID:ypVJRmCUM 残りの人生がどれだけあるか知らないけどそういう環境でそういう仕事してみたいなと思う
543デフォルトの名無しさん (ワッチョイ 2b63-/QKx)
2023/08/24(木) 22:45:31.31ID:0ALYOmXL0 C言語の開発って、
ジャングルの中、誰からも支援を受けずに
自給自足で生き残って敵に勝つイメージがあるな
必要な道具は自分で作るみたいな
恵まれた環境で使うには難しい世の中になってきた
ジャングルの中、誰からも支援を受けずに
自給自足で生き残って敵に勝つイメージがあるな
必要な道具は自分で作るみたいな
恵まれた環境で使うには難しい世の中になってきた
544デフォルトの名無しさん (ワッチョイ 9302-e/Qn)
2023/08/24(木) 23:08:24.66ID:egx7h1gE0 闘うプログラマー読んだことないモグリだけど
カトラーがDECから来る前からWindows APIはあったよね?
カトラーがDECから来る前からWindows APIはあったよね?
545デフォルトの名無しさん (オイコラミネオ MM1d-YAjS)
2023/08/24(木) 23:36:03.41ID:ypVJRmCUM Windowsは1.0からあるからなあw
闘うプログラマーはNTの開発物語
カトラーが関与したのはWindowsNTのAPIセット
闘うプログラマーはNTの開発物語
カトラーが関与したのはWindowsNTのAPIセット
546デフォルトの名無しさん (テテンテンテン MM4b-0mpE)
2023/08/24(木) 23:47:18.67ID:Nhyf7NRLM カトラーが実装したのはカーネルレベルのAPIでしょ
Win32はその上にある
Win32はその上にある
547デフォルトの名無しさん (オイコラミネオ MM1d-YAjS)
2023/08/25(金) 00:02:25.25ID:fBea/yqOM win32はもともとWindows NTの機能だよ
それにカーネルだけ実装してWindows NTを発売したとは思えないけど
3.1とかはwin16
ついでNTでwin32
そのあと95が出てくる
それにカーネルだけ実装してWindows NTを発売したとは思えないけど
3.1とかはwin16
ついでNTでwin32
そのあと95が出てくる
548デフォルトの名無しさん (ワッチョイ 2b63-/QKx)
2023/08/25(金) 00:08:33.68ID:NrcyVyXF0 フリーセルはWIn32sで動いていたんだよな
549はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 893e-glFA)
2023/08/25(金) 00:18:17.29ID:EDIsU9Tc0 あの頃はネット接続も一般的ではなかったから Win32s は雑誌の付録とかの形でよく入ってたのを覚えてる。
俺はテックウィンの付録CDから入れたわ。
俺はテックウィンの付録CDから入れたわ。
550デフォルトの名無しさん (ワッチョイ a19a-SOGH)
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も書式出力を受け付けるが、元々ログ出力関数なので
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 *);
として受け取ってはいけない、という事を指すのだと理解しています。
なぜこのような規定が設けられたのでしょう?
次の実引数が実際にはない場合,又は型が実際の(既定の実引数拡張に従って拡張された)次の実引数の型と適合しない場合,次に掲げる二つの場合を除いて,その動作は,未定義とする。
− 一方の型が符号付き整数型であり,もう一方の型が対応する符号無し整数型であり,
そしてその値が,両方の型で表現可能な値である場合。
− 一方の型がvoid型へのポインタであり,もう一方の型が文字型へのポインタである場合。
これは例えば、可変長引数をとる関数にNULLポインタを渡し、呼び出された側で
FILE *fp = va_arg(ap, FILE *);
として受け取ってはいけない、という事を指すのだと理解しています。
なぜこのような規定が設けられたのでしょう?
552デフォルトの名無しさん (ワッチョイ 355f-vHpx)
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つの例外事項はその部分はコンパイラ側が推測して補正出来る事項なのでそこは許容するよってこと
そこで規格がしてるのは特定の事柄を想定した話じゃなくて、単に責任の所在について言及してるだけだよ
va_argで指定する型と実引数の型を合わせるのはユーザーの仕事だ、合わない場合は動作を未定義にするよってこと
C FAQ 11.34を参照のこと
また、2つの例外事項はその部分はコンパイラ側が推測して補正出来る事項なのでそこは許容するよってこと
554デフォルトの名無しさん (テテンテンテン MMde-4wgn)
2023/08/31(木) 08:59:50.92ID:lOSXeWouM555551 (ワッチョイ 4d20-lN7b)
2023/08/31(木) 19:57:18.34ID:zNsdnZGD0 多数の回答ありがとうございます。
おおむね、先に挙げた例に対しては「問題ない。規格に適合している」とのご意見のようです。
しかし、先に挙げた問題を解決することを目的(の1つ)として、C23では新たに nullptr 定数が設けられる、とも聞いています。
実はそもそも「そんな問題などなかった」という事なのでしょうか?
おおむね、先に挙げた例に対しては「問題ない。規格に適合している」とのご意見のようです。
しかし、先に挙げた問題を解決することを目的(の1つ)として、C23では新たに nullptr 定数が設けられる、とも聞いています。
実はそもそも「そんな問題などなかった」という事なのでしょうか?
556デフォルトの名無しさん (ワッチョイ 3e79-FVin)
2023/08/31(木) 21:01:54.47ID:xuZfOSNk0 「逆に」とか「実は」とか中二病は好きだよね
その規格書の文章が判りやすいとも思えないから好きに解釈していいよ
その規格書の文章が判りやすいとも思えないから好きに解釈していいよ
557デフォルトの名無しさん (ワッチョイ a910-/+sI)
2023/08/31(木) 21:03:14.12ID:Ku+D9NQz0 クソどうでもいい。現実の問題を正しく定義しろカス
558はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E)
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 は整数とポインタを兼ねる (ような定義でも許される) というのが
歴史的経緯によるあまりにもグダグダな場当たり的な規則なので常識的に考えてあかんやろという話。
私の解釈では規格に沿っているとは言えないと思う。
C では整数定数としての 0 は特別な地位にあって空ポインタの定数としても使えるので
#define NULL 0
といった定義でも言語仕様を満たすし実際にこういう定義になっていることも多いのだけれど
状況によっては単に整数と解釈されてしまうことが問題になる。
可変長引数で FILE* を期待しているところに空ポインタを渡すのは許されるが
NULL と書くと (それ単体では整数型なこともあるので) ポインタとは適合しないことがあり得る。
仕様に厳密に言えばその場合の実引数は (void*)0 とか (void*)NULL とか書かないといけない。
大抵の処理系では問題にならないように上手いこと調整されている。
#define NULL 0LL
みたいな感じで (その処理系における) ポインタと同じサイズの整数で定義しておけば一般的な ABI では大丈夫。
(だが言語仕様で保証しているわけではない。)
NULL は整数とポインタを兼ねる (ような定義でも許される) というのが
歴史的経緯によるあまりにもグダグダな場当たり的な規則なので常識的に考えてあかんやろという話。
559デフォルトの名無しさん (スプープ Sdca-+nJJ)
2023/08/31(木) 22:30:45.52ID:zVsC0t7Ed560デフォルトの名無しさん (ワッチョイ 355f-vHpx)
2023/08/31(木) 22:49:56.13ID:0tscOvRb0 >>554,555
可変長引数として渡したオブジェクトポインタは実引数拡張により全部 void* になるから、
typedef void FILE; とでもなっていない限りは適合するとは言えないよ。
va_arg(ap, FILE *) として受け取ってはいけない(移植性を損ねる)ということで合ってる。
そもそも適合は型と型の関係だから「NULLポインターはFILE*と適合」はおかしい。
可変長引数として渡したオブジェクトポインタは実引数拡張により全部 void* になるから、
typedef void FILE; とでもなっていない限りは適合するとは言えないよ。
va_arg(ap, FILE *) として受け取ってはいけない(移植性を損ねる)ということで合ってる。
そもそも適合は型と型の関係だから「NULLポインターはFILE*と適合」はおかしい。
561551 (ワッチョイ 4d20-lN7b)
2023/08/31(木) 23:05:28.70ID:zNsdnZGD0562はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E)
2023/08/31(木) 23:08:37.85ID:n7krQh8u0 >>560
よく確認してみたら確かにそうだわ……。
NULL が整数として解釈される可能性を考えるまでもなく
void* と FILE* は適合しないな。
ポインタが適合する条件としては同一の修飾がされていることに加えて
両者が適合する型のポインタでなければならないことになってる。
void と FILE は適合しないのだから void* と FILE* が適合することもない。
よく確認してみたら確かにそうだわ……。
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型へのポインタと文字型へのポインタだけ、といった事なのでしょうか?
同じポインタ型であっても、保証されているのは、
「一方の型がvoid型へのポインタであり,もう一方の型が文字型へのポインタである場合」
だけとなっています。この制約の意図が不明です。
例えば、可変長引数をとる関数に (void *)NULL を渡し、呼び出された側で
FILE *fp = va_arg(ap, FILE *);
として受け取るのも不適合に思えます。
この場合でも、(例えば)アライメントの問題があり、互換が保証できるのはvoid型へのポインタと文字型へのポインタだけ、といった事なのでしょうか?
564デフォルトの名無しさん (テテンテンテン MMde-4wgn)
2023/09/01(金) 00:09:17.26ID:EYRyaWRCM >>560
適合しない場合ってのは、FILE*とint*とかを言うのだろう
void*とFILE*は適合しないのか?
それとNULLを0なんかに定義してたら、NULLはintとしか適合しなくなる
なのでNULLポインターは((void*)0)と想定している
適合しない場合ってのは、FILE*とint*とかを言うのだろう
void*とFILE*は適合しないのか?
それとNULLを0なんかに定義してたら、NULLはintとしか適合しなくなる
なのでNULLポインターは((void*)0)と想定している
565はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E)
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 であることは許容される。
適合する型なら許されるということに「加えて」
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 であることは許容される。
566551 (ワッチョイ 4d20-lN7b)
2023/09/01(金) 01:19:09.35ID:APE9whcz0567はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E)
2023/09/01(金) 01:43:08.25ID:gaibfzWk0 >>566
総合的に言って不適合という理解で正しいということになる。
void* と char* は適合の規則からすると適合ではないのだけれど、
その表現や境界調整は等しいことを保証する規則があるので
この場合に適合と同等の扱いをしても問題にならないから、
まあ出来るようにしておけば便利なこともあるんとちゃうんかなぁ。
総合的に言って不適合という理解で正しいということになる。
void* と char* は適合の規則からすると適合ではないのだけれど、
その表現や境界調整は等しいことを保証する規則があるので
この場合に適合と同等の扱いをしても問題にならないから、
まあ出来るようにしておけば便利なこともあるんとちゃうんかなぁ。
568デフォルトの名無しさん (テテンテンテン MMde-4wgn)
2023/09/01(金) 02:40:24.68ID:EYRyaWRCM >>565
ポインターに0の代入は問題ないけど、ここでの話は可変個引数に渡した時の事を言ってるので((void*)0)じゃないと不味いでしょ
ポインターに0の代入は問題ないけど、ここでの話は可変個引数に渡した時の事を言ってるので((void*)0)じゃないと不味いでしょ
569デフォルトの名無しさん (テテンテンテン MMde-4wgn)
2023/09/01(金) 02:50:24.64ID:EYRyaWRCM >>565
6.7.5.1では、FILEとvoidが適合しないといけない旨の記述があるけど、voidというのは普通に比較して適合かどうか判定できる型なのか?
特別なルールが有って然るべきな気がするけどね
6.7.5.1では、FILEとvoidが適合しないといけない旨の記述があるけど、voidというのは普通に比較して適合かどうか判定できる型なのか?
特別なルールが有って然るべきな気がするけどね
570はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E)
2023/09/01(金) 09:38:35.84ID:gaibfzWk0 >>568
不味いけど NULL が 0 のことはあるという話。
不味いけど NULL が 0 のことはあるという話。
571はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E)
2023/09/01(金) 18:08:19.15ID:gaibfzWk0 何の話をしてたんだかよくわからんようになったので >>551 を読み返してたんだが
規定が設けられた理由が根本的な疑問ということでいいんかな。
当然だが引数を受け取る側の想定と異なるものを渡したら破綻する。
普通の関数ならコンパイル時に受け取る側と渡す側の型の間に不整合が合ったら
コンパイル時に検出できるし、条件に合えば暗黙の変換もするんだけど
可変長引数の場合は実行時にならないとわからないので
調整する必要なく渡せる条件を規定したらそうなったって感じだと思う。
整数は負数が絡まなければ同じ表現だし
void* と char* にも互換性があることも保証されているので
問題にならない。
規定が設けられた理由が根本的な疑問ということでいいんかな。
当然だが引数を受け取る側の想定と異なるものを渡したら破綻する。
普通の関数ならコンパイル時に受け取る側と渡す側の型の間に不整合が合ったら
コンパイル時に検出できるし、条件に合えば暗黙の変換もするんだけど
可変長引数の場合は実行時にならないとわからないので
調整する必要なく渡せる条件を規定したらそうなったって感じだと思う。
整数は負数が絡まなければ同じ表現だし
void* と char* にも互換性があることも保証されているので
問題にならない。
572デフォルトの名無しさん (ワッチョイ 8646-FlCC)
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 ヌル文字の実体が数値のゼロということから思いついた理屈なのかな?
ポインタはアドレスで、そのアドレスに格納されている値のことではない。
ポインタはアドレスで、そのアドレスに格納されている値のことではない。
575551 (ワッチョイ 4d20-lN7b)
2023/09/01(金) 21:13:54.66ID:APE9whcz0 >>571
色々ありがとうございました。
素朴に考えて、呼び元がポインタを渡し、
それを呼び先がポインタとして受け取れば
(それが何型へのポインタであろうとも)
普通に安全そうに見えるのに、何でこんなに厳しいのか?
そう決まった理由が知りたかった為の質問でした。
誰か、そこら辺の事情を知っている人はいないか? と。
色々ありがとうございました。
素朴に考えて、呼び元がポインタを渡し、
それを呼び先がポインタとして受け取れば
(それが何型へのポインタであろうとも)
普通に安全そうに見えるのに、何でこんなに厳しいのか?
そう決まった理由が知りたかった為の質問でした。
誰か、そこら辺の事情を知っている人はいないか? と。
576デフォルトの名無しさん (ワッチョイ d95f-sVGh)
2023/09/01(金) 21:37:10.15ID:qVeR1pY40 >>575
C言語のポインタは単にアドレス
ただし、構造体なら構造体、関数なら関数で、メモリ上に決まった配置をされるので、なんのポインタかわからないと、メモリのアドレスをずっと追いかけることになる。
コンピューターそのものにはデータ型というものは存在しない。
C言語のポインタは単にアドレス
ただし、構造体なら構造体、関数なら関数で、メモリ上に決まった配置をされるので、なんのポインタかわからないと、メモリのアドレスをずっと追いかけることになる。
コンピューターそのものにはデータ型というものは存在しない。
577デフォルトの名無しさん (スプープ Sdca-+nJJ)
2023/09/01(金) 22:14:19.34ID:LLAg+6GRd578はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E)
2023/09/01(金) 23:22:02.51ID:gaibfzWk0 >>575
ポインタの表現は、それが指す先の型によって異なることも言語仕様としては許されるはず。
§6.2.5 でポインタの表現や境界調整要求が等しくあるべき条件が規定されていて
それ以外の条件では同じ表現または境界調整要求を持つ必要はないと書かれてる。
まあそんなアーキテクチャがどれくらい存在するのかは知らんけど
ポインタの表現は、それが指す先の型によって異なることも言語仕様としては許されるはず。
§6.2.5 でポインタの表現や境界調整要求が等しくあるべき条件が規定されていて
それ以外の条件では同じ表現または境界調整要求を持つ必要はないと書かれてる。
まあそんなアーキテクチャがどれくらい存在するのかは知らんけど
579デフォルトの名無しさん (テテンテンテン MM7f-cJIa)
2023/09/02(土) 00:36:03.53ID:WsIZ4FVlM いやいや、ポインター(アドレス)自体はアライメントされてない所に格納されてるかもしれんけど、中身のアドレス自体は問題ないアライメントになってることが保証されてるでしょ
オマエらは何を言ってるんだ?
オマエらは何を言ってるんだ?
580デフォルトの名無しさん (ワッチョイ ffad-5+Xn)
2023/09/02(土) 00:41:32.42ID:VX6uRHRw0 farポインタみたいにバイト数の違うポインタも混在していたら余計にややこしい問題に・・・
581デフォルトの名無しさん (テテンテンテン MM7f-cJIa)
2023/09/02(土) 01:01:48.59ID:WsIZ4FVlM 例えばFILE*とshort*ならアドレスのアライメントが合わない場合があるだろうけど、これはそもそも型が適合しないわけでどうしようもない
でも、今考えたらvoid*はありとあらゆるアドレスを取る可能性が有るから、それに合うのはchar*しかないよ、ということを言いたかったのだろうなと気付いた
でも規格書を見ても、FILE*とvoid*が適合するかどうかはアンドキュメンテッドだなw
現実には((void*)0)とFILE*は完全に適合してるけどね
でも、今考えたらvoid*はありとあらゆるアドレスを取る可能性が有るから、それに合うのはchar*しかないよ、ということを言いたかったのだろうなと気付いた
でも規格書を見ても、FILE*とvoid*が適合するかどうかはアンドキュメンテッドだなw
現実には((void*)0)とFILE*は完全に適合してるけどね
582551 (ワッチョイ 2320-+GqY)
2023/09/02(土) 06:58:16.01ID:XjF1xIbI0 ここにこう書いてあるからには、何か(通常の関数呼び出しでは
問題にならないが)可変長引数特有の問題があり、
それを避けるためにこうしたのだろう、と思った訳です。
問題にならないが)可変長引数特有の問題があり、
それを避けるためにこうしたのだろう、と思った訳です。
583デフォルトの名無しさん (スプープ Sd1f-I+Vk)
2023/09/02(土) 11:49:29.07ID:+azsBNOBd584デフォルトの名無しさん (ワッチョイ cf63-yzHn)
2023/09/02(土) 11:59:23.66ID:R1w1jy3B0 安全かどうかは、環境によるんじゃ
585デフォルトの名無しさん (スプープ Sd1f-I+Vk)
2023/09/02(土) 12:34:31.87ID:DeBIPPsBd 「環境による」のは安全ではないんだよ
ここで取り上げられてるのは大元の公式文書なのであらゆる環境について言えることが書いてある
ここで取り上げられてるのは大元の公式文書なのであらゆる環境について言えることが書いてある
586デフォルトの名無しさん (ワッチョイ cf63-yzHn)
2023/09/02(土) 12:59:05.22ID:R1w1jy3B0 マイナーなCPUのことなんか気にしたことがなかったな
587はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va)
2023/09/02(土) 13:12:11.45ID:Ng1Dtdjk0 >>584
現在の文脈では「言語仕様をそう決めた理由」が主題。
だからその前提として言語仕様が保証している範囲がどこまでかを
理解しておく必要があって、そこで見当違いの主張に反論がされている
という話の流れ。
現在の文脈では「言語仕様をそう決めた理由」が主題。
だからその前提として言語仕様が保証している範囲がどこまでかを
理解しておく必要があって、そこで見当違いの主張に反論がされている
という話の流れ。
588デフォルトの名無しさん (スプープ Sd1f-I+Vk)
2023/09/02(土) 14:05:43.49ID:DeBIPPsBd589はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy)
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;
みたいなことは禁止されてる?
void *hoge = (void *)fp;
FILE *fuga = (FILE *)hoge;
みたいなことは禁止されてる?
591デフォルトの名無しさん (スプープ Sd1f-I+Vk)
2023/09/02(土) 14:59:50.63ID:wu0IBgrgd どうしても必要ならやるしかない
ただfopenの戻り値でFILE構造体の安全性が保証されてるのにわざわざvoid*に代入してからFILE*に戻すのは
正統な金なのに闇銀行に預けて再びマネーロンダリングするような変な手間だ
ただfopenの戻り値でFILE構造体の安全性が保証されてるのにわざわざvoid*に代入してからFILE*に戻すのは
正統な金なのに闇銀行に預けて再びマネーロンダリングするような変な手間だ
592デフォルトの名無しさん (ラクッペペ MM7f-ymsf)
2023/09/02(土) 15:08:48.05ID:68c+QhTKM void *型って参照する先の変数のサイズが不明なので右辺値になるのは不可能な気がするけどな
キャストは無理でしょ
キャストは無理でしょ
593はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy)
2023/09/02(土) 15:12:41.39ID:Ng1Dtdjk0594デフォルトの名無しさん (アウアウウー Sae7-fXI3)
2023/09/02(土) 15:26:23.14ID:mCX3wjBNa >>592
void じゃなくてもいいや
FILE *fp = fopen(...);
char *hoge = (char *)fp;
FILE *fuga = (FILE *)hoge;
みたいなことは禁止されてる?
void じゃなくてもいいや
FILE *fp = fopen(...);
char *hoge = (char *)fp;
FILE *fuga = (FILE *)hoge;
みたいなことは禁止されてる?
595デフォルトの名無しさん (スプープ Sd1f-I+Vk)
2023/09/02(土) 15:40:22.87ID:iw53wgLpd596デフォルトの名無しさん (ワッチョイ 7310-/gcr)
2023/09/02(土) 15:52:38.82ID:f6/YEIJg0 言葉をちゃんと使うとプログラマ意思疎通がよくなるのでは。
「void * が右辺値になるのは無理」って何だよ。ではなく、正常動作はプログラマの責任になる、って言いたかったんじゃないの?
>>590 みたいなコードは、これだけなら疑問に思うだろうが、こういうコードが有効になる事はあるよ。その一例は
「ここで言うFILE* みたいなモノが複数種類あり」
送信側 - 中継機能 - 受信側
のプログラム構造で送受信のペアは複数あり、中継機能には 実際の中身が何なのかは意識させたくない。
----
ポインタの話から外れて恐縮だが、
例としてタグ・レングス・バリュー形式ってのがあって、「中継者は送受信データがTLV形式の連続であることだけは知っていて」「TとLのサイズは一定」「タグの種類が何種類あるかなんて知らなくていい」
----
これにさらにポインタを含むデータ構造を通信可能にするには?って話で、ポインタ型をバッファ内インデックス値に変換して、ポインタが指す中身も通信データに含める、とか、
サブ構造がポインタ持ってたら再帰的に処理する、とか話は続くが
それはいいとして
>>590 みたいなコードは、現実にはあるよ。という話
「void * が右辺値になるのは無理」って何だよ。ではなく、正常動作はプログラマの責任になる、って言いたかったんじゃないの?
>>590 みたいなコードは、これだけなら疑問に思うだろうが、こういうコードが有効になる事はあるよ。その一例は
「ここで言うFILE* みたいなモノが複数種類あり」
送信側 - 中継機能 - 受信側
のプログラム構造で送受信のペアは複数あり、中継機能には 実際の中身が何なのかは意識させたくない。
----
ポインタの話から外れて恐縮だが、
例としてタグ・レングス・バリュー形式ってのがあって、「中継者は送受信データがTLV形式の連続であることだけは知っていて」「TとLのサイズは一定」「タグの種類が何種類あるかなんて知らなくていい」
----
これにさらにポインタを含むデータ構造を通信可能にするには?って話で、ポインタ型をバッファ内インデックス値に変換して、ポインタが指す中身も通信データに含める、とか、
サブ構造がポインタ持ってたら再帰的に処理する、とか話は続くが
それはいいとして
>>590 みたいなコードは、現実にはあるよ。という話
597はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy)
2023/09/02(土) 16:04:16.63ID:Ng1Dtdjk0 >>594
オブジェクトを指すポインタは char* (またはその他の文字型をさすポインタ) へ変換することは許されるし文字配列として読んでもよい。 (読んだ結果としてどういうレイアウトになってるかはわからんけど。)
そしてもとの型に型変換したら変換前と等しいことも保証される。
オブジェクトを指すポインタは char* (またはその他の文字型をさすポインタ) へ変換することは許されるし文字配列として読んでもよい。 (読んだ結果としてどういうレイアウトになってるかはわからんけど。)
そしてもとの型に型変換したら変換前と等しいことも保証される。
598デフォルトの名無しさん (スプープ Sd1f-I+Vk)
2023/09/02(土) 16:06:19.94ID:Yxb8XUhFd599デフォルトの名無しさん (ワッチョイ 7310-/gcr)
2023/09/02(土) 16:12:48.48ID:f6/YEIJg0 うーん
まだまだ添削できる余地があるぞ…
ここはまあ無料掲示板だが、仕事では、自分には誤解をされやすい性質がある、と意識しなされ
まだまだ添削できる余地があるぞ…
ここはまあ無料掲示板だが、仕事では、自分には誤解をされやすい性質がある、と意識しなされ
600デフォルトの名無しさん (スプープ Sd1f-I+Vk)
2023/09/02(土) 16:50:14.84ID:JxIOKPq6d アハハ
なんだこの人w
なんだこの人w
601デフォルトの名無しさん (ワッチョイ cf63-yzHn)
2023/09/02(土) 17:10:38.18ID:R1w1jy3B0 ここでお金稼ぎしている人いたっけなw
602デフォルトの名無しさん (ワンミングク MM9f-hgj0)
2023/09/02(土) 21:43:01.25ID:5XlbVKpsM もりたぼ稼ごうとした人はいた
603デフォルトの名無しさん (ワッチョイ b35f-RK05)
2023/09/02(土) 22:10:43.72ID:9Zs5bzSj0 ポインタの宣言は、ポインタの型じゃなくて、ポインタが指しているアドレスの格納値をどう扱うつもりなのかを明示している。
void型のポインタは、ポインタだから、何型のポインタだから、64ビットだったり、32ビットだったりするものではない。
void型のポインタは、ポインタだから、何型のポインタだから、64ビットだったり、32ビットだったりするものではない。
604はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va)
2023/09/03(日) 13:47:13.05ID:ApaaLf4l0605デフォルトの名無しさん (スププ 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;
だったんじゃないかな
void void * 登場前の C は
FILE *fp = fopen(...);
int *hoge = (int *)fp;
FILE *fuga = (FILE *)hoge;
だったんじゃないかな
606デフォルトの名無しさん (ワッチョイ 8310-g4sH)
2023/09/04(月) 07:53:14.39ID:YGQMN8Uj0 設計当時はアセンブラの代替言語。
607デフォルトの名無しさん (スッププ Sd1f-I+Vk)
2023/09/04(月) 09:48:09.59ID:R5PUsxPld >>605
基本はcharだからchar *hoge = (char *)fp;じゃない
なんならint hoge = (int )fp;でもよかった
ほとんどの場合intとポインタのサイズが同じだった
基本はcharだからchar *hoge = (char *)fp;じゃない
なんならint hoge = (int )fp;でもよかった
ほとんどの場合intとポインタのサイズが同じだった
608デフォルトの名無しさん (アウアウウー Sae7-fXI3)
2023/09/04(月) 10:04:32.23ID:/ASAZOX6a >>607 みたいなのがいるから void が出来たんだよ
609デフォルトの名無しさん (スプッッ Sd87-IP2U)
2023/09/04(月) 11:07:54.13ID:gab4BDOud 因果逆転だな
610デフォルトの名無しさん (ワッチョイ 7310-/gcr)
2023/09/04(月) 11:19:05.30ID:Ww8QJvvD0611デフォルトの名無しさん (ワッチョイ 7310-/gcr)
2023/09/04(月) 11:24:33.03ID:Ww8QJvvD0 そういえば、むかーしの情報処理試験には言語選択でマシン語ってのがあって、1メモリアドレス値が指すメモリは 8bit 幅ではなく、 16bit だったように記憶してる。
「特殊な環境を想定しやがって…」と思ったナカマいない?
「特殊な環境を想定しやがって…」と思ったナカマいない?
612デフォルトの名無しさん (ワッチョイ 8310-g4sH)
2023/09/04(月) 11:27:19.73ID:YGQMN8Uj0 試験用アセンブラはCASLだったっけ?
仮想環境で実在しない環境用言語だって。
仮想環境で実在しない環境用言語だって。
613はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va)
2023/09/04(月) 12:00:00.02ID:p8KSFCIf0614デフォルトの名無しさん (テテンテンテン MM7f-cJIa)
2023/09/04(月) 12:00:22.47ID:5denWoTkM メモリが8bitって何も出来ないぞw
615デフォルトの名無しさん (ラクッペペ MM7f-ymsf)
2023/09/04(月) 12:05:38.98ID:QM+pFggQM アドレス範囲ではなくてデータ長が16ビットだったと思う
616はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va)
2023/09/04(月) 12:09:35.09ID:p8KSFCIf0 >>611
C の仕様上の用語では「バイト」が 8bit とは限らない定義になっている。
C の仕様で想定する必要がある程度にはそういう環境もあったのだろうし、
主流ではないにしても特殊というほどの感じでもなかったんちゃうか?
まあ「昔」をいつ頃に想定するかにもよるだろうけど。
C の仕様上の用語では「バイト」が 8bit とは限らない定義になっている。
C の仕様で想定する必要がある程度にはそういう環境もあったのだろうし、
主流ではないにしても特殊というほどの感じでもなかったんちゃうか?
まあ「昔」をいつ頃に想定するかにもよるだろうけど。
617はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va)
2023/09/04(月) 12:24:06.96ID:p8KSFCIf0618デフォルトの名無しさん (ワッチョイ 93c9-oCRc)
2023/09/04(月) 14:04:31.55ID:F3cE7vUV0 7bitでアルファベットは表せてたしねぇ
文字集合で完結させてた RFC822
文字集合で完結させてた RFC822
619デフォルトの名無しさん (ワッチョイ 6f5f-ATpV)
2023/09/04(月) 20:56:26.82ID:MxCwE5tq0 実際に1バイトが8ビットじゃないマシンで仕事してた人いる?
経験談を聞いてみたい
つらそう
経験談を聞いてみたい
つらそう
620デフォルトの名無しさん (ワッチョイ b302-jP38)
2023/09/04(月) 21:41:24.34ID:TqSqVDXY0 何がつらいの?
621デフォルトの名無しさん (スッププ Sd1f-I+Vk)
2023/09/04(月) 22:35:30.73ID:yuyUlcPSd UNIXとか基本9ビットが見え隠れしてる気がする
ファイルのパーミッション---rwxrwxとか
C数値のデフォルトが8進数とか(9ビットなら8進数3ケタでまとまりがいい)
ファイルのパーミッション---rwxrwxとか
C数値のデフォルトが8進数とか(9ビットなら8進数3ケタでまとまりがいい)
622デフォルトの名無しさん (ワッチョイ cf63-yzHn)
2023/09/04(月) 22:55:40.14ID:ljnGjc/80 あれは9ビットだったのか
623デフォルトの名無しさん (テテンテンテン MM7f-cJIa)
2023/09/04(月) 23:38:31.34ID:5denWoTkM 1バイト9bitとか完全に都市伝説だろ…
1ワード(レジスタ)が36bitとかはLispマシーンで使われたりしてたけどね
1ワード(レジスタ)が36bitとかはLispマシーンで使われたりしてたけどね
624デフォルトの名無しさん (ワッチョイ 23f0-BDBD)
2023/09/06(水) 06:22:01.74ID:r3vK0XzD0 char が16bitの環境なら使ったことがある
625デフォルトの名無しさん (ワッチョイ 4301-yzHn)
2023/09/06(水) 07:02:16.45ID:Mh27mgbM0 そういうのってどんなCPUなの?
626デフォルトの名無しさん (ワッチョイ cfcf-ATpV)
2023/09/06(水) 09:37:16.14ID:EGh1VJfR0 とりあえずDSPなんかはそうでしょ
ワードマシンって言っちゃっていいか知らんけど、演算の速度をあげるためにワード幅を一番使いそうなビット数にして全部ワード単位でアクセスする設計にしてる
マニュアルにアドレス、char幅、int幅全部同じ何々ビットです注意してねみたいなのがご丁寧に書いてあったりするよ
ワードマシンって言っちゃっていいか知らんけど、演算の速度をあげるためにワード幅を一番使いそうなビット数にして全部ワード単位でアクセスする設計にしてる
マニュアルにアドレス、char幅、int幅全部同じ何々ビットです注意してねみたいなのがご丁寧に書いてあったりするよ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか… [BFU★]
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 中国国営メディア「沖縄は日本ではない」…★7 [BFU★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- バービー、 台湾有事の発言の波紋で「たまったもんじゃない」「高市さんに真意は聞きたい」「国民に向けて説明してほしい」 [muffin★]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 高市早苗、岸田政権(当時)に「台湾有事は日本の有事か」という質問をしていた [175344491]
- ケンタッキーの○○○バーガーという予告がアレを想起すると話題に [523957489]
- 【悲報】中国→日本行きの航空チケット、高市有事の影響で50万人分がキャンセルされる [834922174]
- んなっしょい🍬禁止🈲のお🏡
- 【悲報】早速高市首相のせいで全国の民泊でキャンセルラッシュwwwwwwwwwwww 経営者も嘆き「こんな事は初めてだ…」😲 [871926377]
