仕事と子育てを両立。働くママを、もっと笑顔に!>>

分割コンパイルでsub.c をコンパイルしても
fraction.h:10: two or more data types in declaration of `kiyaku'
と出てきます
分数計算するプログラムの一部で,規約分数を求める部分なのですがどうもうまくコンパイルできません。
構造体とポインタについていまいち分かっていないのでそれが原因だとおもうんですけど,どこがわるいか分かりません。エラーも何を意味してるかわかりません。どなたか教えてくださるとうれしいです。

******sub.c******

#include "fraction.h"
struct fraction *kiyaku(struct fraction *a){
int aa,bb,temp;
if(a->denominator < a->numerator){
aa = a->numerator;
bb = a->denominator;
}
else {
aa = a->denominator;
bb = a->numerator;
}
while(bb !=0){temp = aa%bb; aa = bb; bb=temp;}

a->numerator /= aa;
a->denominator /= aa;

return(a);
}

******fraction.h*******

struct fraction{

int numerator;//bunsi
int denominator;//bunbo

}

extern struct fraction *kiyaku();
extern struct fraction *add();
extern void output();

このQ&Aに関連する最新のQ&A

A 回答 (1件)

構造体宣言の最後には;をつけましょう

    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2003/07/11 12:43

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

QC言語のポインターに関する警告

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int=i; /*main関数内のfor文で使用*/
char line[100], out[100];
void change(int);

/*関数*/
void change(int i)
  {
   if(line[i]=='1'){
    out[10]="a\0"
   }if(line[i]=='2'){
    out[10]="b\0";
   }if(line[i]=='3'){
    out[10]="c\0"
}
}

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int...続きを読む

Aベストアンサー

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(line[i]=='1'){
    out[10]=0x61; /* aのASCIIコード */
   }if(line[i]=='2'){
    out[10]=0x62; /* bのASCIIコード */
   }if(line[i]=='3'){
    out[10]=0x63; /* cのASCIIコード */
}
}
と書きましょう。

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(l...続きを読む

Q構造体の各データの表示について以下のようなプログラムを作成しました。

構造体の各データの表示について以下のようなプログラムを作成しました。

#include <stdio.h>

struct tb{
char name[20];
char sex;
int age;
double height;
double weight;
};

int main(void)
{
int i;

struct tb test[2];

test[0].name="amada"
test[0].sex='f';
test[0].age=20;
test[0].height=172.5;
test[0].weight=62.5;

test[1].name="okada";
test[1].sex='f';
test[1].age=21;
test[1].height=180.2;
test[1].weight=70.8;

for(i=0; i<2; i++){
printf("%s %s %d %f %f \n",test[i].name,test[i].sex,test[i].age,test[i].height,test[i].weight);
}

return 0;
}

ファイル名を適当にsample.cとしてgcc sample.c した所、以下のようなコンパイルエラーが出ました。

sample.c: In function ‘main’:
sample.c:18: error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’
sample.c:18: error: expected ‘;’ before ‘test’
sample.c:23: error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’

このエラーを元にソースをどのように修正したらよいか教えて頂けますでしょうか?
よろしくお願いいたします。

構造体の各データの表示について以下のようなプログラムを作成しました。

#include <stdio.h>

struct tb{
char name[20];
char sex;
int age;
double height;
double weight;
};

int main(void)
{
int i;

struct tb test[2];

test[0].name="amada"
test[0].sex='f';
test[0].age=20;
test[0].height=172.5;
test[0].weight=62.5;

test[1].name="okada";
test[1].sex='f';
test[1].age=21;
test[1].height=180.2;
test[1].weight=70.8;...続きを読む

Aベストアンサー

エラーメッセージに書いてある通り
構造体を以下のように定義するか
struct tb{
char name[20]; -> char *name
char sex;
int age;
double height;
double weight;
};

#include <string.h>
を追加して
strcpy(test[0].name,"amada");
にするかのいずれか(後者の方がいいと思うけどね)

あとは
>test[0].name="amada"
文末に;が無いね。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC言語のバグの警告文について

こんばんわ。

C++でプログラムを作成中なのですが警告文の意味がわからないので教えていただきたいです。

警告文
SAMPLE.c: 181 : warning: passing argument 4 of fwrite' makes pointer from integer without a cast
/usr/include/stdio.h:688: note: expected 'struct FILE * __restrict__' but argument is of type 'int'

どうぞよろしくお願いいたします。

Aベストアンサー

「C言語のバグ」ではなく、「あなたが作ったプログラムが違うかもしれないけど大丈夫ですか?」という警告です。

メッセージに書いてある通りで
「fwriteの4番目の引数で、ポインタ→整数への変換がキャスト無しの行われてます」
です。 fwriteの引数指定が間違ってませんか?

Qgcc: incompatible pointer type

以下のCソースでコンパイルすると、warning: passing arg 1 of `func_b' from incompatible pointer type
となります。
void (*p_func)() は、引数を省略しているので int として扱われるということでしょうか?

#include <stdio.h>
#include <stdlib.h>
void func_a( unsigned char x ){
printf( "x=%d\n", x ) ;
}
void func_b( void (*p_func)() ){
p_func( 1 ) ;
}
int main(){
func_b( func_a ) ;
return 0 ;
}

Aベストアンサー

まずは訂正から。

「関数や関数へのポインタを宣言するときに仮引数リストを空にすると、仮引数はないものとして扱われます。」と書きましたが、今の C の規格では
「関数を定義するときに仮引数リストを空にすると、仮引数はないものとして扱われます。これに対し、関数の(定義ではない)宣言や関数へのポインタの宣言(定義を含む)の場合には、引数の個数や型について一切情報が与えられないことを意味します。」くらいに解釈されます。将来的には変更されるはずですが。

今の場合 void (*p_func)() となっているので「p_func は void を返す関数で、その引数の個数や型は不明」ということになります。

ではなぜ unsigned char や unsigned short のときには warning が出るのに int や char * や long では出るのかという点に移るのですが、これはおそらく過去との互換性だと思います。ANSI/ISO C 以前、つまりいわゆる K&R の時代にはプロトタイプ宣言が存在しませんでした。この時代、char 及び short の引数は int に、また float の引数は double に自動的に変更されていました。つまり、関数の仮引数として char、short、float は許されていませんでした。

今考えている例では p_func に引数の情報が与えられていないため、その引数として char、short 及び float は許されず、その結果これらの型を持つ仮引数があるような関数を渡そうとすると warning が出るのだと思います。

まずは訂正から。

「関数や関数へのポインタを宣言するときに仮引数リストを空にすると、仮引数はないものとして扱われます。」と書きましたが、今の C の規格では
「関数を定義するときに仮引数リストを空にすると、仮引数はないものとして扱われます。これに対し、関数の(定義ではない)宣言や関数へのポインタの宣言(定義を含む)の場合には、引数の個数や型について一切情報が与えられないことを意味します。」くらいに解釈されます。将来的には変更されるはずですが。

今の場合 void (*p_func)() となっ...続きを読む

Qモジュールとは何ですか

モジュールとは具体的には何を指しているのか、をお聞きします。

手元のカタカナ語辞典では
「プログラムを、それぞれ特有の機能を持ついくつかの基準単位に分割すること。また、その基準単位。」
と書いてありました。

そうすると、1つ1つのソースファイルを指しているように思えてきます。

いままで私が人がしゃべっているのを聞いてきたところでは、Windowsでいうところの、exeファイルやdllファイルを指しているような気がします。

「モジュール」という言葉は gooの新語辞典にも載っています。
また、コンピュータ用語辞典のようなサイトも見てみました。
それらによると、「ソフトウェア・ハードウェアの部品」だそうです。
しかし、例えば何のことをいっているのかが、分からないのです。

#ファイルなら何でもいいのだろうか。

この言葉の用例を教えていただきたいのです。

============================
過去の質問と回答より。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=302590
回答No.1の補足より。
>モジュールはAccessの標準モジュールのことです

わたしはAccessのことをほとんど知らないので、ハテナです。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=293234
こちらのNo.2の回答では、
dllとは「共通モジュール=ライブラリ」である、
という使い方ですので、例えばdllのことを指しているようです。

モジュールとは具体的には何を指しているのか、をお聞きします。

手元のカタカナ語辞典では
「プログラムを、それぞれ特有の機能を持ついくつかの基準単位に分割すること。また、その基準単位。」
と書いてありました。

そうすると、1つ1つのソースファイルを指しているように思えてきます。

いままで私が人がしゃべっているのを聞いてきたところでは、Windowsでいうところの、exeファイルやdllファイルを指しているような気がします。

「モジュール」という言葉は gooの新語辞典にも載ってい...続きを読む

Aベストアンサー

「モジュール」と言う言葉には「ソフトウェアの部品」という以上の共通概念はありません。
よって、使用される文章の前後関係によって微妙に意味合いが変ってきます。

1.関数、手続き
「mainモジュール」など
2.機能単位でまとめられたライブラリのメンバー
「標準関数ライブラリ(UNIXならlibc.a)に含まれるstdio関係の関数群」など
3.実行ファイルを構築するための個々の素材ファイル
「ソースファイル」、「オブジェクトファイル」、「ライブラリファイル」など
4.実行環境を構成する個々の実行可能ファイル
「exeファイル」、「dllファイル」など
5.(オブジェクト指向型言語において)クラス

モジュールは機能で分類されていると言う保証はありません。
「stdioを構成する個々の関数」を関数モジュールと言う場合もあります。

モジュールと言う単語を使い場合、「関数モジュール」とか「ライブラリモジュール」と言うように、モジュールと言う言葉の曖昧さを保管するような単語と組み合わせて使う用に心がけた方が安全です。

Qコンパイルエラー invalid operands to binary

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst         uvwxyz0123456789+/=";
unsigned char *p;
unsigned char *q;
unsigned char a[4];
char *RtnBuf;
int j=0;
int cnt;

RtnBuf = (char *)malloc(length+1);
memset(RtnBuf, 0, length+1);

p = (unsigned char*)buf;
q = (unsigned char*)RtnBuf;
cnt = 0;
while(*p != 0) {
a[0] = a[1] = a[2] = a[3] = 0;
a[0] = strchr(b64, p[0]) - b64;
a[1] = strchr(b64, p[1]) - b64;
a[2] = strchr(b64, p[2]) - b64;
a[3] = strchr(b64, p[3]) - b64;

q[0] = ((a[0] << 2) | (a[1] >> 4)) & 0xff;
cnt++;

if (p[2] != '=') {
q[1] = ((a[1] << 4) | (a[2] >> 2)) &0xff;
cnt++;
}
if (p[3] != '=') {
q[2] = ((a[2] << 6) | a[3]) & 0xff;
cnt++;
}
p += 4;
q += 3;
}
*outlen = cnt;
return(RtnBuf);
}

コンパイルはRed Hatでgccを使ってコンパイルしています。
引数は第1引数がデコード対象の文字列、第2引数がデコード対象文字列長、第3引数がデコード後の文字列長で、戻り値がデコード後の文字列です。

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst ...続きを読む

Aベストアンサー

手元にgccが無いので、Windowsのbcc32でコンパイルしてみたところ、
エラーが出ずに通ってしまいました。
だから自信がないのですが…。

a[0] = strchr(b64, p[0]) - b64;



a[0] = strchr(b64, p[0]) - b64[0];

に変えてみたらどうでしょう。
"invalid operands to binary"
は、たぶん、マイナスの両側で型が違っていることを
表しているのではないでしょうか。(←これも自信なし)
strchr()が返すのはchar *型ですが、
b64の型は、charの配列型です。
型が違うので、コンパイラが不正と判断したのかもしれません。

とするとbcc32でなぜ通ったかが問題になるのですが…。
C言語規格でも、ポインタ同士の引き算のところは
ややこしくなっています。
規格解釈の違いがあるのかもしれません。

Qエラーがわかりません、、

以下のプログラムを入力したときに以下のえらーがでます。
List13-4.c: In function ‘get_data’:
List13-4.c:18: error: expected expression before ‘)’ token

18行目を探すのですが、自力では見つけられません。もしかしたら
別のところが間違っていて18行目がエラーと出ているのかなと思っています。ならいたてですぐにわかるようなミスかもしれないですが、よろしくお願いします。

#include <stdio.h>
#include <time.h>

char data_file[] = "datetime.data";

void get_data(void)
{

FILE *fp;

if((fp = fopen(data_file,"r")) == NULL){
printf("本プログラムを実行するのは初めてですね\n");
}
else{
int year,month,day,h,m,s;

fscanf(fp,"%d %d %d %d %d %d",&year,&month,&day,&h,&m,&s);
printf("前回は%d年%d月%d日%d時%d分%d秒でした\n",year,month,day,h,m,s,);

fclose(fp);
}
}
void put_data(void)
{

FILE *fp;
time_tt;
struct tm *local;

time(&t);
local = localtime(&t);

if((fp = fopen(data_file,"w")) == NULL)
printf("\aファイルをオープンできません\n");

else{

fprintf(fp,"%d %d %d %d %d %d\n",
local->tm_year + 1900,local->tm_mon + 1 ,local->tm_mday,
local->tm_hour, local->tm_min,local->tm_sec);

fclose(fp);
}
}




int main(void)
{

get_data();
put_data();

return(0);

}

以下のプログラムを入力したときに以下のえらーがでます。
List13-4.c: In function ‘get_data’:
List13-4.c:18: error: expected expression before ‘)’ token

18行目を探すのですが、自力では見つけられません。もしかしたら
別のところが間違っていて18行目がエラーと出ているのかなと思っています。ならいたてですぐにわかるようなミスかもしれないですが、よろしくお願いします。

#include <stdio.h>
#include <time.h>

char data_file[] = "datetime.data";

void get_data(void)
{

FILE...続きを読む

Aベストアンサー

>printf("前回は%d年%d月%d日%d時%d分%d秒でした\n",year,month,day,h,m,s,);
最後の「,」が余分です。
printf("前回は%d年%d月%d日%d時%d分%d秒でした\n",year,month,day,h,m,s);

QC言語初心者の質問失礼します。

C言語初心者の質問失礼します。
プログラムを作って、cygwinでコンパイラしたのですが、以下のようなエラーメッセージが出てしまいました。
expected declaration or statement at end of input
どのような意味なのか教えてください。
ばかみたいな質問でごめんなさい…。

Aベストアンサー

No. 1 No2 さんに同意です。

直訳すると「入力の最後で、declaration (宣言)もしくは statement (文)が期待されている」です。

文法上、宣言もしくは文のみが期待される場所というのは、複合文のカッコ { と } に挟まれた部分です。

また、ファイルの最後は、関数定義の閉じカッコのはずです。その場所で、宣言もしくは文が期待されるのは、本来おかしいです。

おそらく、プログラマの意図として関数の閉じカッコを書いたハズが、期待通りに関数の閉じカッコとして解釈されず、複合文の閉じカッコとして扱われてしまったのでしょう

つまり、{ に対して } の数が足りないってことです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング