typedefを組み込んだ関数の遣い方がわからない – プログラミング – Home

typedefを組み込んだ関数の遣い方...
 
通知
すべてクリア

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


ちゃまいえ
 ちゃまいえ
(@ちゃまいえ)
ゲスト
結合: 19年前
投稿: 33
Topic starter  

お世話になっております。
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);
などとすると、//の箇所でエラーが出るし。。。
どのようにすればよいでしょうか?


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> void _awgn();
> _awgn(3, 1.7);
> などとすると、//の箇所でエラーが出るし。。。

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

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


返信引用
ちゃまいえ
 ちゃまいえ
(@ちゃまいえ)
ゲスト
結合: 19年前
投稿: 33
Topic starter  

επιστημη様

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

今度は COMPLEX のナカミがわからんので以下同文


返信引用
ちゃまいえ
 ちゃまいえ
(@ちゃまいえ)
ゲスト
結合: 19年前
投稿: 33
Topic starter  

επιστημηさん
申し訳ありません。
COMPLEXは下記です。
typedef struct
{
double I;
double Q;
}COMPLEX;

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

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;

こんなカンジでしょね。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

...おっと、Cなのか。

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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 で行うとい
い。

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


返信引用
ホウジョウウサギ
 ホウジョウウサギ
(@ホウジョウウサギ)
ゲスト
結合: 18年前
投稿: 73
 

>typedefそのものが、今まで使ったことが無かったので、

ならば

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

が,それぞれ

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

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


返信引用
ちゃまいえ
 ちゃまいえ
(@ちゃまいえ)
ゲスト
結合: 19年前
投稿: 33
Topic starter  

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

void _awgn(SEQ_SIG n, double Pn);

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました