- 1 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 12:11:46.61 ID:xxeaCAplM.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 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言語なら俺に聞け 157 https://mevius.5ch.net/test/read.cgi/tech/1624846971/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 361 名前:デフォルトの名無しさん [2022/03/19(土) 15:38:29.74 ID:CZI3HevE0.net]
- よくわからない場合や使うと分かり辛くなる場合は使わないで冗長な書き方した方が良いかも知れない。
使わなくても最近のコンパイラは最適化掛ければ適当にうまいことやって最終的に作られるコードは同じになる可能性が高いと思う。
- 362 名前:デフォルトの名無しさん [2022/03/19(土) 17:00:25.72 ID:mw5TX/57a.net]
- b = a++;
の右辺を評価した結果は aの元の値で、副作用として aのアドレスにあるオブジェクトをインクリメントしているのでは 代入されるのは aの内容でなく、アドレスを持たない値で
- 363 名前:デフォルトの名無しさん [2022/03/19(土) 17:03:51.29 ID:mw5TX/57a.net]
- a++ は右辺値で、 ++a は左辺値
- 364 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 17:12:51.80 ID:X795CU5ld.net]
- どっちも右辺値としないとまずい
int main(){ int a=0; int* p; p=&(++a); // コンパイルエラー p=&(a++); // こっちも }
- 365 名前:デフォルトの名無しさん [2022/03/19(土) 17:42:57.61 ID:mw5TX/57a.net]
- そうだね、失礼しました
- 366 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 17:50:05.80 ID:nPptgbtB0.net]
- : BassClass(
std::format (IdPrefix, index, numBank)),( std::format (NamePrefix, ++index, numBank)) ちょうどこんな感じのコンストラクタでラッパーするコード書いてたんだけど インクリメントしてない方までつられて増えちゃうんだよね C++のコード片でスマソン
- 367 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:11:19.38 ID:8Fsv/onud.net]
- d = ++a + b-- + --c + a++;
この結果は ++a; --c; d = a + b + c + a; b--; a++; だよね 実際はこんな書き方しないほうがいいがw
- 368 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:25:12.86 ID:d0FibUHe0.net]
- >>362
> d = ++a + b-- + --c + a++; > この結果は ++a と a++ とが順序付けされないので未定義動作。
- 369 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 18:39:08.49 ID:Uza1/JxDM.net]
- 両方未定義じゃね?
>>361 の方はちょっと自信ないが >>362 の ++a + a++ はダメだったような気がする
- 370 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:05:15.57 ID:9SMEw2CG0.net]
- 以下のような関数がインラインで実行されてるだけで、評価自体は++が先に行われてるんでないの?知らんけど
int inc(int* a) { int ret = *a; *a = *a + 1; return ret; }
- 371 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 19:10:54.79 ID:fJWxsuK3a.net]
- 引数の評価順なんてCPUでも変わるだろ。
- 372 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 20:25:22.26 ID:hj0ig94x0.net]
- 未定義動作警察だ!
未定義動作の動作は定義されていないのでコンパイラは何をしてもいい > d = ++a + b-- + --c + a++; このコードの場合、 ++a;--c;d=...; b--;a++;相当のコードを吐いてもいいし、 tmp=a;a=tmp+1;--c;d=...; b--;a=tmp+1; 相当のコードを吐いてもいい。 大抵は未定義動作がないことを前提に最適化をかけるが。 極端なことを言えば、d=42としてもいい。 この文の見た目の動作は定義されていないから
- 373 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 00:26:15.18 ID:dAApHicf0.net]
- fgetsのファイル終了・エラー時の戻り値がNULLなのはなぜですか?
他の入出力関係の関数の戻り値はEOFになっています いま入出力の勉強をしてるんですが、関数の引数や戻り値が少しずつ違うので覚えるのが難しいです 使っていくうちに覚えていくものでしょうか?
- 374 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 00:53:13.92 ID:tmhbCmKs0.net]
- 細かな仕様はよく使うもの以外は毎度調べるよ
まあCの関数は数が少ないから全部覚えてるって人も少なくないかも
- 375 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 00:57:50.69 ID:rKPZjyik0.net]
- よく使う関数の戻り値調べると面白いぞ
printfが何を返しているかとか、それは何故なのかとか 戻り値を使っている人を見たことがないけれど
- 376 名前:はちみつ餃子 mailto:sage [2022/03/20(日) 01:37:41.92 ID:u4Grkyrm0.net]
- >>361
こういう場合については未定義ではないが未規定の動作が含まれる。 副作用完了点の間で同一のオブジェクトに複数回の書き換えが生じた場合には未定義の動作となるが、 書き換えが一度の場合はその書き換えがどのタイミングで起こるかわからないというだけで、 未定義の挙動にはならない。
- 377 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 08:21:37.14 ID:e7HuEm7id.net]
- >>368
fgetsの戻り値は文字列へのポインタであり いっぽうEOFは文字(じゃなくてintだけど気分的には)なのだ
- 378 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 10:46:46.29 ID:+oGVYZOT0.net]
- 組み込みのソフトしていると
使わない関数が多くて忘れていきます
- 379 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 11:48:15.83 ID:w4XPcyomd.net]
- <stdio.h>は使えないとして組み込み系って使える標準ライブラリあるの?
- 380 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 12:55:28.41 ID:DiBIkIVz0.net]
- windows.h
- 381 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 13:05:34.82 ID:w4XPcyomd.net]
- 使える標準ライブラリを聞いたつもりなんだが
あと<Windows.h>はOS依存のライブラリな
- 382 名前:蟻人間 mailto:sage [2022/03/20(日) 13:25:28.64 ID:y5NxTTYed.net]
- 標準っていっても何の標準かわからん。
ANSI CとかC89とかあるだろ。
- 383 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 13:41:32.19
]
- [ここ壊れてます]
- 384 名前:ID:w4XPcyomd.net mailto: ANSI C, C89〜C17 の規格で存在を要求されてるライブラリ
組み込みコンパイラだとそもそもC89かC99しかサポートしてないだろうし、 fileIOとかは欠けてるだろうから何なら使えるか聞きたい 組み込みの環境も多数あるだろうから >>373 みたいな人が普段どういう関数使ってるか気になった [] - [ここ壊れてます]
- 385 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 13:42:12.13 ID:e7HuEm7id.net]
- それぞれ組み込むシステムに付属してるだろ
一元的な名前はない ひょっとしたらstdio.hという名前かもしれない
- 386 名前:デフォルトの名無しさん [2022/03/20(日) 14:14:31.30 ID:4KnLtgrc0.net]
- 組み込みって言っても小さくても Linux 動いちゃうようなのもあるし、何とも言えんな。
- 387 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 14:19:28.79 ID:BOo0cJz/a.net]
- string.h は普通に使えた
- 388 名前:はちみつ餃子 mailto:sage [2022/03/20(日) 17:31:23.40 ID:u4Grkyrm0.net]
- C の規格は「規格合致ホスト処理系」「規格合致フリースタンディング処理系」を規定していて、
フリースタンディング処理系はライブラリとして float.h iso646.h limits.h stdarg.h stdbool.h stddef.h stdint.h の内容に限定している。 この範囲なら実行環境に左右されずに用意できるはずという判断なんだろう。
- 389 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 19:31:33.68 ID:w4XPcyomd.net]
- 組み込み向けの最低限の規格があるのか
#defineとtypedefしかないが なるほどこれなら環境がどんなにショボくても用意できそう
- 390 名前:デフォルトの名無しさん [2022/03/20(日) 20:07:23.09 ID:mxx3UMQ+0.net]
- ファイルディスクリプタを使ってEOFを知りたいんだけどどうしたらいい?
普通にreadすりゃ0になるからわかるし、そもそもファイルなら
- 391 名前:求めたサイズより小さく読めるからわかるけど
ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい feofとかファイルポインタだで使えんがや [] - [ここ壊れてます]
- 392 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 20:57:34.02 ID:cOd2oDpEM.net]
- unblocking modeでopenしたfdをreadして判定すれば
- 393 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 22:28:44.17 ID:aLyHOWc60.net]
- ファイルのサイズを取得して、そこへseek するとか?
そもそも、ファイルを開いて、ファイルの終わりにseek できるかも。 元々、ファイルの追記モードもあるぐらいだから
- 394 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 22:54:16.07 ID:pl7vy6aed.net]
- >ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい
そもそもreadが終端まで来たらつぎにreadしてもファイルアクセスせずに0を返すから同じだろう
- 395 名前:デフォルトの名無しさん mailto:sage [2022/03/20(日) 23:19:06.05 ID:dAApHicf0.net]
- >>372
よく分かりました ありがとうございます
- 396 名前:384 mailto:sage [2022/03/21(月) 16:21:59.97 ID:nqBLTVDb0.net]
- >>387
後出し情報であれやけど readしたデータをどこかに送信、最後のデータには最後フラグを立てる みたいなやつなので、ぴったりのときに困ってたんよ バッファを2面用意して、すぐ送信せず常に1回貯めて送信するのが 正解なんだろうなぁ・・・ まあいいけど
- 397 名前:デフォルトの名無しさん [2022/03/21(月) 17:02:36.51 ID:geQt3ukX0.net]
- ファイルサイズと読み出し位置から残りサイズ計算するぐらいか?
- 398 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 18:07:17.68 ID:bPJRBgFUM.net]
- >>389
ファイルサイズわかってるならlseek(fd, 0, SEEK_CUR) で現在位置調べりゃいいだけかと
- 399 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 21:41:26.44 ID:nqBLTVDb0.net]
- 一応、ファイルじゃないときのことも考慮したかった
- 400 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 22:38:50.94 ID:j56ex+kVd.net]
- ファイルディスクリプタが0とか"/dev/stdin"という名前のファイルを考慮し始めたらそれはもう無理じゃ?
- 401 名前:デフォルトの名無しさん [2022/03/21(月) 23:41:34.24 ID:/12E7ImH0.net]
- なんかバグやセキュリティホールの温床になりそうだな。
- 402 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 23:55:00.11 ID:avj/Dp0k0.net]
- キャッシュとか、同期・非同期処理とか、ブロックされる・されないとか、
ブロックデバイス・シーケンシャルかとか、リダイレクト・パイプとか、 共有の有無とか、メモリ内共有かどうかとか、 そんな事を考えだしたら、キリがない なんせ、Linux API の7割は、IO の説明だから、10年以上掛かる
- 403 名前:デフォルトの名無しさん [2022/03/22(火) 02:05:16.87 ID:vyk85loe0.net]
- 1バイト単位なら fdopen() しちゃって FILE * でバッファリングさせた方が楽だな。feof() も使えるし。
1バイト単位ではなく1000バイト単位とか、大きい塊でバッファリングする必要がある場合は自作して feof() みたいなチェックができるようにする。 (それでも FILE * でのバッファリングがあった方が遅いストレージにあるファイルなら読み出し効率上がると思うが)。
- 404 名前:デフォルトの名無しさん mailto:sage [2022/03/24(木) 22:37:34.92 ID:jD8pMP9K0.net]
- 以下はライブラリバージョンが1より大きければ処理を有効する例です
#if LIBRARY_VERSION > 1 … #endif この「LIBRARY_VERSION」は何者ですか? どこに定義されているのでしょうか?
- 405 名前:デフォルトの名無しさん mailto:sage [2022/03/24(木) 23:58:11.94 ID:ItLF0V9z0.net]
- >>397
少なくとも標準仕様ではどこにも定義されてないです 説明のための例では?
- 406 名前:デフォルトの名無しさん mailto:sage [2022/03/24(木) 23:59:45.82 ID:bdM8JANZ0.net]
- MSVC環境ならカーソル合わせてF12キー押せばいい
gccとかは知らん
- 407 名前:デフォルトの名無しさん mailto:sage [2022/03/25(金) 00:14:08.19 ID:sET9XTXv0.net]
- >>397
独習Cからの抜粋と予想して記載します 複数の開発環境で同じヘッダファイルを使用する際の
- 408 名前:宴Cブラリバージョンの差異でエラーとなるのを防ぐための
テクニックです 各自が自分の開発環境に合わせて #define LIBRARY_VERSION 1などと 定義する必要があります [] - [ここ壊れてます]
- 409 名前:デフォルトの名無しさん mailto:sage [2022/03/25(金) 06:50:38.08 ID:0hAphrOld.net]
- いえ、それはそのライブラリの作者(メンテナンスしてる人)が標準ヘッダ内で定義すべき内容です
ユーザーは>>397を自分のファイル内で使用してバージョンの差異を吸収できます
- 410 名前:デフォルトの名無しさん [2022/03/26(土) 01:22:16.42 ID:EYuSPLit0.net]
- >>398,400,401
説明のための例のようですね、失礼しました あと、この定数が未定義の場合の値は0になるのですね そのあたりを理解していませんでした どうもありがとうございました
- 411 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 16:05:05.08 ID:EYuSPLit0.net]
- コンパイル(リンク)時に、同じプロジェクト内の別ソースの関数などを呼び出せるのはなぜ?
インクルードして教えてる訳でもないのに、もしかして全ソースを探しに行ってるんですか?
- 412 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 17:27:18.26 ID:T/pJeR6z0.net]
- 全ソースから探し出すのがリンク
includeとかで関数宣言だけは見えるようにする必要はあるが。 main.c ----------- char* func(int size); int main(){ char* p=func(16); } ----------- funcという名前の関数は、 前方宣言(1行目)してるのでリンク時に探しに行く。 リンク時の解決用に定義した関数(とその実装)を.objファイルに一覧としてまとめる。 リンクという作業では、.objと.libと.dllから"func"という名前の関数を探し出す。 見つからなかったり2つ以上見つかったらリンクエラーになる。 古いCだと前方宣言がなければ int func(); 決め打ちで前方宣言扱いしたりする。
- 413 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 18:26:49.41 ID:kmPIEuI7d.net]
- >>403
(古典的な)Cではアセンブラソースに変換してアセンブル→リンクされるが 通常の関数名や変数名はアセンブラのグローバルシンボルに変換され リンク時に他のアセンブラソースから参照できるようになる 一方関数内のローカル変数やstatic宣言された関数や変数はローカルシンボルとして扱われ他のアセンブラソースからは参照できなくなる
- 414 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 23:45:36.64 ID:EYuSPLit0.net]
- よく分かりました、ありがとうございました
- 415 名前:デフォルトの名無しさん mailto:sage [2022/03/27(日) 21:02:14.58 ID:angONFKk0.net]
- グローバル変数の修飾子の意味は次の意味で合っているでしょうか?
修飾子なし:変数の実体を定義 extern修飾子:定義済みの変数を参照する static修飾子:変数の実体を定義して、その変数を他のファイルからexternさせない
- 416 名前:デフォルトの名無しさん mailto:sage [2022/03/28(月) 11:08:20.21 ID:c4HYTfCO0.net]
- 適当にググって見つかったexternとstaticの解説
ttps://daeudaeu.com/extern/ ttps://daeudaeu.com/static/
- 417 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 00:24:04.59 ID:c+1KPnOj0.net]
- >>408
そのサイト含めいろいろ見て、それをまとめたのが>>407です 念のためどなたかに確認していただこうかと思って書き込みました
- 418 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 06:11:36.84 ID:7UUvIzLId.net]
- そんなに信用されてもw
- 419 名前:デフォルトの名無しさん [2022/03/29(火) 08:18:01.14 ID:C0VnxRTv0.net]
- 自分で色々なパターンでコンパイルして確認しないのかな?って思う。
- 420 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 08:55:46.71 ID:tKmNrPY6d.net]
- 正確な意味を知るには解説サイト見て回るより規格書見るほうがいい
real-c.info/indexDesc.html
- 421 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 13:03:41.11 ID:M0Gs9C4cM.net]
- llvm-14 の、ソースツリーの外にcmake ディレクトリができる下品な感じ、なんとかならないの?
- 422 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 15:17:04.78 ID:X58TTE+20.net]
- >>413
cloneしたディレクトリの直下にbuildディレクトリ作ってそこでcmake 〜 ../llvmじゃいかんの? 今どきソースのディレクトリで直接ビルドしないのは下品というより上品ではないですか
- 423 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 18:15:06.70 ID:U1DxU1KgM.net]
- >>414
>ソースツリーの外に 下品
- 424 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 18:20:46.45 ID:1zZAboUWM.net]
- ソースツリーの中にbuildフォルダ作るのは上品なん?
- 425 名前:はちみつ餃子 mailto:sage [2022/03/29(火) 18:47:55.98 ID:4oPH291+0.net]
- autotools でも out-of-tree build は出来るようにするのが一般的な作法。
あらゆるプロジェクトでそうしているというほどではないと思うけど、ごく普通にある。
- 426 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 22:23:02.11 ID:X58TTE+20.net]
- https://llvm.org/docs/CMake.html を見るとソースフォルダの外でビルドしなきゃいけないような感じに書いてあるけど、
https://clang.llvm.org/get_started.html を見るとリポジトリ直下にbuild作ってそこでビルドすればいいように書いてあるから、llvmはお上品にビルドできるのですわ
- 427 名前:デフォルトの名無しさん mailto:sage [2022/04/01(金) 12:18:00.47 ID:BXJ/mUbsM.net]
- llvm-14
まだゴミw 色んなものがダメになるw
- 428 名前:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B) mailto:sage [2022/04/12(火) 19:31:59 ID:B1tFLWvv0.net]
- char buf[256];
memset(buf, NULL, sizeof(buf));・・・(1) memset(buf, 0, sizeof(buf));・・・(2) (1)と(2)同じ事をしていると思うのですが、どっちで記述するのがメジャーですか?
- 429 名前:蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd02-qTly) mailto:sage [2022/04/12(火) 19:35:46 ID:Dt0TGPDOd.net]
- NULLはポインタだから(2)が正しいよ。
- 430 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a23e-vtdv) mailto:sage [2022/04/12(火) 20:06:33 ID:5njWaFr40.net]
- >>420
言語仕様に厳密にいうと前者で初期化しようとした場合に buf が 0 で初期化されることは保証されないし、 コンパイルエラーになることもありうる。 整数定数式の 0 がポインタに変換したときに空ポインタになることは保証されるので NULL が単に #define NULL 0 として定義している環境もよくあるんだが、 仕様上の NULL は「処理系定義の空ポインタ定数に展開する」ということになっていて 整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。 そんで「整数定数式の 0」がポインタに変換されたときに空ポインタになることは保証されるが、 定数式ではない文脈での整数の 0 は空ポインタになることは保証されていないし、 逆に空ポインタを整数に変換したときに 0 であるとも限らない。 if 文などの制御式としてポインタを置いても問題ないのは C の制御式は !=0 が補われたかのように動作するというルールのおかげ。
- 431 名前:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B) mailto:sage [2022/04/12(火) 20:07:57 ID:B1tFLWvv0.net]
- >>421-422
お早いレスサンクス わかりました
- 432 名前:ハノン mailto:sage [2022/04/20(水) 22:16:48.28 ID:vxzn/db60.net]
- >>422
>整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。 可変長引数にあるあるの最後に (char *)0 (なんで char * なんだ?)なんかがいい例ですね
- 433 名前:デフォルトの名無しさん (ワッチョイ 97b3-4qoo) mailto:sage [2022/04/22(金) 15:01:50 ID:YxI2bgUE0.net]
- (ソースtt.c)
#include <stdio.h> #include <math.h> void main() { double d; int a; d = 1.234; a = round(d); printf("%d\n", a); } $gcc tt.c /tmp/cc0NPwg6.o: 関数 `main' 内: tt.c:(.text+0x23): `round' に対する定義されていない参照です collect2: error: ld returned 1 exit status こんな短いソースなのに解決できない。助けてー(´・ω・`) OSはLinuxです
- 434 名前:デフォルトの名無しさん mailto:sage [2022/04/22(金) 15:04:48.71 ID:SxzvmxoM0.net]
- どうせリンクしてないとかそんなんだろ
- 435 名前:蟻人間 mailto:sage [2022/04/22(金) 15:05:51.08 ID:BJPJNuGwd.net]
- >>425
古いコンパイラにはroundがないかもしれない。
- 436 名前:蟻人間 mailto:sage [2022/04/22(金) 15:06:16.30 ID:BJPJNuGwd.net]
- -lm
- 437 名前:デフォルトの名無しさん mailto:sage [2022/04/22(金) 15:12:16.74 ID:SxzvmxoM0.net]
- gccなら -lmで動的リンクする簡易オプションがある、プログラム内だけで完結したいならコンパイラ付属のmathライブラリのソースも含めてコンパイル
- 438 名前:デフォルトの名無しさん mailto:sage [2022/04/22(金) 15:14:29.72 ID:SxzvmxoM0.net]
- 動的リンクだとmathは浮動小数点の扱いが実行環境に依存するので静的リンク推奨
- 439 名前:デフォルトの名無しさん mailto:sage [2022/04/22(金) 15:26:22.00 ID:YxI2bgUE0.net]
- ありがとう
gcc tt.c -lm でコンパイル通りました。
- 440 名前:デフォルトの名無しさん (スププ Sdbf-DCm/) mailto:sage [2022/04/22(金) 15:44:53 ID:I04xh82td.net]
- 割とよく使う標準ライブラリなのに一々リンク方法をユーザーに選択させるという事の意義を考えるように、おまじないじゃないぞ
- 441 名前:デフォルトの名無しさん mailto:sage [2022/04/22(金) 17:13:59.15 ID:RFW8R+x+d.net]
- roundかtruncかfloorかはたまたceilかもしれないrintとその一味のヤバいやつら
こんなもんさっさと追放しろよ
- 442 名前:デフォルトの名無しさん mailto:sage [2022/04/22(金) 17:31:11.41 ID:SxzvmxoM0.net]
- 整数型で表せない整数をdoubleで表したい時も稀にある
どうせ前後の整数(±1)は表せない不連続すきっ歯領域だし、どう丸まろうが影響無い部分だよ、って意図の明示に
- 443 名前:デフォルトの名無しさん mailto:sage [2022/04/22(金) 17:49:02.83 ID:SxzvmxoM0.net]
- 用途は思い浮かばないでもないが、適切に使われてないケースが多分99%
- 444 名前:デフォルトの名無しさん mailto:sage [2022/04/23(土) 13:45:19.22 ID:+Gd9xYyP0.net]
- 表せないときは整数型多倍長処理作る
- 445 名前:デフォルトの名無しさん [2022/04/24(日) 11:54:23.21 ID:S9c+iUdl0.net]
- GMPでそ
C++じゃないとちょっと使いにくいけど
- 446 名前:デフォルトの名無しさん (ワッチョイ 51e6-DWDP) mailto:sage [2022/04/24(日) 15:18:10 ID:Qwrn6LYl0.net]
- >>437
激しく同意 https://mevius.5ch.net/test/read.cgi/tech/1434079972/84
- 447 名前:デフォルトの名無しさん (スフッ Sd94-6n8/) mailto:sage [2022/04/25(月) 03:24:41 ID:LAuA6+3Dd.net]
- 多倍長整数とか言ってる人は意図汲めてなくね?
正確性も表現力も不要だけど、それでも整数に相当する巨大数が要るのは極を利用した求根アルゴリズム(方程式解法)とかでしょうよ たとえば、求めたい関数fの根がその逆数関数1/fの極と等しい事を利用するとか もしdoubleの範囲を多倍長整数/任意桁数演算で308桁を陽に扱必要があるけど、そもそも極判定は指数部のみで行えるわけで、各桁の数字を陽に保持する意味が無い 一方で指数が巨大なdoubleを生で足すのは悪手 丸めれば各々の積分経路での評価値は真値から一旦遠ざかるけど、一貫した丸めを行う限りは10000万回も足せば互いに相殺されて均される
- 448 名前:デフォルトの名無しさん mailto:sage [2022/04/25(月) 03:38:21.89 ID:LAuA6+3Dd.net]
- ちょっと拵えすぎたような設定だったかもしれないけど、300桁を陽に保持して、ハードウェアの恩恵も無しに一万回加算とか、向かないどころかあまりにも非現実的過ぎる例もある
という例程度に あとdouble使ってればinfが返ってくる可能性があるのが最大の利点 もしinfを引き当てられれば、それを与正入力がその浮動小数点実装における最高精度の解だと理論的に保証される
- 449 名前:デフォルトの名無しさん mailto:sage [2022/04/25(月) 03:44:18.07 ID:LAuA6+3Dd.net]
- 訂正と補足
それを与正→与えた入力 (1/f)(x)→inf と f(x) → 0 と fの根はそのx は論理的に同値
- 450 名前:デフォルトの名無しさん mailto:sage [2022/04/25(月) 05:05:51.34 ID:ueJIdSJ50.net]
- INF見付かれば恣意的に収束/発散閾値を調整しなくてエレガントだよな
俺は素性の事前に分かってて留数定理使えるような関数くらいしか扱わないから、気にせずそのまま足しちゃうわ 積分経路は(楽だから)正方形に取り、均等に4分割して極のある範囲を再帰的に絞り込んでる、下手にニアミスしたりするとかえって桁落ちしたりして整数倍からズレる ±0.1くらいなら、きっと極を囲めてるものと想定 Cで数値計算入門みたいな本で勉強してるけど、浮動小数点の特殊値とかエラーの扱いとかの記述が一切抜け落ちてて困る
- 451 名前:デフォルトの名無しさん (スフッ Sd70-6n8/) mailto:sage [2022/04/25(月) 19:15:48 ID:o7ajKrF0d.net]
- 実質ハードの実装に収束(発散)判定任せて綺麗に見えてるだけだがな
しかし比較無しに符号、複素数なら東西南北まで得られるのは便利
- 452 名前:デフォルトの名無しさん (ワッチョイ 73b3-jUKb) mailto:sage [2022/05/09(月) 06:57:39 ID:Egg1/KgR0.net]
- 20年くらい前、Windows98が使われてた頃なんですが
char s = ''; // ←シングルクォーテーション2個 っという書き方が許されてた記憶があるんですが、記憶違いかな? 今Linux上のgccでコレをコンパイルすると「error: empty character constant」になる
- 453 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 07:35:16.71 ID:QnLN+NJ0a.net]
- あえてなのかバグなのかは知らんけど20年前のコンパイラがそういう記法を通してたってだけだろ
- 454 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 08:27:27.53 ID:Egg1/KgR0.net]
- >>445
冷静に考えてみたらコンパイラもOSも違うからそういうことだな
- 455 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 10:42:17.80 ID:qGH53jdv0.net]
- ''で何が代入されるの?
- 456 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 11:12:38.36 ID:DLFHVgdp0.net]
- '\0' や 0 と同等の動作なんかねぇ
- 457 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 11:15:27.95 ID:DuxsXAR8M.net]
- 普通に考えれば空文字だと思う
- 458 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 11:35:54.50 ID:lTlzTKNA0.net]
- NULL 「何もないよー」な意味をあらわす単語
空文字 長さ0文字の文字列のこと この解釈でOK?
- 459 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 11:37:44.15 ID:DLFHVgdp0.net]
- 文字と文字列は違う 今話題に上がってるのは文字のほう
- 460 名前:デフォルトの名無しさん (ラクッペペ MMe6-PUK/) mailto:sage [2022/05/09(月) 12:02:23 ID:ItS/vT2KM.net]
- 長さ0文字の文字列なら""(ダブルコーテーション)では?
- 461 名前:デフォルトの名無しさん (アウアウウー Sa1f-KEdX) mailto:sage [2022/05/09(月) 14:03:39 ID:KBCMvYUWa.net]
- >>448
まあそれが一番ありがちかと
|

|