ページ 11

授業でしてたのですが

Posted: 2009年1月27日(火) 09:46
by yu
#include <stdio.h>
#include <math.h>

#define NUM1 3
#define NUM2 4
#define NUM3 3

/* 各重量範囲での上限重量(規定サイズ内) */
const int Weight_tbl1[NUM1] = {25, 60, 100},
Price_tbl[NUM1] = {50, 80, 150};

/* 各重量範囲での上限重量(規定サイズ外) */
const int Weight_tbl2[NUM2] = {50, 100, 500, 1000};

const int Size_tbl [NUM3] = {60, 100, 150},
Mag_tbl [NUM3] = {1, 3, 4};

const int Min_size = 20, Max_size = 40, Max_weight = 10000;
const int Unit_price = 2, Base_price = 600, Ext_price = 100;

void calc_carriage(int, int, int, int *, int *);

void calc_carriage(int weight, int size, int dist_mode,
int *class, int *price){
int i;

if(weight <= Weight_tbl2[NUM2 - 1]){
if((size >= Min_size) && (size <= Max_size) &&
(weight <= Weight_tbl1[NUM1 - 1])){
*class = 1;
for(i = 0; weight > Weight_tbl1; i++);
*price = Price_tbl;
}else{
*class = 2;
for(i = 0; weight > Weight_tbl2; i++);
*price = Weight_tbl2 * Unit_price;
}
}else if(weight <= Max_weight){
if(size <= Size_tbl[NUM3 - 1]){
*class = 3;
for(i = 0; size > Size_tbl; i++);
*price = (Base_price + dist_mode * Ext_price) * Mag_tbl;
}else{
*class = -1;
*price = 0;
}
}else{
*class = -2;
*price = 0;
}
}

これに何を付け足すとエラーが直るのか解りません。まだC言語もわかっていないので。
一週間くらいずっと考えてます。

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 09:57
by abc
エラー内容を教えてもらいたいです。
もしかしてclassを変数として使っている?そうならclasssにすればいけるかもです笑

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 11:12
by yu
0127 error LNK2019: 未解決の外部シンボル _main が関数 _mainCRTStartup で参照されました。
が出てきたので、int main(void){ return 0; }
をつけたら、
error C2065: 'class' : 定義されていない識別子です。
error C2065: 'dist_mode' : 定義されていない識別子です。
error C2065: 'price' : 定義されていない識別子です。
error C2065: 'size' : 定義されていない識別子です。
error C2065: 'weight' : 定義されていない識別子です。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
0127\0127.c(46): error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
error C2143: 構文エラー : ';' が '{' の前にありません。
と・・・沢山もエラーが出ます;;

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 11:24
by 御津凪
> int main(void){ return 0; }

これではせっかく作った関数が呼ばれないで即終了しますが良いのでしょうか。

原因は変数名に C++ の予約語である class を使っているせいではないでしょうか。
で、コンパイルで C++ としてコンパイルされたためエラーが出ていると思います。

abc さんの方法で変数名を変えるか、
プロジェクトのプロパティでソースを C としてコンパイルするように設定を変更すれば
多分OKだと思います。

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 11:53
by yu
main・・を外してやってみたのですが、C2085: 'calc_carriage' : 仮引数リスト内にありません。
というエラーが出てきてしまいました;;

お二人の方、ありがとうございます!!

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 11:59
by yu
やぱっり、0127 error LNK2019: 未解決の外部シンボル _main が関数 _mainCRTStartup で参照されました。
が出てきます;;

上記のは教えていただいたのとで解決したのですが。main()・・・を付けるのですよね?

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 12:10
by 御津凪
プログラムを実行するのに、 この場合、一番初めに呼ばれる関数である main は必須です。

上記で、
> これではせっかく作った関数が呼ばれないで即終了しますが良いのでしょうか。
と、書いたのは、main 関数が終了するとプログラムが終了するため、
main 関数内で calc_carriage 関数を呼び出していないので、
何の処理も行わずにプログラムが終了してしまいますよ、という意味です。

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 12:20
by s-rush
main関数は一番最初に実行される部分です。
なのでmainは必ず必要です。

int main(void){ return 0; }
としてしまうと、中身は何もない(なにも実行しない)
プログラムとなってしまいます。

これではせっかく作ったcalc_carriageが呼び出されないので、
ちゃんと動いてくれる(自分の望む結果が得られる)かどうかわかないですよね??
main(void){
   (略)
   calc_carriage(引数)
   (略)
}
という感じにするとcalc_carriageが呼び出されますよ。

Re:授業でしてたのですが

Posted: 2009年1月27日(火) 13:33
by yu
ありがとうございます。
いまは授業で使ってる教室が違うので、休み時間に直しにいってきます!!
自身で解決出来るようにこれから頑張ります。

Re:授業でしてたのですが

Posted: 2009年1月29日(木) 10:15
by yu
出来ました!!