!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 158
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ブーイモ MMcf-4SjH)
2021/12/25(土) 12:11:46.61ID:xxeaCAplM456はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-PvPk)
2022/05/09(月) 17:46:08.50ID:9vSL2/iz0 >>455
要件次第だけど実装が一番簡単なのは log を使うことだと思う。
要件次第だけど実装が一番簡単なのは log を使うことだと思う。
457デフォルトの名無しさん (ワッチョイ 2e02-ltxK)
2022/05/09(月) 17:47:02.53ID:x5IK3MV30 >>456
ニュートン法を使いたいです、、
ニュートン法を使いたいです、、
458はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-PvPk)
2022/05/09(月) 17:50:27.78ID:9vSL2/iz0 >>457
方法がわかってるなら何をききたいの?
方法がわかってるなら何をききたいの?
459デフォルトの名無しさん (ワッチョイ be63-PvPk)
2022/05/09(月) 18:03:26.90ID:jsi1f5HY0 何も入っていない変数が作れます
460デフォルトの名無しさん (ワッチョイ 1746-w9IM)
2022/05/09(月) 18:36:55.77ID:4JqWZIdB0 だからその
> 何も入っていない
は0から0xffのうちの何なのよ。
1 Byteの領域はあるんでそ。
> 何も入っていない
は0から0xffのうちの何なのよ。
1 Byteの領域はあるんでそ。
461デフォルトの名無しさん (ワッチョイ be63-PvPk)
2022/05/09(月) 18:39:59.52ID:jsi1f5HY0 そこは未知の領域
462デフォルトの名無しさん (アウアウウー Sa1f-KEdX)
2022/05/09(月) 19:59:08.45ID:UxqgrJa1a >>460
ネタに全力で食いつくなよw
ネタに全力で食いつくなよw
463デフォルトの名無しさん (ワッチョイ ea02-zDU0)
2022/05/09(月) 20:46:46.66ID:poYUryAv0 一番簡単なのは挟み撃ちだと思うけどな
1の三乗は
0.5の三乗は
と1/2づつ狭めていく
1の三乗は
0.5の三乗は
と1/2づつ狭めていく
464デフォルトの名無しさん (スッップ Sd8a-m628)
2022/05/10(火) 09:30:11.65ID:79aB+w7Md >>450
NULLはポインターに代入できる「無意味な位置」を表すアドレス
NULLはポインターに代入できる「無意味な位置」を表すアドレス
465はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-PvPk)
2022/05/10(火) 11:28:15.81ID:dIEMLhL70 だいぶんボケたことを書いてしまった。 (>>456)
式変形をする必要すらなく pow ひとつで良かった。
double cube_root(double x) {
return pow(x, 1.0/3);
}
式変形をする必要すらなく pow ひとつで良かった。
double cube_root(double x) {
return pow(x, 1.0/3);
}
466デフォルトの名無しさん (ワッチョイ ca69-PvPk)
2022/05/10(火) 19:36:27.76ID:gxi5OEx30 それを自作関数で求めるとは言わんやろ
467デフォルトの名無しさん (ワッチョイ 6aad-zDU0)
2022/05/10(火) 23:29:45.70ID:CQsKbFR90 言うだろう
468デフォルトの名無しさん (スッププ Sd8a-m628)
2022/05/11(水) 06:53:21.08ID:zyEQjrH3d コンビニ弁当買ってきて料理したというレベル
469デフォルトの名無しさん (ワッチョイ be63-PvPk)
2022/05/11(水) 10:08:25.28ID:jCepvp6u0 通はコンパイラの自作から始める?
470デフォルトの名無しさん (ブーイモ MMd6-RieT)
2022/05/11(水) 10:35:21.30ID:a8uVrD+/M 情報学科ならCPU設計からだよ
471デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
2022/05/11(水) 10:39:55.99ID:3yHJq16kM CPU設計だと情報学科なのか電子工学科なのか微妙なところ
472デフォルトの名無しさん (ワッチョイ be63-PvPk)
2022/05/11(水) 10:43:04.06ID:jCepvp6u0 CPU設計ソフトを作る事から
473デフォルトの名無しさん (スッププ Sd8a-m628)
2022/05/11(水) 12:00:05.99ID:2wozbOYLd474デフォルトの名無しさん (アウアウウー Sa1f-KEdX)
2022/05/11(水) 12:53:38.63ID:rJ/SGv8Sa475デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
2022/05/11(水) 12:57:11.03ID:3n2UFvlUM CPU設計の半導体物性や加工技術は情報学科の範疇外だと思う
476デフォルトの名無しさん (オッペケ Sr33-G7U6)
2022/05/11(水) 21:22:30.22ID:Uorg83Yar >>455
もう解決したってことでいいよね
もう解決したってことでいいよね
477デフォルトの名無しさん (ワッチョイ 7e02-jKFb)
2022/05/11(水) 23:25:04.32ID:eEErnLrt0478デフォルトの名無しさん (ワッチョイ 73d2-U1YL)
2022/05/12(木) 00:07:01.33ID:a2iZs8ls0 たぶんニュートン法を使いたいけどアルゴリズムを実装できないだけだと思うな
479デフォルトの名無しさん (オッペケ Sr33-G7U6)
2022/05/12(木) 00:13:44.54ID:rHUhttMxr 反論がないし解決したってことで
480デフォルトの名無しさん (ワッチョイ 1746-OCox)
2022/05/12(木) 03:09:36.14ID:DwGZHhAI0 simulink coderが便利すぎて手打ちする気にならない件
481デフォルトの名無しさん (ワッチョイ 6fbd-EjCo)
2022/05/14(土) 10:01:08.50ID:JFqjXnq80482デフォルトの名無しさん (スッップ Sdd7-m0tN)
2022/05/14(土) 10:23:10.43ID:yelWKEO3d char ch = NULL;
という書き方ならよく見かけた
これはもちろん間違いなのだが
という書き方ならよく見かけた
これはもちろん間違いなのだが
483デフォルトの名無しさん (スププ Sd2f-copH)
2022/05/14(土) 15:45:11.14ID:fRXCxvkXd >>444
これどうなったの
これどうなったの
484デフォルトの名無しさん (ワッチョイ e3ad-lIli)
2022/05/15(日) 13:21:26.16ID:evMzyiSb0 '' が使えるかどうかはコンパイラ次第なのでは?
文法的にダメだろうがなんだろうが使えるようにコンパイラ作られたらそれまでだし。
そういやGCCにも void * の変数に ++ とかの計算が出来たりして衝撃を受けたことがあったなあ。
他のコンパイラでコンパイルしてエラーになって発覚。
文法的にダメだろうがなんだろうが使えるようにコンパイラ作られたらそれまでだし。
そういやGCCにも void * の変数に ++ とかの計算が出来たりして衝撃を受けたことがあったなあ。
他のコンパイラでコンパイルしてエラーになって発覚。
485デフォルトの名無しさん (スプッッ Sddb-f+Gq)
2022/05/15(日) 13:31:38.71ID:+H3bKj0ad キャスト式に代入とかね
486デフォルトの名無しさん (ワッチョイ c702-yXul)
2022/05/15(日) 13:39:44.18ID:tGTiPFBf0 void *型のインクリって一体何バイト進むんだ?
487デフォルトの名無しさん (ワッチョイ 5d10-yvGd)
2022/05/15(日) 13:48:28.89ID:+dMN0zqr0 >void *型のインクリって一体何バイト進むんだ?
codepad のC言語 → 1バイト
codepad のC++ → エラー
ISO C++ forbids incrementing a pointer of type 'void*' compilation terminated due to -Wfatal-errors.
codepad のC言語 → 1バイト
codepad のC++ → エラー
ISO C++ forbids incrementing a pointer of type 'void*' compilation terminated due to -Wfatal-errors.
488デフォルトの名無しさん (ワッチョイ e3ad-lIli)
2022/05/15(日) 13:53:41.23ID:evMzyiSb0489デフォルトの名無しさん (ワッチョイ c702-yXul)
2022/05/15(日) 14:00:59.60ID:tGTiPFBf0 即レスサンキュー
490はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d73e-yvGd)
2022/05/15(日) 14:07:27.97ID:PUHmRytO0 gcc だと sizeof(void) が 1 を返したりするんだよな。
C++ だとこれがエラーになることを SFINAE のトリックに使ったりすることもあるんで、
どうやって辻褄を合わせているのかよくわからん。
C++ だとこれがエラーになることを SFINAE のトリックに使ったりすることもあるんで、
どうやって辻褄を合わせているのかよくわからん。
491デフォルトの名無しさん (ワッチョイ 5d10-yvGd)
2022/05/16(月) 14:17:30.76ID:KxReCtrr0 こういう質問が来るたびに自分で試せばいいのにって思う。
仕様がどうなってるのかという質問なら理解できるけど。
仕様がどうなってるのかという質問なら理解できるけど。
492デフォルトの名無しさん (アウアウウー Sa31-kfZy)
2022/05/16(月) 20:01:48.66ID:YQrK3HARa493デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/17(火) 11:31:17.17ID:HihepIbQd 単に好奇心で聞いてるだけだと思うよ
実用的に使おうと言うんじゃなく
というか関数ポインタも1バイトになるのかw
実用的に使おうと言うんじゃなく
というか関数ポインタも1バイトになるのかw
494デフォルトの名無しさん (ワッチョイ d73e-yvGd)
2022/05/17(火) 11:43:19.86ID:VUKzLr9a0 何か有用な使い道ってあるか?
495デフォルトの名無しさん (ワッチョイ eb69-wjZZ)
2022/05/17(火) 17:06:43.60ID:FuWQL0zJ0 汎用ポインタとして void * で受けておいて
char * でキャストすることなく そのポインタを 1バイト単位で操作できたとしても
*で実体を取得する瞬間にキャスト必須になるし どうなんだろ
char * でキャストすることなく そのポインタを 1バイト単位で操作できたとしても
*で実体を取得する瞬間にキャスト必須になるし どうなんだろ
496デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/17(火) 18:02:18.76ID:HihepIbQd ただのうっかりミスだと思うんだが
修正するとコンパイルできなくなるんで仕様にしてしまったのか
修正するとコンパイルできなくなるんで仕様にしてしまったのか
497デフォルトの名無しさん (アウアウウー Sa31-kfZy)
2022/05/17(火) 18:51:17.67ID:Qbd65aeba >>493
> というか関数ポインタも1バイトになるのかw
んなわけないだろw
関数ポインタは普通に4/8バイトだよ
関数のサイズが1バイトになる
http://codepad.org/zwItkWg3
> というか関数ポインタも1バイトになるのかw
んなわけないだろw
関数ポインタは普通に4/8バイトだよ
関数のサイズが1バイトになる
http://codepad.org/zwItkWg3
498デフォルトの名無しさん (ワッチョイ 5b63-yvGd)
2022/05/17(火) 19:17:06.37ID:kg0MHFY+0 バグからさめると別のバグの世界のような気がする。
499デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/17(火) 20:20:31.65ID:HihepIbQd >>497
君以外はみんなわかってる気がするw
君以外はみんなわかってる気がするw
500デフォルトの名無しさん (ワッチョイ abcf-7P1Y)
2022/05/17(火) 21:01:08.19ID:xzGoH14A0 >>495
Cスタイルキャストだとあまり気にならないかもしれないけどC++スタイル2回重ねるのはちょっと嫌になる。
Cスタイルキャストだとあまり気にならないかもしれないけどC++スタイル2回重ねるのはちょっと嫌になる。
501デフォルトの名無しさん (アウアウウー Sa31-kfZy)
2022/05/17(火) 21:09:29.94ID:JCWwsd/Ra502デフォルトの名無しさん (ワッチョイ d73e-yvGd)
2022/05/17(火) 21:17:57.23ID:VUKzLr9a0503デフォルトの名無しさん (アウアウウー Sa31-kfZy)
2022/05/17(火) 21:26:34.47ID:cXB/OW/Na 文脈?
> gcc だと sizeof(void) が 1 を返したりするんだよな。
↓
> というか関数ポインタも1バイトになるのかw
恥の上塗りかよw
> gcc だと sizeof(void) が 1 を返したりするんだよな。
↓
> というか関数ポインタも1バイトになるのかw
恥の上塗りかよw
504デフォルトの名無しさん (ワッチョイ abcf-7P1Y)
2022/05/17(火) 21:35:35.34ID:xzGoH14A0505デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/17(火) 22:33:22.42ID:HihepIbQd >>503
お前がな…
お前がな…
506デフォルトの名無しさん (テテンテンテン MM17-c+Ta)
2022/05/17(火) 22:45:15.36ID:pcmvPs1uM >>503
お前よりはな
お前よりはな
507デフォルトの名無しさん (アウアウウー Sa31-K8fu)
2022/05/18(水) 07:47:41.31ID:PdG/XNB8a スレチだったら申し訳ない
とあるフリーソフトが起動しなくてdllファイルを読み込んでないのが原因っぽいんだけど
VSでdumpbinを使って関数を調べた所LNK4044のエラー 〇〇.dllは無効です、無視されます
との文が出るんだがこうなるともうdllに原因があるから対処しようがないってこと?
ここから修復出来る方法ありますかね
とあるフリーソフトが起動しなくてdllファイルを読み込んでないのが原因っぽいんだけど
VSでdumpbinを使って関数を調べた所LNK4044のエラー 〇〇.dllは無効です、無視されます
との文が出るんだがこうなるともうdllに原因があるから対処しようがないってこと?
ここから修復出来る方法ありますかね
508デフォルトの名無しさん (ワッチョイ d73e-yvGd)
2022/05/18(水) 11:53:43.44ID:bslzKqYb0 >>507
状況によるのでその情報からだけではわからない。
状況によるのでその情報からだけではわからない。
509デフォルトの名無しさん (ワッチョイ eb69-wjZZ)
2022/05/18(水) 14:03:00.61ID:G19C49df0 ぶっ壊れではなく、OSにVCランタイムが入ってない可能性
Dependency Walker (https://www.dependencywalker.com/) で
その DLL をトレースしてみて、そいつが vcランタイム 要求していないか確認する
(そして古いverのVCランタイムをどうやって入手するかという話に)
Dependency Walker (https://www.dependencywalker.com/) で
その DLL をトレースしてみて、そいつが vcランタイム 要求していないか確認する
(そして古いverのVCランタイムをどうやって入手するかという話に)
510デフォルトの名無しさん (ワッチョイ eb69-wjZZ)
2022/05/18(水) 14:10:31.11ID:G19C49df0 >>500
C++ だと void * のインクリメントがエラーになるので C限定のお話やね
C++ だと void * のインクリメントがエラーになるので C限定のお話やね
511デフォルトの名無しさん (ワッチョイ 0b75-yQzt)
2022/05/18(水) 22:34:39.58ID:CFFEhoB20 ガチ初心者なんやが、まず何すればいいん?
HtmlとCSSだけ少し触ったことがある
HtmlとCSSだけ少し触ったことがある
512デフォルトの名無しさん (ワッチョイ ffbb-r8mr)
2022/05/18(水) 22:40:25.27ID:E1vMcGgB0 ガチ初心者なら、なにもC言語に手を出さなくても……
513デフォルトの名無しさん (ワッチョイ 5b63-yvGd)
2022/05/18(水) 22:52:35.00ID:yp09HIZB0 何が目標なのかを書いてみて
514デフォルトの名無しさん (スプッッ Sd2f-f+Gq)
2022/05/19(木) 05:23:54.79ID:UJCwwVidd >>510
それgcc限定のお話だな
それgcc限定のお話だな
515デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/19(木) 07:44:23.05ID:KBg+aMKFd516デフォルトの名無しさん (スプッッ Sddb-f+Gq)
2022/05/19(木) 09:14:35.57ID:TZT0OIWkd へてむるとCSSてことは、関心事はネットかな?
517デフォルトの名無しさん (ワッチョイ d73e-yvGd)
2022/05/19(木) 12:14:13.87ID:kqStXWIg0518デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/19(木) 18:09:46.73ID:KBg+aMKFd こういう奴はめんどうくさいことが嫌いで
とにかく近道が行きたくて聞いてるので
目的地なんて知らんとにかく近道教えろ!ってことなので
教えようがないんよ
とにかく近道が行きたくて聞いてるので
目的地なんて知らんとにかく近道教えろ!ってことなので
教えようがないんよ
519デフォルトの名無しさん (ワッチョイ 53ae-Lh2i)
2022/05/20(金) 00:03:31.03ID:SEOso9Vd0 すみません、visual studio communityを使っています
関数は呼び出すより前に定義の必要があることが分かりました
ですがソースファイル(.c)を分けて、一方に関数を定義すると定義する順番を気にせず使えます
インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
何故でしょうか?
関数は呼び出すより前に定義の必要があることが分かりました
ですがソースファイル(.c)を分けて、一方に関数を定義すると定義する順番を気にせず使えます
インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
何故でしょうか?
520デフォルトの名無しさん (ワッチョイ eb69-yvGd)
2022/05/20(金) 00:55:01.33ID:tfeu1OX00 >>519
> 関数は呼び出すより前に定義の必要があることが分かりました
いいえ、宣言しておけば定義は後でもいいです
> インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
しなくてもできるってことは必要じゃないってことです
> 関数は呼び出すより前に定義の必要があることが分かりました
いいえ、宣言しておけば定義は後でもいいです
> インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
しなくてもできるってことは必要じゃないってことです
521デフォルトの名無しさん (ワッチョイ e3ad-lIli)
2022/05/20(金) 01:27:17.95ID:1uCl4yv30 >>519
#include等の先頭に#が付いたやつはCコンパイラに処理を引き渡す前にソースのテキストに対して行われる編集を指示するものだ。
つまり #include で何かファイルが指定されていたらそのファイルを読んできてその行に挿入する。そしてそれからコンパイルが行われる。
なので #include で指定するファイルの内容を直接そこに書いてしまっても結果は同じになる。
#include等の先頭に#が付いたやつはCコンパイラに処理を引き渡す前にソースのテキストに対して行われる編集を指示するものだ。
つまり #include で何かファイルが指定されていたらそのファイルを読んできてその行に挿入する。そしてそれからコンパイルが行われる。
なので #include で指定するファイルの内容を直接そこに書いてしまっても結果は同じになる。
522デフォルトの名無しさん (ワッチョイ efd2-ydBh)
2022/05/20(金) 03:28:01.86ID:QfqNLeQw0 >>519
C言語では関数宣言がなくても関数っぽく使われてるものがあったら int func(); の宣言があるものとして決め打ちする。
.hとかで前方宣言してなくてもコンパイルは通る。
利用側の.cでは引数の数と型と返り値型が分からんが、合ってれば問題なく使える。
間違ってた使い方をしたときにエラーを出せないから極力避けるべき(コンパイラによっては出るかもしれんが)
この仕様はエラーを見つける観点からすればクソなので、長い歴史があるC言語以外では採用されてないはず
C言語では関数宣言がなくても関数っぽく使われてるものがあったら int func(); の宣言があるものとして決め打ちする。
.hとかで前方宣言してなくてもコンパイルは通る。
利用側の.cでは引数の数と型と返り値型が分からんが、合ってれば問題なく使える。
間違ってた使い方をしたときにエラーを出せないから極力避けるべき(コンパイラによっては出るかもしれんが)
この仕様はエラーを見つける観点からすればクソなので、長い歴史があるC言語以外では採用されてないはず
523はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d73e-yvGd)
2022/05/20(金) 05:08:48.27ID:YhZHNcJW0 暗黙の関数宣言は仕様から削除されてるよ。
C99 の時点でもう項目がない。
互換性の都合で出来るようにしてある処理系も多いと思うけど
警告くらいは出てるはずだと思うんで読み飛ばさずにしっかり見て欲しいな。
C99 の時点でもう項目がない。
互換性の都合で出来るようにしてある処理系も多いと思うけど
警告くらいは出てるはずだと思うんで読み飛ばさずにしっかり見て欲しいな。
524デフォルトの名無しさん (ワッチョイ bfae-lIli)
2022/05/20(金) 06:35:34.02ID:QdnN/13A0 まあわかるんだけど
K&R Cの楽しさがどんどん消えていく寂しさが・・・
K&R Cの楽しさがどんどん消えていく寂しさが・・・
525デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/20(金) 08:04:15.92ID:px60Na0ad みんな>>519の意味がよくわかるな
というかこれらの解答であってるの?
というかこれらの解答であってるの?
526デフォルトの名無しさん (ワッチョイ 5d10-yvGd)
2022/05/20(金) 08:18:47.95ID:xUD6u/k80 昔大学の授業で使ったTurbo Cで
printf()等がincludeせずに使えた。
warningぐらいは出てたかも。
printf()等がincludeせずに使えた。
warningぐらいは出てたかも。
527デフォルトの名無しさん (オッペケ Sr75-CBzb)
2022/05/20(金) 09:35:03.59ID:qCLhnuk6r 警告出てもコンパイル通ることあるよね
大学のシステムプログラミングの授業の教科書のサンプルコード、インクルード不足で警告よく吐いてた
大学のシステムプログラミングの授業の教科書のサンプルコード、インクルード不足で警告よく吐いてた
528デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/20(金) 10:00:52.44ID:px60Na0ad どんなコードでもラベルがどこかで定義されてる限りコンパイル・リンクはできるんだよ
実行時に望みの結果にならなかったり最悪保護エラーになったりするだけ
実行時に望みの結果にならなかったり最悪保護エラーになったりするだけ
529デフォルトの名無しさん (ワッチョイ 2d5f-yvGd)
2022/05/20(金) 10:12:25.64ID:mW5NTdIj0 コンパイルエラー・リンクエラーになるコードなんていくらでもあるだろ何言ってんだ。
530デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/20(金) 10:15:14.87ID:px60Na0ad ほら変なのが絡んできたw
531デフォルトの名無しさん (ワッチョイ 5d10-yvGd)
2022/05/20(金) 12:57:31.73ID:xUD6u/k80 動的リンクってやつかな?
C言語はDOS時代に独学でやってたんで(大学はコードの書き方しか教えてくれんかった)どうしても
「宣言だけしておけばコンパイルは通るけど、リンク時に実態が無いとエラーになる」
ってイメージが。
C言語はDOS時代に独学でやってたんで(大学はコードの書き方しか教えてくれんかった)どうしても
「宣言だけしておけばコンパイルは通るけど、リンク時に実態が無いとエラーになる」
ってイメージが。
532はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d73e-yvGd)
2022/05/20(金) 14:41:08.78ID:YhZHNcJW0533デフォルトの名無しさん (スップ Sd03-m0tN)
2022/05/20(金) 16:18:15.28ID:px60Na0ad ごちゃごちゃしてきたな
>>519に戻って「プロトタイプ宣言しなくても参照できるのは何故か」と言えば
古典的Cでは関数名は単純にfunc()→_funcというアセンブラシンボルに変換してるだけなので
別のソースでも同じ名前で定義してさえいればリンクは通る
ただCでは引数をスタックに積んで呼び出すので引数の数や順番が関数と呼び出し側で統一されてないと引数を正しく処理できないので見つけにくいエラーを起こしたり最悪スタック上の戻りアドレスを書き換えてしまって停止する
だからインクルードファイルでプロトタイプ宣言して統一しようということ
C++では[関数名_引数の数や種類]というアセンブラシンボルに変換するので、正しい引数で呼び出さないとリンク時に見つからないと言われる
それ以前にプロトタイプが必須になってるけど
>>519に戻って「プロトタイプ宣言しなくても参照できるのは何故か」と言えば
古典的Cでは関数名は単純にfunc()→_funcというアセンブラシンボルに変換してるだけなので
別のソースでも同じ名前で定義してさえいればリンクは通る
ただCでは引数をスタックに積んで呼び出すので引数の数や順番が関数と呼び出し側で統一されてないと引数を正しく処理できないので見つけにくいエラーを起こしたり最悪スタック上の戻りアドレスを書き換えてしまって停止する
だからインクルードファイルでプロトタイプ宣言して統一しようということ
C++では[関数名_引数の数や種類]というアセンブラシンボルに変換するので、正しい引数で呼び出さないとリンク時に見つからないと言われる
それ以前にプロトタイプが必須になってるけど
534デフォルトの名無しさん (ワンミングク MM8a-+hKh)
2022/05/25(水) 01:22:00.94ID:gs0SnL//M 519です
遅くなってすみません
皆さんありがとうございました
まず、宣言と定義の違いを理解していませんでした
同一プロジェクト中の別ソースにある関数を、宣言しないで呼び出せるのが何故か知りたいです
戻り値がint型だと暗黙の宣言で使えるようですが、戻り値がchar型の関数を呼び出せます
関数を呼び出すより前に宣言されているはずなので、先に関数を記述したソースが解析されているということ??
試しにその関数をmain関数の後に持ってくると当然コンパイルエラーになります
恐らく>>533に頂いた回答が近いと思うのですが、リンクを理解していないためか理解できません…
勉強不足で質問するのも申し訳ないのですが、ご回答いただけると嬉しいです
遅くなってすみません
皆さんありがとうございました
まず、宣言と定義の違いを理解していませんでした
同一プロジェクト中の別ソースにある関数を、宣言しないで呼び出せるのが何故か知りたいです
戻り値がint型だと暗黙の宣言で使えるようですが、戻り値がchar型の関数を呼び出せます
関数を呼び出すより前に宣言されているはずなので、先に関数を記述したソースが解析されているということ??
試しにその関数をmain関数の後に持ってくると当然コンパイルエラーになります
恐らく>>533に頂いた回答が近いと思うのですが、リンクを理解していないためか理解できません…
勉強不足で質問するのも申し訳ないのですが、ご回答いただけると嬉しいです
535デフォルトの名無しさん (アウアウウー Sac7-wghP)
2022/05/25(水) 01:31:16.14ID:Q47fXgzra 呼び出せないと思ったほうが良い
536はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5a3e-eugl)
2022/05/25(水) 01:35:46.79ID:9QZiEKx+0 >>534
コンパイラは宣言の辻褄が合っていると「仮定して」処理する。
宣言の辻褄が合うようにするのはプログラマの責任。
辻褄が合ってないときにどうなるかは言語仕様上は未定義のなのでなんとなく動いているように見えてもあてにならない。
コンパイラは宣言の辻褄が合っていると「仮定して」処理する。
宣言の辻褄が合うようにするのはプログラマの責任。
辻褄が合ってないときにどうなるかは言語仕様上は未定義のなのでなんとなく動いているように見えてもあてにならない。
537デフォルトの名無しさん (ワッチョイ 5b10-eugl)
2022/05/25(水) 09:42:18.14ID:mSxNHOMI0 C言語に慣れない頃はmain関数はファイルの最後に書いて、
呼び出される順番にソースの上の方に関数追加していったわ。
-----ccc.c-----
int FuncB(){
return 1;
}
int FuncA(){
return FuncB();
}
int main() {
return FuncA();
}
呼び出される順番にソースの上の方に関数追加していったわ。
-----ccc.c-----
int FuncB(){
return 1;
}
int FuncA(){
return FuncB();
}
int main() {
return FuncA();
}
538デフォルトの名無しさん (アウアウウー Sac7-wghP)
2022/05/25(水) 10:12:31.53ID:dvdfNrTHa539デフォルトの名無しさん (ワッチョイ 0eae-SjAR)
2022/05/25(水) 10:18:58.73ID:aeVycjmX0 間接再帰ができない間だけ通用する
540デフォルトの名無しさん (スッップ Sdba-otPX)
2022/05/25(水) 11:11:34.92ID:f6RSTkPjd541デフォルトの名無しさん (スッップ Sdba-otPX)
2022/05/25(水) 11:27:04.22ID:f6RSTkPjd >>534
何を悩んでるのかよくわからないが
今のCPUは8ビットレジスタなんて持ってないので戻り値がintでもcharでも戻り値の入ってるレジスタは同じになる
だから戻り値charの関数を暗黙のint関数として呼び出しても結果は特に問題なく使えるはず
ただ8ビットより上のビットにゴミ(不定値)が入ってる可能性はある
何を悩んでるのかよくわからないが
今のCPUは8ビットレジスタなんて持ってないので戻り値がintでもcharでも戻り値の入ってるレジスタは同じになる
だから戻り値charの関数を暗黙のint関数として呼び出しても結果は特に問題なく使えるはず
ただ8ビットより上のビットにゴミ(不定値)が入ってる可能性はある
542はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5a3e-eugl)
2022/05/25(水) 11:49:22.28ID:9QZiEKx+0543デフォルトの名無しさん (ワッチョイ 0eae-SjAR)
2022/05/25(水) 11:52:13.52ID:aeVycjmX0 やはりCを上っ面でなく根っこから理解するにはアセンブラの知識も必要だな
544デフォルトの名無しさん (ワッチョイ 5b10-eugl)
2022/05/25(水) 12:06:51.94ID:mSxNHOMI0 コンパイラやアセンブラのnパス(ソースを読み下す回数)って仕様を思い出した。
DOS時代にアセンブラは2パスでCコンパイラは1パスが普通だと聞いて、
Cで先に関数/変数を宣言、定義しないとエラーになるのは1パスでコンパイラが知らない関数/変数が出てくるからだと思ってた。
正しい理解かは知らない。ラベルとかはgotoの後に出てくることもあるし。
DOS時代にアセンブラは2パスでCコンパイラは1パスが普通だと聞いて、
Cで先に関数/変数を宣言、定義しないとエラーになるのは1パスでコンパイラが知らない関数/変数が出てくるからだと思ってた。
正しい理解かは知らない。ラベルとかはgotoの後に出てくることもあるし。
545はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5a3e-eugl)
2022/05/25(水) 13:02:50.97ID:9QZiEKx+0 >>544
バックパッチで処理できるのでコードの頭から読みなおす必要はないよ。
知らない名前が出てきたときに型かもしれないし変数かもしれないってのでは構文解析が難しくなるが
goto の後ろにくるのはどこかで定義されているラベルだと決め打ちできるから単純な処理でいける。
(gcc だとアドレス (を生成する式) を goto に与えることも出来るように拡張されてるからもうちょっと複雑なことをしてると思う。)
バックパッチで処理できるのでコードの頭から読みなおす必要はないよ。
知らない名前が出てきたときに型かもしれないし変数かもしれないってのでは構文解析が難しくなるが
goto の後ろにくるのはどこかで定義されているラベルだと決め打ちできるから単純な処理でいける。
(gcc だとアドレス (を生成する式) を goto に与えることも出来るように拡張されてるからもうちょっと複雑なことをしてると思う。)
546デフォルトの名無しさん (スフッ Sdba-cjEd)
2022/05/25(水) 16:04:37.76ID:ppEY2jmgd gccはプロセス置換なんかで生成した一時ファィルを食わせられないから、少なくとも2回以上はソース通読してると思われる
547デフォルトの名無しさん (ワッチョイ 6301-dv9W)
2022/05/25(水) 19:05:44.16ID:pzbMw6fx0 関数コメントを書く場所だけど、
➀ヘッダファイルの関数プロトタイプ宣言の頭に関数仕様コメントを書く
②Cファイルの関数実装本体の頭に関数仕様コメントを書く
③両方に同じ内容を書く
のどれが今の多数派?
昔は②が多かった印象だけど最近は➀が主流なのかな?
➀ヘッダファイルの関数プロトタイプ宣言の頭に関数仕様コメントを書く
②Cファイルの関数実装本体の頭に関数仕様コメントを書く
③両方に同じ内容を書く
のどれが今の多数派?
昔は②が多かった印象だけど最近は➀が主流なのかな?
548デフォルトの名無しさん (ワッチョイ 5bcf-X+K5)
2022/05/25(水) 19:22:25.67ID:6XrkLlxn0 外部仕様ならユーザーに読ませるからヘッダだし、内部仕様なら逆に見せるべきでないから本体、とかだろ。
549デフォルトの名無しさん (ワッチョイ 5b10-eugl)
2022/05/26(木) 07:54:06.06ID:BbTLBX4q0 将来Libファイル化とか考えると①の方が合理的かなとは思う。
VisualStudioの関数参照で、自動でコメントも表示されたと思ったけど、
そのときは①と②どっちが優先だったのかな?
VisualStudioの関数参照で、自動でコメントも表示されたと思ったけど、
そのときは①と②どっちが優先だったのかな?
550デフォルトの名無しさん (ワッチョイ daf1-XNUb)
2022/05/27(金) 16:12:39.64ID:01BAkppM0 質問失礼します
あるCのプロジェクトを見ていて
typedef struct X X;
struct X { ... some fields ... };
って記述がソース中の随所で見受けられますが、これ以前にもstruct Xの宣言がないのにtypedefできるのが非直感的に感じられます。これはtypedefを宣言するのと同時に、初めてここでstruct Xも宣言しているってことなのでしょうか?
あるCのプロジェクトを見ていて
typedef struct X X;
struct X { ... some fields ... };
って記述がソース中の随所で見受けられますが、これ以前にもstruct Xの宣言がないのにtypedefできるのが非直感的に感じられます。これはtypedefを宣言するのと同時に、初めてここでstruct Xも宣言しているってことなのでしょうか?
551デフォルトの名無しさん (スッップ Sdba-otPX)
2022/05/27(金) 17:20:28.72ID:HNJHF6TRd それは構造体メンバーの中にその構造体自身へのポインタを含めさせるためのトリックじゃなかったかな
struct HOGE{
色々なメンバー…
struct HOGE *next;
};
とやろうとするとHOGEの定義はまだ終わってないのでundefinedエラーになる
typedef struct HOGE STRUCT_HOGE;
struct HOGE{
色々なメンバー…
STRUCT_HOGE *next;
};
これなら通るはず(?)
struct HOGE{
色々なメンバー…
struct HOGE *next;
};
とやろうとするとHOGEの定義はまだ終わってないのでundefinedエラーになる
typedef struct HOGE STRUCT_HOGE;
struct HOGE{
色々なメンバー…
STRUCT_HOGE *next;
};
これなら通るはず(?)
552デフォルトの名無しさん (ワッチョイ 9aad-SjAR)
2022/05/27(金) 17:23:59.27ID:Dxs4BKy40 え?それ大丈夫じゃなかったっけ?
553デフォルトの名無しさん (ワッチョイ 9aad-SjAR)
2022/05/27(金) 17:32:35.88ID:Dxs4BKy40 struct でメンバの定義がない不完全型はポインタ変数のみ宣言出来るので再帰的なやつも大丈夫だ。
ポインタはサイズが分かるから。
ポインタでない普通の変数はサイズが分からないので作れない。
ポインタはサイズが分かるから。
ポインタでない普通の変数はサイズが分からないので作れない。
554はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5a3e-eugl)
2022/05/27(金) 17:59:48.73ID:/qASUmj+0 >>550
その場合の typedef struct X X; の struct X は C99 の 6.7.2.3 にある
「不完全構造体型又は不完全共用体型を宣言し,その型のタグとして識別子を宣言する」
に該当する。
つまり struct X の宣言にもなっているという解釈で正しい。
あえて typedef を先に書く必然性はないんだが……
仕様にはこういう形でも書けるという例が載っているので考えなしに真似してるだけかもしれん。
その場合の typedef struct X X; の struct X は C99 の 6.7.2.3 にある
「不完全構造体型又は不完全共用体型を宣言し,その型のタグとして識別子を宣言する」
に該当する。
つまり struct X の宣言にもなっているという解釈で正しい。
あえて typedef を先に書く必然性はないんだが……
仕様にはこういう形でも書けるという例が載っているので考えなしに真似してるだけかもしれん。
555デフォルトの名無しさん (ワッチョイ daf1-XNUb)
2022/05/27(金) 18:06:40.28ID:01BAkppM0 >>554
詳しい説明ありがとうございました
確かによくよく考えると
typedef struct X { ... some fields ... } X;
と同じでしたね
こちらは違和感ないんですけど確かにこちらもいきなりtypedefのdeclspec内でstruct X { ... some fields ... }初めて使ってますね
詳しい説明ありがとうございました
確かによくよく考えると
typedef struct X { ... some fields ... } X;
と同じでしたね
こちらは違和感ないんですけど確かにこちらもいきなりtypedefのdeclspec内でstruct X { ... some fields ... }初めて使ってますね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 空自機レーダー照射、音声データ公開 中国 ★3 [蚤の市★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★] [蚤の市★]
- 【無職の男(31)】女子小学生に次々触る 下半身を露出した状態で 公然わいせつ、不同意わいせつ疑い 千葉県警 [nita★]
- 【サッカー】UEFA-CL第6節 インテル×リバプール、バルセロナ×フランクフルト、バイエルン×スポルティングなど [久太郎★]
- 【YouTuber】バイク事故で入院のゆたぼん、振込で「お見舞金」募る [muffin★]
- 低所得層のマクドナルド離れが深刻に 広がる「ファストフード格差」の真相 米国 [少考さん★]
- 【実況】博衣こよりのえちえち朝活🧪
- 中国がここまで過敏になるのは日本に前科があるから。盧溝橋、満州事変。ジャップの先制攻撃は挙げればキリがないけど [472617201]
- 冬季賞与報告スレ [577451214]
- 【悲報】○んもに入る言葉「繁茂」しかない
- ワイ社畜、吐く🤮
- 大学生だけど金なさ過ぎてつまらない
