質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

Q&A

解決済

4回答

4527閲覧

型名が必要(C言語:分割コンパイル)

ISARIA

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

0グッド

0クリップ

投稿2015/11/13 09:24

編集2015/11/13 09:27

分割コンパイルを始めたばかりです
初歩的なミスが出てきて、コンパイルできないので助けてください!

C

1/* dft.h */ 2#include<stdio.h> 3#include<math.h> 4#include"dft.h" 5#include"complex.h" 6 7#define PI 2.0*asin(1.0) 8 9 10void clear_array(double x[], int n) //要素数nの配列xに,すべて0を代入する(初期化) 11{ 12 for(int i=0;i<n;i++){ 13 x[i] = 0.0; 14 } 15} 16 17void square_wave(double x[], int n) //要素数nの配列xに,任意の周波数の矩形波を書き込む.振幅は任意,例えば-1から1など 18{ 19 const int f=5; //周波数 20 const double A=1.0; //振幅 21 int s=0; 22 for(int i=0;i<n;i++){ 23 if((i%(2*f))<f){ 24 s=1; 25 }else{ 26 s=0; 27 } 28 x[i]=A*cos(PI*s); 29 } 30} 31 32void sin_waves(double x[], int n, double f1, double f2, double f3) 33{ 34 for(int i=0;i<n;i++){ 35 x[i] = 2.0* sin(1.0*PI*i/n*f1) + 0.8*cos(2.0*PI*i/n*f2) + 0.7*sin(2*PI*i/n*f3); 36 } 37} 38 39void dft(const double in[], Complex out[], const int N) 40// 41// 離散フーリエ変換(DFT) 42// 元データは実数,変換後は複素数 43// 44// in : 元データ.これは変更しない.実数の配列. 45// out : 計算結果.こちらは複素数. 46// N : データ個数.inもoutも同じデータ数でなければならない 47// 48{ 49 int t; 50 /* 出力用の配列を初期化 */ 51 for(t=0; t<N; t++) { 52 out[t].re = 0.0; 53 out[t].im = 0.0; 54 } 55 56 for(int f=0; f<N; f++){ 57 // 以下のループで 1個のF[omega]を計算する. 58 double omega = 2 * PI * f; 59 for(t=0; t<N; t++) { 60 /* 積分の中身の計算 */ 61 out[f] = Cadd(out[f], Cmul( ToComplex(in[t], 0.0), Cexp( ToComplex(0.0, -omega * t/N) ))); 62 } 63 } 64} 65

C

1 /* dft.h */ 2void clear_array(double x[], int n); 3void square_wave(double x[], int n); 4void sin_waves(double x[], int n, double f1, double f2, double f3); 5void dft(const double in[], Complex out[], const int N); //問題の4行目です。 6

この状態でmakefileのためのにobjファイルを作るための分割コンパイルを行ったのですが、コマンドプロンプトにおいて、以下のようなエラーが出ました。

C

1C:\Users\TaKe\Desktop\情報処理\1年後期\授業8回目>bcc32 08-1.cpp complex.cpp dft.cpp 2Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 308-1.cpp: 4警告 W8004 08-1.cpp 9: 'fp' に代入した値は使われていない(関数 main() 5) 6complex.cpp: 7dft.cpp: 8エラー E2303 dft.h 4: 型名が必要 9*** 1 errors in Compile *** 10

どこが間違っているのか教えてください。
分割コンパイルを行う場合、普段とは違う決まりなどがあるのでしょうか?
また、今回makeする為の.objを作るための分割コンパイルですが、.objを簡単に作る方法?などはありますか?

以上の3点についてよろしくお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

**すみません、本題とはまったく関係ないのですけど、**本題のの回答は他の方に任せるとして、

#define PI 2.0*asin(1.0)

の部分は、かなり危険と思います。たまたま参照部分に問題となるパターンが無いだけで、式の書き方によっては(たとえば qpi = 4.0 / PI とか)、悲惨な事になりかねません。

C

1#define PI (2.0*asin(1.0))

とした方が良いと思います。

投稿2015/11/13 10:04

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/11/16 03:39

ありがとうございます。 ()、これからつけていくようにしていきます!
guest

0

・Cは後方参照ができません。
#includeはそこにファイルの中身をコピペするのとほぼ同じです。

C

1#include"dft.h" 2#include"complex.h"

この順番だとdft.hで#include"complex.h"していないので
Complexの定義が後になってしまいますね

だからエラーになります。

順番を逆にすればひとまず直りますが、include順番をいちいち気にするのはアホらしいので、
きちんとインクルードガードを付けて、
モジュールが使うモジュールはヘッダーでincludeするようにします。

今回の例で言えばdft.h内でcomplex.hをインクルードします。

投稿2015/11/13 09:40

編集2015/11/13 09:53
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/11/16 03:37

ありがとうございます!
guest

0

ベストアンサー

おそらくComplexが宣言されていないのでしょうね。
#include"dft.h"#include"complex.hの後ろに移動すればよろしいのではないでしょうか。

投稿2015/11/13 09:31

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/11/16 03:38

ありがとうございます、includeの宣言の順番にも関係があるんですね。
guest

0

既に他の方が回答されているようにdft.h内でinclude を定義します。

C

1#ifndef _DFT_H_ 2#define _DFT_H_ 1 3#include <complex.h> 4 /* dft.h */ 5void clear_array(double x[], int n); 6void square_wave(double x[], int n); 7void sin_waves(double x[], int n, double f1, double f2, double f3); 8void dft(const double in[], Complex out[], const int N); 9#endif

分割コンパイルの場合、ヘッダーファイルにはこのような形で、定義します。
#pragma once が使える環境ならば、そちらでも良いです。

またincludeファイルを指定する括弧にも意味があります。
complex.hは標準ヘッダーファイルなので、二重引用符ではなく、<>で囲みましょう。

投稿2015/11/15 11:58

shanxia

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問