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
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 まあそれが一番ありがちかと
462 名前:はちみつ餃子 mailto:sage [2022/05/09(月) 17:13:19.74 ID:9vSL2/iz0.net] >>444 言語仕様にはそれを通す規定は見つからないな。 少なくとも一文字は必要であることになってる。 C89 ではすでにそうなってるし、後の仕様でも変更はない。 出来る処理系があったのだとしたらあくまで処理系の拡張。 「たとえば 'ab' などのように二文字以上を含む場合は処理系定義」という意味の規定はあるので 雑に任意個の文字を受け付けるようにしたらうっかり 0 個も通してしまったとか、 意図的ではない挙動 (コンパイラのバグ) だった可能性もあるし。
463 名前:デフォルトの名無しさん [2022/05/09(月) 17:32:30.12 ID:x5IK3MV30.net] 立方根を自作関数で求める方法教えてください、、、、、
464 名前:はちみつ餃子 mailto:sage [2022/05/09(月) 17:46:08.50 ID:9vSL2/iz0.net] >>455 要件次第だけど実装が一番簡単なのは log を使うことだと思う。
465 名前:デフォルトの名無しさん [2022/05/09(月) 17:47:02.53 ID:x5IK3MV30.net] >>456 ニュートン法を使いたいです、、
466 名前:はちみつ餃子 mailto:sage [2022/05/09(月) 17:50:27.78 ID:9vSL2/iz0.net] >>457 方法がわかってるなら何をききたいの?
467 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 18:03:26.90 ID:jsi1f5HY0.net] 何も入っていない変数が作れます
468 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 18:36:55.77 ID:4JqWZIdB0.net] だからその > 何も入っていない は0から0xffのうちの何なのよ。 1 Byteの領域はあるんでそ。
469 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 18:39:59.52 ID:jsi1f5HY0.net] そこは未知の領域
470 名前:デフォルトの名無しさん mailto:sage [2022/05/09(月) 19:59:08.45 ID:UxqgrJa1a.net] >>460 ネタに全力で食いつくなよw
471 名前:デフォルトの名無しさん (ワッチョイ ea02-zDU0) mailto:sage [2022/05/09(月) 20:46:46 ID:poYUryAv0.net] 一番簡単なのは挟み撃ちだと思うけどな 1の三乗は 0.5の三乗は と1/2づつ狭めていく
472 名前:デフォルトの名無しさん mailto:sage [2022/05/10(火) 09:30:11.65 ID:79aB+w7Md.net] >>450 NULLはポインターに代入できる「無意味な位置」を表すアドレス
473 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-PvPk) mailto:sage [2022/05/10(火) 11:28:15 ID:dIEMLhL70.net] だいぶんボケたことを書いてしまった。 (>>456 ) 式変形をする必要すらなく pow ひとつで良かった。 double cube_root(double x) { return pow(x, 1.0/3); }
474 名前:デフォルトの名無しさん mailto:sage [2022/05/10(火) 19:36:27.76 ID:gxi5OEx30.net] それを自作関数で求めるとは言わんやろ
475 名前:デフォルトの名無しさん (ワッチョイ 6aad-zDU0) [2022/05/10(火) 23:29:45 ID:CQsKbFR90.net] 言うだろう
476 名前:デフォルトの名無しさん mailto:sage [2022/05/11(水) 06:53:21.08 ID:zyEQjrH3d.net] コンビニ弁当買ってきて料理したというレベル
477 名前:デフォルトの名無しさん mailto:sage [2022/05/11(水) 10:08:25.28 ID:jCepvp6u0.net] 通はコンパイラの自作から始める?
478 名前:デフォルトの名無しさん (ブーイモ MMd6-RieT) mailto:sage [2022/05/11(水) 10:35:21 ID:a8uVrD+/M.net] 情報学科ならCPU設計からだよ
479 名前:デフォルトの名無しさん (ラクッペペ MMe6-PUK/) mailto:sage [2022/05/11(水) 10:39:55 ID:3yHJq16kM.net] CPU設計だと情報学科なのか電子工学科なのか微妙なところ
480 名前:デフォルトの名無しさん (ワッチョイ be63-PvPk) mailto:sage [2022/05/11(水) 10:43:04 ID:jCepvp6u0.net] CPU設計ソフトを作る事から
481 名前:デフォルトの名無しさん mailto:sage [2022/05/11(水) 12:00:05.99 ID:2wozbOYLd.net] 普通は自作関数作りたいんですって言ったら >>463 みたいなアルゴリズムを求めてるだろ 何の用途かは知らんが
482 名前:デフォルトの名無しさん mailto:sage [2022/05/11(水) 12:53:38.63 ID:rJ/SGv8Sa.net] >>471 素子の物理設計からなら電子工学 アーキテクチャからなら情報工学 じゃね? まあ素子の物理設計なんてやってる学校があるかどうかは知らんけど
483 名前:デフォルトの名無しさん mailto:sage [2022/05/11(水) 12:57:11.03 ID:3n2UFvlUM.net] CPU設計の半導体物性や加工技術は情報学科の範疇外だと思う
484 名前:デフォルトの名無しさん mailto:sage [2022/05/11(水) 21:22:30.22 ID:Uorg83Yar.net] >>455 もう解決したってことでいいよね
485 名前:デフォルトの名無しさん (ワッチョイ 7e02-jKFb) mailto:sage [2022/05/11(水) 23:25:04 ID:eEErnLrt0.net] >>457 精度を組み込み関数より高めたいのかな? なら一回で十分だよ、ループする必要も収束を確かめる必要もなくて、 y-=fx / f'x だけで数桁精度が上がる
486 名前:デフォルトの名無しさん [2022/05/12(木) 00:07:01.33 ID:a2iZs8ls0.net] たぶんニュートン法を使いたいけどアルゴリズムを実装できないだけだと思うな
487 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 00:13:44.54 ID:rHUhttMxr.net] 反論がないし解決したってことで
488 名前:デフォルトの名無しさん (ワッチョイ 1746-OCox) mailto:sage [2022/05/12(木) 03:09:36 ID:DwGZHhAI0.net] simulink coderが便利すぎて手打ちする気にならない件
489 名前:デフォルトの名無しさん [2022/05/14(土) 10:01:08.50 ID:JFqjXnq80.net] >>444 許されていないよ char *ss = “”; char ch = ‘a’; の記憶違いでしょう
490 名前:デフォルトの名無しさん mailto:sage [2022/05/14(土) 10:23:10.43 ID:yelWKEO3d.net] char ch = NULL; という書き方ならよく見かけた これはもちろん間違いなのだが
491 名前:デフォルトの名無しさん mailto:sage [2022/05/14(土) 15:45:11.14 ID:fRXCxvkXd.net] >>444 これどうなったの [] [ここ壊れてます]
493 名前:デフォルトの名無しさん [2022/05/15(日) 13:21:26.16 ID:evMzyiSb0.net] '' が使えるかどうかはコンパイラ次第なのでは? 文法的にダメだろうがなんだろうが使えるようにコンパイラ作られたらそれまでだし。 そういやGCCにも void * の変数に ++ とかの計算が出来たりして衝撃を受けたことがあったなあ。 他のコンパイラでコンパイルしてエラーになって発覚。
494 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 13:31:38.71 ID:+H3bKj0ad.net] キャスト式に代入とかね
495 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 13:39:44.18 ID:tGTiPFBf0.net] void *型のインクリって一体何バイト進むんだ?
496 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 13:48:28.89 ID:+dMN0zqr0.net] >void *型のインクリって一体何バイト進むんだ? codepad のC言語 → 1バイト codepad のC++ → エラー ISO C++ forbids incrementing a pointer of type 'void*' compilation terminated due to -Wfatal-errors.
497 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 13:53:41.23 ID:evMzyiSb0.net] >>486 1だったよ。char * と同じように計算していた。 お近くの gcc でお試しください。
498 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 14:00:59.60 ID:tGTiPFBf0.net] 即レスサンキュー
499 名前:はちみつ餃子 mailto:sage [2022/05/15(日) 14:07:27.97 ID:PUHmRytO0.net] gcc だと sizeof(void) が 1 を返したりするんだよな。 C++ だとこれがエラーになることを SFINAE のトリックに使ったりすることもあるんで、 どうやって辻褄を合わせているのかよくわからん。
500 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 14:17:30.76 ID:KxReCtrr0.net] こういう質問が来るたびに自分で試せばいいのにって思う。 仕様がどうなってるのかという質問なら理解できるけど。
501 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 20:01:48.66 ID:YQrK3HARa.net] いや、マニュアル読めよ... https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gcc/Pointer-Arith.html
502 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 11:31:17.17 ID:HihepIbQd.net] 単に好奇心で聞いてるだけだと思うよ 実用的に使おうと言うんじゃなく というか関数ポインタも1バイトになるのかw
503 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 11:43:19.86 ID:VUKzLr9a0.net] 何か有用な使い道ってあるか?
504 名前:デフォルトの名無しさん (ワッチョイ eb69-wjZZ) mailto:sage [2022/05/17(火) 17:06:43 ID:FuWQL0zJ0.net] 汎用ポインタとして void * で受けておいて char * でキャストすることなく そのポインタを 1バイト単位で操作できたとしても *で実体を取得する瞬間にキャスト必須になるし どうなんだろ
505 名前:デフォルトの名無しさん (スップ Sd03-m0tN) mailto:sage [2022/05/17(火) 18:02:18 ID:HihepIbQd.net] ただのうっかりミスだと思うんだが 修正するとコンパイルできなくなるんで仕様にしてしまったのか
506 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 18:51:17.67 ID:Qbd65aeba.net] >>493 > というか関数ポインタも1バイトになるのかw んなわけないだろw 関数ポインタは普通に4/8バイトだよ 関数のサイズが1バイトになる codepad.org/zwItkWg3
507 名前:デフォルトの名無しさん (ワッチョイ 5b63-yvGd) mailto:sage [2022/05/17(火) 19:17:06 ID:kg0MHFY+0.net] バグからさめると別のバグの世界のような気がする。
508 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 20:20:31.65 ID:HihepIbQd.net] >>497 君以外はみんなわかってる気がするw
509 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 21:01:08.19 ID:xzGoH14A0.net] >>495 Cスタイルキャストだとあまり気にならないかもしれないけどC++スタイル2回重ねるのはちょっと嫌になる。
510 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 21:09:29.94 ID:JCWwsd/Ra.net] >>499 関数ポインタが1バイトとか言ってたアホがいたんだけどw てかお前意味わかってないだろ
511 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 21:17:57.23 ID:VUKzLr9a0.net] >>501 文脈を踏まえれば >>493 が言ってるのは「関数ポインタでも (インクリメントで進む量は) 1 バイト」というのは理解できるだろ……。
512 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 21:26:34.47 ID:cXB/OW/Na.net] 文脈? > gcc だと sizeof(void) が 1 を返したりするんだよな。 ↓ > というか関数ポインタも1バイトになるのかw 恥の上塗りかよw
513 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 21:35:35.34 ID:xzGoH14A0.net] >>503 ↓これを踏まえてのsizeof(void)だろ。なんでポインタそのもののサイズが出てくるのよ。 >void *型のインクリって一体何バイト進むんだ?
514 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 22:33:22.42 ID:HihepIbQd.net] >>503 お前がな…
515 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 22:45:15.36 ID:pcmvPs1uM.net] >>503 お前よりはな
516 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:47:41.31 ID:PdG/XNB8a.net] スレチだったら申し訳ない とあるフリーソフトが起動しなくてdllファイルを読み込んでないのが原因っぽいんだけど VSでdumpbinを使って関数を調べた所LNK4044のエラー 〇〇.dllは無効です、無視されます との文が出るんだがこうなるともうdllに原因があるから対処しようがないってこと? ここから修復出来る方法ありますかね
517 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:53:43.44 ID:bslzKqYb0.net] >>507 状況によるのでその情報からだけではわからない。
518 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 14:03:00.61 ID:G19C49df0.net] ぶっ壊れではなく、OSにVCランタイムが入ってない可能性 Dependency Walker (https://www.dependencywalker.com/) で その DLL をトレースしてみて、そいつが vcランタイム 要求していないか確認する (そして古いverのVCランタイムをどうやって入手するかという話に)
519 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 14:10:31.11 ID:G19C49df0.net] >>500 C++ だと void * のインクリメントがエラーになるので C限定のお話やね
520 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 22:34:39.58 ID:CFFEhoB20.net] ガチ初心者なんやが、まず何すればいいん? HtmlとCSSだけ少し触ったことがある
521 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 22:40:25.27 ID:E1vMcGgB0.net] ガチ初心者なら、なにもC言語に手を出さなくても……
522 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 22:52:35.00 ID:yp09HIZB0.net] 何が目標なのかを書いてみて
523 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 05:23:54.79 ID:UJCwwVidd.net] >>510 それgcc限定のお話だな
524 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 07:44:23.05 ID:KBg+aMKFd.net] >>511 こういうよくある質問 何答えればいい?ってなるよな
525 名前:デフォルトの名無しさん (スプッッ Sddb-f+Gq) mailto:sage [2022/05/19(木) 09:14:35 ID:TZT0OIWkd.net] へてむるとCSSてことは、関心事はネットかな?
526 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:14:13.87 ID:kqStXWIg0.net] >>511 世の中は流動的で、何が正解なのかは後にならないとわからない。 正解の道筋があるわけではなく、たくさんの知識があればどれかが役立つこともあるってだけ。 最初は物量だ。 詰め込め。
527 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 18:09:46.73 ID:KBg+aMKFd.net] こういう奴はめんどうくさいことが嫌いで とにかく近道が行きたくて聞いてるので 目的地なんて知らんとにかく近道教えろ!ってことなので 教えようがないんよ
528 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:03:31.03 ID:SEOso9Vd0.net] すみません、visual studio communityを使っています 関数は呼び出すより前に定義の必要があることが分かりました ですがソースファイル(.c)を分けて、一方に関数を定義すると定義する順番を気にせず使えます インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます 何故でしょうか?
529 名前:デフォルトの名無しさん (ワッチョイ eb69-yvGd) mailto:sage [2022/05/20(金) 00:55:01 ID:tfeu1OX00.net] >>519 > 関数は呼び出すより前に定義の必要があることが分かりました いいえ、宣言しておけば定義は後でもいいです > インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます しなくてもできるってことは必要じゃないってことです
530 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 01:27:17.95 ID:1uCl4yv30.net] >>519 #include等の先頭に#が付いたやつはCコンパイラに処理を引き渡す前にソースのテキストに対して行われる編集を指示するものだ。 つまり #include で何かファイルが指定されていたらそのファイルを読んできてその行に挿入する。そしてそれからコンパイルが行われる。 なので #include で指定するファイルの内容を直接そこに書いてしまっても結果は同じになる。
531 名前:デフォルトの名無しさん (ワッチョイ efd2-ydBh) [2022/05/20(金) 03:28:01 ID:QfqNLeQw0.net] >>519 C言語では関数宣言がなくても関数っぽく使われてるものがあったら int func(); の宣言があるものとして決め打ちする。 .hとかで前方宣言してなくてもコンパイルは通る。 利用側の.cでは引数の数と型と返り値型が分からんが、合ってれば問題なく使える。 間違ってた使い方をしたときにエラーを出せないから極力避けるべき(コンパイラによっては出るかもしれんが) この仕様はエラーを見つける観点からすればクソなので、長い歴史があるC言語以外では採用されてないはず
532 名前:はちみつ餃子 mailto:sage [2022/05/20(金) 05:08:48.27 ID:YhZHNcJW0.net] 暗黙の関数宣言は仕様から削除されてるよ。 C99 の時点でもう項目がない。 互換性の都合で出来るようにしてある処理系も多いと思うけど 警告くらいは出てるはずだと思うんで読み飛ばさずにしっかり見て欲しいな。
533 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 06:35:34.02 ID:QdnN/13A0.net] まあわかるんだけど K&R Cの楽しさがどんどん消えていく寂しさが・・・
534 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:04:15.92 ID:px60Na0ad.net] みんな>>519 の意味がよくわかるな というかこれらの解答であってるの?
535 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:18:47.95 ID:xUD6u/k80.net] 昔大学の授業で使ったTurbo Cで printf()等がincludeせずに使えた。 warningぐらいは出てたかも。
536 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 09:35:03.59 ID:qCLhnuk6r.net] 警告出てもコンパイル通ることあるよね 大学のシステムプログラミングの授業の教科書のサンプルコード、インクルード不足で警告よく吐いてた
537 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:00:52.44 ID:px60Na0ad.net] どんなコードでもラベルがどこかで定義されてる限りコンパイル・リンクはできるんだよ 実行時に望みの結果にならなかったり最悪保護エラーになったりするだけ
538 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:12:25.64 ID:mW5NTdIj0.net] コンパイルエラー・リンクエラーになるコードなんていくらでもあるだろ何言ってんだ。
539 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:15:14.87 ID:px60Na0ad.net] ほら変なのが絡んできたw
540 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 12:57:31.73 ID:xUD6u/k80.net] 動的リンクってやつかな? C言語はDOS時代に独学でやってたんで(大学はコードの書き方しか教えてくれんかった)どうしても 「宣言だけしておけばコンパイルは通るけど、リンク時に実態が無いとエラーになる」 ってイメージが。
541 名前:はちみつ餃子 mailto:sage [2022/05/20(金) 14:41:08.78 ID:YhZHNcJW0.net] >>531 無関係。 動的リンクは実行時にリンクする (いわゆる DLL とか so とか) 仕組みで、ホスト環境側の機能。 暗黙の関数宣言は暗黙に宣言する言語機能。
542 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 16:18:15.28 ID:px60Na0ad.net] ごちゃごちゃしてきたな >>519 に戻って「プロトタイプ宣言しなくても参照できるのは何故か」と言えば 古典的Cでは関数名は単純にfunc()→_funcというアセンブラシンボルに変換してるだけなので 別のソースでも同じ名前で定義してさえいればリンクは通る ただCでは引数をスタックに積んで呼び出すので引数の数や順番が関数と呼び出し側で統一されてないと引数を正しく処理できないので見つけにくいエラーを起こしたり最悪スタック上の戻りアドレスを書き換えてしまって停止する だからインクルードファイルでプロトタイプ宣言して統一しようということ C++では[関数名_引数の数や種類]というアセンブラシンボルに変換するので、正しい引数で呼び出さないとリンク時に見つからないと言われる それ以前にプロトタイプが必須になってるけど
543 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 01:22:00.94 ID:gs0SnL//M.net] 519です 遅くなってすみません 皆さんありがとうございました まず、宣言と定義の違いを理解していませんでした 同一プロジェクト中の別ソースにある関数を、宣言しないで呼び出せるのが何故か知りたいです 戻り値がint型だと暗黙の宣言で使えるようですが、戻り値がchar型の関数を呼び出せます 関数を呼び出すより前に宣言されているはずなので、先に関数を記述したソースが解析されているということ?? 試しにその関数をmain関数の後に持ってくると当然コンパイルエラーになります 恐らく>>533 に頂いた回答が近いと思うのですが、リンクを理解していないためか理解できません… 勉強不足で質問するのも申し訳ないのですが、ご回答いただけると嬉しいです
544 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 01:31:16.14 ID:Q47fXgzra.net] 呼び出せないと思ったほうが良い
545 名前:はちみつ餃子 mailto:sage [2022/05/25(水) 01:35:46.79 ID:9QZiEKx+0.net] >>534 コンパイラは宣言の辻褄が合っていると「仮定して」処理する。 宣言の辻褄が合うようにするのはプログラマの責任。 辻褄が合ってないときにどうなるかは言語仕様上は未定義のなのでなんとなく動いているように見えてもあてにならない。
546 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 09:42:18.14 ID:mSxNHOMI0.net] C言語に慣れない頃はmain関数はファイルの最後に書いて、 呼び出される順番にソースの上の方に関数追加していったわ。 -----ccc.c----- int FuncB(){ return 1; } int FuncA(){ return FuncB(); } int main() { return FuncA(); }
547 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 10:12:31.53 ID:dvdfNrTHa.net] >>537 呼び出しじゃなくて依存の順序で書くね 宣言はなるべく書かない!
548 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 10:18:58.73 ID:aeVycjmX0.net] 間接再帰ができない間だけ通用する
549 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 11:11:34.92 ID:f6RSTkPjd.net] >>537 簡単なプログラムで急いで書いてる場合や 関数の仕様を手探りで作りながら書いてる状態ならそんなでもいい ただFuncBからもFuncAを呼び出すようになった場合困るから