C言語なら俺に聞け 158at TECH
C言語なら俺に聞け 158 - 暇つぶし2ch349:デフォルトの名無しさん
22/03/16 05:23:40.43 sZ1wd+Ly0.net
有効範囲解決演算子はスレ違いだぞ

350:デフォルトの名無しさん
22/03/16 13:21:40.48 IYkrMFX0r.net
Cに namespace の概念ってある?

351:デフォルトの名無しさん
22/03/16 13:45:31.87 EozDCnXud.net
gotoラベル
構造体のtag名
構造体のメンバ名
それ以外
という概念のnamespaceならある
typedef struct A{int A;} A;
int main(){ A: return 0;}
で4種類のAを区別できるというだけで、ns::A とかの話ではないが

352:デフォルトの名無しさん
22/03/16 14:57:34.41 IYkrMFX0r.net
ああ
それぞれで固有の識別子を記憶する空間があるから ぱっとみの文字が衝突しててもセーフ
という概念か
コンパイラ記述するときにめんどくさそうね
文意からこっちのテーブルを参照すべきとか

353:デフォルトの名無しさん
22/03/19 11:24:46.11 fvSihUDg0.net
初歩的な質問ですが、
b = a++;
という式はbにaの値を代入してからaをプラス1しますが、
演算子の優先度を考えると、++が優先度高く、=は右優先です
優先度の高い++をしてから代入するように感じるのですが
そうならない理由をご教示ください

354:デフォルトの名無しさん
22/03/19 11:57:41.89 VgIBj69P0.net
a++が返す値は、aをインクリメントする前の値だからだよ

355:デフォルトの名無しさん
22/03/19 12:07:43.36 X795CU5ld.net
b=a++;
のインクリメントが実行されるのは式を評価した後

356:デフォルトの名無しさん
22/03/19 12:40:35.63 fvSihUDg0.net
返信ありがとうございます
演算子の優先度を調べると++が=より優先度が高いはずです
式の処理は優先度の高い演算子から処理されると理解しています
そうすると、++が先に実行された後で=(代入)が実行されてもおかしくないと
考えたのですが、どこに誤りがあるのでしょうか?

357:デフォルトの名無しさん
22/03/19 12:53:26.53 UXt2lmR80.net
そういう時のために
++i
i++
ちゃんと2種類の書き方が用意されてるんだよ

358:デフォルトの名無しさん
22/03/19 12:55:08.49 d0FibUHe0.net
>>351
> 式の処理は優先度の高い演算子から処理されると理解しています
これが間違い。演算子の結合優先度と式の評価順は別。

359:デフォルトの名無しさん
22/03/19 12:56:54.66 X795CU5ld.net
演算子の結合順位と副作用完了点の概念は別
というか b=a;a=a+1; を1文で書くためにa++ 周りのの仕様を特別扱いして実現してる

360:デフォルトの名無しさん
22/03/19 13:30:03.55 fvSihUDg0.net
返信ありがとうございます
++、--の場合は、前置、後置で
式の評価順が通常と異なると覚えました
式の評価順を理論から理解していないので
忘れてしまって失敗するかもしれませんが、
そのうち定着すると思っています

361:デフォルトの名無しさん
22/03/19 15:38:29.74 CZI3HevE0.net
よくわからない場合や使うと分かり辛くなる場合は使わないで冗長な書き方した方が良いかも知れない。
使わなくても最近のコンパイラは最適化掛ければ適当にうまいことやって最終的に作られるコードは同じになる可能性が高いと思う。

362:デフォルトの名無しさん
22/03/19 17:00:25.72 mw5TX/57a.net
b = a++;
の右辺を評価した結果は aの元の値で、副作用として aのアドレスにあるオブジェクトをインクリメントしているのでは
代入されるのは aの内容でなく、アドレスを持たない値で

363:デフォルトの名無しさん
22/03/19 17:03:51.29 mw5TX/57a.net
a++ は右辺値で、 ++a は左辺値

364:デフォルトの名無しさん
22/03/19 17:12:51.80 X795CU5ld.net
どっちも右辺値としないとまずい
int main(){
int a=0;
int* p;
p=&(++a); // コンパイルエラー
p=&(a++); // こっちも
}

365:デフォルトの名無しさん
22/03/19 17:42:57.61 mw5TX/57a.net
そうだね、失礼しました

366:デフォルトの名無しさん
22/03/19 17:50:05.80 nPptgbtB0.net
: BassClass(
std::format (IdPrefix, index, numBank)),(
std::format (NamePrefix, ++index, numBank))
ちょうどこんな感じのコンストラクタでラッパーするコード書いてたんだけど
インクリメントしてない方までつられて増えちゃうんだよね
C++のコード片でスマソン

367:デフォルトの名無しさん
22/03/19 18:11:19.38 8Fsv/onud.net
d = ++a + b-- + --c + a++;
この結果は
++a;
--c;
d = a + b + c + a;
b--;
a++;
だよね
実際はこんな書き方しないほうがいいがw

368:デフォルトの名無しさん
22/03/19 18:25:12.86 d0FibUHe0.net
>>362
> d = ++a + b-- + --c + a++;
> この結果は
++a と a++ とが順序付けされないので未定義動作。

369:デフォルトの名無しさん
22/03/19 18:39:08.49 Uza1/JxDM.net
両方未定義じゃね?
>>361 の方はちょっと自信ないが >>362 の ++a + a++ はダメだったような気がする

370:デフォルトの名無しさん
22/03/19 19:05:15.57 9SMEw2CG0.net
以下のような関数がインラインで実行されてるだけで、評価自体は++が先に行われてるんでないの?知らんけど
int inc(int* a) {
int ret = *a;
*a = *a + 1;
return ret;
}

371:デフォルトの名無しさん
22/03/19 19:10:54.79 fJWxsuK3a.net
引数の評価順なんてCPUでも変わるだろ。

372:デフォルトの名無しさん
22/03/19 20:25:22.26 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:デフォルトの名無しさん
22/03/20 00:26:15.18 dAApHicf0.net
fgetsのファイル終了・エラー時の戻り値がNULLなのはなぜですか?
他の入出力関係の関数の戻り値はEOFになっています
いま入出力の勉強をしてるんですが、関数の引数や戻り値が少しずつ違うので覚えるのが難しいです
使っていくうちに覚えていくものでしょうか?

374:デフォルトの名無しさん
22/03/20 00:53:13.92 tmhbCmKs0.net
細かな仕様はよく使うもの以外は毎度調べるよ
まあCの関数は数が少ないから全部覚えてるって人も少なくないかも

375:デフォルトの名無しさん
22/03/20 00:57:50.69 rKPZjyik0.net
よく使う関数の戻り値調べると面白いぞ
printfが何を返しているかとか、それは何故なのかとか
戻り値を使っている人を見たことがないけれど

376:はちみつ餃子
22/03/20 01:37:41.92 u4Grkyrm0.net
>>361
こういう場合については未定義ではないが未規定の動作が含まれる。
副作用完了点の間で同一のオブジェクトに複数回の書き換えが生じた場合には未定義の動作となるが、
書き換えが一度の場合はその書き換えがどのタイミングで起こるかわからないというだけで、
未定義の挙動にはならない。

377:デフォルトの名無しさん
22/03/20 08:21:37.14 e7HuEm7id.net
>>368
fgetsの戻り値は文字列へのポインタであり
いっぽうEOFは文字(じゃなくてintだけど気分的には)なのだ

378:デフォルトの名無しさん
22/03/20 10:46:46.29 +oGVYZOT0.net
組み込みのソフトしていると
使わない関数が多くて忘れていきます

379:デフォルトの名無しさん
22/03/20 11:48:15.83 w4XPcyomd.net
<stdio.h>は使えないとして組み込み系って使える標準ライブラリあるの?

380:デフォルトの名無しさん
22/03/20 12:55:28.41 DiBIkIVz0.net
windows.h

381:デフォルトの名無しさん
22/03/20 13:05:34.82 w4XPcyomd.net
使える標準ライブラリを聞いたつもりなんだが
あと<Windows.h>はOS依存のライブラリな

382:蟻人間
22/03/20 13:25:28.64 y5NxTTYed.net
標準っていっても何の標準かわからん。
ANSI CとかC89とかあるだろ。

383:デフォルトの名無しさん
22/03/20 13:41:32.19


384:ID:w4XPcyomd.net



385:デフォルトの名無しさん
22/03/20 13:42:12.13 e7HuEm7id.net
それぞれ組み込むシステムに付属してるだろ
一元的な名前はない
ひょっとしたらstdio.hという名前かもしれない

386:デフォルトの名無しさん
22/03/20 14:14:31.30 4KnLtgrc0.net
組み込みって言っても小さくても Linux 動いちゃうようなのもあるし、何とも言えんな。

387:デフォルトの名無しさん
22/03/20 14:19:28.79 BOo0cJz/a.net
string.h は普通に使えた

388:はちみつ餃子
22/03/20 17:31:23.40 u4Grkyrm0.net
C の規格は「規格合致ホスト処理系」「規格合致フリースタンディング処理系」を規定していて、
フリースタンディング処理系はライブラリとして float.h iso646.h limits.h stdarg.h stdbool.h stddef.h stdint.h の内容に限定している。
この範囲なら実行環境に左右されずに用意できるはずという判断なんだろう。

389:デフォルトの名無しさん
22/03/20 19:31:33.68 w4XPcyomd.net
組み込み向けの最低限の規格があるのか
#defineとtypedefしかないが
なるほどこれなら環境がどんなにショボくても用意できそう

390:デフォルトの名無しさん
22/03/20 20:07:23.09 mxx3UMQ+0.net
ファイルディスクリプタを使ってEOFを知りたいんだけどどうしたらいい?
普通にreadすりゃ0になるからわかるし、そもそもファイルなら



391:求めたサイズより小さく読めるからわかるけど ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい feofとかファイルポインタだで使えんがや



392:デフォルトの名無しさん
22/03/20 20:57:34.02 cOd2oDpEM.net
unblocking modeでopenしたfdをreadして判定すれば

393:デフォルトの名無しさん
22/03/20 22:28:44.17 aLyHOWc60.net
ファイルのサイズを取得して、そこへseek するとか?
そもそも、ファイルを開いて、ファイルの終わりにseek できるかも。
元々、ファイルの追記モードもあるぐらいだから

394:デフォルトの名無しさん
22/03/20 22:54:16.07 pl7vy6aed.net
>ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい
そもそもreadが終端まで来たらつぎにreadしてもファイルアクセスせずに0を返すから同じだろう

395:デフォルトの名無しさん
22/03/20 23:19:06.05 dAApHicf0.net
>>372
よく分かりました
ありがとうございます

396:384
22/03/21 16:21:59.97 nqBLTVDb0.net
>>387
後出し情報であれやけど
readしたデータをどこかに送信、最後のデータには最後フラグを立てる
みたいなやつなので、ぴったりのときに困ってたんよ
バッファを2面用意して、すぐ送信せず常に1回貯めて送信するのが
正解なんだろうなぁ・・・ まあいいけど

397:デフォルトの名無しさん
22/03/21 17:02:36.51 geQt3ukX0.net
ファイルサイズと読み出し位置から残りサイズ計算するぐらいか?

398:デフォルトの名無しさん
22/03/21 18:07:17.68 bPJRBgFUM.net
>>389
ファイルサイズわかってるならlseek(fd, 0, SEEK_CUR) で現在位置調べりゃいいだけかと

399:デフォルトの名無しさん
22/03/21 21:41:26.44 nqBLTVDb0.net
一応、ファイルじゃないときのことも考慮したかった

400:デフォルトの名無しさん
22/03/21 22:38:50.94 j56ex+kVd.net
ファイルディスクリプタが0とか"/dev/stdin"という名前のファイルを考慮し始めたらそれはもう無理じゃ?

401:デフォルトの名無しさん
22/03/21 23:41:34.24 /12E7ImH0.net
なんかバグやセキュリティホールの温床になりそうだな。

402:デフォルトの名無しさん
22/03/21 23:55:00.11 avj/Dp0k0.net
キャッシュとか、同期・非同期処理とか、ブロックされる・されないとか、
ブロックデバイス・シーケンシャルかとか、リダイレクト・パイプとか、
共有の有無とか、メモリ内共有かどうかとか、
そんな事を考えだしたら、キリがない
なんせ、Linux API の7割は、IO の説明だから、10年以上掛かる

403:デフォルトの名無しさん
22/03/22 02:05:16.87 vyk85loe0.net
1バイト単位なら fdopen() しちゃって FILE * でバッファリングさせた方が楽だな。feof() も使えるし。
1バイト単位ではなく1000バイト単位とか、大きい塊でバッファリングする必要がある場合は自作して feof() みたいなチェックができるようにする。
(それでも FILE * でのバッファリングがあった方が遅いストレージにあるファイルなら読み出し効率上がると思うが)。

404:デフォルトの名無しさん
22/03/24 22:37:34.92 jD8pMP9K0.net
以下はライブラリバージョンが1より大きければ処理を有効する例です
#if LIBRARY_VERSION > 1

#endif
この「LIBRARY_VERSION」は何者ですか?
どこに定義されているのでしょうか?

405:デフォルトの名無しさん
22/03/24 23:58:11.94 ItLF0V9z0.net
>>397
少なくとも標準仕様ではどこにも定義されてないです
説明のための例では?

406:デフォルトの名無しさん
22/03/24 23:59:45.82 bdM8JANZ0.net
MSVC環境ならカーソル合わせてF12キー押せばいい
gccとかは知らん

407:デフォルトの名無しさん
22/03/25 00:14:08.19 sET9XTXv0.net
>>397
独習Cからの抜粋と予想して記載します
複数の開発環境で同じヘッダファイルを使用する際の



408:宴Cブラリバージョンの差異でエラーとなるのを防ぐための テクニックです 各自が自分の開発環境に合わせて #define LIBRARY_VERSION 1などと 定義する必要があります



409:デフォルトの名無しさん
22/03/25 06:50:38.08 0hAphrOld.net
いえ、それはそのライブラリの作者(メンテナンスしてる人)が標準ヘッダ内で定義すべき内容です
ユーザーは>>397を自分のファイル内で使用してバージョンの差異を吸収できます

410:デフォルトの名無しさん
22/03/26 01:22:16.42 EYuSPLit0.net
>>398,400,401
説明のための例のようですね、失礼しました
あと、この定数が未定義の場合の値は0になるのですね
そのあたりを理解していませんでした
どうもありがとうございました

411:デフォルトの名無しさん
22/03/26 16:05:05.08 EYuSPLit0.net
コンパイル(リンク)時に、同じプロジェクト内の別ソースの関数などを呼び出せるのはなぜ?
インクルードして教えてる訳でもないのに、もしかして全ソースを探しに行ってるんですか?

412:デフォルトの名無しさん
22/03/26 17:27:18.26 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:デフォルトの名無しさん
22/03/26 18:26:49.41 kmPIEuI7d.net
>>403
(古典的な)Cではアセンブラソースに変換してアセンブル→リンクされるが
通常の関数名や変数名はアセンブラのグローバルシンボルに変換され
リンク時に他のアセンブラソースから参照できるようになる
一方関数内のローカル変数やstatic宣言された関数や変数はローカルシンボルとして扱われ他のアセンブラソースからは参照できなくなる

414:デフォルトの名無しさん
22/03/26 23:45:36.64 EYuSPLit0.net
よく分かりました、ありがとうございました

415:デフォルトの名無しさん
22/03/27 21:02:14.58 angONFKk0.net
グローバル変数の修飾子の意味は次の意味で合っているでしょうか?
修飾子なし:変数の実体を定義
extern修飾子:定義済みの変数を参照する
static修飾子:変数の実体を定義して、その変数を他のファイルからexternさせない

416:デフォルトの名無しさん
22/03/28 11:08:20.21 c4HYTfCO0.net
適当にググって見つかったexternとstaticの解説
URLリンク(daeudaeu.com)
URLリンク(daeudaeu.com)

417:デフォルトの名無しさん
22/03/29 00:24:04.59 c+1KPnOj0.net
>>408
そのサイト含めいろいろ見て、それをまとめたのが>>407です
念のためどなたかに確認していただこうかと思って書き込みました

418:デフォルトの名無しさん
22/03/29 06:11:36.84 7UUvIzLId.net
そんなに信用されてもw

419:デフォルトの名無しさん
22/03/29 08:18:01.14 C0VnxRTv0.net
自分で色々なパターンでコンパイルして確認しないのかな?って思う。

420:デフォルトの名無しさん
22/03/29 08:55:46.71 tKmNrPY6d.net
正確な意味を知るには解説サイト見て回るより規格書見るほうがいい
URLリンク(real-c.info)

421:デフォルトの名無しさん
22/03/29 13:03:41.11 M0Gs9C4cM.net
llvm-14 の、ソースツリーの外にcmake ディレクトリができる下品な感じ、なんとかならないの?

422:デフォルトの名無しさん
22/03/29 15:17:04.78 X58TTE+20.net
>>413
cloneしたディレクトリの直下にbuildディレクトリ作ってそこでcmake ~ ../llvmじゃいかんの?
今どきソースのディレクトリで直接ビルドしないのは下品というより上品ではないですか

423:デフォルトの名無しさん
22/03/29 18:15:06.70 U1DxU1KgM.net
>>414
>ソースツリーの外に
下品

424:デフォルトの名無しさん
22/03/29 18:20:46.45 1zZAboUWM.net
ソースツリーの中にbuildフォルダ作るのは上品なん?

425:はちみつ餃子
22/03/29 18:47:55.98 4oPH291+0.net
autotools でも out-of-tree build は出来るようにするのが一般的な作法。
あらゆるプロジェクトでそうしているというほどではないと思うけど、ごく普通にある。

426:デフォルトの名無しさん
22/03/29 22:23:02.11 X58TTE+20.net
URLリンク(llvm.org) を見るとソースフォルダの外でビルドしなきゃいけないような感じに書いてあるけど、
URLリンク(clang.llvm.org) を見るとリポジトリ直下にbuild作ってそこでビルドすればいいように書いてあるから、llvmはお上品にビルドできるのですわ

427:デフォルトの名無しさん
22/04/01 12:18:00.47 BXJ/mUbsM.net
llvm-14
まだゴミw
色んなものがダメになるw

428:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B)
22/04/12 19:31:59 B1tFLWvv0.net
char buf[256];
memset(buf, NULL, sizeof(buf));・・・(1)
memset(buf, 0, sizeof(buf));・・・(2)

(1)と(2)同じ事をしていると思うのですが、どっちで記述するのがメジャーですか?

429:蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd02-qTly)
22/04/12 19:35:46 Dt0TGPDOd.net
NULLはポインタだから(2)が正しいよ。

430:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a23e-vtdv)
22/04/12 20:06:33 5njWaFr40.net
>>420
言語仕様に厳密にいうと前者で初期化しようとした場合に buf が 0 で初期化されることは保証されないし、
コンパイルエラーになることもありうる。

整数定数式の 0 がポインタに変換したときに空ポインタになることは保証されるので
NULL が単に #define NULL 0 として定義している環境もよくあるんだが、
仕様上の NULL は「処理系定義の空ポインタ定数に展開する」ということになっていて
整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。

そんで「整数定数式の 0」がポインタに変換されたときに空ポインタになることは保証されるが、
定数式ではない文脈での整数の 0 は空ポインタになることは保証されていないし、
逆に空ポインタを整数に変換したときに 0 であるとも限らない。
if 文などの制御式としてポインタを置いても問題ないのは C の制御式は !=0 が補われたかのように動作するというルールのおかげ。

431:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B)
22/04/12 20:07:57 B1tFLWvv0.net
>>421-422
お早いレスサンクス
わかりました

432:ハノン
22/04/20 22:16:48.28 vxzn/db60.net
>>422
>整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。
可変長引数にあるあるの最後に (char *)0 (なんで char * なんだ?)なんかがいい例ですね

433:デフォルトの名無しさん (ワッチョイ 97b3-4qoo)
22/04/22 15:01:50 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:デフォルトの名無しさん
22/04/22 15:04:48.71 SxzvmxoM0.net
どうせリンクしてないとかそんなんだろ

435:蟻人間
22/04/22 15:05:51.08 BJPJNuGwd.net
>>425
古いコンパイラにはroundがないかもしれない。

436:蟻人間
22/04/22 15:06:16.30 BJPJNuGwd.net
-lm

437:デフォルトの名無しさん
22/04/22 15:12:16.74 SxzvmxoM0.net
gccなら -lmで動的リンクする簡易オプションがある、プログラム内だけで完結したいならコンパイラ付属のmathライブラリのソースも含めてコンパイル

438:デフォルトの名無しさん
22/04/22 15:14:29.72 SxzvmxoM0.net
動的リンクだとmathは浮動小数点の扱いが実行環境に依存するので静的リンク推奨

439:デフォルトの名無しさん
22/04/22 15:26:22.00 YxI2bgUE0.net
ありがとう
gcc tt.c -lm
でコンパイル通りました。

440:デフォルトの名無しさん (スププ Sdbf-DCm/)
22/04/22 15:44:53 I04xh82td.net
割とよく使う標準ライブラリなのに一々リンク方法をユーザーに選択させるという事の意義を考えるように、おまじないじゃないぞ

441:デフォルトの名無しさん
22/04/22 17:13:59.15 RFW8R+x+d.net
roundかtruncかfloorかはたまたceilかもしれないrintとその一味のヤバいやつら
こんなもんさっさと追放しろよ

442:デフォルトの名無しさん
22/04/22 17:31:11.41 SxzvmxoM0.net
整数型で表せない整数をdoubleで表したい時も稀にある
どうせ前後の整数(±1)は表せない不連続すきっ歯領域だし、どう丸まろうが影響無い部分だよ、って意図の明示に

443:デフォルトの名無しさん
22/04/22 17:49:02.83 SxzvmxoM0.net
用途は思い浮かばないでもないが、適切に使われてないケースが多分99%

444:デフォルトの名無しさん
22/04/23 13:45:19.22 +Gd9xYyP0.net
表せないときは整数型多倍長処理作る

445:デフォルトの名無しさん
22/04/24 11:54:23.21 S9c+iUdl0.net
GMPでそ
C++じゃないとちょっと使いにくいけど

446:デフォルトの名無しさん (ワッチョイ 51e6-DWDP)
22/04/24 15:18:10 Qwrn6LYl0.net
>>437
激しく同意
スレリンク(tech板:84番)

447:デフォルトの名無しさん (スフッ Sd94-6n8/)
22/04/25 03:24:41 LAuA6+3Dd.net
多倍長整数とか言ってる人は意図汲めてなくね?

正確性も表現力も不要だけど、それでも整数に相当する巨大数が要るのは極を利用した求根アルゴリズム(方程式解法)とかでしょうよ

たとえば、求めたい関数fの根がその逆数関数1/fの極と等しい事を利用するとか

もしdoubleの範囲を多倍長整数/任意桁数演算で308桁を陽に扱必要があるけど、そもそも極判定は指数部のみで行えるわけで、各桁の数字を陽に保持する意味が無い


一方で指数が巨大なdoubleを生で足すのは悪手
丸めれば各々の積分経路での評価値は真値から一旦遠ざかるけど、一貫した丸めを行う限りは10000万回も足せば互いに相殺されて均される

448:デフォルトの名無しさん
22/04/25 03:38:21.89 LAuA6+3Dd.net
ちょっと拵えすぎたような設定だったかもしれないけど、300桁を陽に保持して、ハードウェアの恩恵も無しに一万回加算とか、向かないどころかあまりにも非現実的過ぎる例もある
という例程度に
あとdouble使ってればinfが返ってくる可能性があるのが最大の利点
もしinfを引き当てられれば、それを与正入力がその浮動小数点実装における最高精度の解だと理論的に保証される

449:デフォルトの名無しさん
22/04/25 03:44:18.07 LAuA6+3Dd.net
訂正と補足
それを与正→与えた入力
(1/f)(x)→inf

f(x) → 0

fの根はそのx
は論理的に同値

450:デフォルトの名無しさん
22/04/25 05:05:51.34 ueJIdSJ50.net
INF見付かれば恣意的に収束/発散閾値を調整しなくてエレガントだよな
俺は素性の事前に分かってて留数定理使えるような関数くらいしか扱わないから、気にせずそのまま足しちゃうわ
積分経路は(楽だから)正方形に取り、均等に4分割して極のある範囲を再帰的に絞り込んでる、下手にニアミスしたりするとかえって桁落ちしたりして整数倍からズレる
±0.1くらいなら、きっと極を囲めてるものと想定
Cで数値計算入門みたいな本で勉強してるけど、浮動小数点の特殊値とかエラーの扱いとかの記述が一切抜け落ちてて困る

451:デフォルトの名無しさん (スフッ Sd70-6n8/)
22/04/25 19:15:48 o7ajKrF0d.net
実質ハードの実装に収束(発散)判定任せて綺麗に見えてるだけだがな
しかし比較無しに符号、複素数なら東西南北まで得られるのは便利

452:デフォルトの名無しさん (ワッチョイ 73b3-jUKb)
22/05/09 06:57:39 Egg1/KgR0.net
20年くらい前、Windows98が使われてた頃なんですが
char s = ''; // ←シングルクォーテーション2個
っという書き方が許されてた記憶があるんですが、記憶違いかな?
今Linux上のgccでコレをコンパイルすると「error: empty character constant」になる

453:デフォルトの名無しさん
22/05/09 07:35:16.71 QnLN+NJ0a.net
あえてなのかバグなのかは知らんけど20年前のコンパイラがそういう記法を通してたってだけだろ

454:デフォルトの名無しさん
22/05/09 08:27:27.53 Egg1/KgR0.net
>>445
冷静に考えてみたらコンパイラもOSも違うからそういうことだな

455:デフォルトの名無しさん
22/05/09 10:42:17.80 qGH53jdv0.net
''で何が代入されるの?

456:デフォルトの名無しさん
22/05/09 11:12:38.36 DLFHVgdp0.net
'\0' や 0 と同等の動作なんかねぇ

457:デフォルトの名無しさん
22/05/09 11:15:27.95 DuxsXAR8M.net
普通に考えれば空文字だと思う

458:デフォルトの名無しさん
22/05/09 11:35:54.50 lTlzTKNA0.net
NULL 「何もないよー」な意味をあらわす単語
空文字 長さ0文字の文字列のこと
この解釈でOK?

459:デフォルトの名無しさん
22/05/09 11:37:44.15 DLFHVgdp0.net
文字と文字列は違う 今話題に上がってるのは文字のほう

460:デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
22/05/09 12:02:23 ItS/vT2KM.net
長さ0文字の文字列なら""(ダブルコーテーション)では?

461:デフォルトの名無しさん (アウアウウー Sa1f-KEdX)
22/05/09 14:03:39 KBCMvYUWa.net
>>448
まあそれが一番ありがちかと

462:はちみつ餃子
22/05/09 17:13:19.74 9vSL2/iz0.net
>>444
言語仕様にはそれを通す規定は見つからないな。
少なくとも一文字は必要であることになってる。
C89 ではすでにそうなってるし、後の仕様でも変更はない。
出来る処理系があったのだとしたらあくまで処理系の拡張。
「たとえば 'ab' などのように二文字以上を含む場合は処理系定義」という意味の規定はあるので
雑に任意個の文字を受け付けるようにしたらうっかり 0 個も通してしまったとか、
意図的ではない挙動 (コンパイラのバグ) だった可能性もあるし。

463:デフォルトの名無しさん
22/05/09 17:32:30.12 x5IK3MV30.net
立方根を自作関数で求める方法教えてください、、、、、

464:はちみつ餃子
22/05/09 17:46:08.50 9vSL2/iz0.net
>>455
要件次第だけど実装が一番簡単なのは log を使うことだと思う。

465:デフォルトの名無しさん
22/05/09 17:47:02.53 x5IK3MV30.net
>>456
ニュートン法を使いたいです、、

466:はちみつ餃子
22/05/09 17:50:27.78 9vSL2/iz0.net
>>457
方法がわかってるなら何をききたいの?

467:デフォルトの名無しさん
22/05/09 18:03:26.90 jsi1f5HY0.net
何も入っていない変数が作れます

468:デフォルトの名無しさん
22/05/09 18:36:55.77 4JqWZIdB0.net
だからその
> 何も入っていない
は0から0xffのうちの何なのよ。
1 Byteの領域はあるんでそ。

469:デフォルトの名無しさん
22/05/09 18:39:59.52 jsi1f5HY0.net
そこは未知の領域

470:デフォルトの名無しさん
22/05/09 19:59:08.45 UxqgrJa1a.net
>>460
ネタに全力で食いつくなよw

471:デフォルトの名無しさん (ワッチョイ ea02-zDU0)
22/05/09 20:46:46 poYUryAv0.net
一番簡単なのは挟み撃ちだと思うけどな
1の三乗は
0.5の三乗は
と1/2づつ狭めていく

472:デフォルトの名無しさん
22/05/10 09:30:11.65 79aB+w7Md.net
>>450
NULLはポインターに代入できる「無意味な位置」を表すアドレス

473:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-PvPk)
22/05/10 11:28:15 dIEMLhL70.net
だいぶんボケたことを書いてしまった。 (>>456)
式変形をする必要すらなく pow ひとつで良かった。

double cube_root(double x) {
return pow(x, 1.0/3);
}

474:デフォルトの名無しさん
22/05/10 19:36:27.76 gxi5OEx30.net
それを自作関数で求めるとは言わんやろ

475:デフォルトの名無しさん (ワッチョイ 6aad-zDU0)
22/05/10 23:29:45 CQsKbFR90.net
言うだろう

476:デフォルトの名無しさん
22/05/11 06:53:21.08 zyEQjrH3d.net
コンビニ弁当買ってきて料理したというレベル

477:デフォルトの名無しさん
22/05/11 10:08:25.28 jCepvp6u0.net
通はコンパイラの自作から始める?

478:デフォルトの名無しさん (ブーイモ MMd6-RieT)
22/05/11 10:35:21 a8uVrD+/M.net
情報学科ならCPU設計からだよ

479:デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
22/05/11 10:39:55 3yHJq16kM.net
CPU設計だと情報学科なのか電子工学科なのか微妙なところ

480:デフォルトの名無しさん (ワッチョイ be63-PvPk)
22/05/11 10:43:04 jCepvp6u0.net
CPU設計ソフトを作る事から

481:デフォルトの名無しさん
22/05/11 12:00:05.99 2wozbOYLd.net
普通は自作関数作りたいんですって言ったら
>>463みたいなアルゴリズムを求めてるだろ
何の用途かは知らんが

482:デフォルトの名無しさん
22/05/11 12:53:38.63 rJ/SGv8Sa.net
>>471
素子の物理設計からなら電子工学
アーキテクチャからなら情報工学
じゃね?
まあ素子の物理設計なんてやってる学校があるかどうかは知らんけど

483:デフォルトの名無しさん
22/05/11 12:57:11.03 3n2UFvlUM.net
CPU設計の半導体物性や加工技術は情報学科の範疇外だと思う

484:デフォルトの名無しさん
22/05/11 21:22:30.22 Uorg83Yar.net
>>455
もう解決したってことでいいよね

485:デフォルトの名無しさん (ワッチョイ 7e02-jKFb)
22/05/11 23:25:04 eEErnLrt0.net
>>457
精度を組み込み関数より高めたいのかな?
なら一回で十分だよ、ループする必要も収束を確かめる必要もなくて、
y-=fx / f'x
だけで数桁精度が上がる

486:デフォルトの名無しさん
22/05/12 00:07:01.33 a2iZs8ls0.net
たぶんニュートン法を使いたいけどアルゴリズムを実装できないだけだと思うな

487:デフォルトの名無しさん
22/05/12 00:13:44.54 rHUhttMxr.net
反論がないし解決したってことで

488:デフォルトの名無しさん (ワッチョイ 1746-OCox)
22/05/12 03:09:36 DwGZHhAI0.net
simulink coderが便利すぎて手打ちする気にならない件

489:デフォルトの名無しさん
22/05/14 10:01:08.50 JFqjXnq80.net
>>444
許されていないよ
char *ss = “”;
char ch = ‘a’;
の記憶違いでしょう

490:デフォルトの名無しさん
22/05/14 10:23:10.43 yelWKEO3d.net
char ch = NULL;
という書き方ならよく見かけた
これはもちろん間違いなのだが

491:デフォルトの名無しさん
22/05/14 15:45:11.14 fRXCxvkXd.net
>>444 これどうなったの



493:デフォルトの名無しさん
22/05/15 13:21:26.16 evMzyiSb0.net
'' が使えるかどうかはコンパイラ次第なのでは?
文法的にダメだろうがなんだろうが使えるようにコンパイラ作られたらそれまでだし。
そういやGCCにも void * の変数に ++ とかの計算が出来たりして衝撃を受けたことがあったなあ。
他のコンパイラでコンパイルしてエラーになって発覚。

494:デフォルトの名無しさん
22/05/15 13:31:38.71 +H3bKj0ad.net
キャスト式に代入とかね

495:デフォルトの名無しさん
22/05/15 13:39:44.18 tGTiPFBf0.net
void *型のインクリって一体何バイト進むんだ?

496:デフォルトの名無しさん
22/05/15 13:48:28.89 +dMN0zqr0.net
>void *型のインクリって一体何バイト進むんだ?
codepad のC言語 → 1バイト
codepad のC++ → エラー
ISO C++ forbids incrementing a pointer of type 'void*' compilation terminated due to -Wfatal-errors.

497:デフォルトの名無しさん
22/05/15 13:53:41.23 evMzyiSb0.net
>>486
1だったよ。char * と同じように計算していた。
お近くの gcc でお試しください。

498:デフォルトの名無しさん
22/05/15 14:00:59.60 tGTiPFBf0.net
即レスサンキュー

499:はちみつ餃子
22/05/15 14:07:27.97 PUHmRytO0.net
gcc だと sizeof(void) が 1 を返したりするんだよな。
C++ だとこれがエラーになることを SFINAE のトリックに使ったりすることもあるんで、
どうやって辻褄を合わせているのかよくわからん。

500:デフォルトの名無しさん
22/05/16 14:17:30.76 KxReCtrr0.net
こういう質問が来るたびに自分で試せばいいのにって思う。
仕様がどうなってるのかという質問なら理解できるけど。

501:デフォルトの名無しさん
22/05/16 20:01:48.66 YQrK3HARa.net
いや、マニュアル読めよ...
URLリンク(gcc.gnu.org)

502:デフォルトの名無しさん
22/05/17 11:31:17.17 HihepIbQd.net
単に好奇心で聞いてるだけだと思うよ
実用的に使おうと言うんじゃなく
というか関数ポインタも1バイトになるのかw

503:デフォルトの名無しさん
22/05/17 11:43:19.86 VUKzLr9a0.net
何か有用な使い道ってあるか?

504:デフォルトの名無しさん (ワッチョイ eb69-wjZZ)
22/05/17 17:06:43 FuWQL0zJ0.net
汎用ポインタとして void * で受けておいて
char * でキャストすることなく そのポインタを 1バイト単位で操作できたとしても
*で実体を取得する瞬間にキャスト必須になるし どうなんだろ

505:デフォルトの名無しさん (スップ Sd03-m0tN)
22/05/17 18:02:18 HihepIbQd.net
ただのうっかりミスだと思うんだが
修正するとコンパイルできなくなるんで仕様にしてしまったのか

506:デフォルトの名無しさん
22/05/17 18:51:17.67 Qbd65aeba.net
>>493
> というか関数ポインタも1バイトになるのかw
んなわけないだろw
関数ポインタは普通に4/8バイトだよ
関数のサイズが1バイトになる
URLリンク(codepad.org)

507:デフォルトの名無しさん (ワッチョイ 5b63-yvGd)
22/05/17 19:17:06 kg0MHFY+0.net
バグからさめると別のバグの世界のような気がする。

508:デフォルトの名無しさん
22/05/17 20:20:31.65 HihepIbQd.net
>>497
君以外はみんなわかってる気がするw

509:デフォルトの名無しさん
22/05/17 21:01:08.19 xzGoH14A0.net
>>495
Cスタイルキャストだとあまり気にならないかもしれないけどC++スタイル2回重ねるのはちょっと嫌になる。

510:デフォルトの名無しさん
22/05/17 21:09:29.94 JCWwsd/Ra.net
>>499
関数ポインタが1バイトとか言ってたアホがいたんだけどw
てかお前意味わかってないだろ

511:デフォルトの名無しさん
22/05/17 21:17:57.23 VUKzLr9a0.net
>>501
文脈を踏まえれば >>493 が言ってるのは「関数ポインタでも (インクリメントで進む量は) 1 バイト」というのは理解できるだろ……。

512:デフォルトの名無しさん
22/05/17 21:26:34.47 cXB/OW/Na.net
文脈?
> gcc だと sizeof(void) が 1 を返したりするんだよな。

> というか関数ポインタも1バイトになるのかw
恥の上塗りかよw

513:デフォルトの名無しさん
22/05/17 21:35:35.34 xzGoH14A0.net
>>503
↓これを踏まえてのsizeof(void)だろ。なんでポインタそのもののサイズが出てくるのよ。
>void *型のインクリって一体何バイト進むんだ?

514:デフォルトの名無しさん
22/05/17 22:33:22.42 HihepIbQd.net
>>503
お前がな…

515:デフォルトの名無しさん
22/05/17 22:45:15.36 pcmvPs1uM.net
>>503
お前よりはな

516:デフォルトの名無しさん
22/05/18 07:47:41.31 PdG/XNB8a.net
スレチだったら申し訳ない
とあるフリーソフトが起動しなくてdllファイルを読み込んでないのが原因っぽいんだけど
VSでdumpbinを使って関数を調べた所LNK4044のエラー 〇〇.dllは無効です、無視されます
との文が出るんだがこうなるともうdllに原因があるから対処しようがないってこと?
ここから修復出来る方法ありますかね

517:デフォルトの名無しさん
22/05/18 11:53:43.44 bslzKqYb0.net
>>507
状況によるのでその情報からだけではわからない。

518:デフォルトの名無しさん
22/05/18 14:03:00.61 G19C49df0.net
ぶっ壊れではなく、OSにVCランタイムが入ってない可能性
Dependency Walker (URLリンク(www.dependencywalker.com)) で
その DLL をトレースしてみて、そいつが vcランタイム 要求していないか確認する
(そして古いverのVCランタイムをどうやって入手するかという話に)

519:デフォルトの名無しさん
22/05/18 14:10:31.11 G19C49df0.net
>>500
C++ だと void * のインクリメントがエラーになるので C限定のお話やね

520:デフォルトの名無しさん
22/05/18 22:34:39.58 CFFEhoB20.net
ガチ初心者なんやが、まず何すればいいん?
HtmlとCSSだけ少し触ったことがある

521:デフォルトの名無しさん
22/05/18 22:40:25.27 E1vMcGgB0.net
ガチ初心者なら、なにもC言語に手を出さなくても……

522:デフォルトの名無しさん
22/05/18 22:52:35.00 yp09HIZB0.net
何が目標なのかを書いてみて

523:デフォルトの名無しさん
22/05/19 05:23:54.79 UJCwwVidd.net
>>510
それgcc限定のお話だな

524:デフォルトの名無しさん
22/05/19 07:44:23.05 KBg+aMKFd.net
>>511
こういうよくある質問
何答えればいい?ってなるよな

525:デフォルトの名無しさん (スプッッ Sddb-f+Gq)
22/05/19 09:14:35 TZT0OIWkd.net
へてむるとCSSてことは、関心事はネットかな?

526:デフォルトの名無しさん
22/05/19 12:14:13.87 kqStXWIg0.net
>>511
世の中は流動的で、何が正解なのかは後にならないとわからない。
正解の道筋があるわけではなく、たくさんの知識があればどれかが役立つこともあるってだけ。
最初は物量だ。 詰め込め。

527:デフォルトの名無しさん
22/05/19 18:09:46.73 KBg+aMKFd.net
こういう奴はめんどうくさいことが嫌いで
とにかく近道が行きたくて聞いてるので
目的地なんて知らんとにかく近道教えろ!ってことなので
教えようがないんよ

528:デフォルトの名無しさん
22/05/20 00:03:31.03 SEOso9Vd0.net
すみません、visual studio communityを使っています
関数は呼び出すより前に定義の必要があることが分かりました
ですがソースファイル(.c)を分けて、一方に関数を定義すると定義する順番を気にせず使えます
インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
何故でしょうか?

529:デフォルトの名無しさん (ワッチョイ eb69-yvGd)
22/05/20 00:55:01 tfeu1OX00.net
>>519
> 関数は呼び出すより前に定義の必要があることが分かりました
いいえ、宣言しておけば定義は後でもいいです

> インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
しなくてもできるってことは必要じゃないってことです

530:デフォルトの名無しさん
22/05/20 01:27:17.95 1uCl4yv30.net
>>519
#include等の先頭に#が付いたやつはCコンパイラに処理を引き渡す前にソースのテキストに対して行われる編集を指示するものだ。
つまり #include で何かファイルが指定されていたらそのファイルを読んできてその行に挿入する。そしてそれからコンパイルが行われる。
なので #include で指定するファイルの内容を直接そこに書いてしまっても結果は同じになる。

531:デフォルトの名無しさん (ワッチョイ efd2-ydBh)
22/05/20 03:28:01 QfqNLeQw0.net
>>519
C言語では関数宣言がなくても関数っぽく使われてるものがあったら int func(); の宣言があるものとして決め打ちする。
.hとかで前方宣言してなくてもコンパイルは通る。
利用側の.cでは引数の数と型と返り値型が分からんが、合ってれば問題なく使える。

間違ってた使い方をしたときにエラーを出せないから極力避けるべき(コンパイラによっては出るかもしれんが)
この仕様はエラーを見つける観点からすればクソなので、長い歴史があるC言語以外では採用されてないはず

532:はちみつ餃子
22/05/20 05:08:48.27 YhZHNcJW0.net
暗黙の関数宣言は仕様から削除されてるよ。
C99 の時点でもう項目がない。
互換性の都合で出来るようにしてある処理系も多いと思うけど
警告くらいは出てるはずだと思うんで読み飛ばさずにしっかり見て欲しいな。

533:デフォルトの名無しさん
22/05/20 06:35:34.02 QdnN/13A0.net
まあわかるんだけど
K&R Cの楽しさがどんどん消えていく寂しさが・・・

534:デフォルトの名無しさん
22/05/20 08:04:15.92 px60Na0ad.net
みんな>>519の意味がよくわかるな
というかこれらの解答であってるの?

535:デフォルトの名無しさん
22/05/20 08:18:47.95 xUD6u/k80.net
昔大学の授業で使ったTurbo Cで
printf()等がincludeせずに使えた。
warningぐらいは出てたかも。

536:デフォルトの名無しさん
22/05/20 09:35:03.59 qCLhnuk6r.net
警告出てもコンパイル通ることあるよね
大学のシステムプログラミングの授業の教科書のサンプルコード、インクルード不足で警告よく吐いてた

537:デフォルトの名無しさん
22/05/20 10:00:52.44 px60Na0ad.net
どんなコードでもラベルがどこかで定義されてる限りコンパイル・リンクはできるんだよ
実行時に望みの結果にならなかったり最悪保護エラーになったりするだけ

538:デフォルトの名無しさん
22/05/20 10:12:25.64 mW5NTdIj0.net
コンパイルエラー・リンクエラーになるコードなんていくらでもあるだろ何言ってんだ。

539:デフォルトの名無しさん
22/05/20 10:15:14.87 px60Na0ad.net
ほら変なのが絡んできたw

540:デフォルトの名無しさん
22/05/20 12:57:31.73 xUD6u/k80.net
動的リンクってやつかな?
C言語はDOS時代に独学でやってたんで(大学はコードの書き方しか教えてくれんかった)どうしても
「宣言だけしておけばコンパイルは通るけど、リンク時に実態が無いとエラーになる」
ってイメージが。

541:はちみつ餃子
22/05/20 14:41:08.78 YhZHNcJW0.net
>>531
無関係。
動的リンクは実行時にリンクする (いわゆる DLL とか so とか) 仕組みで、ホスト環境側の機能。
暗黙の関数宣言は暗黙に宣言する言語機能。

542:デフォルトの名無しさん
22/05/20 16:18:15.28 px60Na0ad.net
ごちゃごちゃしてきたな
>>519に戻って「プロトタイプ宣言しなくても参照できるのは何故か」と言えば
古典的Cでは関数名は単純にfunc()→_funcというアセンブラシンボルに変換してるだけなので
別のソースでも同じ名前で定義してさえいればリンクは通る
ただCでは引数をスタックに積んで呼び出すので引数の数や順番が関数と呼び出し側で統一されてないと引数を正しく処理できないので見つけにくいエラーを起こしたり最悪スタック上の戻りアドレスを書き換えてしまって停止する
だからインクルードファイルでプロトタイプ宣言して統一しようということ
C++では[関数名_引数の数や種類]というアセンブラシンボルに変換するので、正しい引数で呼び出さないとリンク時に見つからないと言われる
それ以前にプロトタイプが必須になってるけど

543:デフォルトの名無しさん
22/05/25 01:22:00.94 gs0SnL//M.net
519です
遅くなってすみません
皆さんありがとうございました
まず、宣言と定義の違いを理解していませんでした
同一プロジェクト中の別ソースにある関数を、宣言しないで呼び出せるのが何故か知りたいです
戻り値がint型だと暗黙の宣言で使えるようですが、戻り値がchar型の関数を呼び出せます
関数を呼び出すより前に宣言されているはずなので、先に関数を記述したソースが解析されているということ??
試しにその関数をmain関数の後に持ってくると当然コンパイルエラーになります
恐らく>>533に頂いた回答が近いと思うのですが、リンクを理解していないためか理解できません…
勉強不足で質問するのも申し訳ないのですが、ご回答いただけると嬉しいです

544:デフォルトの名無しさん
22/05/25 01:31:16.14 Q47fXgzra.net
呼び出せないと思ったほうが良い

545:はちみつ餃子
22/05/25 01:35:46.79 9QZiEKx+0.net
>>534
コンパイラは宣言の辻褄が合っていると「仮定して」処理する。
宣言の辻褄が合うようにするのはプログラマの責任。
辻褄が合ってないときにどうなるかは言語仕様上は未定義のなのでなんとなく動いているように見えてもあてにならない。

546:デフォルトの名無しさん
22/05/25 09:42:18.14 mSxNHOMI0.net
C言語に慣れない頃はmain関数はファイルの最後に書いて、
呼び出される順番にソースの上の方に関数追加していったわ。
-----ccc.c-----
int FuncB(){
return 1;
}
int FuncA(){
return FuncB();
}
int main() {
return FuncA();
}

547:デフォルトの名無しさん
22/05/25 10:12:31.53 dvdfNrTHa.net
>>537
呼び出しじゃなくて依存の順序で書くね
宣言はなるべく書かない!

548:デフォルトの名無しさん
22/05/25 10:18:58.73 aeVycjmX0.net
間接再帰ができない間だけ通用する

549:デフォルトの名無しさん
22/05/25 11:11:34.92 f6RSTkPjd.net
>>537
簡単なプログラムで急いで書いてる場合や
関数の仕様を手探りで作りながら書いてる状態ならそんなでもいい
ただFuncBからもFuncAを呼び出すようになった場合困るから

550:デフォルトの名無しさん
22/05/25 11:27:04.22 f6RSTkPjd.net
>>534
何を悩んでるのかよくわからないが
今のCPUは8ビットレジスタなんて持ってないので戻り値がintでもcharでも戻り値の入ってるレジスタは同じになる
だから戻り値charの関数を暗黙のint関数として呼び出しても結果は特に問題なく使えるはず
ただ8ビットより上のビットにゴミ(不定値)が入ってる可能性はある

551:はちみつ餃子
22/05/25 11:49:22.28 9QZiEKx+0.net
>>541
(現代の一般的な) 呼び出し規約的には区別がないので動的リンクだと割と問題なさそうだが、
最適化が絡むと何がどうなるか想像もつかない。

552:デフォルトの名無しさん
22/05/25 11:52:13.52 aeVycjmX0.net
やはりCを上っ面でなく根っこから理解するにはアセンブラの知識も必要だな

553:デフォルトの名無しさん
22/05/25 12:06:51.94 mSxNHOMI0.net
コンパイラやアセンブラのnパス(ソースを読み下す回数)って仕様を思い出した。
DOS時代にアセンブラは2パスでCコンパイラは1パスが普通だと聞いて、
Cで先に関数/変数を宣言、定義しないとエラーになるのは1パスでコンパイラが知らない関数/変数が出てくるからだと思ってた。
正しい理解かは知らない。ラベルとかはgotoの後に出てくることもあるし。

554:はちみつ餃子
22/05/25 13:02:50.97 9QZiEKx+0.net
>>544
バックパッチで処理できるのでコードの頭から読みなおす必要はないよ。
知らない名前が出てきたときに型かもしれないし変数かもしれないってのでは構文解析が難しくなるが
goto の後ろにくるのはどこかで定義されているラベルだと決め打ちできるから単純な処理でいける。
(gcc だとアドレス (を生成する式) を goto に与えることも出来るように拡張されてるからもうちょっと複雑なことをしてると思う。)

555:デフォルトの名無しさん
22/05/25 16:04:37.76 ppEY2jmgd.net
gccはプロセス置換なんかで生成した一時ファィルを食わせられないから、少なくとも2回以上はソース通読してると思われる

556:デフォルトの名無しさん
22/05/25 19:05:44.16 pzbMw6fx0.net
関数コメントを書く場所だけど、
➀ヘッダファイルの関数プロトタイプ宣言の頭に関数仕様コメントを書く
②Cファイルの関数実装本体の頭に関数仕様コメントを書く
③両方に同じ内容を書く
のどれが今の多数派?
昔は②が多かった印象だけど最近は➀が主流なのかな?

557:デフォルトの名無しさん
22/05/25 19:22:25.67 6XrkLlxn0.net
外部仕様ならユーザーに読ませるからヘッダだし、内部仕様なら逆に見せるべきでないから本体、とかだろ。

558:デフォルトの名無しさん
22/05/26 07:54:06.06 BbTLBX4q0.net
将来Libファイル化とか考えると①の方が合理的かなとは思う。
VisualStudioの関数参照で、自動でコメントも表示されたと思ったけど、
そのときは①と②どっちが優先だったのかな?

559:デフォルトの名無しさん
22/05/27 16:12:39.64 01BAkppM0.net
質問失礼します
あるCのプロジェクトを見ていて
typedef struct X X;
struct X { ... some fields ... };
って記述がソース中の随所で見受けられますが、これ以前にもstruct Xの宣言がないのにtypedefできるのが非直感的に感じられます。これはtypedefを宣言するのと同時に、初めてここでstruct Xも宣言しているってことなのでしょうか?

560:デフォルトの名無しさん
22/05/27 17:20:28.72 HNJHF6TRd.net
それは構造体メンバーの中にその構造体自身へのポインタを含めさせるためのトリックじゃなかったかな
struct HOGE{
  色々なメンバー…
  struct HOGE *next;
};
とやろうとするとHOGEの定義はまだ終わってないのでundefinedエラーになる
typedef struct HOGE STRUCT_HOGE;
struct HOGE{
  色々なメンバー…
  STRUCT_HOGE *next;
};
これなら通るはず(?)

561:デフォルトの名無しさん
22/05/27 17:23:59.27 Dxs4BKy40.net
え?それ大丈夫じゃなかったっけ?

562:デフォルトの名無しさん
22/05/27 17:32:35.88 Dxs4BKy40.net
struct でメンバの定義がない不完全型はポインタ変数のみ宣言出来るので再帰的なやつも大丈夫だ。
ポインタはサイズが分かるから。
ポインタでない普通の変数はサイズが分からないので作れない。

563:はちみつ餃子
22/05/27 17:59:48.73 /qASUmj+0.net
>>550
その場合の typedef struct X X; の struct X は C99 の 6.7.2.3 にある
「不完全構造体型又は不完全共用体型を宣言し,その型のタグとして識別子を宣言する」
に該当する。
つまり struct X の宣言にもなっているという解釈で正しい。
あえて typedef を先に書く必然性はないんだが……
仕様にはこういう形でも書けるという例が載っているので考えなしに真似してるだけかもしれん。

564:デフォルトの名無しさん
22/05/27 18:06:40.28 01BAkppM0.net
>>554
詳しい説明ありがとうございました
確かによくよく考えると
typedef struct X { ... some fields ... } X;
と同じでしたね
こちらは違和感ないんですけど確かにこちらもいきなりtypedefのdeclspec内でstruct X { ... some fields ... }初めて使ってますね

565:デフォルトの名無しさん
22/05/27 20:53:33.56 v5HQQ34i0.net
struct Y;
struct X {
struct Y* next;
};
struct Y は struct X と同じでした

566:デフォルトの名無しさん
22/05/27 22:59:30.30 Uk6q3si00.net
エアプ使いばかり

567:デフォルトの名無しさん
22/05/28 11:23:05.30 81XaDMLN0.net
typedef struct X {
struct X *hage;
char a[0];
} X;
これはokだが
typedef struct X {
X *hage;
char a[0];
} X;
これはだめやろ

568:デフォルトの名無しさん (アウアウウー Sac5-MppQ)
22/05/28 13:26:19 CfHVy9pGa.net
よくてもよさそうだけどなあ

569:はちみつ餃子
22/05/28 15:18:56.42 IqCM7SI40.net
C++ ではアリだが、それはそれとして配列の大きさは 0 は駄目だよ。

570:デフォルトの名無しさん
22/05/28 18:03:45.61 2wkU6YYXa.net
配列要素0個はgccの拡張やね、標準規格に取り込んで欲しいわ

571:デフォルトの名無しさん
22/05/28 18:11:56.00 I3uIL+k90.net
いっそのこと要素数指定無しの配列も認めて欲しい

572:デフォルトの名無しさん
22/05/28 18:22:29.20 GsM4WAAy0.net
>>562
それはポインタと何が違うのん?
もしかして自動reallocとか?

573:ハノン
22/05/28 18:26:01.93 HcUv+NxjH.net
>>560-561
C99 ではすでに取り入れられた可変長構造体ですが、C++ ではまだなんですかね?
URLリンク(www.kouno.jp)

574:デフォルトの名無しさん (ワッチョイ d901-2OYr)
22/05/28 18:53:41 6Sv+ENTH0.net
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)」のゲームもこれを牽引している。

575:デフォルトの名無しさん
22/05/28 19:27:23.65 72vE6z5l0.net
>>564
VLAはC++ではいらない子

576:デフォルトの名無しさん
22/05/28 20:00:35.42 VWmT0B4pa.net
>>564
だからそこで[1]を指定しないとならないのがダメダメって話
namestr[100]を確保するコード書いてみ

577:デフォルトの名無しさん
22/05/28 20:00:39.40 TcgqTRp90.net
>>565
NFTはゲームに絡んでいる部分だけは面白そう

578:デフォルトの名無しさん
22/05/28 20:13:20.50 q7Q7UvgS0.net
struct Header {
int total_size;
char naemestr[1];
};
本質的には int total_size + naemestr可変としたいが
sizeof(struct Header) は char naemestr[1]; を含むのでキモいことになる

579:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-yO3c)
22/05/28 20:21:20 IqCM7SI40.net
>>567 >>569
二個以上のメンバからなる構造体である場合に最後の要素は不完全型であることが許される。
つまり char a[]; と書く分には OK だし、 sizoef で構造体の大きさを調べたときにはこのメンバを抜いた大きさが返ってくる。

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

>>564
C11 以降だと VLA はオプショナルだぞ。

580:ハノン
22/05/28 20:46:38.14 HcUv+NxjH.net
>>566
VLA は可変長配列の話、>>564 は可変長構造体の話、全然違うし可変長構造体は C99 で是認されましたよ
ちょっと遅れているんじゃないですか?

581:ハノン
22/05/28 20:47:26.50 HcUv+NxjH.net
>>567
[1]だろうと[0] だろうとどうでもよくて、問題は可変長構造体がC++では認められているか否かの話なのでは?

582:ハノン
22/05/28 20:48:11.40 HcUv+NxjH.net
>>570
>>571

583:デフォルトの名無しさん
22/05/28 21:12:45.84 CfHVy9pGa.net
動的に変わらんのに可変長っていうの違和感あるわ

584:デフォルトの名無しさん
22/05/28 21:12:59.17 q7Q7UvgS0.net
>>570
最後の要素が 不完全型な some-type [ ] に限り sizeof は そのメンバを含まない大きさを返すけど
some-type [1] の場合にはそのメンバを含んじゃう
URLリンク(ideone.com)

585:はちみつ餃子
22/05/28 21:34:55.35 IqCM7SI40.net
>>575
「よりよい方法があるのであえて 1 を書く必要はないじゃろ」というのが主旨。

586:デフォルトの名無しさん (ワッチョイ 4101-VwMx)
22/05/28 22:06:06 q7Q7UvgS0.net
了解

587:ハノン
22/05/28 22:46:10.65 Fu9mRLk6H.net
>>574
確かに、静的可変長とかいい言葉はありませんかね
でも存在自体は昔から知られていましたよ URLリンク(www.kouno.jp)

588:デフォルトの名無しさん
22/05/29 00:52:18.99 TsbfhcxCd.net
まあキモいけどサイズが実際より大きすぎるぶんには問題は起きない

589:デフォルトの名無しさん
22/05/29 01:10:06.53 9R680m3FH.net
>>579
キモい?アセンブラでは普通にやりますよ‥‥

590:デフォルトの名無しさん
22/05/29 01:18:23.26 J7SFw8MM0.net
そうだね、アセンブラを使えば良い

591:デフォルトの名無しさん (ワッチョイ 9379-3jko)
22/05/29 02:00:28 MBI5r2Hn0.net
最後が可変の構造体はchar naemestr[1]; なんて定義せずに
#definne Header_getNaemestr(p) (char *)((struct Header*)(p) + 1)
みたいに書く方法もあるよ

592:デフォルトの名無しさん (ワッチョイ abae-11kL)
22/05/29 05:45:19 7E0AvYTo0.net
>>571
配列と構造体を間違えたのは悪かったが
なんで遅れてるって話になるんだ?

593:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-yO3c)
22/05/29 08:46:06 +aZOCBrD0.net
C++ の提案としては出てる。
URLリンク(www.open-std.org)
今のところ C++ に取り入れられる見込みはない模様。

C で実績があるわけだし、変な矛盾はないと思うんだが
仕様として整合性をとるのは別の大変さがあるんかね?

594:デフォルトの名無しさん
22/05/29 12:15:20.33 IcJAaUL30.net
ビットマップのカラーテーブル部
データフォーマットの中間部分に鎮座してる可変

595:デフォルトの名無しさん
22/05/29 12:46:49.46 vh7xwuy0a.net
データ部の位置が変なリンクリスト嫌いだわ

596:デフォルトの名無しさん (ワッチョイ 2b63-yO3c)
22/05/29 12:59:38 J7SFw8MM0.net
XEvent にはとてもお世話になりました
今は使う機会が無くなりましたが

597:デフォルトの名無しさん (ブーイモ MM4b-/szq)
22/05/29 13:00:08 lS+LcIfWM.net
リンクリストでlist_head使ってないってこと?

598:デフォルトの名無しさん
22/05/29 13:33:49.79 9R680m3FH.net
>>583
遅れてるからですよ、C89 から話題になっていたことを理解していないからそんな間違いをするのです‥‥

599:デフォルトの名無しさん
22/05/31 11:53:16.64 B+MkXCVE0.net
>>589
C89から話題って何のことだ?
理解してるかどうかどうやって確認したんだ?
ああ、しどろもどろってやつかw

600:デフォルトの名無しさん
22/06/01 11:41:44.19 +HI81M8pd.net
>>546
そういえば愛用のtccはストリームからも読み込めるけど
まあ全部内部バッファに溜めればワンパスに見えるし、結局のところはわからんぬ
すくなくとも論理的に2パスする必要のある言語仕様的は思い浮かばない

601:デフォルトの名無しさん
22/06/01 16:22:13.14 UJNXiTT3d.net
プリプロセッサで一度マクロ


602:展開してからコンパイラに渡してるから2パスと言えなくもない



603:ハノン
22/06/01 21:59:27.44 8/80xBhO0.net
>>592
プリプロはパスに勘定しません
pascal こそ最高の正義、でも pascal 以降、おしなべてすべての言語は堕落してしまいましたね‥‥

604:デフォルトの名無しさん (ワッチョイ 09ad-dhW+)
22/06/01 23:11:11 vvQTEkHX0.net
pascalってキラーアプリとかあったっけ

605:デフォルトの名無しさん (ワッチョイ 2b63-yO3c)
22/06/01 23:13:36 f45OwcOU0.net
Janeなんたらは有名かもだが、他は知らない

606:デフォルトの名無しさん
22/06/02 05:56:20.78 mFaN5Fu80.net
Cはpascalへのアンチテーゼでもある

607:デフォルトの名無しさん
22/06/02 06:19:33.58 My4Fa6/ja.net
>>594
TeX

608:デフォルトの名無しさん
22/06/02 18:56:01.53 5oSm2G9pd.net
>>593
アセンブラ以外のすべての言語は退廃と怠惰の産物と心得よ

609:デフォルトの名無しさん
22/06/02 19:27:29.17 M0/peWx+0.net
怠惰は美徳なり

610:デフォルトの名無しさん
22/06/02 20:43:06.06 9S2EfN690.net
プログラマー三大美徳
怠惰、短気、傲慢

611:デフォルトの名無しさん
22/06/03 06:04:19.89 2JsQlaOH0.net
傲慢か
既存のコード無視して上書き的なメンテするやつか?

612:デフォルトの名無しさん (ワッチョイ abae-11kL)
22/06/03 06:39:00 2JsQlaOH0.net
>>598
コーディングシート使って機械語を直打ちしてた俺に言わせると
アセンブラも贅沢品だぞ

613:デフォルトの名無しさん (ワッチョイ 5110-yO3c)
22/06/03 07:54:41 nRSHAlo70.net
DOS時代にコプロセッサとか言うのあったけど、実際に使われてたの?
解説書を見ること無くWin時代に入っちゃって。

614:デフォルトの名無しさん
22/06/03 08:05:52.15 4GI8EAsla.net
FPUはあるとないで全然違ったよ

615:デフォルトの名無しさん
22/06/03 08:08:00.81 AsLopwGrM.net
今でもARMのFPUとかいろいろ使われてるよ

616:はちみつ餃子
22/06/03 09:38:08.46 ysQR9TY90.net
>>592
Tiny C Compiler はプリプロセスも含めてワンパスで処理するよ。
処理が各段階に分離されてないのでコンパイラのソースコードが読みづらいらしい。

617:はちみつ餃子
22/06/03 10:19:43.88 ysQR9TY90.net
GPU もある種のコプロセッサと言えなくもない。 そういう分類の仕方はあまりしないが……。

618:デフォルトの名無しさん
22/06/03 13:47:50.04 jxOrvhuY0.net
当時、コプロセッサを「子プロセッサ」だと思ってたのを思い出す。

619:デフォルトの名無しさん
22/06/03 19:52:40.79 tmTTQ0Rod.net
>>603
486から標準でCPUに組み込まれて
今では自動的に使われていることになる

620:デフォルトの名無しさん
22/06/03 19:59:24.89 jmq+XGTN0.net
PentiumのFPUバグ…

621:デフォルトの名無しさん
22/06/03 20:14:45.52 sSA68QUoa.net
487とは

622:デフォルトの名無しさん
22/06/03 20:48:03.52 LlSBEtTM0.net
かつてのARMはFPUどころかMMU、Cacheまでコプロ命令で制御してたな。

623:デフォルトの名無しさん
22/06/03 20:53:33.97 /AcAT3MUa.net
>>611
487は468SX(486DXの浮動小数点ユニット無し版)用のコプロやね
実態は486DXで装着すると468SXを乗っ取って全部487で実行しちゃうからCo-って感じじゃないけど

624:デフォルトの名無しさん
22/06/05 02:34:40.58 YsWbAm+I0.net
『コプロ』なるLSIを追加すると、掛け算を割り算が使えるようになる。
8~16ビット全盛時代、その文句の意味が分からなかったなあ。
BASICで普通に四則演算していたから。

625:デフォルトの名無しさん (ワッチョイ c6ae-+66E)
22/06/05 05:54:10 7J0TRviH0.net
コプロラグニー

626:デフォルトの名無しさん
22/06/05 06:54:01.45 pIMmlsGTd.net
>>614
何もかも間違ってるw

627:デフォルトの名無しさん
22/06/05 07:36:26.69 AvwHMxMpa.net
>>614
未だに分かってないな

628:デフォルトの名無しさん
22/06/05 07:41:32.89 7J0TRviH0.net
CPUが電卓を使うというのが何ともミステリアスだった

629:デフォルトの名無しさん
22/06/06 16:32:55.98 qbvku5vVd.net
**が理解できない
教えてくだちい

630:デフォルトの名無しさん
22/06/06 21:07:32.00 1f/zEEFPd.net
ポインタのポインタ?

631:デフォルトの名無しさん
22/06/06 21:24:19.81 7xDnzGS8M.net
間接参照の間接参照だろ
経験豊富なら余裕で見分けられる

632:デフォルトの名無しさん
22/06/06 21:37:13.48 v7exk6pA0.net
ポインタは記法が悪いよ
関数ポインタはもっと悪い

633:デフォルトの名無しさん
22/06/06 22:15:21.61 uQ+SySK50.net
宣言のときの * と、指し先の実体を求める *

634:デフォルトの名無しさん
22/06/06 23:45:42.93 9jLV7J2l0.net
a***b

635:デフォルトの名無しさん
22/06/08 02:10:57.84 KYIfcmSY0.net
c=a/*b;

636:デフォルトの名無しさん
22/06/08 07:54:23.07 CNk0rgMY0.net
int a=1;
int *b=&a;
int **c=&b;
int d=0;
d=**c; /* d == a */

637:619
22/06/08 08:41:18.56 NWnFU//jd.net
少しわかった気がします
試してみて理解します
皆さんありがとうございます

638:デフォルトの名無しさん
22/06/08 16:31:44.77 KT22GtKja.net
関数のポインタとか
関数のポインタを引数に持つ関数のポインタとか

639:デフォルトの名無しさん
22/06/08 17:05:53.27 V/Z/RpWDF.net
typedefすればいい
typedef int AAA_FUNC( int, char *, ...);
int AAA_caller( int, AAA_FUNC*);

640:デフォルトの名無しさん
22/06/09 11:32:24.20 ZhHr/cTg0.net
>**
なんで char **argv が思い浮かばなかったかなぁ・・・。

641:デフォルトの名無しさん
22/06/09 13:06:08.29 0WQEetb00.net
char *argv[]という初心者をいたぶる陰険な罠を避けたかったんじゃね?

642:デフォルトの名無しさん
22/06/09 15:57:22.96 lMNj+E1f0.net
GNU MakeよりCMakeが優れてるのはどの辺でしょうか?

643:はちみつ餃子
22/06/09 16:49:53.93 k8dtcEck0.net
>>632
CMake はメタビルドツールなので make と比較するようなものではない。
CMake を使う多くの場合で make も使う。

644:デフォルトの名無しさん
22/06/09 17:00:06.87 lMNj+E1f0.net
>>633
そうなんですね。ありがとうございます

645:デフォルトの名無しさん
22/06/10 11:33:59.29 rZTjX0hE0.net
宣言/デリファレンスの記法が悪いというより、=が悪い
両辺を等値(あるいはそうする=代入)というセマンティクスと解離してる

646:デフォルトの名無しさん
22/06/10 11:41:37.01 rZTjX0hE0.net
初期化の=は左辺ではなく、左辺で宣言されるものを指してるわけで、頭の中で=以外の記号に置き換えて読むといいかも

647:デフォルトの名無しさん
22/06/10 13:18:43.35 PT4Yy0z80.net
=と==は、はっきり区別されてるだろ
連動して常に等しいという規則ならマクロでやればいいし

648:デフォルトの名無しさん
22/06/10 13:19:17.11 HL4tZsFs0.net
A=1
B=2
C=3
A=B=C
PRINT A,B,C

649:デフォルトの名無しさん
22/06/10 16:02:05.50 5CLHXu7x0.net
>>638
BとCが等しいかの比較結果が A に入る

650:デフォルトの名無しさん
22/06/10 22:32:37.38 ExBywScCd.net
C言語ではA=B=C;でAとBにCの値が入るはずだが

651:デフォルトの名無しさん (オッペケ Sr87-vhci)
22/06/11 02:33:23 yqb/24klr.net
Cの比較は==だからね

652:デフォルトの名無しさん (ワッチョイ cfae-/e9c)
22/06/11 04:29:30 3J9oG0Sq0.net
BASICだろ

653:デフォルトの名無しさん
22/06/11 08:08:56.72 5lUjqa1id.net
なんのスレ

654:デフォルトの名無しさん
22/06/11 08:27:12.87 TYekU7UkM.net
C
A=1, B=1, C=1
BASIC
A=-1, B=1, C=1

655:デフォルトの名無しさん
22/06/11 15:01:54.40 s3NqXqGx0.net
ちょー初心者
引数付きの関数で引数が空のときにも意味を持たせたい
nanntoka(char adress)なんて関数で
呼び出し側がnantoka()と書いたときも意味を持たせる場合どうすりゃいいの?
null判定でいいんですか?

656:はちみつ餃子
22/06/11 15:07:25.17 D3tfzU/30.net
>>645
C では出来ない。

657:デフォルトの名無しさん
22/06/11 15:15:18.40 s3NqXqGx0.net
だよねー
やっぱ数値は工夫のしようがないから無理なのかー
やー助かりました

658:デフォルトの名無しさん
22/06/11 15:45:32.03 NTE9LoY80.net
C++なら出来るんだっけ。

659:デフォルトの名無しさん
22/06/11 15:48:15.36 nZnmEekY0.net
C++にはデフォルト引数があるし
オーバーロードもできる
Cでできるかは知らん
int f(const char*s = nullptr);

660:デフォルトの名無しさん
22/06/11 16:27:10.38 dptRvNRm0.net
普通にはできないからやるな
(1) printfみたいにやる方法
(2) __VA_ARGS__でやる方法
があるぞい

661:デフォルトの名無しさん
22/06/11 17:10:24.92 t7XDMYlk0.net
>>650
printfみたいな可変引数でも第一引数は必要なので純粋に引数なしってのはできなかったはず。

662:デフォルトの名無しさん
22/06/11 17:22:53.63 lqPwOW/ya.net
_Genericとかみんな使う?

663:デフォルトの名無しさん
22/06/11 17:28:25.28 YjAHf+RK0.net
printf(NULL);
悪魔の召喚

664:デフォルトの名無しさん
22/06/12 05:58:21.10 rhQkMiRe0.net
>>651
できるぞ
第一引数なしで可変引数にするときは
void func();
と、省略記号なしで宣言する
ただし言うまでもないが
func();
で呼び出したときの第一引数は不定なので
使い途はない

665:デフォルトの名無しさん
22/06/12 07:27:33.25 Tbig4rXQd.net
プロトタイプ省略すればなんでもできるw

666:デフォルトの名無しさん
22/06/12 08:41:18.11 LzXoNMHn0.net
>>654
> nanntoka(char adress)なんて関数で
って書いてあるのに...

667:デフォルトの名無しさん
22/06/12 15:51:07.84 rhQkMiRe0.net
>>656
> 呼び出し側がnantoka()
とも書いてあるだろ
何が言いたい?

668:はちみつ餃子
22/06/12 16:04:25.30 7muDz8Uq0.net
>>654
> 第一引数は不定なので
いいえ。 未定義動作です。

669:デフォルトの名無しさん
22/06/12 16:07:16.41 LzXoNMHn0.net
>>657
勝手に端折るなよ、 書いてあるのは
> 呼び出し側がnantoka()と書いたときも意味を持たせる場合どうすりゃいいの?
で、答えはできない
つまり
>>654 > できるぞ
がアホだってことな

670:デフォルトの名無しさん
22/06/12 16:17:07.73 2T6Ast9Ed.net
>>654
>第一引数なしで可変引数にするときは
可変引数になってないね
全然意味のない書き込みだね…

671:デフォルトの名無しさん
22/06/13 06:48:01.95 BOW2YZM80.net
>>658
不定の値にアクセスしたら未定義の動作だね
何が言いたい?
>>659
幼児レベルの罵倒語が必要か?
654は正しいのか誤っているのかどっちだ?
>>660
では聞くが可変引数って何だ?
JIS X3010にそんな用語はないが

672:デフォルトの名無しさん
22/06/13 08:40:16.72 si/cekt2d.net
int func(void); と
int func(...); に対する言及なしで
int func(); だけ出てきてるからまともな議論じゃないと思ってスルーしてたが
可変引数は >>651 で出てきてそれに合わせてるだけじゃねーの?

673:デフォルトの名無しさん (スップ Sd1f-asUV)
22/06/13 08:54:28 si/cekt2d.net
int func(void); だとそもそも引数なししか受け付けない。
int func(...); だと引数の型と個数を実装側が期待するものにしなければならない。間違えたら未定義動作。
int func(); だと引数の型がわからないまま関数を使う。間違えてたら未定義動作。

int func(...); の第1引数は普通は型を明示するから
int func(const char*, ...); のようになるが。

674:はちみつ餃子
22/06/13 09:33:56.73 zy+KupId0.net
>>661
いいえ。 一致しない引数で関数を呼出そうとすることが未定義です。

675:デフォルトの名無しさん
22/06/13 10:21:00.47 BOW2YZM80.net
>>664
一致しないって何と何が?
funcについて仮引数は宣言されていない
よって実引数との型の比較行われず
一致にも不一致にもあたらないぞ

676:はちみつ餃子
22/06/13 10:32:48.37 zy+KupId0.net
>>665
いいえ。 どこかに関数定義は存在し、関数定義 (の仮引数) とその関数呼出し (の実引数)
との矛盾 (引数の数があわない・型が適合しない) は許されていません。

677:デフォルトの名無しさん
22/06/13 11:04:47.60 YiPaBYDZr.net
可変長引数では無理なのね
>>650の(2)の実装だとどうなるの

678:はちみつ餃子
22/06/13 11:30:06.51 zy+KupId0.net
マクロでコンパウンドリテラルを作ってから (その個数と共に) 渡すという方法が取れると思う。
受け取る関数の型は >>645 の通りではできないけど。
#include <stdio.h>
#define foo(...) bar(sizeof((char[]){0, __VA_ARGS__}), (char[]){0, __VA_ARGS__})
void bar(int n, char* args) {
if(n==1) {
printf("no argment.\n");
} else {
printf("argment is %c.\n", args[1]);
}
}
int main(void) {
foo('a');
foo();
}

679:デフォルトの名無しさん
22/06/13 11:35:06.46 BOW2YZM80.net
>>666
話が噛み合っていないな
引数の数も型も比べる相手がいないのに矛盾しようがない
そもそも関数原型を用意しましょうなんていうのはCにおいて後付けの推奨事項に過ぎない
既存のコードを否定するのは影響が大きすぎるからな

680:デフォルトの名無しさん
22/06/13 11:47:54.04 ir4nxYTVd.net
>>661
自分で「可変引数にするときは」と言っておいて
なにが「そんな用語はない」だよ
頭おかしい

681:デフォルトの名無しさん
22/06/13 11:48:35.71 cwJzo4Jp0.net
fn(void)
fn(int)
こういう2種類の引数を許容したとして
呼ばれた側はどう区別したら良いんだろう
コンパイル時に、別関数にアサインしたらいいのかな
その場合は受け取る関数も二つ用意してやらないと行けないな

682:デフォルトの名無しさん
22/06/13 11:52:40.59 ir4nxYTVd.net
区別はできない
引数を見ようとしたら結果は不定になる
単なるバグだよ

683:デフォルトの名無しさん
22/06/13 12:04:59.49 63W4P7Hh0.net
(2)の想定はこれだった
URLリンク(wandbox.org)
これも引数0個のときは##__VA_ARGS__か__VA_OPT__が必要で
まずかったな

684:デフォルトの名無しさん
22/06/13 12:13:41.38 Bgq8kBxf0.net
>>669 関数定義とその呼び出しを比較するって書かれてるのに、きみが無視するから噛み合わないんだよ。

685:デフォルトの名無しさん
22/06/13 12:16:16.46 BOW2YZM80.net
>>674
void func() { } /* 定義 */
int main()
{
func(); /* 呼び出し */
}
どこが矛盾なんだ?
# 迂闊な答えをすると罠があるから気をつけな

686:デフォルトの名無しさん
22/06/13 12:18:15.22 BOW2YZM80.net
>>670
その時点ではアバウトな言葉遣いが容認される流れだったが
厳密さを求める流れにあんたが変えたんだよ

687:デフォルトの名無しさん
22/06/13 12:27:06.91 Bgq8kBxf0.net
>>675 その例だけなら矛盾しないね。でも引数渡せないから>645のやりたかったことはできないよね。

688:デフォルトの名無しさん
22/06/13 15:54:04.85 BOW2YZM80.net
>>677
引数が空のときにに意味を持たせるんだったな
void func() { puts("no arguments are given"); }
int main()
{
func();
}
# さっき言った「罠」がまだここにある

689:デフォルトの名無しさん
22/06/13 16:19:19.10 Bgq8kBxf0.net
まともに話す気なさそうだし、もういいや。
C言語では>>645に書かれてるようなことはできなくて、
>>654の「第一引数は不定」はどうせ未定義動作の間違い、
という点に異論が無ければ、これ以上語ることもない。

690:デフォルトの名無しさん
22/06/13 16:34:27.02 cwJzo4Jp0.net
nantoka()と呼び出した場合、
呼び出された関数は、
nanntoka(char adress)として
スタック上からadressを取り出そうとするが
ここにある値はNULLではなく、不定値(所謂ゴミ)
NULL判定で回避はできない

691:デフォルトの名無しさん
22/06/13 16:37:54.51 ir4nxYTVd.net
>>678
Once again, once again, you're on your own
Who's to blame? who's to blame? it's such a shame
No-one ever hears your name, or plays your game

692:デフォルトの名無しさん
22/06/13 18:45:35.75 +5MOS3Faa.net
>>680
> スタック上からadressを取り出そうとするが
だからそれを実行するかどうかもわからんって話
未定義動作ってそういうもんだ

693:デフォルトの名無しさん
22/06/13 18:53:43.72 HsopZ7m+d.net
グローバル変数 int exists_adress; を介してやれば引数あり/なし のモードを未定義動作を回避しつつ設定できそう
実用性など皆無だが

694:デフォルトの名無しさん
22/06/13 19:17:35.58 ir4nxYTVd.net
>>682
読み出すまではできるだろ
戻りアドレスか関係ないレジスタの退避値が入っている
問題はここではエラーにならず次にこの値で何かしようとしたらクラッシュする可能性が高い
これは単にコンパイラを騙して原因がわかりにくいエラーを出す方法なだけ
全くなんの意味もない

695:デフォルトの名無しさん
22/06/13 19:21:03.88 cwJzo4Jp0.net
分からないなら、試して見れば良いのに

696:デフォルトの名無しさん
22/06/13 19:40:41.59 +5MOS3Faa.net
>>684
だからコンパイラは読み出すコードを吐く義務はない
未定義動作とわかった時点で呼び出しすらしないコードを吐く可能性もある
未定義動作ってそういうもんだ

697:デフォルトの名無しさん
22/06/13 19:46:28.66 cwJzo4Jp0.net
読み出さなければ、実行時エラーにならないだろう
なんで、なるの?

698:デフォルトの名無しさん
22/06/13 19:48:48.04 cwJzo4Jp0.net
呼ばれた側の関数は、adressに入っている(はずの)値を使うんだぜ
コード吐かなければ、それこそコンパイラのバグになるぞ

699:デフォルトの名無しさん
22/06/13 19:52:23.50 cwJzo4Jp0.net
実際に呼び出すコードは、呼ばれた側の関数に実装されるが、
呼び出し側の引数セットありと、引数セット無しで、
違うコードが実行されたりするのか?

700:デフォルトの名無しさん
22/06/13 20:03:29.40 Q7R38T3J0.net
何が起こっても不思議ではない未定義派と、コンパイラ実装は実質こうなってる派で話が噛み合うはずがないと思うの。

701:デフォルトの名無しさん
22/06/13 20:05:01.34 cwJzo4Jp0.net
信仰と言うより、勘違いだろう
恥ずかしくて後に引けなくなった感じ

702:デフォルトの名無しさん
22/06/13 20:09:56.04 cwJzo4Jp0.net
引数セットするのは、呼び出し側
コンパイラが呼び出し側で引数がないと判定した結果、
気を利かせて呼び出さないコードを吐くって一体どういうことだろう
呼ばれた側は機械的にあるはずの引数にアクセスする
呼ばれる側はセットしてないなんて分からないからアクセスしてしまうぞ

703:デフォルトの名無しさん
22/06/13 20:10:29.53 8KDu5nutr.net
>「罠」がある(キリッ
とかお寒いこと書いちゃうくらいだしよほど視野が狭くなってたんだろうなぁ

704:デフォルトの名無しさん
22/06/13 20:15:33.10 iGSNe98na.net
stdcall と cdecl の話か?
どっちにしても引数省略されたのかされてないのか呼ばれた方では判らん
C++なら省略の代わりにデフォルト引数入れたりマングリングしたり出来るが
Cではどうしようもない

705:デフォルトの名無しさん
22/06/13 20:17:50.97 6K7aQgyCM.net
>>693
コピペで使えそうだなw

706:デフォルトの名無しさん
22/06/13 21:42:41.32 PLcvpN2h0.net
>>688-689,691-692
コンパイルエラーとして全くコードを吐かないという事すら可能なのに何を言ってるんだよ...
今時未定義動作すら考慮して最適化したりしてる時代なんだぞw
URLリンク(qiita.com)

707:デフォルトの名無しさん
22/06/13 21:44:17.84 ir4nxYTVd.net
>>686
何か勘違いしてないか
コンパイラが未定義動作とわかったらエラーか最低でもワーニングを出す
コンパイラにはわからないからバグになるんだよ

708:デフォルトの名無しさん
22/06/13 22:00:44.23 cwJzo4Jp0.net
ワーニング笑

709:デフォルトの名無しさん
22/06/13 22:05:19.85 cwJzo4Jp0.net
一体どこのコンパイラがコード吐かずに停止するんだよ

710:デフォルトの名無しさん
22/06/13 22:14:04.47 PLcvpN2h0.net
>>697
> コンパイラが未定義動作とわかったらエラーか最低でもワーニングを出す
そんな義務はない
> コンパイラにはわからないからバグになるんだよ
同一翻訳単位ならわかるだろ
勘違いしてるのは君、と言うか君の知識が浅すぎるだけ
>>699
存在するかどうかは関係なく規格上はそう言う処理系でも規格準拠という話

711:デフォルトの名無しさん
22/06/13 22:42:16.41 cwJzo4Jp0.net
つまり実在しないコンパイラってことだな

712:デフォルトの名無しさん
22/06/13 22:44:07.87 cwJzo4Jp0.net
オレ以外、全員狂ってるって言ってるのと同じ

713:デフォルトの名無しさん
22/06/13 22:44:55.56 cwJzo4Jp0.net
こいつと同じ職場でなくて良かった

714:デフォルトの名無しさん
22/06/13 23:54:32.34 uF/nHRZy0.net
法解釈論「人殺しは違法であり罰される」
実運用論「証拠を完璧に隠滅できれば罰されない」
意固地になっちゃってるから何言っても無駄

715:デフォルトの名無しさん
22/06/14 03:02:34.64 bOBoFDUrM.net
意固地になるとアスペチックになるのか
アスペチックだから意固地になりやすいのか

716:デフォルトの名無しさん (ワッチョイ ff01-MmlY)
22/06/14 06:01:33 WigeF4Tr0.net
意固地もなにも未定義動作なんて規格の話なんだから実運用論とか言われてもねw

717:デフォルトの名無しさん
22/06/14 06:16:24.48 XpDhKBGs0.net
>>679
第一引数が不定とは、第一引数を何らかの方法で取り出した場合の話だが
おまえさん、その方法はどんな方法を想定しているんだ?

718:デフォルトの名無しさん
22/06/14 07:36:21.84 /Eif446V0.net
自分で言った言葉に?みつく芸なんだろうか

719:デフォルトの名無しさん
22/06/14 10:22:14.90 2fucKJss0.net
>>707
>654が言ってるのはどうせこんなのだろうと思ってた。
URLリンク(wandbox.org)
#include <stdio.h>
void func();
int main() { func(); }
void func(int x) { printf("%d\n", x); }

720:デフォルトの名無しさん
22/06/14 10:32:47.66 rBU/2bdp0.net
実体記述時と、宣言&呼び出し時とで、引数の型や個数の不一致
コンパイルが通るかもしれんけど、どう動くかわからないし
俺の環境ではこう動くからと、それを信じて採用するには怖すぎる

721:デフォルトの名無しさん
22/06/14 10:33:48.55 XpDhKBGs0.net
>>709
654は俺でまあそんなとこだが
俺は今679に聞いている
おそらく「654と同じ」とかなんとか言って
自分の手の内は隠したまま人の批判をするんだろうけどな

722:デフォルトの名無しさん
22/06/14 10:44:32.74 2fucKJss0.net
>>711 え? 679 (ワッチョイ 835f-GGE9) だから答えたのに何でよくわからんイチャモンつけられてんの?
いやまぁ、予想通りで結論に異論無いならいいんだけどさ。

723:デフォルトの名無しさん
22/06/14 10:50:39.67 rBU/2bdp0.net
省略時のデフォルト引数と(マングリング等による)別実装
C以前の言語でもありそうだし前者は検討してそうなもんだけど見送ったなりの理由があるんだろうか

724:デフォルトの名無しさん
22/06/14 10:52:59.20 2fucKJss0.net
想定が合ってたということで改めて結論も明記しとくと、
>709 のプログラムが未定義動作を起こすのは不定な x の値を使用するからではなく、
func(int x) に対して引数の数が不正な関数呼び出し func() を行うからであって、
x の値を使用しない場合(例えば関数内を空にした場合など)ても未定義動作になる、という話ね。

725:デフォルトの名無しさん
22/06/14 10:53:17.30 XpDhKBGs0.net
>>712
ほらな、やっぱり自分の手の内は晒さない

726:デフォルトの名無しさん
22/06/14 11:13:15.99 rBU/2bdp0.net
661の立場だと
 void func(int x) { }
 ・・・・・
 func();
は、記述のほうで x をリファレンスしてないからセーフで未定義には該当しないと読めるが
そいう主張なのかな


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch