ページ 11

教えてください。

Posted: 2010年7月09日(金) 13:20
by tatu
void ascending_order(list[LIST_ITEM].sp, list[LIST_ITEM].p){
↑この文がダメって(Argument list syntax error)言われるんですが、なぜですか??

Re:教えてください。

Posted: 2010年7月09日(金) 14:34
by box
他の行に真のエラー原因があって、その行だけを見ても
何もわからないことがあります。

できれば、ソースコード全体を見せてくださるのが望ましいと思います。
そうすれば、こちらでも実際にコンパイルしてみることができますから。

Re:教えてください。

Posted: 2010年7月09日(金) 14:53
by tatu
指摘お願いします。

Re:教えてください。

Posted: 2010年7月09日(金) 15:04
by Mist
構造体を引数とする関数の作り方が間違っています。
下記の頁を読んでください。

http://www9.plala.or.jp/sgwr-t/c/sec15-4.html

Re:教えてください。

Posted: 2010年7月09日(金) 15:26
by tatu
構造体は、mainの中ではダメなんですか??

Re:教えてください。

Posted: 2010年7月09日(金) 15:35
by box
> 構造体は、mainの中ではダメなんですか??

昇順や降順にソートする関数の引数に使っている
構造体の定義を、なぜ当該関数の中で行なっているのですか?
というご指摘を受けています。

Re:教えてください。

Posted: 2010年7月09日(金) 15:54
by tatu
よくわかんないです・・・

Re:教えてください。

Posted: 2010年7月09日(金) 16:08
by box
何がわからないのか、主語をきちんと書いてください。

Re:教えてください。

Posted: 2010年7月09日(金) 19:53
by tatu
>boxさん

昇順、降順の関数で構造体の引数を使うのは変ってことですか??

Re:教えてください。

Posted: 2010年7月09日(金) 20:13
by box
そうではありません。
問題は、引数として使うよりも「前に」構造体を定義していない、という点にあります。

また、今のコードでは、引数として渡している変数の型が不明ですね。
構造体ではない型、例えばint型の変数を引数として渡すとき、どういう風に書きますか?
画像

Re:教えてください。

Posted: 2010年7月09日(金) 21:42
by tatu
こう言う感じですか??

void func(int x, int y){
printf("%d %d", x, y);
}

void main(void){
int a, b;
a = 5;
b = 3;

func(a, b);
}

Re:教えてください。

Posted: 2010年7月09日(金) 22:01
by box
> void func(int x, int y){

こういう風に、引数の並びを書くときは、
「型名 変数名(, 型名, 変数名 ...)」と書きますね。

ひるがえって、最初のコードを見てください。
引数の型がどこにも書いてありません。

Re:教えてください。

Posted: 2010年7月10日(土) 00:11
by tatu
やってみましたけど、やっぱダメでした。

Re:教えてください。

Posted: 2010年7月10日(土) 01:13
by Poco
> void ascending_order(unsigned char list[LIST_ITEM].sp, unsigned long list[LIST_ITEM].p){

仮引数名(list[LIST_ITEM].sp、list[LIST_ITEM].p))が不正です。
spとかpとか簡単な名前に置き換えてください。

Re:教えてください。

Posted: 2010年7月10日(土) 07:52
by box
MistさんのNo.56380を再読してください。
構造体を宣言する場所が、本当にそこでいいでしょうか。
また、構造体のメンバー構成が同じでも、
shoppingという構造体とcoursesという構造体とは別物として扱います。
今回のプログラムではそういう扱いでいいのでしょうか。

Re:教えてください。

Posted: 2010年7月11日(日) 12:39
by tatu
こんにちは。
関数を取り払って、まず構造体から直してみました。
でも、まだ直ってないのですがどこが悪いのか指摘してください。
因みに、「未定義のシンボル sp(関数 main)」って返ってきます。
お願いします。

Re:教えてください。

Posted: 2010年7月11日(日) 13:01
by もぐりん
ちなみに、コンパイラは何を使用していますか?
質問するなら、最低限開発環境も提示しないと検証できませんよ。

Re:教えてください。

Posted: 2010年7月11日(日) 13:22
by 白い時空
気付いたところとしては
scanf("%s", &liste[LIST_ITEM].sp);
ここの&は必要ないと思います。

liste.p < liste.sp
この比較は明らかにおかしいです。

Re:教えてください。

Posted: 2010年7月11日(日) 14:04
by fatens
>「未定義のシンボル sp(関数 main)」って返ってきます。

struct shopping{
unsigned long p;
unsinged char sp[SP_ITEM];
};
unsinged → unsigned です。
予約語の色を変えてくれるエディタなどを使うと、こういう綴りミスはすぐに見つけられると思います。


いろいろ問題はありますが、とりあえず1つ挙げておくと、
構造体変数は比較はできませんが代入はできるので、ソートの内部はもっと簡単にできます。

Re:教えてください。

Posted: 2010年7月11日(日) 16:54
by tatu
みなさん、ありがとうございます。
>もぐりん
>コンパイラは何を使用していますか?
Borlandです。「独習C(参考書)」についてたものです。

>白い時空
>scanf("%s", &liste[LIST_ITEM].sp);
>ここの&は必要ないと思います。
なぜですか??
>liste.p < liste.sp
>この比較は明らかにおかしいです。
すいません。これは「liste.p < liste[j].p」です。

>fatens
>unsinged → unsigned です。
すいません。簡単なミスですね。

動くようにはなったのですが、文字化けしてしまってるんです。
自分の環境ではないところでは、上手くいってたのですが…。

Re:教えてください。

Posted: 2010年7月11日(日) 18:30
by ドラ
>for(i = 0; i < LIST_ITEM; i++){
> printf("買い物:");
> scanf("%s", &liste[LIST_ITEM].sp);
> printf("値段:");
> scanf("%lu", &liste[LIST_ITEM].p);
>}
入力した値をどこに格納しているか確認してください。

Re:教えてください。

Posted: 2010年7月11日(日) 19:58
by box
>>scanf("%s", &liste[LIST_ITEM].sp);
>>ここの&は必要ないと思います。
>なぜですか??

scanf関数の第2引数以降は、ポインタである必要がありますね。
また、C言語の大前提として、「配列名は、その配列の先頭要素へのポインタである」
というものがあります。よって、

scanf("%s", liste[LIST_ITEM].sp);

という結論を得ます。