• ベストアンサー

構造体の使い方

構造体が定義されている場所では、 struct runqueue{ task_t としかないのに、実際の関数の部分では task_t *p = current というように、変数として宣言されている部分があるのですが、これにはどういった意味があるのでしょうか?

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

  • ベストアンサー
  • chipizou
  • ベストアンサー率44% (8/18)
回答No.1

普通の変数宣言だと思います。 構造体の変数宣言なのに、structがどうしてないのかという質問でしたら、どこかで、構造体がtypedefされているからだと思います。

その他の回答 (5)

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

なんとなく、インクルードしているヘッダファイルに  typedef struct task task_t; のような宣言がありそうな気がします。 もちろん、構造体定義の本体もどこかにいるんでしょうけど。。。  struct task {   …(いろんな型の変数 (⇒メンバ) の定義)…  }; # 当然ですが、この例は task_t が struct task の typedef # であった場合です。。。念のため。。。 grep 等で、探してみてはいかがでしょうか。 あ、そうか…。 定義本体の方は、ライブラリの中とかに入っちゃっていたら見つからないのか。。。 …ま、そんなこともあるかもしれません。 少なくとも、  typedef struct task task_t; のような宣言はどこかにいるはずです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

Cじゃ無くてC++なのでは?

回答No.4

ANo.3さんの書いておられるとおり task_tは別の場所でtypedefされているのでしょう。 たぶん、 struct task_struct { いろいろ定義 }; typedef struct task_struct task_t; というのがどこかにあると思います。。

  • ryuta_mo
  • ベストアンサー率30% (109/354)
回答No.3

べつのところでtask_t型が定義されてるんじゃないんですか?

回答No.2

これだけではよく分かりませんので定義部分を全部書いてもらえませんか。 もし、typedef struct runqueue {構造体の内容定義} task_t; であれば、task_t型を定義しているので、pはtask_t型(struct runqueue)へのポインタの変数ですが。。。

iwaryou
質問者

補足

夜遅くの回答ありがとうございます。 typedef struct runqueue runqueue_t; struct prio_array { int nr_active; unsigned long bitmap[BITMAP_SIZE]; list_t queue[MAX_PRIO]; }; struct runqueue { spinlock_t lock; unsigned long nr_running, nr_switches, expired_timestamp; signed long nr_uninterruptible; task_t *curr, *idle; prio_array_t *active, *expired, arrays[2]; int prev_nr_running[NR_CPUS]; task_t *migration_thread; list_t migration_queue; } ____cacheline_aligned; と言う風に定義されているのですが、

関連するQ&A

  • 構造体について

    linuxのソースコードを呼んでいる者ですが、構造体について、実際に使う方法が分かりません。 ソースコードを少し書き換えて改良したいのですが、構造体が定義されているので、それをそのまま引用しないといけないので分からなくなってしまいました。 例えば、それぞれの関数のなかで最初の変数宣言の部分にstructが付いているものもあれば、付いていないものもあります。 この差はなんなのでしょうか?

  • 構造体と構造体型の変数宣言箇所

    はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。  ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?

  • C言語の構造体

    組込み系でマイコンにソフトをプログラミングの仕事をしています。 C言語は初心者です。 http://www9.plala.or.jp/sgwr-t/c/sec15.html のページの冒頭に、 「構造体は幾つかの異なる型のデータをまとめて 1つのデータ型として扱うものなのです。」と書かれています。 1つのデータ型として扱うとどのようなメリットがあるのでしょうか? 例えば、 struct seiseki seito1; のように対象が1つ(seito1)なら int seito1_no; char  seito1_name[20]; double seito1_average; と変数を確保すれば済むのに、 何故、構造体で宣言するのでしょうか? 例えば、 struct seiseki seito2[20]; のように、似たものが複数ある場合は(seito2が20人分なるなら、) 構造体で宣言する意味があるとはなんとなくわかります。 後ページの http://www9.plala.or.jp/sgwr-t/c/sec15-4.html では、関数でのやり取りが書かれています。 関数で引数や返値で扱うときに構造体にしておいた方が良いからでしょうか? 構造体のメリットというのが今一わかりません。 対象が1つでも構造体で書いた方がいろんな意味で良いのでしょうか? 如何せん、初心者なので質問がうまく書けませんがご了承ください。 ※上から目線的な回答はご遠慮願います。

  • 構造体でデータをやり取り出来ないか

     みなさん、こんにちは。質問させて頂きます。  関数に変数を渡すとき、変数のポインタを渡す方法が有ります。  この方法なら呼ばれた関数が、呼び出した関数の変数を直接操作出来ます。  これを構造体で出来ないでしょうか。  下記のプログラムで実験しました。(2)の所を色々と書き換えて試したのですが、エラーになります。  (1)は、エラーになりません。エラーで無く(2)の様に使えなければ、(1)の p はどのような使い道が有るのでしょう。 /*-----------------------------*/ struct Par { long a ; } ; /*-----------------------------*/ void sub1( struct Par *p )  ・・・(1) エラーにならない { p.a = 2 ;   ・・・(2) 色々変えて試しても、エラーになる }

  • 構造体の宣言

    下記のように構造体の宣言をした所、 struct B_PARAM test; 「`test' の領域サイズがわかりません」というエラーになってしまいました。この構造体を宣言し、値を入れていこうとしています。 ヘッダファイルに構造体の形は定義してあるのですが、 構造体の中に構造体があるからでしょうか? またこの構造体を正しく宣言するにはどうすればいいのでしょうか?

  • 構造体のアドレス渡し

    構造体をmain()からアドレス渡しで別関数(test.cpp)に渡し、その関数の中だけでの別関数test1()にその構造体を、値渡しでもアドレス渡しでも、渡せるのでしょうか? ちなみにmain.cppと、test.cppと、myhead.hとして分割コンパイルでやりました。 /*---------main.cpp--------*/ //ヘッダファイルで構造体宣言、test()のプロトタイプ宣言済み void main() { struct data dt[10]; ・・・・・・ test(dt); //test.cppのtest関数に構造体を渡す。 } /*---------test.cpp---------*/ void test1(??????); //test1()のプロトタイプ宣言 void test(struct data *p) //構造体をアドレス渡しで受け取った { ・・・・・ test1(?????); //test.cppで宣言したtest1関数に構造体を渡したい } どうかよろしくお願いします。

  • pthread_createでタスクの構造体にて

    pthread_createという関数でeventというスレッドタスクを作成したく、次のように宣言しました。 if(pthread_create(&thread03 , NULL , thread_func03 ,(void*)&pth) !=0) perror("pthread_create()"); ちなみに、pth_argは次のような構造です。 typedef struct{ char *c; int i; long l; }pth_arg; /* thread_func関数に値を渡すときの構造体 */ 実際のタスク void *event(void *param) { pth_arg *this_arg; this_arg = param; -----(中略)------------------------- } このような形ビルドも正常に完了し、this_argの構造をそのままこのタスク内で使用することも可能なのですが、その後に typedef struct{ char *c; int i; long l; }env_t; /* 次のような構造体もこのタスク内に追加したくなり、 実際のタスク env_t * pEnv; //グローバル宣言 void *event(void *param) { pth_arg *this_arg; this_arg = param; pEnv->i = 0x01; -----(中略)------------------------- } このように、env_t * pEnv;でグローバル宣言で宣言して 値を代入するようなコードを書くと、ビルドはOKなのですが、実行すると Segmentation fault (core dumped) このエラーが出てきて動作が停止してしまいます。 これを解決方法などありませんでしょうか? どうぞ、ご教示頂きますようお願い致します。

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 構造体について

    私は今プログラミング(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; これらがそれぞれどのような意味があるのでしょうか。 これらでわかることがあればぜひ教えてください。よろしくお願いいたします。

  • 構造体の纏め方

    関数のポインタを使用して、 /* プロトタイプ宣言 */ void func1 ( void ); void func2 ( void ); void func3 ( void ); /*******************/ /* プロトタイプ纏める */ void ( *funcs[] ) ( void ) = { func1, func2, func3 }; /*********************/ と言うのが、構造体でも出来ないでしょうか?と言うのが質問です。 変数(添字)によって、見るべき構造体を自由に変更させたいと言うのが主な使用方法です。 typedef struct _tag { int arg1; int arg2; } tag; tag watch1 , watch2 , watch3; とある変数が1なら、watch1、とある変数が2なら、watch2、とある変数が3なら、watch3を見ると言うようなプログラムにしたくて、質問しました。 witch文を使うしかないのでしょうか? 良き回答、お待ちしています。