- 1 名前:デフォルトの名無しさん (ワッチョイ 0f63-sFbk) mailto:sage [2023/04/21(金) 14:05:20.18 ID:rqj2HSDF0.net]
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 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 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 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
- 498 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 893e-glFA) mailto:sage [2023/08/20(日) 21:28:54.03 ID:CVtYBdI90.net]
- >>492
いまどきのレコードプレイヤーはレーザーで読み取るタイプのもあるんやが 音質や使い勝手よりも針を落とす感覚が好きな懐古趣味の人も 少なからずいそうやなと思う。
- 499 名前:デフォルトの名無しさん (ワッチョイ 2b63-/QKx) mailto:sage [2023/08/20(日) 21:44:18.30 ID:GxzweHHZ0.net]
- そのうち量子センサーなんてでてきて、
盤面を一瞬で読み取って再生する何て出てくるかもね 知らんけど
- 500 名前:デフォルトの名無しさん (ワッチョイ 93ad-hPrW) [2023/08/20(日) 22:47:50.93 ID:pbHEs6OP0.net]
- 盤面を写真撮影して凹凸を一度に全部読み、後は再生するだけ。なんてのはできそうだな。
- 501 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/20(日) 22:56:04.52 ID:pKCQsYPtM.net]
- >>498
盤面をスマホで読み取らせて、それを再生してると思わせといて、実はラベルを解析して事前に録音済みのデータを再生するという、イカサマサービスを思い付いたw
- 502 名前:デフォルトの名無しさん (ワッチョイ 2bcf-YAjS) mailto:sage [2023/08/20(日) 23:03:56.28 ID:P3ytobrG0.net]
- こまわりくんはレコードの溝読めたな。
- 503 名前:デフォルトの名無しさん (ワッチョイ 93ad-hPrW) [2023/08/20(日) 23:13:57.98 ID:pbHEs6OP0.net]
- >>499
OCRプログラムでラベルの写真のタイトル部分の文字列読ませれば可能だが、問題は、ラベルに似せたものの上に書いた文字でも同じように読んで成功してしまうことだ。つまりレコード不要。
- 504 名前:デフォルトの名無しさん (ワッチョイ 2b63-/QKx) mailto:sage [2023/08/20(日) 23:16:52.12 ID:GxzweHHZ0.net]
- そういえばオープンリールも速度とトラック数にこだわりがあったな
- 505 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/20(日) 23:22:22.29 ID:pKCQsYPtM.net]
- >>501
さすがにレコードか位は判別可能なんで、そういう誤魔化しは除外できるでしょ つうか、インチキなんだからどうでもいいんだけどねw
- 506 名前:デフォルトの名無しさん (スッップ Sdb3-jt3B) mailto:sage [2023/08/20(日) 23:46:32.25 ID:WX+gcEAed.net]
- 人間「このレコードかけて」
AIスピーカー「かしこまりました…あーあーはってしーないー」 人間「お前が歌うんかい!」
- 507 名前:デフォルトの名無しさん (ワッチョイ 5910-oBFI) mailto:sage [2023/08/21(月) 00:56:03.52 ID:h/vumT/U0.net]
- >>499
ワロタ …でも「顧客が本当に必要なもの」はそれかもしれない
- 508 名前:デフォルトの名無しさん (ワッチョイ 2b63-/QKx) mailto:sage [2023/08/21(月) 00:58:44.27 ID:EVtKvg8p0.net]
- 曲を再生して、それをスマホに聴かせ、曲名やアルバム名を調べる
というのは割と使ってる
- 509 名前:デフォルトの名無しさん (ワッチョイ 7101-vfxM) [2023/08/23(水) 12:33:50.88 ID:WRsTeN290.net]
- localtimeでtm型のポインタが返ってきますが
これはfreeのような後始末はしなくても良かったんでしたっけ? 以下のt1の後始末です #include <time.h> #include <stdio.h> int main () { time_t t0 = time (NULL); struct tm *t1 = localtime (&t0); return 0; }
- 510 名前:デフォルトの名無しさん (ワッチョイ 93ad-Dfy6) mailto:sage [2023/08/23(水) 12:46:33.56 ID:RWX4pd1L0.net]
- 不要
静的な領域なんで その代わりスレッドセーフじゃないし 次に呼び出したら値が変わっちゃうのでそのまま使うならコピー必須
- 511 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 893e-glFA) mailto:sage [2023/08/23(水) 13:08:22.64 ID:d+s8esX90.net]
- 時間系関数の一部では同じ型のポインタを返す他の関数が
内容を書き換えることもあるということにも気を付ける必要がある。 つまり localtime が返したポインタが指す先は gmtime の呼び出しで内容が変わるかもしれないし変わらないかもしれない。
- 512 名前:デフォルトの名無しさん (ワッチョイ 7101-vfxM) mailto:sage [2023/08/23(水) 13:18:07.19 ID:WRsTeN290.net]
- >>508,509
あざーす! 思い出しました! そうでした
- 513 名前:デフォルトの名無しさん (スップ Sdb3-Vj9P) mailto:sage [2023/08/23(水) 13:23:04.60 ID:Tm9lJ2oNd.net]
- Cの標準ライブラリはメモリ操作関係やsprintfみたいな書式出力系以外は古臭くてほぼ使い物にならないから
システムのAPIを直接呼んだ方がいいよ ガハハ
- 514 名前:デフォルトの名無しさん (ワッチョイ 5910-oBFI) mailto:sage [2023/08/23(水) 13:57:11.07 ID:dIB9DDlN0.net]
- >>511
えー、お名前教えて あなたとあなたのコードが関係するプロジェクトは全部避けたいですw
- 515 名前:デフォルトの名無しさん (ワッチョイ 7101-vfxM) mailto:sage [2023/08/23(水) 13:59:16.75 ID:WRsTeN290.net]
- >>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に直接出力できないんですかね? すれ違いかもしれんですが
- 516 名前:デフォルトの名無しさん (ワッチョイ 7101-vfxM) mailto:sage [2023/08/23(水) 15:39:04.68 ID:WRsTeN290.net]
- 同じ出力になる以下を使用することにします
$ 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
- 517 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/23(水) 16:21:15.95 ID:mK4fJzJ6M.net]
- >>512
Win32使ってCでコーディングするなら、Win32以外のAPIを呼び出す必要がないな
- 518 名前:デフォルトの名無しさん (ワッチョイ c101-YAjS) mailto:sage [2023/08/23(水) 19:26:23.68 ID:De6qHSvf0.net]
- 標準入出力関数を Win32APIだけで実装しなおすのはなかなか
車輪の再発明くさい案件になるな
- 519 名前:デフォルトの名無しさん (オイコラミネオ MM1d-YAjS) mailto:sage [2023/08/23(水) 19:53:06.85 ID:7GDemJR0M.net]
- 残念ながらC標準ライブラリは古くて当たり前なんだ…
それを基準にして多くの人が回ってるから変えられないんだろう でも人間の使える時間は限られてるので使えるものはうまく使ったほうがいい メンテナンス性は知らないが
- 520 名前:デフォルトの名無しさん (スップ Sdb3-jt3B) mailto:sage [2023/08/23(水) 19:55:44.31 ID:6N7MylZZd.net]
- 新しく作り直したのに使い物にならないのがWIN32APIの凄いところなんだよなw
- 521 名前:デフォルトの名無しさん (オイコラミネオ MM1d-YAjS) mailto:sage [2023/08/23(水) 19:59:10.27 ID:7GDemJR0M.net]
- win95ってほぼ30年前でしょ…
- 522 名前:デフォルトの名無しさん (ワッチョイ 5910-oBFI) mailto:sage [2023/08/23(水) 20:09:03.11 ID:dIB9DDlN0.net]
- >>515
Win32?今の話の流れと全然関係ないです 私はLinux上で開発してるけど、それも関係ない いいからお名前教えて
- 523 名前:デフォルトの名無しさん (ワッチョイ 5910-oBFI) mailto:sage [2023/08/23(水) 20:14:42.63 ID:dIB9DDlN0.net]
- まあいいや。どうせ永遠に話通じないし、意味ないね、スレ汚しごめん> all
世界中のあらゆる人と意思疎通できる訳がない
- 524 名前:デフォルトの名無しさん (ワッチョイ 5910-oBFI) mailto:sage [2023/08/23(水) 20:17:30.73 ID:dIB9DDlN0.net]
- >>515
あなたもごめんね、信念に従ってそのまま生きて下さい
- 525 名前:デフォルトの名無しさん (ブーイモ MMab-NzR0) mailto:sage [2023/08/23(水) 20:26:41.70 ID:magUjDjkM.net]
- 何でWinで開発する人って標準ライブラリを毛嫌いしてるんですか?
- 526 名前:デフォルトの名無しさん (ワッチョイ 2b63-/QKx) mailto:sage [2023/08/23(水) 20:37:13.42 ID:gVkUNQKt0.net]
- システムコールとか呼んでなかったか?
たしか、目標をセンターに入れてスイッチ、だった
- 527 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/23(水) 23:51:05.54 ID:Ed2C94gyM.net]
- Win32とかゲーム開発する時は必須だろ
デバッグ中はprintf使ったりするけど、最終的にはバイナリに標準ライブラリのコードは含めない
- 528 名前:デフォルトの名無しさん (スップ Sdb3-jt3B) mailto:sage [2023/08/23(水) 23:56:23.25 ID:6N7MylZZd.net]
- GNUみたいにそれなりの人たちがディスカッションして作ったものではなく
いかにもマイクロソフトのサラリーマンプログラマたちが適当に会議して作った仕様に見えるので信仰の対象にしてるのは気がしれんw
- 529 名前:デフォルトの名無しさん (ワッチョイ 4102-DaUO) mailto:sage [2023/08/24(木) 00:03:34.65 ID:7wZt4qen0.net]
- >>523
Win16でmallocなんか使ってたらころされてしまいますよ
- 530 名前:デフォルトの名無しさん (ワッチョイ 2b63-/QKx) mailto:sage [2023/08/24(木) 00:24:02.15 ID:0ALYOmXL0.net]
- そこでfar pointerです
- 531 名前:デフォルトの名無しさん (スップ Sdb3-jt3B) mailto:sage [2023/08/24(木) 00:43:25.45 ID:NfI5GYO1d.net]
- 16ビットで十分なハンドル値をnearポインタにキャストするというのはいいアイデアだった
- 532 名前:デフォルトの名無しさん (ワッチョイ 7101-vfxM) mailto:sage [2023/08/24(木) 00:56:52.45 ID:hEI/Eij50.net]
- あぁなるほど!
16bitの頃のMSの貧弱な開発環境で育ったせいで 標準Cに対しては屈折した気持ちのままなのねw
- 533 名前:デフォルトの名無しさん (ワッチョイ db79-wKkg) mailto:sage [2023/08/24(木) 01:06:43.62 ID:W+JHQ2GG0.net]
- 標準ライブラリは古いつーか実環境を考慮してないだけでbit数はあまり関係ない…
理解してないのに無理に話に入ってこんでもいいぞ
- 534 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/24(木) 01:26:43.52 ID:WP7jiBq4M.net]
- >>526
いや、初期のマイクロソフト知らないのかよw 闘うプログラマーとか読んでみろ めちゃくちゃおもろいよ そんなことも知らないとか、モグリも大概にしろ
- 535 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/24(木) 01:40:06.60 ID:WP7jiBq4M.net]
- macOS(iOS)のアプリ作る時は、OPENSTEP由来のFoundationフレームワークを使うだろ
こうなるとprintfも使わずにNSLogばっかりだなw
- 536 名前:デフォルトの名無しさん (ワッチョイ 93ad-hPrW) [2023/08/24(木) 02:24:55.77 ID:LAGetXxi0.net]
- そもそもC言語で新規開発すること自体がほとんどないので標準ライブラリ使うかどうかは今となってはどうでも良い。
- 537 名前:デフォルトの名無しさん (スフッ Sdb3-G+yN) mailto:sage [2023/08/24(木) 07:36:25.07 ID:6SD6OvDLd.net]
- macOS以前のmacのCはもっとひどかった黒歴史
- 538 名前:デフォルトの名無しさん (スッププ Sdb3-jt3B) mailto:sage [2023/08/24(木) 12:16:23.79 ID:50jyCEBUd.net]
- >>532
その手の本を本気にするなよ恥ずかしいw 小説だぞ
- 539 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/24(木) 12:58:04.14 ID:piehDxfAM.net]
- >>536
それで煽ってるつもりかよw 知らないなら黙ってろよ
- 540 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/24(木) 13:05:10.53 ID:piehDxfAM.net]
- 闘うプログラマーをディスる奴が居るとはな
さすがモグリは違うw
- 541 名前:デフォルトの名無しさん (スッププ Sdb3-jt3B) mailto:sage [2023/08/24(木) 16:07:54.33 ID:s7pHw0+wd.net]
- お前の聖書を貶されて怒るのはわかるが
ただの宗教を他人におしつけるなw
- 542 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 893e-glFA) mailto:sage [2023/08/24(木) 17:35:21.45 ID:575mCkoc0.net]
- 「綺麗なのは使われてないものだけ」みたいな格言をどっかで見た。
- 543 名前:デフォルトの名無しさん (オイコラミネオ MM1d-YAjS) mailto:sage [2023/08/24(木) 22:11:17.69 ID:ypVJRmCUM.net]
- 闘うプログラマー懐かしいな
随分と前に上下巻の頃に読んだ うろ覚えで申し訳ないがwinodwsのAPIセットを考えるのにカトラーと幹部がクルーザーを1~2週間借りて 湖でクルージングしながらゆっくり考えたってところが印象的 クリエイターって感じで良かった
- 544 名前:デフォルトの名無しさん (オイコラミネオ MM1d-YAjS) mailto:sage [2023/08/24(木) 22:22:10.52 ID:ypVJRmCUM.net]
- 残りの人生がどれだけあるか知らないけどそういう環境でそういう仕事してみたいなと思う
- 545 名前:デフォルトの名無しさん (ワッチョイ 2b63-/QKx) mailto:sage [2023/08/24(木) 22:45:31.31 ID:0ALYOmXL0.net]
- C言語の開発って、
ジャングルの中、誰からも支援を受けずに 自給自足で生き残って敵に勝つイメージがあるな 必要な道具は自分で作るみたいな 恵まれた環境で使うには難しい世の中になってきた
- 546 名前:デフォルトの名無しさん (ワッチョイ 9302-e/Qn) [2023/08/24(木) 23:08:24.66 ID:egx7h1gE0.net]
- 闘うプログラマー読んだことないモグリだけど
カトラーがDECから来る前からWindows APIはあったよね?
- 547 名前:デフォルトの名無しさん (オイコラミネオ MM1d-YAjS) mailto:sage [2023/08/24(木) 23:36:03.41 ID:ypVJRmCUM.net]
- Windowsは1.0からあるからなあw
闘うプログラマーはNTの開発物語 カトラーが関与したのはWindowsNTのAPIセット
- 548 名前:デフォルトの名無しさん (テテンテンテン MM4b-0mpE) mailto:sage [2023/08/24(木) 23:47:18.67 ID:Nhyf7NRLM.net]
- カトラーが実装したのはカーネルレベルのAPIでしょ
Win32はその上にある
- 549 名前:デフォルトの名無しさん (オイコラミネオ MM1d-YAjS) mailto:sage [2023/08/25(金) 00:02:25.25 ID:fBea/yqOM.net]
- win32はもともとWindows NTの機能だよ
それにカーネルだけ実装してWindows NTを発売したとは思えないけど 3.1とかはwin16 ついでNTでwin32 そのあと95が出てくる
- 550 名前:デフォルトの名無しさん (ワッチョイ 2b63-/QKx) mailto:sage [2023/08/25(金) 00:08:33.68 ID:NrcyVyXF0.net]
- フリーセルはWIn32sで動いていたんだよな
- 551 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 893e-glFA) mailto:sage [2023/08/25(金) 00:18:17.29 ID:EDIsU9Tc0.net]
- あの頃はネット接続も一般的ではなかったから Win32s は雑誌の付録とかの形でよく入ってたのを覚えてる。
俺はテックウィンの付録CDから入れたわ。
- 552 名前:デフォルトの名無しさん (ワッチョイ a19a-SOGH) mailto:sage [2023/08/25(金) 07:12:39.12 ID:Fur8du0o0.net]
- >>533
macOS(Mac OS X)になって、旧Mac OS由来のCarbon APIのサポートのため Foundationの下にCoreFoundationというCの共通ライブラリが作られたよね すなわちC言語が基礎と。おそらく今でも Carbon亡き今、CoreFoundationを直接使う必要はほぼないけど 書式出力は文字列のクラス(NSString/CFString)に含まれるというべきかな NSLogも書式出力を受け付けるが、元々ログ出力関数なので
- 553 名前:デフォルトの名無しさん (ワッチョイ 4d20-lN7b) [2023/08/31(木) 01:23:37.12 ID:zNsdnZGD0.net]
- Cの規格書の 7.15.1.1 va̲arg には以下の記述があります。
次の実引数が実際にはない場合,又は型が実際の(既定の実引数拡張に従って拡張された)次の実引数の型と適合しない場合,次に掲げる二つの場合を除いて,その動作は,未定義とする。 − 一方の型が符号付き整数型であり,もう一方の型が対応する符号無し整数型であり, そしてその値が,両方の型で表現可能な値である場合。 − 一方の型がvoid型へのポインタであり,もう一方の型が文字型へのポインタである場合。 これは例えば、可変長引数をとる関数にNULLポインタを渡し、呼び出された側で FILE *fp = va_arg(ap, FILE *); として受け取ってはいけない、という事を指すのだと理解しています。 なぜこのような規定が設けられたのでしょう?
- 554 名前:デフォルトの名無しさん (ワッチョイ 355f-vHpx) mailto:sage [2023/08/31(木) 04:18:42.26 ID:0tscOvRb0.net]
- >>551
実引数と適合しない型で取り出す場合の組み合わせは無数にあり、 多くは無意味でそのすべてについて結果を規定するのは大変だし必要無いので 最低限必要と思われる範囲で動作が規定されている、と考えれば自然。
- 555 名前:デフォルトの名無しさん (ワッチョイ 86cf-TDjq) [2023/08/31(木) 06:17:20.33 ID:2za9g7aR0.net]
- >>551
そこで規格がしてるのは特定の事柄を想定した話じゃなくて、単に責任の所在について言及してるだけだよ va_argで指定する型と実引数の型を合わせるのはユーザーの仕事だ、合わない場合は動作を未定義にするよってこと C FAQ 11.34を参照のこと また、2つの例外事項はその部分はコンパイラ側が推測して補正出来る事項なのでそこは許容するよってこと
- 556 名前:デフォルトの名無しさん (テテンテンテン MMde-4wgn) mailto:sage [2023/08/31(木) 08:59:50.92 ID:lOSXeWouM.net]
- >>551
NULLポインターはFILE*と適合(compatible)してるから問題ない そこに書いてあるのは適合しない場合の事
- 557 名前:551 (ワッチョイ 4d20-lN7b) [2023/08/31(木) 19:57:18.34 ID:zNsdnZGD0.net]
- 多数の回答ありがとうございます。
おおむね、先に挙げた例に対しては「問題ない。規格に適合している」とのご意見のようです。 しかし、先に挙げた問題を解決することを目的(の1つ)として、C23では新たに nullptr 定数が設けられる、とも聞いています。 実はそもそも「そんな問題などなかった」という事なのでしょうか?
- 558 名前:デフォルトの名無しさん (ワッチョイ 3e79-FVin) mailto:sage [2023/08/31(木) 21:01:54.47 ID:xuZfOSNk0.net]
- 「逆に」とか「実は」とか中二病は好きだよね
その規格書の文章が判りやすいとも思えないから好きに解釈していいよ
- 559 名前:デフォルトの名無しさん (ワッチョイ a910-/+sI) mailto:sage [2023/08/31(木) 21:03:14.12 ID:Ku+D9NQz0.net]
- クソどうでもいい。現実の問題を正しく定義しろカス
- 560 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E) mailto:sage [2023/08/31(木) 22:30:14.55 ID:n7krQh8u0.net]
- >>554 >>555
私の解釈では規格に沿っているとは言えないと思う。 C では整数定数としての 0 は特別な地位にあって空ポインタの定数としても使えるので #define NULL 0 といった定義でも言語仕様を満たすし実際にこういう定義になっていることも多いのだけれど 状況によっては単に整数と解釈されてしまうことが問題になる。 可変長引数で FILE* を期待しているところに空ポインタを渡すのは許されるが NULL と書くと (それ単体では整数型なこともあるので) ポインタとは適合しないことがあり得る。 仕様に厳密に言えばその場合の実引数は (void*)0 とか (void*)NULL とか書かないといけない。 大抵の処理系では問題にならないように上手いこと調整されている。 #define NULL 0LL みたいな感じで (その処理系における) ポインタと同じサイズの整数で定義しておけば一般的な ABI では大丈夫。 (だが言語仕様で保証しているわけではない。) NULL は整数とポインタを兼ねる (ような定義でも許される) というのが 歴史的経緯によるあまりにもグダグダな場当たり的な規則なので常識的に考えてあかんやろという話。
- 561 名前:デフォルトの名無しさん (スプープ Sdca-+nJJ) mailto:sage [2023/08/31(木) 22:30:45.52 ID:zVsC0t7Ed.net]
- >>555
>として受け取ってはいけない、という事を指すのだと理解しています。 君のこの理解が間違っていた それだけでしょ
- 562 名前:デフォルトの名無しさん (ワッチョイ 355f-vHpx) mailto:sage [2023/08/31(木) 22:49:56.13 ID:0tscOvRb0.net]
- >>554,555
可変長引数として渡したオブジェクトポインタは実引数拡張により全部 void* になるから、 typedef void FILE; とでもなっていない限りは適合するとは言えないよ。 va_arg(ap, FILE *) として受け取ってはいけない(移植性を損ねる)ということで合ってる。 そもそも適合は型と型の関係だから「NULLポインターはFILE*と適合」はおかしい。
- 563 名前:551 (ワッチョイ 4d20-lN7b) mailto:sage [2023/08/31(木) 23:05:28.70 ID:zNsdnZGD0.net]
- >>558
処理系によってはNULLが (void *)0 でなく、 0 と定義されているかもしれない(から駄目)という事ですね。 納得しました。ありがとうございました。
- 564 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E) mailto:sage [2023/08/31(木) 23:08:37.85 ID:n7krQh8u0.net]
- >>560
よく確認してみたら確かにそうだわ……。 NULL が整数として解釈される可能性を考えるまでもなく void* と FILE* は適合しないな。 ポインタが適合する条件としては同一の修飾がされていることに加えて 両者が適合する型のポインタでなければならないことになってる。 void と FILE は適合しないのだから void* と FILE* が適合することもない。
- 565 名前:551 (ワッチョイ 4d20-lN7b) [2023/08/31(木) 23:38:40.05 ID:zNsdnZGD0.net]
- NULLについては納得しましたが、まだ疑問が残っています。
同じポインタ型であっても、保証されているのは、 「一方の型がvoid型へのポインタであり,もう一方の型が文字型へのポインタである場合」 だけとなっています。この制約の意図が不明です。 例えば、可変長引数をとる関数に (void *)NULL を渡し、呼び出された側で FILE *fp = va_arg(ap, FILE *); として受け取るのも不適合に思えます。 この場合でも、(例えば)アライメントの問題があり、互換が保証できるのはvoid型へのポインタと文字型へのポインタだけ、といった事なのでしょうか?
- 566 名前:デフォルトの名無しさん (テテンテンテン MMde-4wgn) mailto:sage [2023/09/01(金) 00:09:17.26 ID:EYRyaWRCM.net]
- >>560
適合しない場合ってのは、FILE*とint*とかを言うのだろう void*とFILE*は適合しないのか? それとNULLを0なんかに定義してたら、NULLはintとしか適合しなくなる なのでNULLポインターは((void*)0)と想定している
- 567 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E) mailto:sage [2023/09/01(金) 00:20:09.48 ID:gaibfzWk0.net]
- >>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 であることは許容される。
- 568 名前:551 (ワッチョイ 4d20-lN7b) mailto:sage [2023/09/01(金) 01:19:09.35 ID:APE9whcz0.net]
- >>565
適合する型なら許される、という点は理解しています。 しかし「void* と FILE* は適合しない」のであれば、 >>563 の例も不適合ではないでしょうか? また、不適合であっても void* と char* の組み合わせ の場合なら許される理由は何でしょう?
- 569 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E) mailto:sage [2023/09/01(金) 01:43:08.25 ID:gaibfzWk0.net]
- >>566
総合的に言って不適合という理解で正しいということになる。 void* と char* は適合の規則からすると適合ではないのだけれど、 その表現や境界調整は等しいことを保証する規則があるので この場合に適合と同等の扱いをしても問題にならないから、 まあ出来るようにしておけば便利なこともあるんとちゃうんかなぁ。
- 570 名前:デフォルトの名無しさん (テテンテンテン MMde-4wgn) mailto:sage [2023/09/01(金) 02:40:24.68 ID:EYRyaWRCM.net]
- >>565
ポインターに0の代入は問題ないけど、ここでの話は可変個引数に渡した時の事を言ってるので((void*)0)じゃないと不味いでしょ
- 571 名前:デフォルトの名無しさん (テテンテンテン MMde-4wgn) mailto:sage [2023/09/01(金) 02:50:24.64 ID:EYRyaWRCM.net]
- >>565
6.7.5.1では、FILEとvoidが適合しないといけない旨の記述があるけど、voidというのは普通に比較して適合かどうか判定できる型なのか? 特別なルールが有って然るべきな気がするけどね
- 572 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E) mailto:sage [2023/09/01(金) 09:38:35.84 ID:gaibfzWk0.net]
- >>568
不味いけど NULL が 0 のことはあるという話。
- 573 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E) mailto:sage [2023/09/01(金) 18:08:19.15 ID:gaibfzWk0.net]
- 何の話をしてたんだかよくわからんようになったので >>551 を読み返してたんだが
規定が設けられた理由が根本的な疑問ということでいいんかな。 当然だが引数を受け取る側の想定と異なるものを渡したら破綻する。 普通の関数ならコンパイル時に受け取る側と渡す側の型の間に不整合が合ったら コンパイル時に検出できるし、条件に合えば暗黙の変換もするんだけど 可変長引数の場合は実行時にならないとわからないので 調整する必要なく渡せる条件を規定したらそうなったって感じだと思う。 整数は負数が絡まなければ同じ表現だし void* と char* にも互換性があることも保証されているので 問題にならない。
- 574 名前:デフォルトの名無しさん (ワッチョイ 8646-FlCC) mailto:sage [2023/09/01(金) 19:53:17.39 ID:El2JpNjt0.net]
- ポインタ苦いか塩つぱいか
そが上に熱き涙をしたたらせて コードを書くはいづこの里のならひぞや 「まずい」や「拙い」でなく「不味い」と書かれると、つい...
- 575 名前:デフォルトの名無しさん (アウアウウー Sa11-sVGh) [2023/09/01(金) 20:42:45.29 ID:5C0TsKNSa.net]
- メモリの先頭をいじっている時点で頭がおかしいが
- 576 名前:デフォルトの名無しさん (アウアウウー Sa11-sVGh) [2023/09/01(金) 21:08:05.68 ID:5C0TsKNSa.net]
- ヌル文字の実体が数値のゼロということから思いついた理屈なのかな?
ポインタはアドレスで、そのアドレスに格納されている値のことではない。
- 577 名前:551 (ワッチョイ 4d20-lN7b) mailto:sage [2023/09/01(金) 21:13:54.66 ID:APE9whcz0.net]
- >>571
色々ありがとうございました。 素朴に考えて、呼び元がポインタを渡し、 それを呼び先がポインタとして受け取れば (それが何型へのポインタであろうとも) 普通に安全そうに見えるのに、何でこんなに厳しいのか? そう決まった理由が知りたかった為の質問でした。 誰か、そこら辺の事情を知っている人はいないか? と。
- 578 名前:デフォルトの名無しさん (ワッチョイ d95f-sVGh) [2023/09/01(金) 21:37:10.15 ID:qVeR1pY40.net]
- >>575
C言語のポインタは単にアドレス ただし、構造体なら構造体、関数なら関数で、メモリ上に決まった配置をされるので、なんのポインタかわからないと、メモリのアドレスをずっと追いかけることになる。 コンピューターそのものにはデータ型というものは存在しない。
- 579 名前:デフォルトの名無しさん (スプープ Sdca-+nJJ) mailto:sage [2023/09/01(金) 22:14:19.34 ID:LLAg+6GRd.net]
- >>575
単純にアラインの問題じゃないの char型なら1バイト単位だからどんなアドレスでもOKだが それ以上のサイズの変数へのポインタは他のポインタへ変換できない可能性があるというのがたてまえで
- 580 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a13e-e+8E) mailto:sage [2023/09/01(金) 23:22:02.51 ID:gaibfzWk0.net]
- >>575
ポインタの表現は、それが指す先の型によって異なることも言語仕様としては許されるはず。 §6.2.5 でポインタの表現や境界調整要求が等しくあるべき条件が規定されていて それ以外の条件では同じ表現または境界調整要求を持つ必要はないと書かれてる。 まあそんなアーキテクチャがどれくらい存在するのかは知らんけど
- 581 名前:デフォルトの名無しさん (テテンテンテン MM7f-cJIa) mailto:sage [2023/09/02(土) 00:36:03.53 ID:WsIZ4FVlM.net]
- いやいや、ポインター(アドレス)自体はアライメントされてない所に格納されてるかもしれんけど、中身のアドレス自体は問題ないアライメントになってることが保証されてるでしょ
オマエらは何を言ってるんだ?
- 582 名前:デフォルトの名無しさん (ワッチョイ ffad-5+Xn) [2023/09/02(土) 00:41:32.42 ID:VX6uRHRw0.net]
- farポインタみたいにバイト数の違うポインタも混在していたら余計にややこしい問題に・・・
- 583 名前:デフォルトの名無しさん (テテンテンテン MM7f-cJIa) mailto:sage [2023/09/02(土) 01:01:48.59 ID:WsIZ4FVlM.net]
- 例えばFILE*とshort*ならアドレスのアライメントが合わない場合があるだろうけど、これはそもそも型が適合しないわけでどうしようもない
でも、今考えたらvoid*はありとあらゆるアドレスを取る可能性が有るから、それに合うのはchar*しかないよ、ということを言いたかったのだろうなと気付いた でも規格書を見ても、FILE*とvoid*が適合するかどうかはアンドキュメンテッドだなw 現実には((void*)0)とFILE*は完全に適合してるけどね
- 584 名前:551 (ワッチョイ 2320-+GqY) mailto:sage [2023/09/02(土) 06:58:16.01 ID:XjF1xIbI0.net]
- ここにこう書いてあるからには、何か(通常の関数呼び出しでは
問題にならないが)可変長引数特有の問題があり、 それを避けるためにこうしたのだろう、と思った訳です。
- 585 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 11:49:29.07 ID:+azsBNOBd.net]
- >>579
そんな保証はまったくない 例えばmallocの場合戻り値は「あらゆる組み込み型に対応できるようにアラインメントされる」と特に注釈されている 逆に言えばvoid*はどんなポインタにキャストしても安全と思い込みがちだがそんなことはないということ >>582 通常の呼び出しなら型チェックが働くが可変長呼び出しでは一切働かないという注意だろう 最近のprintfは型チェックされるようになってるけど
- 586 名前:デフォルトの名無しさん (ワッチョイ cf63-yzHn) mailto:sage [2023/09/02(土) 11:59:23.66 ID:R1w1jy3B0.net]
- 安全かどうかは、環境によるんじゃ
- 587 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 12:34:31.87 ID:DeBIPPsBd.net]
- 「環境による」のは安全ではないんだよ
ここで取り上げられてるのは大元の公式文書なのであらゆる環境について言えることが書いてある
- 588 名前:デフォルトの名無しさん (ワッチョイ cf63-yzHn) mailto:sage [2023/09/02(土) 12:59:05.22 ID:R1w1jy3B0.net]
- マイナーなCPUのことなんか気にしたことがなかったな
- 589 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va) mailto:sage [2023/09/02(土) 13:12:11.45 ID:Ng1Dtdjk0.net]
- >>584
現在の文脈では「言語仕様をそう決めた理由」が主題。 だからその前提として言語仕様が保証している範囲がどこまでかを 理解しておく必要があって、そこで見当違いの主張に反論がされている という話の流れ。
- 590 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 14:05:43.49 ID:DeBIPPsBd.net]
- >>586
「可搬性」という概念はCでは大事 マイナーなCPUのみならず将来的に登場する高性能だが制限が多いCPUでも手直しせずに動かせるということもあるかもしれない
- 591 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy) mailto:sage [2023/09/02(土) 14:41:25.26 ID:Ng1Dtdjk0.net]
- 必要なら環境依存なことをしやすいのも C の良いところだが
不必要な依存は避けるに越したことはないわな
- 592 名前:デフォルトの名無しさん (アウアウウー Sae7-fXI3) [2023/09/02(土) 14:45:40.34 ID:mCX3wjBNa.net]
- FILE *fp = fopen(...);
void *hoge = (void *)fp; FILE *fuga = (FILE *)hoge; みたいなことは禁止されてる?
- 593 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 14:59:50.63 ID:wu0IBgrgd.net]
- どうしても必要ならやるしかない
ただfopenの戻り値でFILE構造体の安全性が保証されてるのにわざわざvoid*に代入してからFILE*に戻すのは 正統な金なのに闇銀行に預けて再びマネーロンダリングするような変な手間だ
- 594 名前:デフォルトの名無しさん (ラクッペペ MM7f-ymsf) mailto:sage [2023/09/02(土) 15:08:48.05 ID:68c+QhTKM.net]
- void *型って参照する先の変数のサイズが不明なので右辺値になるのは不可能な気がするけどな
キャストは無理でしょ
- 595 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy) mailto:sage [2023/09/02(土) 15:12:41.39 ID:Ng1Dtdjk0.net]
- >>590
オブジェクトを指す (つまり関数ポインタではない) ポインタを void* に変換してから元の型に変換すると 元のオブジェクトと等しいことは保証されている。
- 596 名前:デフォルトの名無しさん (アウアウウー Sae7-fXI3) [2023/09/02(土) 15:26:23.14 ID:mCX3wjBNa.net]
- >>592
void じゃなくてもいいや FILE *fp = fopen(...); char *hoge = (char *)fp; FILE *fuga = (FILE *)hoge; みたいなことは禁止されてる?
- 597 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 15:40:22.87 ID:iw53wgLpd.net]
- >>592
なんで? ポインタはメモリ上の一点を指すもので インクリメントデクリメントが不可能なだけで キャストは可能 >>594 いったい何が聞きたいんだ? 禁止はされてないよ ただこれ見たプログラマは皆「バカだなあw」とは言うだろうw
- 598 名前:デフォルトの名無しさん (ワッチョイ 7310-/gcr) mailto:sage [2023/09/02(土) 15:52:38.82 ID:f6/YEIJg0.net]
- 言葉をちゃんと使うとプログラマ意思疎通がよくなるのでは。
「void * が右辺値になるのは無理」って何だよ。ではなく、正常動作はプログラマの責任になる、って言いたかったんじゃないの? >>590 みたいなコードは、これだけなら疑問に思うだろうが、こういうコードが有効になる事はあるよ。その一例は 「ここで言うFILE* みたいなモノが複数種類あり」 送信側 - 中継機能 - 受信側 のプログラム構造で送受信のペアは複数あり、中継機能には 実際の中身が何なのかは意識させたくない。 ---- ポインタの話から外れて恐縮だが、 例としてタグ・レングス・バリュー形式ってのがあって、「中継者は送受信データがTLV形式の連続であることだけは知っていて」「TとLのサイズは一定」「タグの種類が何種類あるかなんて知らなくていい」 ---- これにさらにポインタを含むデータ構造を通信可能にするには?って話で、ポインタ型をバッファ内インデックス値に変換して、ポインタが指す中身も通信データに含める、とか、 サブ構造がポインタ持ってたら再帰的に処理する、とか話は続くが それはいいとして >>590 みたいなコードは、現実にはあるよ。という話
|

|