へにっくすの掲示板日記

言語の移植。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

言語の移植。

投稿記事 by へにっくす » 10年前

以下の投稿。

http://dixq.net/forum/viewtopic.php?f=3&t=16537

コードからして違う言語からの移植だなと思い、
C/C++言語はこうしなきゃだめよんとレスしましたが。

・・・もうね、知識として知ってはいますって・・・
怒りのレス。
さあどうこたえるかな。

アバター
amehirune
記事: 181
登録日時: 12年前

Re: 言語の移植。

投稿記事 by amehirune » 10年前

うーん…
確かにちょっと、レスを無視しているような返答内容でしたね。
でも、アタマに来るのはわかりますが、
もうちょっと優しい言い方ができたのではないでしょうか…?
(なんか、横から見たら煽ってるように見えてしまいますよ)

アバター
usao
記事: 1892
登録日時: 12年前

Re: 言語の移植。

投稿記事 by usao » 10年前

1-Baseで添え字…
Numerical Recipies in C のコードがわざわざそうなっててすごい気持ち悪いんだよなぁ.
数学な話での表記を a1, a2, a3, ... って1から始まる書き方にしてあるからそれと対応取りたいんだろうけど,
「in C」の時点でそこはCな側に歩み寄って欲しかった.
それだけのために独自の「配列を1-Baseで使おうぜライブラリ」に依存したCコード掲載されるとかえって読み難いんですが…っていう.

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 言語の移植。

投稿記事 by へにっくす » 10年前

> amehiruneさん
アタマきているのに優しい言葉は使えないです。
私は、ちゃんと理由がある場合は怒っていいと思っていますので。

> usaoさん
もしかしてこの本ですか。
配列の宣言はどのようになってます?
int a[5 + 1];と宣言して、a[1]~a[5]を使っているとか?
最後に編集したユーザー へにっくす on 2015年4月23日(木) 05:56 [ 編集 1 回目 ]

アバター
usao
記事: 1892
登録日時: 12年前

Re: 言語の移植。

投稿記事 by usao » 10年前

>配列の宣言はどのようになってます?

今ちょっと調べたら
宣言というか確保に関しては,提示コード内部で配列が欲しい場合,
使いたい添え字範囲を指定すると領域を用意してくれる関数があって,そいつを使う形.
そのライブラリ関数が何やってるかっていうと,
mallocで必要サイズ分確保して,[最小添え字]から使えるようにオフセットしたポインタを返してるだけな模様.なるほど.

CODE:

//実物じゃないですよ.「こんな感じ」ということ.
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;
}
>int a[5 + 1];と宣言して、a[1]~a[5]を使っているとか?
理由は不明ですが,
malloc内の個数計算と,returnの箇所に謎の +1 されてるからそういう形になってますね.


ふうむ,もっとキレそうになりながら読んでた記憶があるんですが,
1-Baseで揃えられたコードってのはやはり個人的には嫌ではあるけれども,今見てみると,この理由では言うほど読み難くも無い……かな.
(そんなことよりも変数が sだのkだのnlだの何の値なのか全く不明な名称になってることの方が圧倒的に読みづらい.)
最後に編集したユーザー usao on 2015年4月23日(木) 15:04 [ 編集 1 回目 ]

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 言語の移植。

投稿記事 by へにっくす » 10年前

> そういう形になってますね.
予想通り・・・
とゆーかそれ以外に方法がない気が。

> もっとキレそうに
オトナになったってことなのかな? 笑

アバター
usao
記事: 1892
登録日時: 12年前

Re: 言語の移植。

投稿記事 by usao » 10年前

>> そういう形になってますね.
>予想通り・・・
>とゆーかそれ以外に方法がない気が。

実際,謎の+1は不要だと思うのですけどね.
int a[5];
int *p = a -1;
として,以降,p[1]~p[5]を使えばいい,的な.

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 言語の移植。

投稿記事 by へにっくす » 10年前

> usaoさん
おお、なるほど
でもそれを思いつく人って…
なんだかなあと思うです
(別にusaoさんに対してでなく、移植した人が思いついた人に対してです)

YuO
記事: 947
登録日時: 15年前

Re: 言語の移植。

投稿記事 by YuO » 10年前

usao さんが書きました:int a[5];
int *p = a -1;
として,以降,p[1]~p[5]を使えばいい,的な.
それはundefined behaviorです……。

ちなみに,C FAQには
このテクニックは魅力的だが(NUMERICAL RECIPES IN Cの古い版でも 使われている)、厳密にいえばC言語の規格に従っていない。
とあり,過去の版で使われていたようです。
ref) C言語 FAQ 日本語訳 6章 配列とポインター 6.17

アバター
usao
記事: 1892
登録日時: 12年前

Re: 言語の移植。

投稿記事 by usao » 10年前

Oh,未定義だったとは.

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 言語の移植。

投稿記事 by へにっくす » 10年前

> YuOさん
ご指摘ありがとうございます。

> usaoさん
考えるとドツボになる例でしたね 笑