- ベストアンサー
C言語での質問です
C言語を始めて、2ヶ月くらいです。コンパイラは、Borlandc++で、エディタは、bcpadに付いていたものを使っています。 「サンプル通り作成したプログラムがコンパイルエラーになり」 一つ一つ確認しても、間違っている箇所が見つかりません。一人で解決できないとき、皆さんはどのようにして解決していますか。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
★エラーメッセージがかなり参考になりますよ。 ・本当に『private_data』が未定義です。正しくは次のようになります。 『struct private_data Adata, Bdata;』となります。もしも、『private_data』だけで 構造体の型を表したい場合は、『typedef』などを使います。 typedef struct private_data{ char blood; char area[5]; int old, exp, wage; } private_data; ←これならば『private_data』キーワードで宣言できます。 ・あと『else if(式){ … }』の記述が出来ます。 if ( same == 0 ){ printf("二人は違います\n"); } else if ( same == 1 ){ ←ここです。 printf("二人は同じです\n"); } ・上記の方法があります。 最後に: ・C言語の質問は『C/C++』カテゴリがありますよ。そこでどうぞ。 ・上記の場所さえ直せば、多分全部のエラーが無くなると思いますよ。 ・以上。おわり。
その他の回答 (8)
- TagoSuck
- ベストアンサー率72% (16/22)
なんか、コンパイルエラーの質問にデバッガの利用を薦めてしまって、すみません。まったく見当違いの答えでしたね。反省してます。 罪滅ぼしに、デバッガを使ってみました。 コンパイルの際に、ソースレベルコンパイルします > bcc32 -v kozinn.c で、デバッグを開始します。 > C:\borland\bcc55\bin\td32 kozinn.exe 青いウィンドウが出てきて、ソースが表示されます。 後は、デバッガの各コマンドなんですが、例えば現在の変数の値を見るなら、Alt + VでメニューのViewを開いてから、Variablesを選択してEnterを押します。 次にAlt + RでメニューのRunを開き、Step over(F8)を選択してEnterを押すと、一行ずつ処理を開始します。 これで、一行ずつの処理の過程と、変数の値を見ることができます。 Variablesの二つに分かれた下段に、same, input, Bdata, Adataがあると思います。VariablesでTABキーを押すと、カーソルが下段に移動しますので、Adataを選択してEnterを押すと、更にAdataの構造体の各変数の値が閲覧できます。 値の代入で、正しい値が代入されているか等を確認する事ができます。 良く使うのは、いくつかの機能だけだと思いますので、詳しい機能や使い方に関しては、検索するなどで調べてみてください。 いくつか探してみました。
お礼
回答ありがとうございます。C言語に慣れていないために、質問が正確に伝わらなかったにもかかわらず、貴重なアドバイス大変感謝しています。おかげで、これからは、デバッガを使ってのエラー修正もできそうです。(少し時間がかかるかもしれないですが……) また、デバッガのアドバイスも、大変参考になりました。お手数をかけてしまいました。プログラムのエラーについても、丁寧に回答してくれていたことと思っています。ありがとうございました。 私がまた質問しているのを見かけたときは、アドバイスをお願いします。 最後に、typedefを使ったときと、使わなかったときのどちらでも実行することができました。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★原因⇒タイプミスです。 ・回答番号 5 番⇒『struct private Adata, Bdata;』 ・回答番号 6 番⇒『stfct private_data Adata, Bdata;』 ・正しくは『struct private_data Adata, Bdata;』でしょう。 ・違いを見つけて下さい。→打ち間違いだと思います。 ・以上。
- catecholamine
- ベストアンサー率28% (4/14)
C言語から離れて長くなるのでうろ覚えで申し訳ないのですが... 確か、CとC++とでは、struct の定義が異なっていたように思います。 C言語でstructを型として使う場合には、他の方が回答なさっているようにtypedef を使う必要があります。 C++の場合にはstructは初めからclassの一種として言語仕様に組み込まれているので、サンプル通りでかまわないはずです。 したがってtypedefを使わないとうまくいかないということはコンパイラのオプション設定か何かでC言語としてコンパイルしているからではないでしょうか。そのへんのところをお確かめください。
お礼
回答ありがとうございます。今回は、structを使ったときの変数の宣言が、サンプルプログラムで間違っていたようです、定義の仕方をかえてみたら無事解決することができました。 コンパイラの設定も見直してみます。
- TagoSuck
- ベストアンサー率72% (16/22)
#4です 問題の回答は別の方が答えて下さっているので...。 今回のコンパイルエラーは、先頭の「未定義のシンボル private_data(関数 main )」というエラー以外は、このエラーによる副作用でしかありません。 宣言方法に間違えがないか。 タイプミスなどによる間違えはないか。 以前の行のエラーの副作用を受けていないか。 などを確認してみるといいでしょう。 エラーメッセージをそのままネット検索しても、結構良い情報を得られますよ。
補足
回答ありがとうございます。今回は何とか、解決しそうです。まだ、記述の方法で、「stfct private_data Adata, Bdata;」としたときにはエラーが出てしまいますが、もう一度テキストを調べてみます。 また、デバッグする力を付けたいと思い、前回アドバイスいただいた「Borland TD32」をインストールテストをしてみたのですがTD32.exe とTD32inst.exe があリ、使い方がよく分かりません。もし、お使いでしたらアドバイスをお願いします。
- TagoSuck
- ベストアンサー率72% (16/22)
一応、職業プログラマーです。 よくある事ですが、サンプル自体がコンパイルの通らない物なのでは? ちなみに、コンパイラはどんなエラーを発するのでしょうか? サンプルとエラーメッセージがあれば、今回は解決できると思いますが...。 ただ、質問は、どうやってエラー行とエラー箇所を見付けるかですよね。 基本的にはデバッガを使うのが一番早いと思います。 ある程度の規模の物を作るなら、どうしてもデバッガの使い方は覚えた方がいいですよ。
補足
回答ありがとうございます。ご指摘のデバッガをインストールしてみます。今回どうしても解決できない問題文を載せますので、お力を貸してください。 /*個人データ照合プログラム *A君とB君のデータで、次のことが分かっている、それぞれの項目を選択し *入力すると、2人のデータが同じか、異なっているかを判定し、結果を表示する*/ /*血液型 A君 A B君 B *出身地 長野 長野 *年齢 21 22 *経験 15ケ月 12ケ月 *自給 800円 800円*/ #include <stdio.h> #include <string.h> struct private_data { char blood; char area[5]; int old, exp, wage; }; int main() { 25 private_data Adata, Bdata; (数字は行番号です。) 26 int input; 27 int same; /*A君の規定データの入力*/ 31 Adata.blood = 'A'; strcpy(Adata.area,"長野"); Adata.old = 21; Adata.exp = 15; Adata.wage = 800; /*B君の規定データの代入*/ 39 Bdata.blood = 'B'; strcpy(Bdata.area,"長野"); Bdata.old = 22; Bdata.exp = 12; Bdata.wage = 800; /*質問の表示と選択結果の入力*/ printf("何で比較しますか?\n"); printf("1 : 血液型 2 : 出身地 3 : 年齢 4 : アルバイト経験 5 : 自給\n"); scanf("%d", &input); same = 0; /*判定と結果*/ switch(input) { case 1 : if(Adata.blood == Bdata.blood) same = 1; break; case 2 : if(strcmp(Adata.area, Bdata.area) == 0) same = 1; break; case 3 : if(Adata.old == Bdata.old) same = 1; break; case 4 : if(Adata.exp == Bdata.exp) same = 1; break; case 5 : if(Adata.wage == Bdata.wage) same = 1; break; default:printf("そんな項目番号はありません\n"); same = 2; } if(same == 0) { printf("二人は違います\n"); }else { if(same == 1) { printf("二人は同じです\n"); } } return(0); }■ D:\borland\bcc55\lesson> bcc32 kozinn.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland kozinn.c: エラー E2451 kozinn.c 25: 未定義のシンボル private_data(関数 main ) エラー E2379 kozinn.c 25: ステートメントにセミコロン(;)がない(関数 main ) エラー E2140 kozinn.c 26: ここでは宣言はできない(関数 main ) エラー E2140 kozinn.c 27: ここでは宣言はできない(関数 main ) エラー E2451 kozinn.c 31: 未定義のシンボル Adata(関数 main ) エラー E2451 kozinn.c 39: 未定義のシンボル Bdata(関数 main ) *** 6 errors in Compile *** このような問題文です。アドバイスをお願いします。
- LAZZY-2k
- ベストアンサー率37% (20/54)
C言語の場合、他の方々が仰っているような書き間違い等によるもの、 もしくは開発環境やOSによりエラーが発生します。 Borland C++コンパイラ(Borland社の無料配布版)の場合、付属している標準のヘッダファイルが最新のC言語の基準より古いものがあったと思います。 確かBorlandC++コンパイラでは、bool型とかはできなかったと思います。 その場合は、最新の基準を満たした標準のヘッダファイルをネット上から探してインストールとかすれば解決するはずです。 C言語は同じプログラムでもOSによって違う動きをすることがあります。 これは32ビットOS、64ビットOS等の相違によって起きるものです。 以下のような処理があったとします。 if( iNumber == 1 ) { printf("Number One!\n"); } これはiNumberが1のとき、「Number One!」と表示する処理です。 32ビットOSでは「iNumberがint型の1だったとき『Number One!』と表示」しますが、 64ビットOSでは「iNumberがlong型の1だったとき『Number One!』と表示」といった感じだったと思います。(うろ覚えなので、あまり自信はありません) どうしてもC言語のことで分からないときは、C言語の質問掲示板を頼るのも良いと思います。 「C言語 掲示板」の2つのキーワードで検索すれば、見つかると思います。 参考までに、C言語掲示板のURLを載せておきます。
お礼
貴重な回答ありがとうございます、参考になりました。 今回は、構造体の定義での、変数の宣言の仕方が間違っていました。 無事解決しました。
補足
回答ありがとうございます。C言語の掲示板があるんですね、いろいろ調べて利用してみます。また、ヘッダファイルなども、インストールできるとは知りませんでした。
- m0r1_2006
- ベストアンサー率36% (169/464)
エラーの行番号より,だいぶ上に間違いがある場合も多いです. セミコロン忘れていたり,} が抜けてたりとか. 全角スペース入りとかもあります.
お礼
回答ありがとうございます。ご指摘のとおり、初めの変数の宣言部にエラーがありました。無事解決しました。
補足
回答ありがとうございます。一応全部確認したのですが、サンプルと同じでした。
- mtfoggy
- ベストアンサー率14% (37/255)
>間違っている箇所が見つかりません。 エラーメッセージと、その行番号で、見つけてます。
お礼
回答ありがとうございます。無事に解決することができました。
補足
回答ありがとうございます。行番号は、分かるのですが、エラーメッセージの内容を確認する方法がよく分かりません。 参考にするようなものがありましたら教えてください。
お礼
回答ありがとうございます。ご指摘のとおり、typedefを使ったときの変数宣言の仕方や、structを使ったときの変数の宣言の仕方を間違えていました。サンプルのプログラムでは、typedefを使っていなかったため、確認に時間がかかってしまいましたが、どちらの方法でも、無事に実行することができました。いつも適切な回答をしていただき、ありがとうございます。
補足
回答ありがとうございます。ご指摘のとおり「typedef」 を使った記述だと無事に実行することができました。ただ、「struct private Adata, Bdata;」 で記述するとエラーが出てしまいます。もう一度テキストを確認してみます。また、Borland社のTD-32というデバッガをインストールしたのですが、テキストを読んでも、使い方がよく分かりません。もし使っていましたら、アドバイスをお願いします。