typedefを組み込んだ関数の遣い方がわからない

[戻る]
ちゃまいえ 2014/06/15(日) 19:04:15
お世話になっております。
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);
などとすると、//の箇所でエラーが出るし。。。
どのようにすればよいでしょうか?

επιστημη 2014/06/15(日) 19:11:59
> void _awgn();
>  _awgn(3, 1.7);
> などとすると、//の箇所でエラーが出るし。。。

void _awgn(SEQ_SIG n, double Pn);
SEQ_SIG s;
// sのナカミを埋める。[*]
_awgn(s, 1.7);

でしょうね。[*]の部分は SEQ_SIG が示されてないのでわからんです。

ちゃまいえ 2014/06/15(日) 19:38:56
επιστημη様

さっそくのお返事、ありがとうございます。
SEQ_SIG自身を書き忘れました。
SEQ_SIGは、
typedef struct
{
    COMPLEX *sig;
    unsigned int len;
}SEQ_SIG;
です。

επιστημη 2014/06/15(日) 20:21:03
今度は COMPLEX のナカミがわからんので以下同文

ちゃまいえ 2014/06/15(日) 20:37:13
επιστημηさん
申し訳ありません。
COMPLEXは下記です。
typedef struct
{
    double I;
    double Q;
}COMPLEX;

 そうなると、関数_awgnが、SEQ_SIGを参照し、
SEQ_SIGは、COMPLEXを参照し、
となっていくと思うのですが、
こう言った時は、具体的に、どのような組み方をすればいいのでしょうか?
typedefそのものが、今まで使ったことが無かったので、
基礎的な質問で、申し訳ありません。

επιστημη 2014/06/15(日) 21:24:23
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;

こんなカンジでしょね。

επιστημη 2014/06/16(月) 05:24:21
...おっと、Cなのか。

new COMPLEX[n] → (COMPLEX*)malloc(sizeof(COMPLEX)*n);
delete[] s.sig → free(s.sig)

tetrapod 2014/06/16(月) 17:36:42
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 で行うとい
い。

余談
アンダースコアで始まる名前は言語規格書が「コンパイラ・ライブラリメーカ用」の名前
としているので
自作プログラムでそういう名前を使うのは避けたほうがいい。

ホウジョウウサギ 2014/06/17(火) 09:51:26
>typedefそのものが、今まで使ったことが無かったので、

ならば

typedef struct{ ... }SEQ_SIG;
typedef struct{ ... }COMPLEX;

が,それぞれ

typedef struct SEG_SIG{ ... };
typedef strcut COMPLEX{ ... };

とされているとしたら,特に問題ないということでしょうか?
(後者側な場合と同じように書けば良いと思いますよ.)

ちゃまいえ 2014/06/17(火) 23:37:24
みなさん
ありがとうございます。
ただ、ご指摘にもとづいて、
下記のようにやると、
このようなコンパイルエラーが出るのですが、
単純なところで、間違っているのでしょうか?
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' の前に必要です。

επιστημη 2014/06/18(水) 05:13:39
void _awgn(SEQ_SIG n, double Pn);

を宣言した時点で SEQ_SIG の型が不明なんじゃないかな。
適切な #include なり、typedef struct ... SEQ_SIG; なりが必要かと。

古いスレッドには追加発言できません。