掲示板

掲示板を置いてみました。ご自由に書き込んで下さい。
ただし、私は根性なしなので、閑古鳥が鳴いたり、荒れてきたと
思ったらとっとと閉鎖する可能性があります。


より新しい記事へ ← 500 件の投稿中 50件目〜1件目を表示 → より前の記事へ
表示件数: 件/頁 


50 ヘッダ解析ツール? コメント数:  1件
  tos 2001/07/06 (金) 20:04
あるソースを見ると、結構たくさんのヘッダファイルをインクルードしていたりします。
本当にこんなにたくさんのヘッダファイルをインクルードする必要があるかと思い、
わざわざ、インクルードしている部分をコメントアウトして、コンパイルして確かめたり
しています。

このような面倒な事しなくても、そのファイルが本当に必要としているヘッダファイルが一発でわかるような、
ツールどなたか知りませんでしょうか?(Windows版で)
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


49 Re^3: 完全制覇 P.212 list4-4 realloc.cについて コメント数:  0件
  ぽかり 2001/07/02 (月) 14:06
かずま氏 、(ぱ)氏 どうもありがとうございました。

かずま氏
>Ctr+Z は表示されないと思うのですが
はい。表示されませんでした。書き方がまずかったですね。
この場所で Ctr+Z を押したことを言いたかっただけなので。

(ぱ)氏
> getchar();
> printf("hoge\n");
> printf("piyo\n");
>
> のように書きgetchar()に対してCtrl-Zを入力した場合でも、
> piyoは出ますがhogeは表示されませんね。

実はこれに似たようなことを、僕もやってみたんです(具体的な文字列は違いますが)。それで苦肉の策(?)として
getchar();
printf("\n\nhoge\n");
printf("piyo\n");
として、しのぎました。

それにしても、DOSのバグだったとは・・・・。
かなりの時間ソースとにらめっこしてたんですけどねぇ。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


48 Re^2: 完全制覇 P.212 list4-4 realloc.cについて コメント数:  1件
  (ぱ)   | maebashi@cse.co.jp 2001/07/02 (月) 03:33
 http://member.nifty.ne.jp/maebashi/
> Ctr+Z は表示されないと思うのですが、それはともかく
> Windows 95/98 のMS-DOSプロンプトには変なバグ(仕様?)があって、
> コントロールZの後改行まで表示が行われません。Windows NT/2000
> のコマンドプロンプトにはこのバグはありません。

ありがとうございます。

私の方はウラを取ろうともたもたしてました (_o_)

たとえば、

getchar();
printf("hoge\n");
printf("piyo\n");

のように書きgetchar()に対してCtrl-Zを入力した場合でも、
piyoは出ますがhogeは表示されませんね。

DOS窓上での動きについてチェックが甘かったです。ご迷惑を
おかけしました。

List2-8などでも同様の現象があります。まとめてWeb上で
フォローしたいと思います。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


47 Re: 完全制覇 P.212 list4-4 realloc.cについて コメント数:  2件
  かずま  | sakamoto@mc.catv.ne.jp 2001/07/02 (月) 01:11
> さっそくですが、このrealloc.cを実際に書いて動かしてみたのですが、
> 読み込んだ値をfor文で表示するときに、i=0の値が表示されずi=1の値から
> 表示されます。なぜなんでしょうか?

Ctr+Z は表示されないと思うのですが、それはともかく Windows 95/98 の
MS-DOSプロンプトには変なバグ(仕様?)があって、コントロールZの後改行まで
表示が行われません。Windows NT/2000 のコマンドプロンプトにはこのバグは
ありません。

printf("abc\32def\nghi\n"); を試してみてください。(\32 は Ctrl+Z)

入力の Ctrl+Z に対しても、エコーバックのために、プログラムの出力の
1行目が表示されません。

C:\tmp>realloc >file
1
2
3
^Z
C:\tmp>type file

このようにファイルに出力してみれば、プログラムが正しく出力しているのが
わかります。また、プログラムの while文と for文の間に printf("\n"); を
挿入すると、お望みの表示になります。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


46 完全制覇 P.212 list4-4 realloc.cについて コメント数:  3件
  ぽかり 2001/06/30 (土) 05:57
はじめまして。
ポインタ完全制覇で勉強させて頂いています。

さっそくですが、このrealloc.cを実際に書いて動かしてみたのですが、
読み込んだ値をfor文で表示するときに、i=0の値が表示されずi=1の値から表示されます。なぜなんでしょうか?

1
2
3
Ctr+Z
variable_array[1]..2
variable_array[2]..3

と表示されてしまいます。

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


45 Re^16: 可変長構造体は規格違反ではない! コメント数:  0件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/28 (木) 09:53
> 「規格合致プログラム」と「規格厳密合致プログラム」の区別は
> ついていますか?
すいません。規格合致=規格厳密合致という意味で使ってました。
のぐーさんは「厳密合致」は問題にしていなかったのですね。
勘違いしていました。申し訳ありません。

ただ、のぐーさんが最初に問題として取り上げた(ぱ)さんの以下の文章には
http://member.nifty.ne.jp/maebashi/programmer/c_yota/pointer.html
「# だからこういうコードは書いちゃダメ、と言っているわけではありません。
# 「規格厳密一致プログラム(strictly conforming program)」を書くことに、
# それほど意味があるとは思えませんし。」
と言う記述があったので、のぐーさんは
「可変長構造体は規格違反ではない」=「規格厳密合致である!」
と、主張していると勝手に誤解していました。

> ですから処理系依存で全く構わないのです。
つまり、のぐーさんと(ぱ)さん争点は
可変長構造体が「規格厳密合致プログラム」かどうかではなく
「規格合致プログラム」かどうかだと言うことですね。

厳密規格には違反だけど制約には違反していないとか。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


44 Re^16: 可変長構造体は規格違反ではない! コメント数:  0件
  (ぱ)   | maebashi@cse.co.jp 2001/06/28 (木) 02:59
 http://member.nifty.ne.jp/maebashi/
> > すると、規格に合致しているはずのプログラムの動作が
> > 処理系依存になってしまいませんか?
>
> ですから処理系依存で全く構わないのです。

「処理系定義」の動作に依存したプログラムは規格合致プログラム
でしょうが、「処理系依存」で全く構わない、となるとちょいと
語弊がありそうな。

構造体メンバの境界調整については確かに「処理系定義」ですが、
変則的な方法で「書きこんじゃった」時についてはどうだか...

まあ、この例だと、bus errorになるとも思えませんが。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


43 Re^15: 可変長構造体は規格違反ではない! コメント数:  2件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/27 (水) 23:22
 http://homepage1.nifty.com/nogue/
> 「a[15]が合法」と言う意味はa[15]への代入行為が規格合致プログラムという
> 意味でしょうか?

「規格合致プログラム」と「規格厳密合致プログラム」の区別は
ついていますか?

規格厳密合致プログラムとは、未定義はもちろん、未規定や
処理系定義のふるまいに依存してはなりません。どの処理系
でも同じ動作をする必要があります。

規格合致プログラムとは、未定義や制約違反を含まなければ
よく、したがって処理系によって実行結果が異なっていても
かまいません。

「規格違反」という言葉を使うときは、たいてい未定義や制約
違反を問題にする、つまり規格合致プログラムか否かを
問題にすると思いますが。

> すると、規格に合致しているはずのプログラムの動作が
> 処理系依存になってしまいませんか?

ですから処理系依存で全く構わないのです。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


42 Re^14: 可変長構造体は規格違反ではない! コメント数:  3件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/27 (水) 20:05
> > a[] と b[] の間に、どれだけの padding が入るか、規格は全く規定していないと
> > 思います。
> それはそうですが、b[4]もしくはb[3]のエイリアスに
> なったとしても、論旨には影響しません。

申し訳ないのですがどうして影響しないのかわかりません。
詳しく解説していただけますか?
「a[15]が合法」と言う意味はa[15]への代入行為が規格合致プログラムという
意味でしょうか?
ところで、a[15]への代入によってもたらされる結果が
b[3]に影響するかb[5]に影響するかが
処理系依存になりますよね?
すると、規格に合致しているはずのプログラムの動作が
処理系依存になってしまいませんか?

私の理解不足の点などございましたらご指摘願えませんでしょうか。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


41 Re^13: 可変長構造体は規格違反ではない! コメント数:  4件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/26 (火) 23:35
 http://homepage1.nifty.com/nogue/
> > 単にa[15]はb[5]のエイリアスになってるだけですね。
>
> これは違うような。
> a[] と b[] の間に、どれだけの padding が入るか、規格は全く規定していないと
> 思います。

それはそうですが、b[4]もしくはb[3]のエイリアスに
なったとしても、論旨には影響しません。
パディングの量はoffsetofで調べられるし。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


40 Re^17: 可変長構造体は規格違反ではない! コメント数:  0件
  (ぱ)   | maebashi@cse.co.jp 2001/06/26 (火) 02:41
 http://member.nifty.ne.jp/maebashi/
> わかってないついでに「構造体定義」って何ですか?
> typedef struct {
> int len;
> char str[1];
> } string_t; ←(1)
> string_t *hoge;←(2)
> hoge=malloc(たくさん); ←(3)
> (1)は構造体の宣言で(3)で記憶域を確保してやっと構造体が定義されるんだと
> 思っていたのですが。

あやや、すみません、「構造体宣言」に言いなおします(_o_)
# でも、typedefは型定義...
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


39 Re^16: 可変長構造体は規格違反ではない! コメント数:  1件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/25 (月) 20:57
> これはそうでしょうが、可変長構造体では構造体定義はひとつしか
> 出てこないので、
> この根拠にはならないと思います。

やっぱり、よくわかってないくせに発言してはいけませんね(^^;)
わかってないついでに「構造体定義」って何ですか?
typedef struct {
int len;
char str[1];
} string_t; ←(1)
string_t *hoge;←(2)
hoge=malloc(たくさん); ←(3)

(1)は構造体の宣言で(3)で記憶域を確保してやっと構造体が定義されるんだと
思っていたのですが。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


38 Re^15: 可変長構造体は規格違反ではない! コメント数:  2件
  (ぱ) 2001/06/25 (月) 19:41
> とでpaddingの量が違うと言う狂った処理系があってもANSI準拠と
> 名乗っていいはずですよね。

これはそうでしょうが、可変長構造体では構造体定義はひとつしか
出てこないので、

> と、すると可変長構造体を使った「規格違反でないプログラム」と言う奴が
> ANSI準拠の処理系で動作しなくなっちゃいますね。

この根拠にはならないと思います。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


37 Re^14: 可変長構造体は規格違反ではない! コメント数:  3件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/25 (月) 19:20
struct {
int len;
char str[1];
} String1;

struct {
int len;
char str[100];
} String100;
とでpaddingの量が違うと言う狂った処理系があってもANSI準拠と
名乗っていいはずですよね。

と、すると可変長構造体を使った「規格違反でないプログラム」と言う奴が
ANSI準拠の処理系で動作しなくなっちゃいますね。
どうせ、そんな処理系ないからいいけど。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


36 Re^14: 可変長構造体は規格違反ではない! コメント数:  0件
  kit 2001/06/25 (月) 19:18
> たしか、Cでは記述順に配置されることが保証されているはずですよ

ふむふむ。確かに 6.5.2.1 に、アドレスが増加する順序で置かれる旨の
記述がありました。なるほど。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


35 Re^13: 可変長構造体は規格違反ではない! コメント数:  9件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/25 (月) 18:48
> もともとの話題に戻ると、構造体の各メンバが宣言された順序でメモリに
> 配置されるという仮定がない限り、可変長構造体が規格上問題ないとは
> 断言できないと思いますが、こういう明示的な記述ってありましたっけ?

たしか、Cでは記述順に配置されることが保証されているはずですよ
(paddingの量は処理系依存だけど)
その保証がなくなってるのはC++じゃなかったかしら。

あ、規格書を読んで答えたわけじゃないので、何章の何番だ?って聞かれても
困りますが。

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


34 Re^12: 可変長構造体は規格違反ではない! コメント数:  15件
  kit 2001/06/25 (月) 16:44
> 単にa[15]はb[5]のエイリアスになってるだけですね。

これは違うような。
a[] と b[] の間に、どれだけの padding が入るか、規格は全く規定していないと
思います。

もともとの話題に戻ると、構造体の各メンバが宣言された順序でメモリに
配置されるという仮定がない限り、可変長構造体が規格上問題ないとは
断言できないと思いますが、こういう明示的な記述ってありましたっけ?
共用体の common initial sequence を拡大解釈すれば可能?
ちょっと根拠として弱い気もするんですけど。
(まあ、普通の実装は宣言順で並んでいるとは思いますが、ただし bit field は除く)

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


33 Re^12: 可変長構造体は規格違反ではない! コメント数:  0件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/24 (日) 23:22
 http://homepage1.nifty.com/nogue/
一方「読み書き」は間接参照演算子の部分を見なければなりませんが、
「正しくない値がポインタに代入されている場合、単項*演算子の動作は未定義とする。」
と書いてあるのみで、「正しくない値」の具体的説明が無いようです。
(脚注に例は3つほどあげてありますが。)
配列を一つ越えた所はアドレシング可能であっても参照可能ではないと
いう点ぐらいは全員の意見が一致するでしょうが、これではどの様な恣
意的解釈も可能になります。ただし、エイリアスが発生しただけで未定
義だと解釈してしまうと、通常のダブルリンクトリストや二分木も未定
義になってしまいます。

>char a;
>double *b;
>b = (double*)&a
>b = 0.5;
なぜこの話題でこの例が出てくるのか、よくわかりません。
double *b=malloc(sizeof(char));
*b=0.5;
なら分かりますが。これはどう見ても領域不足なので、
「正しくない値」にひっかかると思います。

>どっちも非合法なら、「どっちかに引っかかるとダメ」ということで、
よって、私はa[15]の方は合法という立場です。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


32 Re^11: 可変長構造体は規格違反ではない! コメント数:  17件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/24 (日) 23:16
 http://homepage1.nifty.com/nogue/
>わたしゃこれでも忙しいんですが...
お手数かけます。

>typedef struct {
>  int a[10];
>  int b[10];
>} Hoge;
>で、a[15]に書きこんでも良さそうですが、それはどうなんでしょうか?
mallocで確保したのなら、良いと思います。
単にa[15]はb[5]のエイリアスになってるだけですね。

>Hogeがスタックにあるときとヒープにあるときで違いは
>あるんでしょうか。
それは違ってもおかしくないでしょう。
mallocは7.10.3で規定されており、静的変数や自動変数として定義された
ものについては別の場所で規定されており、文章の内容も違いますから。

「アドレッシング」と「読み書き」は区別して論じるべきです。
加減演算子の部分で書いてあるのはアドレッシング可能な範囲ですね。
mallocで確保された1つの領域は当然連続しており、「適切に境界調整され
ており」「いかなる型のオブジェクトへのポインタにも代入してもよいし」
「割りつけられた領域のオブジェクトの配列へのアクセスに使用してよい」
ので、アドレッシング不可能になる要因は存在しません。

長くなったので、分割します。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


31 Re^10: 可変長構造体は規格違反ではない! コメント数:  18件
  (ぱ)   | maebashi@cse.co.jp 2001/06/24 (日) 06:03
 http://member.nifty.ne.jp/maebashi/
> リプライが無いようですが、議論するのが嫌になって
> しまったのでしょうか?
> それとも、まさかとは思いますが,ギブアップですか?

わたしゃこれでも忙しいんですが...

結局この問題は、「確保されている領域」を基準とするか、
「宣言のサイズ」を基準とするかの問題であるわけです(よね?)。

「確保されている領域」を基準とする場合、可変長構造体は
規格違反ではなくなりますが、それに徹すると、

typedef struct {
  int a[10];
  int b[10];
} Hoge;

で、a[15]に書きこんでも良さそうですが、それはどうなんでしょうか?

あるいは、

char a;
double *b;

b = (double*)&a;

b = 0.5;

これは合法でしょうか?

どっちも非合法なら、「どっちかに引っかかるとダメ」ということで、

>それとも、「どちらか小さい方を取る」などといった
>都合の良すぎる解釈

になるわけですよ。C-FAQもこの立場を取っているのだと思います。

結局この問題は、「ポインタのキャスト」という邪悪な手段が残されて
いる部分に起因しているわけで、じゃあ規格書のキャストの所になにか
書いてあるかな、と思ってこれは一応見てみたけど直接的なのはなさそう
なのでした。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


30 Re^9: 可変長構造体は規格違反ではない! コメント数:  19件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/23 (土) 23:52
 http://homepage1.nifty.com/nogue/
(ぱ)さん、こんにちは。
リプライが無いようですが、議論するのが嫌になって
しまったのでしょうか?
それとも、まさかとは思いますが,ギブアップですか?

もちろん、返答の義務があるなどとは微塵も申しません
が、せめて、最後の部分の質問には
答えていただきたいなと思ったのですが。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


29 Re: 『完全制覇』p.261 コメント数:  0件
  (ぱ)   | maebashi@cse.co.jp 2001/06/21 (木) 02:53
 http://member.nifty.ne.jp/maebashi/
> 『完全制覇』は何度も繰り返し読ませてもらってます。

ありがとうございます。

> p.261 List5-11 の 15行目は、
> strlen(src) + 1 が括弧でくくられていたほうがよいように思います。

うわ。(^^;

おっしゃる通りです。正誤表に入れておきます。

> 手許にあるのが第1刷ですので、すでに訂正済みだったら、すみません。
> というより、素人ですので、そもそも言ってることが変だったら、すみません。

いえ、当方のポカです。ご指摘ありがとうございました (_o_)
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


28 『完全制覇』p.261 コメント数:  1件
  ぬ 2001/06/20 (水) 02:49
はじめまして。
『完全制覇』は何度も繰り返し読ませてもらってます。

実は1度目に読んだときから気になってたのですが・・・

p.261 List5-11 の 15行目は、
strlen(src) + 1 が括弧でくくられていたほうがよいように思います。

sizeof(char) が 1 であることが規格で保証されている限り、
動作に変化はなさそうですが、それを言ったら、端から
dest = malloc(strlen(src) + 1);
でよいことになるでしょうし。

p.256 の List5-6 の 28行目では、括弧付いてますね。

手許にあるのが第1刷ですので、すでに訂正済みだったら、すみません。
というより、素人ですので、そもそも言ってることが変だったら、すみません。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


27 Re^3: ? コメント数:  0件
  (ぱ)   | maebashi@cse.co.jp 2001/06/19 (火) 23:50
 http://member.nifty.ne.jp/maebashi/
> まずいっす。理由: 「FreeBSD」で固有名詞だから。

了解です。正誤表に載せておきます。

ご指摘ありがとうございました。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


26 Re^2: ? コメント数:  1件
  kit 2001/06/19 (火) 20:30
> > 詳しくは知りませんが、Free と BSD を離して書いて
> > あるのは意図的なものでしょうか?
:
> 意図的ではありません。...けど、これってまずいんでしょうか。

まずいっす。理由: 「FreeBSD」で固有名詞だから。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


25 Re: 誤殖? コメント数:  2件
  (ぱ)   | maebashi@cse.co.jp 2001/06/19 (火) 01:36
 http://member.nifty.ne.jp/maebashi/
> 完全制覇 (第1刷) の201ページに、
>
> /* Free BSDのman pageから抜粋 */
>
> とあります。私はそれほどヘビーユーザではないので
> 詳しくは知りませんが、Free と BSD を離して書いて
> あるのは意図的なものでしょうか?

ご指摘ありがとうございます。

意図的ではありません。...けど、これってまずいんでしょうか。

他の所はたいていFreeBSDと書いていると思うので、統一性から
すると空けないほうが良いかと思うんですが、X Window System
みたいに表記について規定があるのかなあ、という意味ですけど。

どうなんでしょう? > 詳しい方

> ところで、誤殖を発見した場合、どこに報告するのが適切でしょうか?

ここで結構です。よろしくお願いします。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


24 ANSI 宣言,K&R定義の警告 コメント数:  0件
  REC   | tabe@mug.biglobe.ne.jp 2001/06/18 (月) 22:46
 http://ncosweb.h2o-lp.co.jp/
int func(char) ; /* 宣言 */
int func(c) /* 定義 */
char c ;
{
;
}
上の、ANSI宣言、K&R定義で引数がINT未満の時、
コンパイラは警告を出しますが、
今ひとつ何を警告しているのか、わかりません。
C-FAQにも、前橋さんの本にも説明がありますが、
Xの時、Yを期待するが、Zとなる。
の、X,Y,Zをご存知の方教えてください(出来れば、FLOAT,DOUBLEはなしで)
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


23 誤殖? コメント数:  3件
  K.S 2001/06/16 (土) 14:19
(正誤表に無かったので一応)

完全制覇 (第1刷) の201ページに、

/* Free BSDのman pageから抜粋 */

とあります。私はそれほどヘビーユーザではないので
詳しくは知りませんが、Free と BSD を離して書いて
あるのは意図的なものでしょうか?

ところで、誤殖を発見した場合、どこに報告するのが適切でしょうか?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


22 Re^3: 文字列リテラルとは? コメント数:  0件
  ITA 2001/06/15 (金) 10:55
> > 「char str[] = "hoge";」と書いた場合と全く同じ
> > 格納のされ方・同じ初期化の仕方、なんでしょうか?
> これは解釈が逆ですね。
> コンパイラは文字列リテラル"hoge"を{'h','o','g','e','\0'}に
> 展開して解釈するのです。
> ですから結局、値の格納のされ方・初期化の方法は同じです。

なるほど。

"hoge" は {'h','o','g','e','\0'} と解釈され、最終的に
他の配列と同じ扱いになる、のでしょうか??

文字列は、どこか他の配列とは違うというか、特別扱い
されてるような印象を受けてしまって、混乱してます。

(これ以上遅レスで引っぱるのも何なので、自分で調べます)


> 配列の初期化がどのようになされるのかが知りたいのでしたら、
> コンパイラでアセンブラファイルの出力をしてみることをオススメします。
> どこか関数の頭でデータを複製したりしているはずですので。

Web でかき集めた情報を頼りに何とか読もうと
したんですが、結局あまり理解しきれませんでした(^^;
せっかくアドバイスしていただいたのに、すみません。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


21 Re^8: 可変長構造体は規格違反ではない! コメント数:  20件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/14 (木) 08:43
 http://homepage1.nifty.com/nogue/
>とりあえず、配列があったら、その最後の要素+1の所まで
>ポインタが向けられることを保証しなければいけないのでは?

という文からは、
「strings{MAX}をアドレッシング可能でなければいけない。
それを満たさないmalloc()の実装は規格違反だ。」
という意味しか読み取れませんが。

「strings[MAX]をアドレッシングできなくても良い。」
ということを認めたならば、malloc()で確保された領域に
関しては、宣言ではなくmallocの引数のサイズ指定によって
「配列オブジェクトの要素」か否かが決まるということを
認めることになりませんか?

それとも、「どちらか小さい方を取る」などといった
都合の良すぎる解釈をできるような部分が、規格の文章の
中にありますでしょうか?

>(異論はあるかも知れませんが)私はこれは
>ダメだと思っているので、ダメだと思う根拠を挙げたん

前回の文からは、そういった意味は読み取れませんでしたが、
これはつまり、strings{MAX}ではなくて、
struct cell * cell = malloc(sizeof(struct cell) - MAX + strlen(str) + 1);
cell->strings[strlen(str)]='\0';
も未定義だという主張ですね?
では、その根拠は規格の文書のどこにありますか?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


20 Re^7: 可変長構造体は規格違反ではない! コメント数:  21件
  (ぱ)   | maebashi@cse.co.jp 2001/06/14 (木) 02:46
 http://member.nifty.ne.jp/maebashi/
> その説明だと、一般に「規格準拠」と信じられている
> 実際の処理系の動作と矛盾するのです。

C-FAQ 2-6に

>しかしながらこの技法も、規格の厳密な解釈によると
>許されないようだ。

とあるように、(異論はあるかも知れませんが)私はこれは
ダメだと思っているので、ダメだと思う根拠を挙げたん
ですけど?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


19 Re: 体当り入門 page105の あたり コメント数:  0件
  (ぱ)   | maebashi@cse.co.jp 2001/06/14 (木) 02:41
 http://member.nifty.ne.jp/maebashi/
> my_sort5.cというプログラム例がありますが、
> これがどうもうまくいきません。

とりあえず私のところでは動いています。

これを機に、ソースをダウンロードできるようにしまし
たので、よろしければ使ってください。
# ポインタ完全制覇の方も早く作業しないと...

> あと、Fig.2-6のsorted_numはsorted_countの間違いではないでしょうか。

こちらはその通りです。ご指摘ありがとうございます。

正誤表に載せておきました。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


18 体当り入門 page105の あたり コメント数:  1件
  costa 2001/06/12 (火) 20:31
my_sort5.cというプログラム例がありますが、
これがどうもうまくいきません。
表示数が足りなかったり、入力停止を受け付けなかったりするのですが、
このプログラムについて何か怪しい点があると思ったら誰か教えて下さい。
あと、Fig.2-6のsorted_numはsorted_countの間違いではないでしょうか。


【新規投稿】 【この投稿にリプライ】 【投稿者削除】


17 Re^2: 配列のレンジチェック コメント数:  0件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/12 (火) 00:16
 http://homepage1.nifty.com/nogue/
>そもそもここでは規格の話はしてません。

それはまずいです。配列のレンジチェックが
可能かどうかは、そういうことをやって
規格と矛盾しないかどうかを、まず論じる
べきではないでしょうか?

そうしないと、あるソースが配列のレンジチェック
を行う処理系でエラーを出したとして、これは
・ソースが規格に適合していない のか
・処理系が規格に適合していない のか
分からなくなります。

>ユーザにとっての使い勝手の話です。

だったら警告止まりで良いような気がします。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


16 Re^6: 可変長構造体は規格違反ではない! コメント数:  22件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/12 (火) 00:14
 http://homepage1.nifty.com/nogue/
>なにが「ちゃんと」かわかりませんが、
>とりあえず、配列があったら、その最後の要素+1の所まで
>ポインタが向けられることを保証しなければいけないのでは?

その説明だと、一般に「規格準拠」と信じられている実際の処理系の動作と
矛盾するのです。

#define MAX 32768
struct cell {
int data;
char strings[MAX];
}
のように宣言しておいて、mallocするときに
struct cell * cell = malloc(sizeof(struct cell) - MAX + strlen(str) + 1);
のように確保して、
cell->strings[MAX]
をアドレッシング可能でしょうか?アドレス計算するだけでも、
特に16ビットの処理系のようにアドレス空間に余裕がない処理系では
ラップアラウンドを起こします。LISPマシンのようにアドレス空間が
非連続なマシンでも同様です。

やはりここは、mallocで確保した「領域」に関しては、宣言時の要素数とは
無関係に、mallocで確保したサイズ全体を「配列の内部」と考えないと
おかしいのではないでしょうか?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


15 Re: 配列のレンジチェック コメント数:  1件
  (ぱ)   | maebashi@cse.co.jp 2001/06/11 (月) 07:51
 http://member.nifty.ne.jp/maebashi/
> >この割り算で余りが出たら... 実行時エラーでいいような気がする。
> の部分です。これだと
> int *p=malloc(sizeof(int)+1);
> はエラーですね?ではこれは、規格のどこに違反しますか?

そもそもここでは規格の話はしてません。ユーザにとっての
使い勝手の話です。

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


14 Re^5: 可変長構造体は規格違反ではない! コメント数:  23件
  (ぱ)   | maebashi@cse.co.jp 2001/06/11 (月) 07:49
 http://member.nifty.ne.jp/maebashi/
> この場合、焦点になるのは、むしろ 7.10.3 記憶域管理関数
> の部分のような気がします。mallocで確保した部分をどう
> 解釈するか。(nifty:FCでは、そっちを詳しく議論する前に
> 議論か終わってしまいましたが……)

typedef struct {
int hoge1[10];
int hoge2[10];
} Hoge;

のとき、hoge1[15]に書くのはいいんでしょうか。

Hogeがスタックにあるときとヒープにあるときで違いは
あるんでしょうか。

> それと、str[1]と宣言したらstr[0]とstr[1]しかアドレッシ
> ングできないとする立場だと、str[32768]とかやって実際に
> はそれより小さくmallocした場合をちゃんと説明できるでし
> ょうか

なにが「ちゃんと」かわかりませんが、
とりあえず、配列があったら、その最後の要素+1の所まで
ポインタが向けられることを保証しなければいけないのでは?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


13 Re^5: 未定義? コメント数:  0件
  レプラコーン  | sailis@annie.ne.jp 2001/06/10 (日) 04:59
 http://www.annie.ne.jp/~sailis/pvon/
> 嘘を言っちゃいけません。
> 規格上、なぜ未定義かの根拠は、まさにtosさんが引用した
> 部分が根拠になります。
理解不足でした。
部分式の評価順序だけではなく、
副作用の発生するところも未定義だから、ですね。

tosさん、失礼しました。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


12 Re^4: 未定義? コメント数:  1件
  のぐー  | BXM06466@nifty.ne.jp 2001/06/10 (日) 01:08
 http://homepage1.nifty.com/nogue/
tosさん、レプラコーンさん、こんにちは。

> いいえ。

嘘を言っちゃいけません。
規格上、なぜ未定義かの根拠は、まさにtosさんが引用した
部分が根拠になります。

だいたい、K&Rの付録Aの参照マニュアルなんて、「このマニュ
アルは標準規格書そのものではなく、それの一つの解釈である」
なんて注意書きしてあるようなしろものですので、規格を参照
できるなら規格のほうを重視すべきです。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


11 Re^4: 未定義? コメント数:  0件
  tos 2001/06/08 (金) 08:56
やっとわかりました。
本多さん、レプラコーンさんありがとうございました。

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


10 Re^3: 未定義? コメント数:  2件
  レプラコーン  | sailis@annie.ne.jp 2001/06/08 (金) 01:05
 http://www.annie.ne.jp/~sailis/pvon/
いいえ。
プログラミング言語Cの式を索引で引いてみるとp244に書いてあるのですが、
「演算子の優先順位と結合規則は完全に指定されているが〜」
という部分です。

とはいえ、本多さんが既に回答してくださっていますね。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


9 Re^3: 未定義? コメント数:  1件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/07 (木) 20:42
> > 右辺と左辺の式の評価順序が未定義なんですね。
> すいません。
> これに対する記述は、どこかにあるのでしょうか?
大概の教科書には演算子一覧って言うのがあって、
そこには結合規則、評価順序なんていう項目がたいていあると思いますよ。

←とか→とか「右から左」とか「左から右」とか
未定義とか不定とか書いてあると思います(たぶん)

評価順序は→か未定義しかないですけどネ。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


8 Re^2: 未定義? コメント数:  2件
  tos 2001/06/07 (木) 15:23
> 右辺と左辺の式の評価順序が未定義なんですね。

すいません。
これに対する記述は、どこかにあるのでしょうか?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


7 Re: 未定義? コメント数:  3件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/07 (木) 13:04
> ただ、そうすると未定義といわれる下記のような式。
> a[i] = i++;
> これも、代入を「使われた」と見なすと、未定義の動作にならないような気がするのですが・・・。

右辺と左辺の式の評価順序が未定義なんですね。
i=0;
a[i]=i++;
の場合、左辺の評価を先に行った場合
1.左辺a[i]を評価する(a[0]に値を格納することを決定する)
2.右辺iを評価する(値0を取り出す)
3.2で式の評価が完了したのでiをインクリメントする
4.代入する(a[0]=0)

これが右辺から評価されると
1.右辺iを評価する(値0を取り出す)
2.1で式の評価が完了したのでiをインクリメントする
3.左辺a[i]を評価する(a[1]に値を格納することを決定する)
4.代入する(a[1]=0)
と、なる。
...実際問題、仕事では余計な頭を使いたくないので
私はインクリメントなんかは完全に別行にしちゃうなぁ。
当然、関数の引数中で演算もしない。
条件文も余分な括弧をつけまくるし。
if( (a==0) && (b==0) )みたいに。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


6 Re^2: 未定義? コメント数:  3件
  tos 2001/06/07 (木) 12:10
> プログラミング言語Cを持っておられるようなので、
> 「式」を索引で引いてみると良いと思います。
> その点については記述してありますよ。

プログラミング言語cを読んでもよくわかりませんでしたが、規格に

「直前の副作用完了点から次の副作用完了点までの間に、
式の評価によってオブジェクトに格納された値を変更する回数は、
高々1回でなければならない。
さらに、変更前の値は、格納されている値を決定するためにだけ
アクセスしなければならない。」

との記述がありました。
これにより、未定義なのですね?



【新規投稿】 【この投稿にリプライ】 【投稿者削除】


5 Re: 初心者、式について コメント数:  0件
  本多  | manybook@msc.biglobe.ne.jp 2001/06/07 (木) 01:09
> 例えば、a;というような式がある場合、aは式と呼べるのでしょか。;が
> ない限り、式とは呼べないと思うのですが。

私の解釈はかなり間違っているかもしれませんが、
宣言中じゃなければ、aはいつでも式でしょう。
a;と書いたらそれは文ですね。

なんの作用もないだけで。

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


4 Re^2: 文字列リテラルとは? コメント数:  1件
  レプラコーン  | sailis@annie.ne.jp 2001/06/06 (水) 22:57
 http://www.annie.ne.jp/~sailis/pvon/
> 「char str[] = "hoge";」と書いた場合と全く同じ
> 格納のされ方・同じ初期化の仕方、なんでしょうか?
これは解釈が逆ですね。
コンパイラは文字列リテラル"hoge"を{'h','o','g','e','\0'}に
展開して解釈するのです。
ですから結局、値の格納のされ方・初期化の方法は同じです。

配列の初期化がどのようになされるのかが知りたいのでしたら、
コンパイラでアセンブラファイルの出力をしてみることをオススメします。
どこか関数の頭でデータを複製したりしているはずですので。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


3 Re: 初心者、式について コメント数:  0件
  レプラコーン  | sailis@annie.ne.jp 2001/06/06 (水) 22:44
 http://www.annie.ne.jp/~sailis/pvon/
> 例えば、a;というような式がある場合、aは式と呼べるのでしょか。;が
> ない限り、式とは呼べないと思うのですが。
難しいですね。でも、式と呼べないとなると、
(void )func(); とか while(1) { ... }; とか
switch(a) { /* switchが評価するのも式 */
case 0:   /* 0は「定数式」ですし */
  ...
}
も式とは呼べないことになりそうですね。
a=a; などを「左辺代入式」と言うように、
言葉が分かれていることも考えると、
単にa;と書いた場合は「値の評価が可能な式(右辺となりえる値)」と
言う大きな括りがあるように考えても
差し支えがないような気がしないでもないですが・・・。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


2 Re: 未定義? コメント数:  4件
  レプラコーン  | sailis@annie.ne.jp 2001/06/06 (水) 22:30
 http://www.annie.ne.jp/~sailis/pvon/
プログラミング言語Cを持っておられるようなので、
「式」を索引で引いてみると良いと思います。
その点については記述してありますよ。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


1 Re: 文字列リテラルとは? コメント数:  2件
  ITA 2001/06/06 (水) 20:11
うひぃ(^^; やはり知れば知るほど難しいですね。

初期化用のデータは、とりあえずどこかに確保される
みたいですが、それは別に

char str[] = "hoge";

の "hoge" が文字列リテラルだから、というわけでは
なく、配列の初期化がそもそもそういう仕組みに
なっている、という事でしょうか?

というのは例えば、

char str[] = {'h', 'o', 'g', 'e', '\0'};

と書くと、単に「char a = 'h';」みたいなやつが複数
並んでるだけに見えてしまうんですが、これもやはり
どこかに初期化用のデータを格納していて、それは
「char str[] = "hoge";」と書いた場合と全く同じ
格納のされ方・同じ初期化の仕方、なんでしょうか?

(中略/すいません、書きすぎました)

…どうやら私は、出直し決定のようです。


あ、そうそう、

> # 掲示板を質問用途で汚してしまってすみません

前回の書き込みの初めに「『完全制覇』を読んで云々」と
書いてしまったので、こんな調子で私みたいな初心者が
どんどんここに書き込んでしまうと、この掲示板が
「C言語初心者 質問掲示板」になってしまうなぁ、という
懸念を表したわけでして(^^;
【新規投稿】 【この投稿にリプライ】 【投稿者削除】

Copyright(C) 1999 NIFTY Corporation
All Rights Reserved.