以下の投稿。
http://dixq.net/forum/viewtopic.php?f=3&t=16537
コードからして違う言語からの移植だなと思い、
C/C++言語はこうしなきゃだめよんとレスしましたが。
・・・もうね、知識として知ってはいますって・・・
怒りのレス。
さあどうこたえるかな。
へにっくすの掲示板日記
言語の移植。
Re: 言語の移植。
うーん…
確かにちょっと、レスを無視しているような返答内容でしたね。
でも、アタマに来るのはわかりますが、
もうちょっと優しい言い方ができたのではないでしょうか…?
(なんか、横から見たら煽ってるように見えてしまいますよ)
確かにちょっと、レスを無視しているような返答内容でしたね。
でも、アタマに来るのはわかりますが、
もうちょっと優しい言い方ができたのではないでしょうか…?
(なんか、横から見たら煽ってるように見えてしまいますよ)
Re: 言語の移植。
1-Baseで添え字…
Numerical Recipies in C のコードがわざわざそうなっててすごい気持ち悪いんだよなぁ.
数学な話での表記を a1, a2, a3, ... って1から始まる書き方にしてあるからそれと対応取りたいんだろうけど,
「in C」の時点でそこはCな側に歩み寄って欲しかった.
それだけのために独自の「配列を1-Baseで使おうぜライブラリ」に依存したCコード掲載されるとかえって読み難いんですが…っていう.
Numerical Recipies in C のコードがわざわざそうなっててすごい気持ち悪いんだよなぁ.
数学な話での表記を a1, a2, a3, ... って1から始まる書き方にしてあるからそれと対応取りたいんだろうけど,
「in C」の時点でそこはCな側に歩み寄って欲しかった.
それだけのために独自の「配列を1-Baseで使おうぜライブラリ」に依存したCコード掲載されるとかえって読み難いんですが…っていう.
Re: 言語の移植。
>配列の宣言はどのようになってます?
今ちょっと調べたら
宣言というか確保に関しては,提示コード内部で配列が欲しい場合,
使いたい添え字範囲を指定すると領域を用意してくれる関数があって,そいつを使う形.
そのライブラリ関数が何やってるかっていうと,
mallocで必要サイズ分確保して,[最小添え字]から使えるようにオフセットしたポインタを返してるだけな模様.なるほど.
>int a[5 + 1];と宣言して、a[1]~a[5]を使っているとか?
理由は不明ですが,
malloc内の個数計算と,returnの箇所に謎の +1 されてるからそういう形になってますね.
ふうむ,もっとキレそうになりながら読んでた記憶があるんですが,
1-Baseで揃えられたコードってのはやはり個人的には嫌ではあるけれども,今見てみると,この理由では言うほど読み難くも無い……かな.
(そんなことよりも変数が sだのkだのnlだの何の値なのか全く不明な名称になってることの方が圧倒的に読みづらい.)
今ちょっと調べたら
宣言というか確保に関しては,提示コード内部で配列が欲しい場合,
使いたい添え字範囲を指定すると領域を用意してくれる関数があって,そいつを使う形.
そのライブラリ関数が何やってるかっていうと,
mallocで必要サイズ分確保して,[最小添え字]から使えるようにオフセットしたポインタを返してるだけな模様.なるほど.
//実物じゃないですよ.「こんな感じ」ということ.
int *CreateIntVec( int min_indx, int max_indx )
{
int *p = (int*)malloc( (max_indx-min_indx+1 +1)*sizeof(int) );
return p-min_indx +1;
}
理由は不明ですが,
malloc内の個数計算と,returnの箇所に謎の +1 されてるからそういう形になってますね.
ふうむ,もっとキレそうになりながら読んでた記憶があるんですが,
1-Baseで揃えられたコードってのはやはり個人的には嫌ではあるけれども,今見てみると,この理由では言うほど読み難くも無い……かな.
(そんなことよりも変数が sだのkだのnlだの何の値なのか全く不明な名称になってることの方が圧倒的に読みづらい.)
最後に編集したユーザー usao on 2015年4月23日(木) 15:04 [ 編集 1 回目 ]
Re: 言語の移植。
> そういう形になってますね.
予想通り・・・
とゆーかそれ以外に方法がない気が。
> もっとキレそうに
オトナになったってことなのかな? 笑
予想通り・・・
とゆーかそれ以外に方法がない気が。
> もっとキレそうに
オトナになったってことなのかな? 笑
Re: 言語の移植。
>> そういう形になってますね.
>予想通り・・・
>とゆーかそれ以外に方法がない気が。
実際,謎の+1は不要だと思うのですけどね.
int a[5];
int *p = a -1;
として,以降,p[1]~p[5]を使えばいい,的な.
>予想通り・・・
>とゆーかそれ以外に方法がない気が。
実際,謎の+1は不要だと思うのですけどね.
int a[5];
int *p = a -1;
として,以降,p[1]~p[5]を使えばいい,的な.
Re: 言語の移植。
> usaoさん
おお、なるほど
でもそれを思いつく人って…
なんだかなあと思うです
(別にusaoさんに対してでなく、移植した人が思いついた人に対してです)
おお、なるほど
でもそれを思いつく人って…
なんだかなあと思うです
(別にusaoさんに対してでなく、移植した人が思いついた人に対してです)
Re: 言語の移植。
それはundefined behaviorです……。usao さんが書きました:int a[5];
int *p = a -1;
として,以降,p[1]~p[5]を使えばいい,的な.
ちなみに,C FAQには
とあり,過去の版で使われていたようです。このテクニックは魅力的だが(NUMERICAL RECIPES IN Cの古い版でも 使われている)、厳密にいえばC言語の規格に従っていない。
ref) C言語 FAQ 日本語訳 6章 配列とポインター 6.17
Re: 言語の移植。
> YuOさん
ご指摘ありがとうございます。
> usaoさん
考えるとドツボになる例でしたね 笑
ご指摘ありがとうございます。
> usaoさん
考えるとドツボになる例でしたね 笑