お世話になっております。
Windows7下の
Visial Studio (.c)で組んでおります。
既存の関数を使おうと思っています。
typedef struct
{
unsigned short int *dat;
unsigned int len;
}SEQ_DATA;
void _awgn(SEQ_SIG n, double Pn)
{
double r, t; unsigned int i;
for(i=0;i<n.len;i++)
{
(n.sig+i)->I = _randN() * sqrt(Pn/2); //
(n.sig+i)->Q = _randN() * sqrt(Pn/2);
}
}
と言うような関数があります。
mainの方で、
この_awgnを使いたいのですが、
このような場合、どのような使い方をすれば、
いいのでしょうか?
void _awgn();
_awgn(3, 1.7);
などとすると、//の箇所でエラーが出るし。。。
どのようにすればよいでしょうか?
> void _awgn();
> _awgn(3, 1.7);
> などとすると、//の箇所でエラーが出るし。。。
void _awgn(SEQ_SIG n, double Pn);
SEQ_SIG s;
// sのナカミを埋める。[*]
_awgn(s, 1.7);
でしょうね。[*]の部分は SEQ_SIG が示されてないのでわからんです。
επιστημη様
さっそくのお返事、ありがとうございます。
SEQ_SIG自身を書き忘れました。
SEQ_SIGは、
typedef struct
{
COMPLEX *sig;
unsigned int len;
}SEQ_SIG;
です。
今度は COMPLEX のナカミがわからんので以下同文
επιστημηさん
申し訳ありません。
COMPLEXは下記です。
typedef struct
{
double I;
double Q;
}COMPLEX;
そうなると、関数_awgnが、SEQ_SIGを参照し、
SEQ_SIGは、COMPLEXを参照し、
となっていくと思うのですが、
こう言った時は、具体的に、どのような組み方をすればいいのでしょうか?
typedefそのものが、今まで使ったことが無かったので、
基礎的な質問で、申し訳ありません。
void _awgn(SEQ_SIG n, double Pn);
SEQ_SIG s;
// sのナカミを埋める。
unsigned int n = 10; // テキトー
s.sig = new COMPLEX[n];
s.len = n;
_awgn(s, 1.7);
...
delete [] s.sig;
こんなカンジでしょね。
...おっと、Cなのか。
new COMPLEX[n] → (COMPLEX*)malloc(sizeof(COMPLEX)*n);
delete[] s.sig → free(s.sig)
C/C++ では
・型を使う前には型の「定義」が必要
・型定義は(複数のソースファイル間で矛盾が無いよう)ヘッダファイルで行うのが原則
・大域変数、関数を使う場合は「宣言」が必要
・大域変数宣言、関数宣言は同上、ヘッダファイル (.h) で行うのが原則
・関数定義は重複しないようソースファイル (.c, .cpp) で行うのが原則
なので
> COMPLEXは下記です。
> typedef struct
> {
> double I;
> double Q;
> }COMPLEX;
こういうのは「ヘッダ」で行う。たとえば mycomplex.h というヘッダファイルを作っ
て、
このヘッダファイルの中で上記「型定義」を行う。
> void _awgn(SEQ_SIG n, double Pn) { ... }
というのは「関数定義」なので、これは awgn.c というソースファイルを作って、
このソースファイル中で上記「関数定義」を行う。
関数定義だけでは他ファイルからこれをつかうのが困難なので
ヘッダファイルとソースファイルはペアで作るのが原則。
先の awgn.c に対応する awgn.h をつくり
extern void _awgn(SEQ_SIG n, double PN); という「関数宣言」を awgn.h で行うとい
い。
余談
アンダースコアで始まる名前は言語規格書が「コンパイラ・ライブラリメーカ用」の名前
としているので
自作プログラムでそういう名前を使うのは避けたほうがいい。
>typedefそのものが、今まで使ったことが無かったので、
ならば
typedef struct{ ... }SEQ_SIG;
typedef struct{ ... }COMPLEX;
が,それぞれ
typedef struct SEG_SIG{ ... };
typedef strcut COMPLEX{ ... };
とされているとしたら,特に問題ないということでしょうか?
(後者側な場合と同じように書けば良いと思いますよ.)
みなさん
ありがとうございます。
ただ、ご指摘にもとづいて、
下記のようにやると、
このようなコンパイルエラーが出るのですが、
単純なところで、間違っているのでしょうか?
main(void)
{
void _awgn(SEQ_SIG n, double Pn);
1>コンパイルしています...
1>QAM_Improvement.c
1>c:\qam_improvement\qam_improvement.c(14) : error C2146: 構文エラー : ')' が、
識別子 'n' の前に必要です。
1>c:\qam_improvement\qam_improvement.c(14) : error C2146: 構文エラー : ';' が、
識別子 'n' の前に必要です。
void _awgn(SEQ_SIG n, double Pn);
を宣言した時点で SEQ_SIG の型が不明なんじゃないかな。
適切な #include なり、typedef struct ... SEQ_SIG; なりが必要かと。