main.c を分割コンパイルすると次のようにエラーが出ます。
これもどこがいけないのかわかりません^^;
1/2 + 1/3 + ... 1/10 を計算するというものですが,たぶんadd の記述はまちがってるかもしれません。ただそれはきにしないでください。
よろしくおねがいします。
storage size of `a' isn't known
storage size of `b' isn't known

*****main.c******
#include "fraction.h"
int main(){
int i;
struct function a, b;
a.numerator =1;
a.denominator =2;
for(i=3;i<11;i++){
b.numerator =1;
b.denominator =i;
add (&a,&b);
}
return (0);
}


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

struct fraction{

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

};

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


****sub.c*****
struct fraction *add(struct fraction *a,struct fraction *b){
....
....
....
}

A 回答 (1件)

struct function a, b;


で記述されている構造体名が違っているのではないでしょうか?
fractionでは?
    • good
    • 0
この回答へのお礼

ありがとうございます。。。恥ずかしい。。
なんか
fraction
function
よくまちがえるんです。。。注意力がないというか。。。
助かりました!

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

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

QMacでRAMDISKの使用方法に関して。

Mac OS10.12.2においてRAMDISKを32GB作成したく(現在50MB積んであります)
http://blog.majili.com/mac/into-ramdis-memory-on-mac/
このぺーじより32GBのRAMDISKは作成はできたのですが
起動時にSafariをRAMDISKに移動させ起動し
システム終了時にバックアップしたいのですが
どのようにすればよいのでしょうか?
作成するにあたってAutomatorの使い方もわからないです。
Mac購入一ヶ月のため勉強不足で申し訳ありません。

Aベストアンサー

キャッシュの保存先をRAMDiskにすることで、効果はあるかもしれません。

ですが、それは「キャッシュの保存先」の変更であり、アプリケーション本体をRAMDiskに置くこととは関係ありません。
また、この場合は、RAMDiskには32GBも必要ありません。
キャッシュの高速化を遥かに上回る「メインメモリ不足による低速化」をまねくことになります。

ただ、実際の閲覧で、キャッシュがどれくらい有効なのかはわかりません。
昨今だと、すぐ使いそうなものはメインメモリをキャッシュに使って、ファイルにはすぐには書かなかったりもします。
見るたびに変化するようなサイトだと、キャッシュが無効に設定されているかもしれません。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

QグラフィックボードとRAMサイズ

お世話になります。
DELL T3500を購入しました。4GbyteのRAMです。標準のグラフィックボードのオンボードメモリが512Mbyteあります。WindowsXP 32ビットを選択したところ、マイコンピュータの右クリック プロパティー で表示されます、システムのプロパティーでのRAMのサイズが、約2.5Gbyteほどになりました。
DELL T3400の時にも、RAMサイズは少なく表示されていましたが、ここまで少なくはなく、約3Gbyteでした。こちらのボードは、256Mbyteのオンボードメモリです。
DELLサポートでは、「仕様です。」とのこと。「表示だけで、実RAMサイズは4Gbyteあるので、問題はありません。」とのことでした。
ところが、アプリケーションがOSも含め使えるメモリも、実際この表示サイズしかありません。
「グラフィックボードのRAMが、画面の表示切り替えを実行する際に、本体のRAMを使うために、OSが使えないRAM領域を強制的に確保している」とも聞いたのですが、この件について、解説のあるリンク等あれば、ご紹介いただければ幸いです。

追記:
画像処理のライブラリを使用しています。ライブラリがOSを排他制御できるRAM領域が別に512Mbyteあります。従って、いずれのパソコンでも実際の稼動では、2Gbyte前後のRAMしか、OSとアプリケーションは使うことが出来ていません。ただし、ディスクスワップなどの現象は起きていません。LAN接続、その他常駐ソフトは一切なく、OSのアップデートもSP3までです。自作の画像処理ソフトと、画像の閲覧のためのエクスプローラー、画像圧縮ソフト(自作)などわずかなプログラムが動作している程度で、通常のRAM使用量は500~600Mbyteに押さえ込まれています。

従って、実害は今のところありません。

よろしくお願いいたします。

お世話になります。
DELL T3500を購入しました。4GbyteのRAMです。標準のグラフィックボードのオンボードメモリが512Mbyteあります。WindowsXP 32ビットを選択したところ、マイコンピュータの右クリック プロパティー で表示されます、システムのプロパティーでのRAMのサイズが、約2.5Gbyteほどになりました。
DELL T3400の時にも、RAMサイズは少なく表示されていましたが、ここまで少なくはなく、約3Gbyteでした。こちらのボードは、256Mbyteのオンボードメモリです。
DELLサポートでは、「仕様...続きを読む

Aベストアンサー

WinXP32bitはメモリを3.25GBまでしか認識する事が出来ません。
グラフィックを表示するにはRAM領域が必要となり、
本来システムとして使われているRAMからグラフィックに割り当てます。
※別でグラフィックが備わっている場合、全てシステムへ回ります。
 GeforceやRadeonなど

よってT3500の場合はグラフィックに0.5GB(512MB)割り当てられ、
残りが2.7GB≒2.5GBとなります。

T3400の場合は3.2GBからグラフィックに0.2GB割り当てられ、
残りが3.0GBとなります。

Qint型からchar型への変換

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

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

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

Qlone star state

どうしてテキサス州は lone star stateと言われるのですか。
よろしくお願いします。

Aベストアンサー

仕事で使っている教材にテキサス州に関するエッセイがあったのを思い出しながら回答しています。

テキサスは,合計6つの国に支配された歴史があり,メキシコから独立する際,未来を願って,大きな星の旗を掲げた。
それが今の州の旗の一つの星に現れている。

この州旗にある一つの星から lone star state「一つ星の州」と呼ばれている。

独立国だったテキサスが,条約によってアメリカに併合した。
州の中で唯一,領土割譲でなく,条約によって合衆国に加盟した。
唯一,州旗を合衆国旗(星条旗)と同じ高さに掲げることができる。

合法的に,望めば合衆国から離脱することができる。

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...続きを読む

QDVD-RAMとDVD-ROMの違い

PCを買い換えて中身をチェックしたらDVD-ROMがあるのにDVD-RAMが入っていません。ROMとRAMはどう違うのでしょうか?また、ROMだけでDVDへの書きこみ等はできるのでしょうか?

Aベストアンサー

DVD-RAM対応のPCを購入されたのでしょうかね?

DVD-RAMとは、東芝、松下、日立が開発したDVDの書き込み規格です。最初に規格された書き込み規格となります。ランダム書き込みを前提に作られたメディアで、WindowsXPパソコンでは、特に専用ソフトなしに読み書きができます。自動で、書き込めるディスクとして認識されるのです。


DVD-ROMは、DVD規格の原形です。読み出し規格でDVDの中でも最初に策定された規格です。DVD-VideoやDVD-Audioなどのセルビデオ、セル音楽のディスクが有名。これらを再生できる機器がDVD-ROMドライブで、DVD-ROM規格と呼ばれる規格に沿っています。

DVDには、1度だけ書き込みが可能なDVD-R。
書き換えが可能な、DVD-RWもあります。

パソコンのマイコンピュータ上では、DVD-R/RWドライブはDVD-ROMドライブとして認識します。
DVD-RAM対応のドライブは、DVD-RAMドライブとして認識します。


他にも次世代メディアであるHD DVD-ROM、HD DVD-ARW(Version1規格が最近発行された)などもまもなく登場予定。(来年の中旬頃)

ちなみに、DVD+RとDVD+RWというメディアがありますが、DVD規格には属しません。DVD互換の書き込みが出来るメディアとなります。

DVD-RAM対応のPCを購入されたのでしょうかね?

DVD-RAMとは、東芝、松下、日立が開発したDVDの書き込み規格です。最初に規格された書き込み規格となります。ランダム書き込みを前提に作られたメディアで、WindowsXPパソコンでは、特に専用ソフトなしに読み書きができます。自動で、書き込めるディスクとして認識されるのです。


DVD-ROMは、DVD規格の原形です。読み出し規格でDVDの中でも最初に策定された規格です。DVD-VideoやDVD-Audioなどのセルビデオ、セル音楽のディスクが有名。これらを再生できる機...続きを読む

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最近流行っているRAMDISKについて

お世話になります。
最近、32bitOSにおいて4GB以上認識されないメモリをRAMDISKとして活用する方法が流行っているようですが、
自分のPCは2GBしかないんですが、この場合RAMDISKを作ることにあまり意味はないんでしょうか?

普段コミットチャージは多い時で700~800MB使用している状態です。

Aベストアンサー

XPで作成するなら500~800M位のRAMDISKを
作成することになるかと思いますが、
その容量で使用したいソフトやゲーム、一時ファイルが
あるかどうかになるかと思います。

ソフトであれば重たいソフトが早く起動し、
ゲームであればロード時間が大幅に短縮されます。
ファイルを解凍する際や、インターネット、動画のエンコードの
一時ファイル作成場所をRAMDISKにすると多少処理が早くなります。

しかし、特に上記に当てはまる物がない場合は
CPU使用率も上がってしまいますので、作らない方が良いです。
一時ファイルだけでしたらフォトショップなどの一時ファイルでは
効果はありますが他は微妙なところです。

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

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

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

このQ&Aを見た人が検索しているワード


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

人気Q&Aランキング