C言語なら俺に聞け 159

レス数が950を超えています。1000を超えると書き込みができなくなります。
2022/08/04(木) 23:32:27.83ID:yWVViPyIM
!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

C2x ドラフト
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.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言語なら俺に聞け 158
https://mevius.5ch.net/test/read.cgi/tech/1640401906/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/12/12(月) 19:31:09.72ID:BWUj5Mhq0
FORTRANなら呼べると思うが、COBOLは分からない

FORTRANやCOBOLからならCの関数は呼べたと思う
2022/12/12(月) 19:34:09.58ID:2yJi4NkT0
objファイルは流石に無理があるけどDLLや静的ライブラリでも作れば良いだけでは?
gfortranならexe以外にもDLL等が作成出来る
2022/12/12(月) 19:37:26.25ID:BWUj5Mhq0
受け渡しのデータ型も割と近くないかな?
2022/12/12(月) 19:39:34.73ID:qCai2YYC0
引数の積みかたやらスタックフレームの巻き戻しはどっちがやるか等の約束事が
シンプルに固定されてるDLLなら他所言語への持ち出しや持ち入れがやりやすいわね
2022/12/12(月) 20:17:18.59ID:munrOkPw0
>>828 まあ・・C言語を触るぐらいだから、一般的には大学とかのコンピュータサイエンス教科を
履修しているのが前提だろうから、そこはあえて省略したのですが・・

昔の高校生は頭がよかったけど。

今は「仕事でC言語を触らせてくれる身分」になるためには基本、情報系の大卒でしょうし・・
2022/12/12(月) 20:18:59.06ID:munrOkPw0
>>828 配列のソートってメモリ意識しますかね。フラグメンテーションとか考えたこともないな・・。
単純に演算オーダー(log O^n とか・・)そんな感じである程度予測を立てて、あとは扱うデータ次第かと。
2022/12/12(月) 21:58:34.14ID:J7ftRWn10
アルゴリズムのレベルではある程度の効率は事前に考えるけど
断片化とかキャッシュヒットとかはチューニングが必要な状況になるまで考えないな。
むしろ考慮したくなっても意識的に忘れるようにする。
いわゆる「早すぎる最適化」の一種だから。

当然ながら必要になったときには知っている必要はあるんだけどそんな機会は多くないよね。
普通の (アルゴリズムのレベルでは充分に配慮された) プログラムを書いて極端に効率が悪いようなら
メモリアロケータやキャッシュの設計のほうが悪い。
(そうは言っても目の前にあるものがそうなってるなら自分のほうが合わさないとしょうがないんだろうけどさ……)
2022/12/12(月) 22:18:23.35ID:1Of7Vyge0
>>847
win32api はなぜ PASCAL にしたんでしょうかね?
2022/12/12(月) 22:21:28.35ID:1Of7Vyge0
>>847
AMD64 は AMD が呼び出し規約まで決めちゃったけれども、普通は OS 屋が決めるものという気がしますけどね
2022/12/12(月) 23:05:07.66ID:J7ftRWn10
>>839
register というキーワードが将来に転用 (repurposing) 出来るようにというのは書かれている。
https://timsong-cpp.github.io/cppwp/n4659/diff.cpp14.dcl.dcl

auto という名前が新しい用途にぴったり (少なくとも不自然ではない) なので
それと同じくらいに register という名前が丁度良い場面というのは全く想像がつかないんだけど
思いもよらぬ形で上手いこと使われることはあるかもしれんね。

メンバ関数の宣言のときの default とか delete とかも考えたやつは天才じゃん……と私は思ったよ。
2022/12/12(月) 23:08:20.90ID:BWUj5Mhq0
switch文のdefaultはたまに綴りを間違えてしまうw
2022/12/12(月) 23:14:51.65ID:J7ftRWn10
>>861
あれの問題点は綴りを間違えてもラベルという扱いになってしまってエラーとして検出されないところなんよね。
処理系やオプションによっては使われていないラベルとして警告が出たりはするんだけど。
2022/12/12(月) 23:35:39.10ID:zHXfNaq5d
転用とかややこしいだけだから勘弁
自動でautoだからあんまり気にすんなよ、ちなc++ではこんな意味だよと、またややこしい補足が増えるだけ
むしろアンスコ付きの変な名前の方がかえってキーワードなんだなと分かりやすい、ソースは醜くなるけど、それは今更
2022/12/13(火) 00:08:19.11ID:HbzfEbfW0
auto も B言語の名残りだか後方互換だかで、
Bではデータ型がなくて、変数=整数が文脈により、ポインタとしても使われた
その storage classesとして、automatic, external, internal の3種類があった

main() {
extrn putchar, n, v;
auto i, c, col, a;
(略)
putchar('*n*n');
}

v[2000];
n 2000;

という風に auto で変数を宣言していた
2022/12/13(火) 00:29:54.37ID:+JwZZYrvd
他に触る言語で明示的にauto宣言するのはbcかな、オモチャみたいなもんでPOSIXも有名無実で仕様なんぞ無いに等しいが

ポインタは明示的に触らないけど、エミュる時は配列の添字にauto変数(整数)突っ込むからむしろCよりBっぽい
2022/12/13(火) 00:36:12.95ID:FXPyPtyo0
可変長で必要に応じて伸び縮みする配列とか、
桁数制限無しの整数型や計算誤差のない実数型とか

誰か作って(人任せ)
2022/12/13(火) 06:01:01.43ID:d0KqwuA/0
> 桁数制限無しの整数型

つGMP
2022/12/13(火) 07:11:07.69ID:ZjPntofYa
>>858
当時流行ってたからだろ
2022/12/13(火) 07:11:26.57ID:4+XH+KhI0
>>866
>桁数制限無しの整数型
https://mevius.5ch.net/test/read.cgi/tech/1434079972/84
2022/12/13(火) 13:48:16.74ID:aee1RRAhM
計算誤差の無い実数型って不可能だけどなw
decimalを使うと2進数は10進数の浮動小数点数を正確に表現出来ない問題を解消できる
ratio(分数)を使うと、1/3とかをそのまま保持出来るから誤差が出ない
ちなみに、Common Lispは分数を凄い簡単に扱えるしbignumも使える
Cでもそうなって欲しいもんだ
2022/12/13(火) 13:59:48.87ID:7PNjtjtua
なぜ分数や多倍長整数が必要な案件にCなんかを使うのか
2022/12/14(水) 12:00:46.68ID:erx97Ujd0
虚数や複素数も扱えてたよね
あまり使い道はないかも知れないが
2022/12/14(水) 13:40:07.30ID:XaqmHtNn0
区間を分割して評価、終了判定がintegerpで判定とか細かい所で色々楽はできるだろう
単にスケールしても済むし、何回もやるなら任意精度でない有理型くらい構造体とgcdさえ書ければ誰でも書けるだろ

用途が違うし別にclは推さんが、標準の一つであるcltl2はあらゆるプログラマに貴重な書
浮動小数点演算に関しても複素関数の豊富なプロット載せて定義やブランチカット選びの良し悪しにかなりページ割いて、その図の生成に使ったpsコード生成コードも載ってる

つーか>>866はbcって言って欲しいだけでしょ、おまえら釣られすぎ
2022/12/14(水) 14:04:41.21ID:XaqmHtNn0
<cmath.h>徹底解剖みたいな文献って無いんだろうか
2022/12/14(水) 14:17:47.17ID:XaqmHtNn0
complex.hだった
最近触り始めたpythonでcmathだから素で間違えた
んでc++はmath.hが<cmath>と…
2022/12/14(水) 16:18:53.52ID:YAu9ihh40
math.h と cmath とは事情がややこしいので単に名前が変わっただけとは思わないほうがいい。
math.h の関数は多相化されてなくてマクロで多相化された版は tgmath.h にある。
cmath の多相化にはテンプレートが使われている。
2022/12/14(水) 19:29:35.78ID:XaqmHtNn0
Cのtgmathの方が(実装的な意味で)エグいよね
よくマクロの真髄みたいに色んな実装が紹介されるし、ちゃんと動いてるんだろうけど
ちょっと訳がわからないものは避けたい…

_Genericでスッキリ書けたりしないのだろうか
2022/12/14(水) 20:13:04.33ID:h6lYzG45d
ヘッダに直書きされてるから目につく機会が多いだけで、内部的にやっても同じロジックが隠れるだけか
気にし出せばきりがないようにも思う
2022/12/14(水) 20:45:14.60ID:QXbvEgmH0
>>874
<ccmath>?
2022/12/15(木) 14:40:26.12ID:xFKc8Du50
>>877
_Generic で素直に分岐すれば問題なくかけるよ。
tgmath.h が規格に入ったとき (C99) は規格の範囲内でやる方法は無かったので
処理系の拡張を使ったり新たな拡張を作ったりしてなんとかなったのだがやっぱりそれは
あかんやろと思ったのか C11 で _Generic を入れることになった。

ただ、処理系は C99 に厳密なモードを持つことがあるからそのモードで動かしたときに
ヘッダ内の _Generic についていちいち警告なりエラーなりが出るのもよろしくないし、
#ifdef で分けるのも二度手間だし、
旧来通りの実装で残すのはそれなりに合理的なんだと思う。

ありがたいことに普通に使う分には標準ヘッダの実体を気にする必要はないのだから忘れておくのが幸せだろう。
881デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 10:08:23.47ID:537DsEmx0
// エラーを報告するための関数
// printfと同じ引数を取る
void error(char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
exit(1);
}
これってprintfをerrorに変えただけって認識でok
882デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 10:08:47.18ID:537DsEmx0
すまん誤爆した
883デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 10:11:35.91ID:537DsEmx0
これってprintfをerrorに変えただけって認識でok?
error("引数の個数が正しくありません");と
fprintf(stderr, "引数の個数が正しくありません\n");
の違いを誰か教えてくれ
2022/12/21(水) 10:21:03.43ID:6CmfCawf0
>>881-883
その認識でいいけどそれに加えて最後に exit で終わっているから
復旧不可能なエラーを報告するための関数なんだろ。
2022/12/21(水) 10:21:33.71ID:LOXcnIHB0
呼び出したら、死ぬ?
2022/12/21(水) 10:31:04.10ID:Fs8T+fBed
そのerrorならexit以外そうじゃね
perror(msg)はもう少し賢くて
fprintf(stderror, "%s: %s\n", msg, strerror(errno))
相当(by k&r2e)
887デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 10:34:02.36ID:537DsEmx0
>>884
こんな時間にありがとう、助かる。
fprintf(stderr, "引数の個数が正しくありません\n");と同じってことやな
これにexitを加えて関数にしたのがerrorってことやね
わざわざerror関数にする必要性がわからんかったから助かったわ
2022/12/21(水) 10:37:12.34ID:LOXcnIHB0
私なら、error()を呼び出した側でexit()呼ぶなあ
2022/12/21(水) 10:39:53.43ID:Fs8T+fBed
ステータス選べるしな
わざわざexitに渡すステータス引数を拵えるくらいならexit読んだ方が早い
2022/12/21(水) 10:51:42.39ID:Fs8T+fBed
>>881
あ、地味にfprintf(stderr, "\n")でフラッシュしてるのに気付いた
あるいはfmtへの\n付け忘れ防止配慮か
基本stderrはこまめにフラッシュされるものと思ってるけど、fflushや"\n"で念を入れても損は無いな
2022/12/21(水) 11:33:17.33ID:6CmfCawf0
言語仕様では exit で終了とか main の終端に到達した場合に全てのオープンされているファイルはクローズする
(そのときに全ての出力ストリームをフラッシュする) というのは保証してる。

エラーが起きている状況でどこまで信用できるかよくわからんから念押ししても損はないだろうけど。
892デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 15:19:19.23ID:537DsEmx0
http://codepad.org/noY0x7K2
これの70行目と79行目の*ってただただ関数でポインタを扱うよってだけ?
なんか関数ポインタと似ててどうなんやって思った
int (*func1)(char*, int);
2022/12/21(水) 15:23:54.32ID:WXW0EqS+d
なんか質問者はexit呼ばないんだったら関数化しないでええやろって思ってそうで怖いな
設計方針次第でもあるが心配になるな
894デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 15:35:25.72ID:537DsEmx0
>>893
今学習段階だからかなりの無知なんや、すまん
895デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 15:51:20.06ID:537DsEmx0
あと上のURLのプログラムのcallocではメモリ解放してないけど大丈夫なのか?
2022/12/21(水) 15:56:02.50ID:6CmfCawf0
>>892
返却値の型が Token* であるという意味。
でも文法的には * は宣言子に含まれていて Token の側じゃなく関数名がある側のグループなんよ。
だから右側に寄せて書く習慣になってる。
C の宣言の文法が無茶苦茶なのはイマサラな話なので……。

可変長引数の扱いも低レイヤの事情が見え隠れするような古の設計なので
歴史的事情を知らんとわけわからんのもしょうがないとは思う。
2022/12/21(水) 16:08:16.37ID:5pWmYDMC0
一貫性が大事って意味ならそう思う、特にdiagnosticなエラー(最後まで残る)は

俺は手入力で適当なエラーメッセージ書くのは極力控えてる、例えば数学関数書いてるなら
errno = EDOM;
perror(__func__);
→my_func: Argument to the math function out of domain.
的な
手続き的なルーチン(main)なら__FILE__/__LINE__とかで

用意されてるシンボル定数で意味論が合うなら活用すべき

EDOMなんかは好きに使っていいけど、システム、IO関連のエラーは意味が直感的でなかったり、規約に厳密に従わないとerrno見るcallerが騙されたりでバグの素なので、ちゃんとマニュアル参照のこと
898デフォルトの名無しさん (ワッチョイ 2a04-e5AJ)
垢版 |
2022/12/21(水) 16:09:52.42ID:537DsEmx0
>>896
こりゃかなわん。
基礎から出直してくる
2022/12/21(水) 16:10:45.37ID:5pWmYDMC0
ああ、当たり前だけどerrnoを上書きする前に気付いてないフラグ立ってないかif(!errno)チェックは忘れずに
割と立ってる事がある()
2022/12/21(水) 16:16:43.94ID:WXW0EqS+d
>>895
勿論使い終わったら解放する必要があるので解放関数を用意してあげよう
2022/12/21(水) 17:55:00.19ID:j8NGwdcp0
>>895
exit() したら解放されるからいいんじゃん

って言う層が一定数いる
2022/12/21(水) 18:13:15.89ID:3kYobt3Gd
今、息してるのか?
2022/12/21(水) 18:21:41.76ID:LOXcnIHB0
一日一回再起動すれば大丈夫
2022/12/21(水) 21:42:34.64ID:MxQdxJ6G0
再起動なんてちまちましたことやってられるかい
電源ぶっこ抜いて入れ直すんだよ、それか蹴れば直る
2022/12/22(木) 11:43:33.39ID:kpFE4WK60
アプリ(強制)終了後に使ったファイル削除→このファイルは使用中です。


OSで保証されてないならアプリ側でやるしか無いじゃん。
2022/12/22(木) 13:27:28.75ID:LbsYIb+eM
誰かがこのPCを使っている
2022/12/22(木) 13:35:11.18ID:KHPfY9lXd
LANなら充分にあり得ることだな
2022/12/22(木) 19:42:13.17ID:/Ar1RYH70
プロセス終了に関しちゃ今時のOSでハンドル握りっぱなしにはならんでしょ
2022/12/22(木) 20:28:13.17ID:Q5govio9d
/* 文字列を逆順にして返す関数 */
#include <stdio.h>
#include <string.h>
void reverse(char *ss);
int main(void)
{
  char tt[]= "programing game"; 

reverse(tt);
printf("tt=%s\n",tt);
return 0;
}
void reverse(char *ss)
{
int wk,pos1=0,pos2;
pos2=strlen(ss)-1;
while (pos1<pos2) {
wk=*(ss+pos1)
*(ss+pos1)=*(ss+pos2);
*(ss+pos2)=wk;
++pos1;
--pos2;
}

}
このプログラム、gccだとコンパイル出来ますが、clangだと以下のエラーになります。なぜでしょうか?
~/CCR/UserFiles/sample26.c:22:3: error:
invalid operands to binary
expression ('int' and 'char *')
*(ss+pos1)=*(ss+pos2);
^~~~~~~~~~
1 error generated
2022/12/22(木) 20:40:06.89ID:KT1tc7ko0
>>909
wk=*(ss+pos1) の後にセミコロンが抜けてる。
2022/12/22(木) 20:43:53.45ID:Q5govio9d
ありがとうございます。コピペミスでした。
2022/12/22(木) 21:11:31.21ID:KT1tc7ko0
事例としては面白いよ。
セミコロンが抜けても一応は式の形式として成立するから
型が合わないというところがエラーとして報告されちゃうんだな。
2022/12/22(木) 22:10:59.69ID:dL3lthyL0
昔のコンパイラならエラーなしで通してだろうな
2022/12/22(木) 22:43:34.75ID:K5vPIqXq0
ナウいヤングな文字列の掛け算はサポート外なんだわ
strcatで頑張れ
2022/12/22(木) 23:40:21.52ID:bege0WAi0
昔のコンパイラだと=*が乗算代入だったんだけどな
2022/12/23(金) 08:27:13.83ID:msM3WKDD0
exit on free 論争か・・・ そういう論争があったというのは知っているが
どっちに帰着したのか知らない
2022/12/23(金) 08:52:05.54ID:FPNxo7old
RAIIでexitするやついたら匙投げる
2022/12/24(土) 17:52:35.28ID:aYmW2hx40
プロセス終了を検知してOSで良きに測って欲しいよね
2022/12/24(土) 20:25:27.94ID:xbH5VpiM0
>>917
膨大なリストなんかはいちいち解放しないで exit( ) でヒープごと解放する方が効率的なんて言う奴までいたんだよ...
2022/12/24(土) 21:34:16.33ID:aYmW2hx40
いっそプログラム開始時に、
ドーンとでっかくメモリ確保して
自前でチマチマ割り当てて、
終了時にドーンと解放で良い気もする
2022/12/25(日) 00:15:12.94ID:8blj/qJt0
そういう戦略をとっている有名なプログラムもある。
確保したメモリが結局はプログラムの最後までほとんど使用されっぱなしだということがわかっているなら
ちまちま管理しなくても終了と同時に全部が回収されることをあてにしても総合的なメモリ使用量は変わらない
(むしろ free のコスト分だけ節約できる) という考えをすることはあって、
リンカの LLD や Mold がそういう戦略をとっていたはず。

http サーバの h2o はセッション単位でドカンとメモリの確保と解放をしてる。

つってもプログラム全体のメモリについて見通しが立てられるということと
実行環境の事情を把握してるからそういう戦略を取れるのであって、
普通は小さなモジュールに分割するし、モジュール単位でメモリ管理に矛盾がないように設計するので
結果的にチマチマした確保と解放になる。

そこそこの規模になるとプログラムを分割せずに把握するのは大変なので凡人は小さな単位で
確保と解放をするように設計するのはしょうがないよ。
2022/12/25(日) 07:20:21.70ID:vLPFsJBC0
>>921
> 結果的にチマチマした確保と解放になる。
解放が必要なものまで>>920みたいなことしちゃダメだろ
リンカーのシンボル表みたいなのは処理中は追加オンリーで処理終了後に解放することになるから一気に解放が有効なわけで
2022/12/25(日) 08:37:13.23ID:AjsJE3fQ0
つまりメモリプールでしょ。昔からある戦略だ
2022/12/25(日) 08:49:15.44ID:gsvPl1RZ0
DOS時代の拡張子COMアプリは起動時に空いてるコンベンショナルメモリ全部(PC98ならVRAMの前まで)COMアプリに割り当てられるんだっけ。
2022/12/25(日) 08:59:08.85ID:CcfMXDnS0
やればできるよ
EXEとの違いはリロケーションテーブルがないってだけ
コード次第で出来んことは無いィィィ
2022/12/25(日) 09:03:42.49ID:vLPFsJBC0
>>923
考え方は近いがもっと特化した手法
なのでシンボル表みたいなものにしか適用できない
2022/12/25(日) 10:31:57.80ID:NJW41kMTa
空いてるコンベンショナルメモリ全部というと大きなメモリが割り当てられるように聞こえるけどコンベンショナルメモリは640キロバイトしかないからな
逆に小細工しないと拡張メモリ(exeで使える大きなメモリ)が使えないと言った方が正しい
2022/12/25(日) 11:06:28.12ID:CcfMXDnS0
リアルモードの「拡張メモリ」ならCOMでもEXEでも同じことだぞ
プロテクトモード用の「EXE」はまた別物だ
バイモーダルEXEなんてのもあったね
2022/12/25(日) 13:44:18.05ID:pgi9BcgIM
ラージモデルのexe、拡張子をcomに書き換えても動くのは秘密です。
2022/12/25(日) 15:44:19.19ID:mgz0dfZnM
exeとcomってファイル先頭のエントリーアドレスの解釈が違ってなかったっけ?
拡張子だけ変更しても暴走したような気がする
2022/12/25(日) 16:11:57.52ID:zQEQkIp7H
>>924
自力でシステムコール(あるいは farmalloc()) と far ポインタを扱うんだったら出来る
2022/12/25(日) 16:49:45.05ID:FlWfyDt20
OSは、EXEかCOMかの判定をファイル先頭2バイトで行うので
拡張子は同名実行ファイルの優先度以外には影響ありません
933デフォルトの名無しさん (ワッチョイ 495f-ma2h)
垢版 |
2022/12/25(日) 18:17:37.99ID:4l2e8mxL0
何のOSの話なんだよ?
2022/12/25(日) 22:36:13.77ID:R9zYhJab0
>>933
MS-DOS
2022/12/25(日) 23:53:11.65ID:3pvnVlsWH
>>925
LSI-C試食版のコード64KB の制限はなんとかなりませんかね?
2022/12/26(月) 00:03:12.26ID:eX0Ff8H70
試食版のコードで生成する実行プログラムを、動かす環境もってるの?
2022/12/26(月) 01:36:38.31ID:xk9EZjkPH
>>936
http://takeda-toshiya.my.coocan.jp/msdos/index.html
2022/12/26(月) 10:26:13.14ID:eX0Ff8H70
W32が動く環境があるなら、そこでネイティブに使えるコンパイラにした方が良くないかな?
試食版って事はそれを業務で使うわけではないんでしょ?
2022/12/26(月) 11:02:09.22ID:+xP92Jxa0
8086 の SBC とか使って趣味でなんか作ってるんじゃね
俺も会社でだけど 80186 ボードのために Visual C++ 1.52c をずっと持ってた
2022/12/26(月) 11:47:25.06ID:Gtnl1i7F0
C使用でも何も考えずにVC++無料版入れてるわ。
バージョンアップの度にプロジェクト作成項目に悩む・・・。
941デフォルトの名無しさん (スップ Sddb-fEIR)
垢版 |
2022/12/26(月) 11:49:12.88ID:rbZigseYd
関数のポインタの配列を返す関数の宣言を教えてくさい
2022/12/26(月) 12:21:30.32ID:sWfTrmtka
残念だなのび太
C言語は配列を返せないんだ
2022/12/26(月) 12:24:01.49ID:XQluw9Ded
>>935
試食って書いてあるの見えない?
そういう類いには意図的に制限かけてあるんだよ
有料の正規バージョンを買ってねって意味

PS3のlinux封じとは訳が違う
怒る人のいないやり方なので
脱獄は誰も手伝ってくれないよ
2022/12/26(月) 12:48:43.97ID:gpJgKl24M
森公一郎さん、亡くなっているんだよな
945デフォルトの名無しさん (アウアウウー Sa1f-SvsN)
垢版 |
2022/12/26(月) 12:49:38.27ID:6bMfB0bxa
>>942
返す関数は定義出来るだろ
確保した領域の生存が関数内のみかそうじゃないかで結果は変わるが

>>941
思ってるものを描いてみ?
2022/12/26(月) 12:54:26.08ID:VH0Lg5Zw0
まあ関数イテレータ的には使えるのか

int getNoTest1(int x, int y, int z){return x*100+y*10+z;}
int getNoTest2(int x, int y, int z){return x*200-y*20-z;}
int getNoTest3(int x, int y, int z){return x*1000-y*100+z;}
typedef int(*FuncType)(int, int, int);

FuncType *getFuncAddrArray(void){
 static FuncType fa[3];
 fa[0] = getNoTest1;
 fa[1] = getNoTest2;
 fa[2] = getNoTest3;
 return fa;
}

int main(int argc, char *argv[]){
 FuncType *funcAddr = getFuncAddrArray();
 for (int i = 0; i < 3; ++i){
  printf("%d\n", funcAddr[i](rand(), rand(), rand()));
 }
 return 0;
}
2022/12/26(月) 15:36:06.25ID:tmqxSKGS0
>>945
できねーよ
配列が第一級オブジェクトじゃない珍しい言語
2022/12/26(月) 16:49:38.00ID:URVWGre6d
void(*func(void)[2])(void);
できるとしたら、こうなるが
2022/12/26(月) 17:05:11.56ID:0DsOmzGV0
固定長配列を戻すなら struct を経由したくなるわ
2022/12/26(月) 17:05:36.17ID:F5Lcb5Ke0
const char *f() {return "関数のポインタの配列";}
2022/12/26(月) 17:32:34.93ID:eX0Ff8H70
一休さんは、やめよう
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況