C言語なら俺に聞け 154

■ このスレッドは過去ログ倉庫に格納されています
2020/01/14(火) 19:32:30.16ID:SgRnb4BR0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

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言語なら俺に聞け 153
https://mevius.5ch.net/test/read.cgi/tech/1566050562/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/01/18(土) 23:02:02.15ID:Kwj2OX4/0
> でなければ実現できない
という要件が気になる。
94デフォルトの名無しさん (アウアウクー MM91-0c/Z)
垢版 |
2020/01/19(日) 02:29:28.66ID:ec7Q1zSDM
迷路のルート検索に再帰で書いた事あるけど10000ぐらいでスタックオーバーするので再帰をループで書き直した思いで
2020/01/19(日) 04:29:07.91ID:r8dbXOf20
お前ら知ってるか
Pythonの構文解析はgoto文の状態遷移なんだぜ
あれ見てPythonは業が深い言語だと思ったわ
まぁあれが一番早いんだろうけど
2020/01/19(日) 06:30:18.66ID:6oeBvQPN0
ツリー探索なんか待ち行列を使えば非再帰に変形できるからな
2020/01/19(日) 08:03:33.51ID:D5W6f6uHd
C言語で記述可能かどうかって意味なら
どんなものでも非再帰に変形可能
2020/01/19(日) 08:20:31.11ID:UmCLgzkS0
>>95
構文解析とかは大抵そうだよ
最近は使ってないから変わってるかも知れんが昔yacc/lex使った時の出力はgoto使い捲くりだったし
2020/01/19(日) 08:26:41.57ID:bqsJmSpA0
>>85
関数の最初に「返り値と関数名と仮引数リスト」を書くでしょ。
それだけの情報があれば関数を呼び出すには十分なのだ。

…と、構造体名の前方宣言みたいな説明でケムに巻いてみる。
2020/01/19(日) 09:07:49.21ID:IjeRNxme0
ソースコード上ではあたかも再帰が可能かのように見せかけてるだけでしょ
そういうウソをコンパイラは演出してくれている
2020/01/19(日) 09:13:46.72ID:Wel1D6/w0
>>85
実際に再帰呼び出しが実行されるのはその関数が書き終わったあとなのだから何の不思議もないような気がするが。
2020/01/19(日) 09:52:53.26ID:L+cLui7g0
そもそもC言語の再帰をコンパイルして出てきたマシーンコードって
スタックに積んでgotoしてるだけのループじゃん
2020/01/19(日) 10:09:42.96ID:IjeRNxme0
本物の再帰を実現できる無限のメモリーなんて存在しないじゃん
だから現状は擬似再帰、
しかもあと500年くらいは擬似再帰で我慢してもらうしかない
2020/01/19(日) 10:31:33.19ID:L+cLui7g0
再帰は再帰専用のメモリースペースを使うから限界がすぐくるだけやぞ
2020/01/19(日) 10:42:13.41ID:IjeRNxme0
今の科学力では本物の数学的な再帰なんて実現出来ない、
だから、擬似再帰に留まってる

あとは実数マシンと整数マシンで、現状は離散的な整数マシン
実数をそのまま扱えるマシンすら存在してない
2020/01/19(日) 10:49:21.60ID:RfLx+x9Fd
コンピューターに限界がある
なんてことは誰でも知ってるから
いちいち書かなくても良いよ
2020/01/19(日) 10:56:48.90ID:IjeRNxme0
だな
>>102が言うからには他の言語ではもっと画期的な方法があるのかと思ってた
2020/01/19(日) 10:57:08.36ID:L+cLui7g0
そもそも宇宙は巨大な計算機だからすでに存在してる
2020/01/19(日) 11:00:03.37ID:+Juhn6xh0
無限ループこそが再帰の神髄
2020/01/19(日) 11:00:47.42ID:RfLx+x9Fd
本物の再帰
とか
疑似再帰
とか

文系かよ
2020/01/19(日) 15:32:55.94ID:bqsJmSpA0
>>105
「アナログコンピュータ」ってのがあって、俺がいじったのは
その都度回路を組んで信号を送って電圧計の針の振れを観察するんだが、
あれは一応、物理の限界の精度で実数をそのまま扱うマシンだね。

このスレッドで扱う対象じゃないけど。
2020/01/19(日) 15:48:32.08ID:RfLx+x9Fd
アナログと実数には遠い溝が...

精度はデジタルの方がはるかに上
113デフォルトの名無しさん (アウウィフ FF05-otum)
垢版 |
2020/01/19(日) 16:44:13.95ID:ehZNNwbSF
>>54
そんなキャストはしてはいけない
お前の使い方が間違ってる
敢えて括弧を付けるが正しいのはこの二つだけ
printf("%d\n", *(array[0]));
printf("%d\n", *(*array));
2020/01/19(日) 17:47:28.55ID:6oeBvQPN0
無駄なだけの「正しい」括弧なんかやめれ
printf("%d", (*array)[0]); //少なくともこれの意味がわかるようになるまでは
2020/01/19(日) 19:24:15.02ID:IVwJAfoP0
ポインターがintと同じサイズと思うなよ
2020/01/19(日) 20:11:46.65ID:6oeBvQPN0
エー、エイチ、オー
2020/01/19(日) 20:13:42.23ID:AxsWVwh/M
丸括弧の次に優先順位が高い角括弧ってだけの話じゃん
識別子に最優先くっついてガツンと先に作用するて意味じゃわかりやすい関数等の丸括弧を除いて最強という。
2020/01/19(日) 20:40:31.66ID:Wel1D6/w0
>>117
なんか演算子の優先順位をいい加減に覚えてそう。C言語のBNFでも見てきたら?
2020/01/19(日) 21:31:45.40ID:RfLx+x9Fd
+ と << が混ざった演算
( ) を付けないと警告を出すアホコンパイラがあるんだよね
2020/01/22(水) 18:42:43.98ID:fnLfByOj0
ウィキのバスエラーの所に出ているサンプルをVisual Studioでコンパイルしたんですが
デバッガで見てもゴミ値が入るだけで特に警告もエラーも出さないので
バスエラーになっているかいないか分かりません。バスエラーを体験するにはどうすればいいですか?
コンパイルオプションで対応出来ますか?

https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B9%E3%82%A8%E3%83%A9%E3%83%BC
2020/01/22(水) 18:48:19.32ID:0ayd3B3Q0
x86はアラインメント不整合でも正常に読み書き出来る

AVXレジスタで
アラインメントが整ってないと使えない命令があるから
それを使えば例外発生する

MOVAPS など
2020/01/23(木) 20:01:35.17ID:9tTsebGL0
ありがとうございました。
2020/01/23(木) 20:11:21.63ID:6RFiXn/e0
int main(void)
{
return *(int *)0;
}
の方が簡単
124デフォルトの名無しさん (アウアウウー Sa4b-AenA)
垢版 |
2020/01/24(金) 17:55:51.18ID:zcPs/H1Xa
>>123
それセグメンテーションフォルトでは?バスエラーになるCPUあるの?
2020/01/24(金) 18:05:28.52ID:xfkHfIRp0
リードアクセスだしなあ
0番地が未実装というのは考えにくいね
2020/01/24(金) 19:16:51.65ID:JBJjeU6+0
そもそもバスエラーとかセグメンテーションフォールトは、CPUの例外等をOS側で適当にマッピングして、そう呼ぶOSがあるというだけだからOS依存。

x86/x64のCPUで>>123のような適当なメモリアクセスを行うと、CPUで例外#GPや例外#PFが発生する。UNIXならそれを状況に応じてセグメンテーションフォールト(SIGSEGV)やバスエラー(SIGBUS)として扱い、WindowsだったらEXCEPTION_ACCESS_VIOLATIONとして扱う。

アライメントがずれている時は、発生した例外#ACをバスエラー(SIGBUS)やEXCEPTION_DATATYPE_MISALIGNMENTとして扱う。
2020/01/24(金) 20:23:29.22ID:xfkHfIRp0
ASを出してから一定時間経過してもDTACKが帰ってこないとBERR端子をぶっ叩かれてバスエラー
2020/01/24(金) 20:40:29.99ID:aSv3EoFQ0
68K通った人からするとアライメント不整合はアドレスエラーの印象が強い
2020/01/24(金) 21:00:31.06ID:3pA3r7pN0
スパッと例外で死んでくれれば良いんだけど
単にズレるだけってCPUがある
2020/01/25(土) 00:46:35.96ID:cts07rfpx
int i;
int *pi = &i;
*((int *) (((char *) pi) ÷ 1)) = 1;

x86はこれがバスエラーにならないね
2020/01/25(土) 01:00:05.76ID:vvn39fxSM
>>130
÷は+だとして、
eflagsのACビットを立てておくとバスエラーになる
2020/01/25(土) 01:03:11.29ID:cts07rfpx
>>131
ゴメン、その通り
加算演算子です
2020/01/25(土) 01:05:26.15ID:iDfv/qKw0
そもそもx86だとバスエラー発生が無理なんではないのか?
2020/01/25(土) 05:21:20.46ID:g3vROROv0
>>129
ARMのCPUでアラインメントの整合を怠ったら
偶数番地/奇数番地か、その2倍のアドレス値だったか
データの半分しか書き込まれなくて…って事態を目撃したことがある。

素朴なビットマップグラフィックのプログラムだったので
画面がシマシマになるのが文字通り目で見えた。
同じソースをx86系で実行すると期待通りの結果になるんだよ。
2020/01/25(土) 18:58:17.60ID:OESzqPub0
>>130
>>133

// x64 linux

volatile int x[2];

int main () {

asm("pushf");
asm("btsl $18, (%rsp)"); // set AC
asm("popf");

// *(int*)((char*)x+1)=1; // SIGBUS

asm("pushf");
asm("btrl $18, (%rsp)"); // clear AC
asm("popf");

return 0;
}
2020/01/25(土) 23:01:02.31ID:5aeLZw2zx
>>135
130です
130のように書くとバスエラーがなければ ip を破壊する可能性が高いし、最適化でコードが生成されないためのケアもされていて思慮深いコードですね…

しかしGASのオベランドは逆に見えてしまって…
2020/01/25(土) 23:05:55.96ID:iDfv/qKw0
やはりアセンブラの領域にまで踏み込まないと無理なんでしょうね
2020/01/25(土) 23:07:44.29ID:tu9lbSH20
>>92
再起はループに起こせるよ
2020/01/28(火) 19:15:06.58ID:oIjih5hj0
起こせるけど再帰の方がシンプルに書ける
2020/01/28(火) 19:58:49.90ID:KHL1SP2c0
バカには(再帰は)無理
2020/01/28(火) 21:13:43.62ID:kvBVtoLm0
>>138
本当ですか?
二方向以上への再帰をループに起こせる自信は私にはありません
2020/01/28(火) 21:28:18.02ID:wcDzWZFN0
枝分かれするとき、「今は進まない」方向を待ち行列に並ばせておいて
あとで対応しにくればええやん
2020/01/29(水) 04:36:34.49ID:8i6C3PjP0
複数関数をまたがる再帰
関数コールがたくさんの箇所で行われる

こんなヤツだとループにするのは非常にメンディー

可能ではあるけど
2020/01/29(水) 07:12:24.51ID:6aVmGUgqM
クイックソートの非再帰実装とかあちこちに転がってるから勉強しとけ。
待ち行列じゃなくスタックな。
145デフォルトの名無しさん (ワッチョイ 9e8c-Witc)
垢版 |
2020/01/29(水) 07:41:04.40ID:X/jeBiHu0
大きいプログラムだと差は小さい。
2020/01/29(水) 08:52:34.15ID:WHzHFeoy0
>>144
キューでも再帰実装できるし別に良くね?
147デフォルトの名無しさん (アウアウウー Sa21-lBRq)
垢版 |
2020/01/29(水) 09:55:20.60ID:Ji+gdkxYa
もっと口を尖らせて
2020/01/29(水) 10:07:23.93ID:6aVmGUgqM
>>146
できる例もあるが一般の再帰では無理
2020/01/29(水) 10:15:28.71ID:WHzHFeoy0
>>148
太い枝から積んで順にやってけばええんやで
2020/01/29(水) 11:54:36.69ID:/CdgIXHbH
>>149
よくわからんからコード出して
2020/01/29(水) 11:56:45.66ID:HJZ6WUGV0
金取っていいパターンだな
2020/01/29(水) 13:00:56.99ID:jPsoIsZ7d
一般的には
パラメーターとローカル変数とコール位置
などの情報をスタックに積んでいく

機械的にやるならこれしかない
ほぼ再帰と同じ処理になる

機械的にやらないなら場合によっていろいろな方法がある
2020/01/29(水) 13:01:50.34ID:i1SX986la
>>149
太い枝の意味が分からんが、処理の順序が変わってしまうような変更はダメじゃね?
元の再帰のコードが必ずしもその太い枝の順とは限らないし、そもそも木構造とは限らないだろう。
2020/01/29(水) 13:17:09.29ID:p9IYATJW0
再帰の代替なら素直にスタックでやった方が楽だよな。ポインタ1つで済むし
2020/01/29(水) 13:42:07.48ID:HJZ6WUGV0
再帰ではスタックを使うからって
そこで脳硬化症にかかると。。。
2020/01/29(水) 14:08:59.70ID:0fI82nWR0
本物の再帰を実現可能なマシンなんて存在しない
全部はスタックに還元するしか無いんだから
再帰だなんだと騒いでも結局現行のスタックやアドレスでどうにかなるじゃん

本当に再帰でしか書けなくなるのは本物の再帰を実行可能な再帰マシンが出来てからの話
157デフォルトの名無しさん (ワッチョイ ea02-L01+)
垢版 |
2020/01/29(水) 14:21:03.67ID:drvY0wlA0
ここでvoidくんの見解を聞いてみよう
2020/01/29(水) 15:32:00.95ID:iDUguYS70
>>156
よく分からないんだけど、本物の再帰ってどういうもの?
スタックが有限だということを除いて、今のC言語の再帰関数の実現方法と本質的には何が異なるの?
2020/01/29(水) 18:05:30.01ID:pS76hSXZ0
再帰ソムリエの俺からすれば疑似再帰など下の下
本物再帰こそコードに埋め込まれるに相応しい
芳醇な香りと甘酸っぱい味わい
2020/01/29(水) 18:27:48.80ID:HJZ6WUGV0
たとえ64bit空間(16EiB)でも「真の」再帰はできんぞ?
どこかで必ず再帰を諦めるかクラッシュする可能性が排除できない
2020/01/29(水) 18:35:20.80ID:8i6C3PjP0
本物の再帰
真の再帰

次は何が出てくるかな?
2020/01/29(水) 18:50:58.59ID:7jhbc4AI0
(究極 | 至高 | 伝説 | 奇跡)の再帰
2020/01/29(水) 18:56:18.56ID:pS76hSXZ0
俺、斎藤再帰、17歳
今日も玄関から出続ける登校が始まるぜ!
エンドレスナイト!
2020/01/29(水) 18:58:52.17ID:kTgu21G10
>>161
本家 再帰
元祖 再帰
165デフォルトの名無しさん (ワッチョイ 5d35-MzNC)
垢版 |
2020/01/29(水) 19:14:11.95ID:ZN4TcJna0
再起を賭けた戦いが始まる!
2020/01/29(水) 19:34:26.07ID:cVCtJzafM
負けたやつは二度とコード中で再起を使えない
2020/01/29(水) 20:07:17.39ID:kTgu21G10
>>163
定時制ですか?
2020/01/29(水) 20:44:02.49ID:HJZ6WUGV0
再起不能w
2020/01/29(水) 22:19:07.14ID:kTgu21G10
それは歳のせいでしょう
2020/01/30(木) 00:19:52.75ID:oEmB/ijk0
>>170
自己再起
171デフォルトの名無しさん (アウアウクー MM7d-T0fr)
垢版 |
2020/01/30(木) 00:35:40.44ID:v1tZ7RqBM
puts("無限ループやん");
2020/01/30(木) 05:13:48.15ID:cjZm5rKh0
>>160
真の再帰ってなんですか?160がどくじにかんがえたさいきょう再帰ってことでいいですか?
2020/01/30(木) 06:00:39.64ID:gnQ2YSBX0
>>172
必ず再帰を諦めずクラッシュしないという定義が>>160に書かれてあるように、オラには見える。
174デフォルトの名無しさん (ワッチョイ b501-0Ybi)
垢版 |
2020/01/30(木) 07:15:03.02ID:Z7o7STkD0
mainを再帰させるべき。
2020/01/30(木) 07:33:27.84ID:7USHzq/h0
ああ、
そんなコードを書いたことがある
2020/01/30(木) 07:35:18.50ID:7USHzq/h0
少ない文字数で大きな数を作るのを競うヤツで
2020/01/30(木) 10:15:17.82ID:OBUYa7FA0
赤い目を光らせて再起動

I will be back!
2020/01/30(木) 11:34:47.79ID:6JJixhdc0
どっちかつーと溶鉱炉で自分で自分を吐いているT-1000の姿が再帰に近いだろう
2020/01/30(木) 20:32:51.06ID:fVK6hy0p0
お前ら再帰してるときのプログラムの気持ち考えたことあるの?
俺はある
ちょっと恥ずかしいんだよな、自分を省みるみたいで
180デフォルトの名無しさん (ワッチョイ ea02-L01+)
垢版 |
2020/01/30(木) 20:50:43.10ID:XBwSjSkj0
何言ってんだこの馬鹿
2020/01/30(木) 21:25:54.78ID:N4FezhNTM
俺はCPUの気持ちになってるよ。
「ちょ、おま、いまのとこほっといて、またそっち行くわけ?」
「え、戻れるように退避してる?ならいいけど……」
みたいな。
2020/01/30(木) 23:15:18.07ID:OBUYa7FA0
結んでいたはずの命綱をたぐり寄せると全部手元に来てしまったw
183デフォルトの名無しさん (ワッチョイ 9e8c-Witc)
垢版 |
2020/01/31(金) 08:16:18.27ID:Kenfb4Kv0
AIは兵士をメカで作らない。たぶん生物兵器であろう。
ターミネータは嘘っぽい。エイリアンの方が本当っぽい。
2020/01/31(金) 09:16:07.89ID:R8G2m3ys0
アウトランダーズ
2020/01/31(金) 12:32:57.36ID:b8EdwmzO0
アウトランナーズ
2020/01/31(金) 12:37:32.33ID:1BlsaWfK0
アウトフォクシーズ
2020/01/31(金) 18:16:56.63ID:TLQmE8wI0
c言語で書く金融アプリケーションの事例がいくつか知りたいのですが!
2020/01/31(金) 18:23:03.22ID:EyOnVgK3d
>>187
金融なら、Haskell・OCamlでC言語ソース生成くらいグリグリやってんとちゃう?
189デフォルトの名無しさん (アウアウウー Sa21-lBRq)
垢版 |
2020/01/31(金) 19:41:28.40ID:K802DmBra
ないんじゃないかな?
2020/01/31(金) 19:46:08.12ID:k4NtdgGW0
金融アプリケーションって何?
2020/01/31(金) 19:47:08.82ID:xOuBGXY8d
COBOLとか使うヤツ
2020/01/31(金) 21:16:24.88ID:70BTs5bI0
>>187
疑問文なのに何で末尾に!を付けるの?
質問していると言うよりクレームつけてるみたいだなw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。