掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29295

どこが違うかわかりません
投稿者---もっこり(2006/12/23 20:54:03)


始めまして!
本題ですが、要素数no個の配列の最小値を求めるプログラムを作っています。そこで、下にあるようにプログラムを作ってみました。

1|#include <stdio.h>
2|
3|int min_of(const int vc[],int no)
4|{
5| int i,min=vc[0];
6|
7| for(i=1;i<no;i++)
8| min=(min<vc[i])?min:vc[i];
9|
10| return(min);
11|}
12|
13|int main(void)
14|{
15| int i,no;
16|
17| printf("要素数は?");
18| scanf("%d",&no);
19|
20| int ary[no];
21|
22| for(i=0;i<no;i++){
23| printf("ary[%d]=",i);
24| scanf("%d",&ary[i]);
25| }
26|
27| printf("最小値は%dです。\n",min_of(ary,no));
28|
29| return(0);
30|}

ところが、コンパイル時に
「20: syntax error near `int`
20: `ary` undefined
24: `ary` undefined
27: `ary` undefined」
とエラーが出てしまいます。
プログラム自体にエラー??それとも、環境設定がだめ??
教えてください!!お願いします!!


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> 追加 29296 もっこり 2006/12/23 20:57:00


No.29296

追加
投稿者---もっこり(2006/12/23 20:57:00)


ちなみに、コンパイラはlsi C-86試食版です。


この投稿にコメントする

削除パスワード

No.29297

Re:追加
投稿者---RAPT(2006/12/23 21:11:52)


題名と投稿者名は具体的に書きます。
ソースの添付は「HTML変換ツール」で字下げします。

> 15| int i,no;
> 16|
> 17| printf("要素数は?");
> 18| scanf("%d",&no);
> 19|
> 20| int ary[no];

LSI-C86 は古い規格のコンパイラなので、変数の宣言は関数の頭にまとめる必要があります。
そして、変数で配列の要素数を指定した配列を宣言することは、C言語の規格上できません。
malloc() / free() を使って下さい。



この投稿にコメントする

削除パスワード

No.29299

Re:追加
投稿者---もっこり(2006/12/23 22:05:20)


>LSI-C86 は古い規格のコンパイラなので、変数の宣言は関数の頭にまとめる必要があります。

では、新しいコンパイラは別に変数できるのですか??

>malloc() / free() を使って下さい。
ありがとうございました。



この投稿にコメントする

削除パスワード

No.29300

Re:追加
投稿者-----(2006/12/23 23:54:17)


>では、新しいコンパイラは別に変数できるのですか??

C++だと、関数の記述の途中であっても、
実際に使うより前であれば定義できます。
変数の定義と使用を比較的近くに置くことができるので、
わかりやすいといえるかもしれません。

一方、Cでは、そういうわけにはいきません。
関数の開始を示すなどの"{"の直後に、そのブロック("{"〜"}"の間)で
使うすべての変数を定義しておく必要があります。



この投稿にコメントする

削除パスワード

No.29303

Re:追加
投稿者---YuO(2006/12/24 01:22:47)


>>>LSI-C86 は古い規格のコンパイラなので、変数の宣言は関数の頭にまとめる必要があります。
>>では、新しいコンパイラは別に変数できるのですか??

「新しい規格に対応した」コンパイラであれば,ブロック中で宣言と文を混在させるができます。
「新しい」コンパイラ,というだけでは,宣言できないこともあります。
# 例えば,Visual C++ 2005とか。

ちなみに,
>>>そして、変数で配列の要素数を指定した配列を宣言することは、C言語の規格上できません。
も,Cの古い規格ではできませんでしたが,現在の規格では可能です。


>一方、Cでは、そういうわけにはいきません。

どこのCを言っているのでしょうか?

ISO/IEC 9899:1999の6.8.2 Compound statementによれば,
compound-statement:
{ block-item-listopt }
block-item-list:
block-item
block-item-list block-item
block-item:
declaration
statement
とありますが。



この投稿にコメントする

削除パスワード

No.29304

Re:追加
投稿者-----(2006/12/24 07:20:33)


規格書をろくに読んだこともないくせにコメントした--がバカでした。

許してください。


この投稿にコメントする

削除パスワード

No.29305

Re:追加
投稿者---もっこり(2006/12/24 10:20:51)


>>>>LSI-C86 は古い規格のコンパイラなので、変数の宣言は関数の頭にまとめる必要があります。
>>>では、新しいコンパイラは別に変数できるのですか??
>
>「新しい規格に対応した」コンパイラであれば,ブロック中で宣言と文を混在させるができます。

確かに、このように書かなければいけませんでしたね。
ちなみに、新しい規格に対応しているフリーソフトはあるのでしょうか??

>>>>そして、変数で配列の要素数を指定した配列を宣言することは、C言語の規格上できません。
>も,Cの古い規格ではできませんでしたが,現在の規格では可能です。

コンパイラにも新旧があることなんて知りませんでした。
勉強不足でございました。


この投稿にコメントする

削除パスワード

No.29302

Re:追加
投稿者---たかぎ(2006/12/24 01:19:58)
http://takagi.in/


>>LSI-C86 は古い規格のコンパイラなので、変数の宣言は関数の頭にまとめる必要があります。
>
>では、新しいコンパイラは別に変数できるのですか??

新しいコンパイラではなく、新しい規格に準拠したコンパイラなら可能です。


この投稿にコメントする

削除パスワード

No.29301

Re:追加
投稿者---たかぎ(2006/12/24 01:19:02)
http://takagi.in/


> LSI-C86 は古い規格のコンパイラなので、変数の宣言は関数の頭にまとめる必要があります。

こう言っているのであれば...

> そして、変数で配列の要素数を指定した配列を宣言することは、C言語の規格上できません。

変数で配列の要素数を指定した配列の宣言ができないのも古い規格のコンパイラだからですね。
C99ならできますよ。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧