• ベストアンサー

構造体のメンバについて

Linuxのソースを読んでいて分からない箇所があり,投稿させていただきました. 以下のような構造体で struct vr41xx_giuint_cascade { unsigned int flag; int (*get_irq_number)(int irq); }; 2つめの引数はどのような型か分かりません. よろしくお願いします.

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

  • ベストアンサー
  • ency
  • ベストアンサー率39% (93/238)
回答No.2

↓こんな型↓の関数を指すポインタです。 int GetIrqNumber( int Irq ) { …… } 関数を指すポインタなので「関数ポインタ」と呼んだりもします。 要するに、構造体のメンバに関数を設定することができるんです。 こんな感じですね。 struct vr41xx_giuint_cascade Hoge; Hoge.get_irq_number = &GetIrqNumber; で、こんな感じで使います。 int IRQ = 90; (*Hoge.get_irq_number)( IRQ ); 【参考】 関数ポインタは、以下のようにアドレス演算子や間接参照演算子を省略することができます。 Hoge.get_irq_number = GetIrqNumber; // & をとってみた→問題なし。 Hoge.get_irq_number( IRQ ); // * をとってみた→問題なし。

hiroki2005
質問者

お礼

詳細な回答ありがとうございました. 確かにプログラムでは,メンバに代入するときに&を使っていなく役に立ちました.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • skbler
  • ベストアンサー率9% (69/692)
回答No.3

関数ポインタですね。ご質問の事例は、変数のそれと同様、関数にもアドレスがあります。(*get_irq_number)のことを指しておられると思うのですが、型に関しては、intです。 保持するアドレスにある関数は、関数のポインタ宣言と関数プロンプトの宣言とで、引数や戻り値の型・個数が一致している必要があります。アドレスを保持するだけなので、参照先の関数が別に存在することになるかと思われます。

hiroki2005
質問者

お礼

確かにget_irq_number関数はありました.回答ありがとうございます.

全文を見る
すると、全ての回答が全文表示されます。
  • peko_pee
  • ベストアンサー率53% (45/84)
回答No.1

get_irq_number は関数へのポインタです。 int 型の引数をひとつ受け取り int 型の値を返す関数へのポインタ という意味です。 この変数を使って get_irq_number(int型引数); のように関数を呼び出すことが出来ます。

hiroki2005
質問者

お礼

関数のポインタだったんですね.素早い回答ありがとございました.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 構造体について

    私は今プログラミング(C++)を勉強しているのですが、構造体に苦戦しています。分からないことがいくつかあります。もし知っていたらどれでもいいですので、よろしければ教えてください。 1、たとえば構造体を宣言するときに struct abc{ int s; struct abc xx; struct abc yy; }; と宣言するときがあります。でも上記の例と下記の例との違いが分かりません。 struct abc{ int s; struct abc xx; struct abc yy; }abc; 2、たとえばメインの最初にこのように宣言されているとします。 int j, i; struct abc *kk, *nn, *mm; これはここに宣言したものがローカルで、1のときに宣言したものがグローバルと考えていいのでしょうか? 3、メインの中に次のようなプログラムがあったとします。 kk->xx = j; kk->yy = j; nn->yy = NULL; i = kk->xx; i = kk; これらがそれぞれどのような意味があるのでしょうか。 これらでわかることがあればぜひ教えてください。よろしくお願いいたします。

  • 構造体のあるメンバを基準にソートするには?

    以下のように定義した構造体(下の構造体は入れ子になっている)を必要な時に動的に割り当てた後(デー多数は不定)、たとえば、商品価格を基準に降順、昇順に並び替える機能を追加したいのですが、どのように解決したらよろしいでしょうか? /* 現在の日時を格納する構造体 */ typedef struct time_type{ int year; int month; int day; }time_type; /* 商品の情報を格納する構造体 */ typedef struct shohin_type{ int code; /* 商品コード */ int price; /* 商品価格 */ char *name; /* 商品名 */ int flag; /* フラグ */ struct time_type date; /* 登録日 */ struct shohin_type *before; /* 前の構造体のアドレス */ struct shohin_type *next; /* 次の構造体のアドレス */ }shohin_type;

  • 構造体のメンバをfor文で回したい

    次のようなソースで typedef struct test{ int a; int b; int c; }TEST; TEST xx; xx.a=xx.a+3; xx.b=xx.b+3; xx.c=xx.c+3; printf("%d %d %d\n",xx.a,xx.b,xx.c); のようなことをしたいんですが、 xx.a=xx.a+3; xx.b=xx.b+3; xx.c=xx.c+3; の処理の部分をfor文で回せるようにしたいです。 構造体の宣言のところで配列をつかって struct test{ int abc[3]; } とすれば簡単にいくのは分かるんですが、a,b,cそれぞれに分かりやすい名前をつけたいので、配列で確保したくないです。 何かいい方法はないでしょうか? 実際計算に使うんですが、メンバはすべてdouble型で30個程度になると思います。

  • 構造体について

    以下のような構造体の宣言が合ったとき struct list { int a; char b[20]; struct list *next; }; struct list *add_list( int a, char *str, struct list *head );・・・1 struct list *del_list( int a, struct list *head );・・・2 1は引数の数が同じため問題ないのですが、2はどういう意味になるのでしょう?

  • 構造体の配列とメンバの配列

    typedef struct _ex_table1 {   int  x[10];   int  y[10]; }ETable1; ETable1 et1; int ans1; for( int a = 0; a < 10; a++ ){   et1.x[a] = a+10;   et1.y[a] = a*2; } for( int b = 0; b < 10; b++ ){   if( et1.x[b] == 15 ){     ans1 = et1.y[b];     break;   }   else{     ans1 = 0;   } } printf( "%d", ans1 ); ///////////////////////////////// typedef struct _ex_table2 {   int xx;   int yy; }ETable2; ETable2 et2[10]; int ans2; for( int aa = 0; aa < 10; aa++ ){   et2[aa].xx = aa+10;   et2[aa].yy = aa*2; } for( int bb = 0; bb < 10; bb++){   if( et2[bb].xx == 15 ){     ans2 = et2[bb].yy;     break;   }   else   {     ans2 = 0;   } } printf("%d", ans2 ); と言う感じに、微妙にソースを書いてみたのですが、 上のメンバ(x,xx)の値が正しいものがあったら、 対応する下のメンバ(y,yy)を出力したいと思っていますが、 構造体を配列にした場合と、構造体メンバを配列にした場合は どのように違うのでしょうか? 私には、同じように思えてしまいます。 どなたか、利点・欠点など教えていただけませんか? よろしくお願い致します。

  • 構造体を値で渡す良い点はありますか?

    C言語で以下のように引数に値を渡す場合とポインタを渡す場合では、 どんなメリットデメリットはあるのでしょうか? 普段はポインタばかり渡していたので、値を渡す経験がなく疑問に思いました。 構造体を値で渡す良い点はありますか? struct sample { int a; int b; }; void test1(struct sample sa){} void test2(struct sample *sa){}

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • 構造体の配列を関数に渡すには

    構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

このQ&Aのポイント
  • ヤフオクのゆうパック(おてがる版)で複数商品を落札した場合に送料無料にできるか
  • 商品のサイズと送料に関してヤフオクの支払いにどのように反映されるか
回答を見る