SystemC言語の文法についての質問

このQ&Aのポイント
  • SystemC言語の文法について質問です。ビット宣言変数のアドレスを関数に渡してエラーが発生してしまいます。Calc_funcの引数の入れ方が駄目なのですが、どうすればいいでしょうか。
  • 質問者はCalc_funcに引数としてポインタを渡す処理を行いましたが、エラーが起きています。型を変えて試してみましたが問題は解決しません。質問者はビット宣言変数のアドレスを関数に渡す方法を探しています。
  • ビット宣言変数のアドレスを関数に渡す処理でエラーが発生しています。どのような引数の入れ方をすると正常に動作するか教えてください。インターネット上でも情報を見つけることができませんでした。
回答を見る
  • ベストアンサー

SystemC言語の文法(関数の引数にポインタ?)

SystemC言語の文法について質問です。 ある雑誌で、ビット宣言変数のアドレスを関数に渡しており、 私も真似て作ってみたのですが、エラーが発生してしまいます。 --- (例) 引数にポインタを入れる処理 // 引数 sc_uint<32> *s の関数 void test::Calc_func( sc_uint<32> *s ) { cout << "s[0] = " << s[0]; // 32bitのデータ出力? } // これがmain文の代わりです void test::A_func(void) { sc_biguint<2048> a; sc_uint<12> i; for( i = 0; i < 2048; i++ ) { a[i] = 0; } Calc_func( &a[0] ); // ←問題! } // Error内容 Calc_funcの引数の入れ方が駄目! --- 色々、Calc_funcへの型を変えてやってみたのですが、 全くびくともしません。 雑誌が間違っている可能性は低いと思いまして、 今回、このような質問をさせていただきました。 インターネット上の情報でも、このような処理を 見つけることができませんでした。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • eon_ion
  • ベストアンサー率30% (7/23)
回答No.2

SystemCに関してよく理解できている訳ではないので、以下は間違っているかも知れませんが、一応、ご参考までに。 sc_biguint<2048> a; これは2048ビット符号無し整数の型宣言なのでaは2048ビットとなりますが、 sc_uint<32> *s では、sは32ビット符号無し整数のポインタです。 &a[0]は上記より2048ビットの数値のポインタなので、32ビットの数値のポインタであるsとは、元々合わないのではないでしょうか? 型変換とは具体的にどの様な事をされたかは分かりませんが、SystemCはハードウエアを記述していますので、ハードウエア、例えば2048ビットのレジスタと32ビットのレジスタが同じ扱いにはならないという意味ではないかなと思います。

darkness22
質問者

お礼

ご回答ありがとうございます。 PCトラブルで確認するのが遅くなってしまいました。 なるほど・・・型違いのエラーであることは承知していたのですが、 2048bit型の"整数の型宣言”というところを改めてご指摘をもらい、 何か道筋が見えたような気がします。 雑誌では、このポインタ関数に関する入力ソースがなかったので、 普通に入れてしまえばよいのかと思いましたが、確かにおかしいです。 結局のところ、この32bit引数の関数にアドレスを入れるためには、 2048bitを32bitに分割しながら代入しなければならないような気がしてきました。 一度試してます。 bit宣言というのに違和感があり、従来のCやC++の考え方ができなくなっていました。 貴重な助言、ありがとうございました。

darkness22
質問者

補足

無事に32bitずつ入力することで、 引数にアドレスを渡すことができました。

その他の回答 (1)

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

SystemCって勝手にC++を拡張しているみたいなんで若干自信がないんですが Cで ポインタ と 配列 と 配列の0番目 と &演算子 というのはどういうことかをもう一度確認したほうがよいと思います。 ほぼCプログラマが最初につまづくところでなおかつCの一番基本なのでしっかり確認してプログラミングに望んでください。

darkness22
質問者

お礼

ご回答ありがとうございます。 PCトラブルで確認するのが遅くなってしまいました。 C言語であれば理解しているのですが、 bit宣言におけるポインタ渡しなんて初めてみたもので。。。

関連するQ&A

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • 関数を引数とする方法?

    いつもお世話になっています。 MFCでプログラムをしています。 今、任意の関数(Func1)を 積分する関数(Func2)を作っています。 現在は、被積分関数の数だけ、 積分関数(Func2)を書いているのですが、 非効率的なので、なるべく汎用性を持たせたいと 考えています。 参考書(新C言語入門シニア編)の該当個所で、 クラスでない通常の関数を引数とする場合は、 うまくいったのですが、 クラスのメンバ関数を引数とした場合、 どうしてもコンパイルエラーが 発生してしまいます。 関数Func、I及びエラーメッセージは大凡次のとおりです。今のところ、引数とする関数(Func1)の引数は、 同一個数としています。 <被積分関数の例> double ClassA::Func1 (double a){ return a * 10; } <積分関数> double ClassA::Func2 (double (*f)(double), double a, double b){ return b * f(a); } void classA::Integration() { ... Func2(Func1,a,b); ... } <エラーメッセージ> classA::Integrationの呼び出し箇所で、 「1番目の引数を double(double)からdouble(__cdecl)(double)に 変換できません」 と出ます。 double(double)の部分は合っているようなのですが、 (__cdecl)の部分が違うということまでは 分かりました。 メンバ関数であることが原因のようなので、 Func2での引数宣言を double ClassA::Func2 (double (ClassA::*f)(double), double a, double b){ return b * f(a); } に変えてみたところ、 引数受け渡しのところはクリアするのですが、 Func2(Func1,a,b); の呼び出し時に、Func2が関数ではないという エラーがでます。 アドバイス又は参考URL等を 教えていただければ助かります。 よろしくお願いします。

  • ラムダ式を関数に渡したいのですが

    Class1からClass2にある関数の引数にラムダ式で関数を渡すようなプログラムを作ろうと思い、以下のようにコードを記述しました。 #include <iostream> class Class1 { int i = 0; void func() { std::cout << "Hello world" << std::endl; } void init() { Class2 *class2 = new Class2(); class2->setFunc([this] { func(); i++; }()); } }; class Class2 { void(*mFunc)(); void runFunc(){ mFunc(); } public: void setFunc(void func()) { mFunc = func; } }; すると class2->setFunc([this] { func(); i++; }()); のところで「型"void"の引数は型"void(*)()"のパラメーターと互換性がありません」というエラーが発生してしまいます。 キャプチャにthisを渡したラムダ式を他のクラスの関数ポインタのような変数に代入させるようにしたいのですがどのように記述したらできますか

  • 2次元配列とポインタの引数受け渡しについて

    2次元配列を関数に渡すときは、引数に渡す2次元配列と同じサイズを指定、もしくは2次元目のサイズのみ合わせて渡す方法がありますが、両方とも違うサイズで同じ関数を使いたいです。 最初は中身が同じで引数で受け取る2次元配列のサイズだけ、それぞれに合わせた引数を持つ関数を2つ作っていたのですが、なんだか冗長な気がしました。 そこで、2次元配列の先頭ポインタとサイズを受け取るようにすればいいのかと思い、テストとして次のプログラムを作成してみました。 #include <stdio.h> void func(unsigned char *a, int y, int x); int main(void) { unsigned char a[10][10]; func(a, 10, 10); printf("%d\n", a[7][4]); return 0; } void func(unsigned char *a, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { *(a + i*y + j) = i * j; } } } もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。 a.c: In function ‘main’: a.c:10: warning: passing argument 1 of ‘func’ from incompatible pointer type a.c:4: note: expected ‘unsigned char *’ but argument is of type ‘unsigned char (*)[10]’ このような書き方はやはりやめたいいのでしょうか。 また、その際はサイズ別に関数を作るしかないのでしょうか。 他にいい方法があれば教えていただけると助かります。

  • 関数ポインタについて

    関数ポインタを使用する際に、 指定する先の関数でデフォルト引数が指定されている場合、 関数ポインタを用いて、その引数を省略して呼び出すことはできるのでしょうか? 以下例とします。 void function(int a = 10){}; typedef void (*test)(int a); test a = &function; a(); //このように呼び出したい

  • ポインタのポインタが引数にある関数の使い方。

    ポインタのポインタが引数にある関数の使い方。 現在、このポインタのポインタが引数にある関数の動きがわからず困っています。 int test(int ** head) { int * pTail = (int *)*head; pTail = pTail + 1; } もし、この関数を呼び出して使用した場合どのような動きをするのでしょうか? int * comm_msg; これをグローバルポインタ変数として宣言させて、 test((void **)&comm_msg); このように呼び出したとした場合とさせていただきます。

  • 可変長引数をもつオーバライド関数について

    オーバライド関数について質問があります。 以下のようなクラスAとBがあります。 クラスAは基本クラスです。 クラスBはクラスAから導出しました。 ------------------------------------ CLASS A { public: virtual void func(char* p, ...); } ------------------------------------ CLASS B : public A { public: void func(char* p, ...); } ------------------------------------ メンバ関数の func() はオーバライド関数で、可変長の引数を持っています。 今、クラスBの func() の中で、クラスAの func() をコールするようにコーディングしました。 ----------------------------------- void B::func(char* p, ...) { : : A::func( ???? ) : : } ----------------------------------- ところが、クラスBの func()が受け取った引数を、そのままクラスAの func() に渡したいのですが、どうしたらいいのか分かりません。これって無理でしょうか? 教えて下さい。

  • VBで、関数を関数の引数にするは?

    VBで関数の引数に、関数を呼ぶにはどのようにすればいいでしょうか?  例えば以下のようなイメージです   DEF FUNC1(X)=X^2   DEF FUNC2(F,a,b)=F(a)+F(b)     関数FUNC2では、関数Fを引数にする     つまりFUNC2(FUNC1,1,2)は     FUNC1(1)+FUNC1(2)=1^2+2^2=5 こんな感じです。 お教えください。

  • 2次元配列を引数とする関数について

    2次元配列を引数とする関数について 私は今、2次元配列を引数とする関数の表を作るという課題に取り組んでいます。 条件として、int a[数字][数字]={{1,2,3...}}という配列の宣言と同時の初期化は使わず、 関数内で表の値を代入し、値を表示する関数を作り、事実上二つの関数を作るというものです。 私は以下のようなプログラムを作り、動かしましたが、[数字][数字]=********のような本来 あるべき実行結果とは異なる数字の羅列が出てきてしまいました。 ↓ #include <stdio.h> void func(int a[][6]); void fund(int b[4][6]); void main(void) { int a[4][6]; fund(a); func(a); } void func(int a[][6]) { int i,j,b[4][6]; fund(b); for(i=0;i<4;i++)        { for(j=0;j<6;j++) { printf("a[%d][%d]=%d\n",i,j,a[i][j]); printf("\n"); } } } void fund(int b[4][6]) { int i,j; for(i=0;i<4;i++) { for(j=0;j<6;j++)          { scanf("b[%d]*[%d]=%d\n",&i,j,b[i][j]); } } } 本来の実行結果 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 紙にも書いて何回も見直しましたが、どこがおかしいのかわかりませんでした。 どうすれば良いのでしょうか? 何か良いアドバイスをよろしくお願いします。

  • メンバー関数ポインタ

    非常に基礎的なことで申し訳ないですが。 クラスのメンバー関数へのポインタ変数へ 代入しようとすると 関数呼び出しには引数リストがありません。 とエラーがでます。 何がわるいでしょうか? 以下のような感じのコードです。 void (classname::*P_func)() = classname::func; 定義しただけと思いますが。。 VCです。 よろしくお願いします。

専門家に質問してみよう