構造体の引数について

このQ&Aのポイント
  • 構造体の引数についてのご質問です。YYY[]をmainの上で設定し、sub()関数で値を使いたいのですが、現在の設定ではコンパイルが通りません。どのように修正すればsub()関数で利用できるでしょうか?
  • ご質問内容は、構造体の引数についてです。主に、YYY[]の設定方法とsub()関数での利用方法についてお知りになりたいとのことです。現在の設定ではコンパイルエラーが発生しているようですので、修正方法についてまとめます。
  • 構造体の引数に関するご質問です。YYY[]をmainの上で設定し、sub()関数内で値を使いたいのですが、コンパイルエラーが発生しています。どのようにすればsub()関数でYYYの値を利用することができるでしょうか?以下で修正方法を説明します。
回答を見る
  • ベストアンサー

構造体の引数について

struct XXX { char *aaa; char *bbb; }; static struct XXX YYY[] = { {NULL, "JJJ"}, ... }; 上記のYYY[]をmainの上で設定し、下記のように使いたいです。 sub()関数でYYYの値を見たいのですが、下記の設定ではコンパイルが通りません。 どうしたらsub()関数で使うことができますか? どなたかご教授ください。 main(){ rtn = sub((struct xxx *)YYY); } int sub(struct xxx *YYY[10]){ for(i=0; YYY[i]->bbb[0]; iii++){ ... } ... }

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

  • ベストアンサー
  • sire
  • ベストアンサー率62% (22/35)
回答No.1

struct XXX { char *aaa; char *bbb; }; static struct XXX YYY[] = { {NULL, "JJJ"}, {NULL, "JJJ2"}, }; int sub(struct XXX* YYY); int main(int argc, char* argv[]) { return sub(YYY); } int sub(struct XXX* YYY){ for(int i=0; YYY[i].bbb[0]; i++){ } return 0; } あるいは、 int sub(struct XXX* YYY)のシグニチャーが int sub(struct XXX YYY[])でも。 これで、どうでしょうか?subの中のfor文の条件は考えなければいけませんが。

toritu
質問者

お礼

ありがとうございます!!! このやり方でやらせて頂きます。

関連するQ&A

  • 静的構造体の初期化について

    struct XXX{ MYSQL *MMM; char a[32]; char b[32]; char c[32]; char d[24]; } static struct XXX YYY[] = { {NULL, "AAA", "BBB", "CCC", "DDD"}, {NULL, "AAA", "BBB", "CCC", "DDD"}, {NULL, "", "", "", ""} } main(){ for(i=0; YYY[i].a[0]; i++){ MMM = ... } 上記のように、YYY[]分MMMの値を設定します。 この設定はうまくMMMが取得できるのですが、 実際にはMMMを1つの構造体の中に10個分用意したいです。 つまり、イメージは struct XXX{ MYSQL *MMM[10]; ... } このような形です。 ただし、初期化の仕方がわからずコンパイルが通りません。 またこのようなやり方ができるのかもわかりません。 どなたかご教授ください。 他にいいやり方があるのであればそれも教えて下さい。

  • static変数について

    struct XXX { char *aaa; char *bbb; }; static struct XXX YYY[] = { {NULL, "JJJ"}, ... }; thread(){ ... } 上記のstatic変数をスレッド関数thread()の外部変数として設定した場合、 *aaaの値はスレッドごとには確保することできませんでしょうか。 上書きされてしまうのでしょうか。 やはりスレッドセーフではないのでしょうか。 その際、どのように設定してあげればよいのでしょうか。 どなたかご教授お願いします。

  • ポインタ配列について

    struct AAA{ char *aaa; char *bbb; }; main(){ struct AAA *BBB[36]; ... rtn = sub(BBB); ... rtn = subsub(BBB); } void sub(*BBB[36]){ ... for(i=0; i<3; i++){ BBB[i] = (struct AAA*)malloc(sizeof(struct AAA)); } ... } void subsub(*BBB[36]){ ... for(i=0; i<3; i++){ printf("[%s]\n", BBB[i]->aaa); } ... } このような流れのプログラムを組みたいです。 *BBB[36]に値を設定してその値を使うプログラムです。 "struct AAA"の内容を大量に受信するので*BBB[36]としました。 sub()、subsub()の引数の書き方*BBB[36]はあってますか? またsub()、subsub()関数の引数*BBB[36]は他にもっとシンプルなやり方があると思うのですが。 どなたか教えて下さい。 宜しくお願いします。

  • 構造体の型について

    ある構造体をxxxと名づける以下のプログラムを作成しました。 ーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx aaa; strcpy(aaa.variable,"bbb"); printf("%s\n",aaa.variable); } ーーーーーーーーーーー これは動き、bbbと表示されます。 しかしながら、構造体のポインタを使用した 以下のプログラムではコンパイルはとおりますが実行時にコアダンプして落ち ます。 ーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx* aaa; strcpy(aaa->variable,"bbb"); printf("%s\n",aaa->variable); } ーーーーーーーーーーーーーーーーーーーーーーー 両プログラムの意図はまったく同じなのに何故いけないのでしょうか。

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • 入れ子の構造体について

    例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?

  • 構造体配列ポインタを引数で使うには

    いつもお世話になってます。 C言語を使って、構造体配列を引数として使って、サブ関数で取得した値(配列)をメイン関数に渡したいと思っているのですが、受け渡しが上手くできません。 現在以下の様に組んでいます。 /* 構造体宣言 */ typedef struct EXP1 { char sTime[17]; /* 開始日時 */ struct { int num; /* データ数 */ float data[96]; /* データ */ } getdata[5]; } EXP1 ; /* メイン関数 */ int func1( EXP1 ex1; for( loop = 0 ; loop < 5 ; loop++){ ans = funcGet( array1, &ex1.getdata[loop].data ); } if( ans = 0 ){ for( loop = 0 ; ; loop++){ printf("%f",ex1.data[count].pvdata[loop] ); } } } /* サブ関数 */ static int funcGet(int array, float *fvalue) { ans = calcvalu( array, fvalue ); //←float型で値が取得される。 for( i = 0 ; i < 10 ; i++ ) { printf("%f", *(fvalue + i); } return 0; } サブ関数で"fvalue"を確認したところ、正常に値が取得できているのですが、メイン関数では取得できていません。 どうかアドバイスをよろしくお願いします。

  • 構造体を引数とする関数について

    関数に構造体を渡したいのですが、エラーが出て上手くいきません。 下のプログラムのように組んでいるのですが、どこが問題なのかご教授願いたいです。 もし、下記のプログラムのようなことができないのでしたら、代替案を提示してもらえると助かります。 環境はVC++です。よろしくお願いします。 struct DATA{ int x; char name[32]; }; void info(DATA *status[]); int main(void){ DATA student[3] = { { 1, "佐藤" }, { 2, "高橋" }, { 3, "田中" }, }; info(&student[]); return 0; } void info(DATA *status[]){ for (int i = 0; i < 3; i++){ printf("%d\n%s", status[i]->x, status[i]->name); } }

  • 動的な構造体配列の初期化

    以下のように構造体を new で動的に確保したときに 構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。 何かよい方法がありましたら教えて下さい。お願いいたします。 # 簡単にイメージですが・・・ typedef struct { CString a; CString b; }aaa_t ; struct s_aaa{ char bbb[10]; int ccc; CArray<aaa_t,aaa_t> m_aaaArray ; } s_aaa *StructB; StructB = new s_aaa [10];

  • 構造体 アドレス

    VC++6 こんにちは。構造体のアドレスを文字列ポインタで操作することに悩んでいます。下にソースの一部を書きます。 typedef struct{   char code[100];   int type; }AAA; typedef struct{   double method[4][3];   int area; }BBB; 複数の構造体があり、 BOOL CTestApp::File_Check(){  AAA aaa; ~  db.DB_regi(2, (char *)&aaa); ~ } void CData::DB_regi(int key, char *buff) {  switch(key){ ~  case 2:   sss.push_back(buff);  //vector<char *> sss;   break; } で、データを登録し、 int CTestApp::Data_Check() { ~  AAA aaa;  db.DB_get(2, (char *)&aaa); ~ } void CData::DB_get(int key, char *buff) {  switch(key){ ~  case 2:   buff = sss[i];   break; ~ } で、構造体のアドレスを取得しようと思ったら、取得できませんでした。 //DB_getの中では、aaa = (AAA *)buff;とすれば指定の構造体を取得できる。 DB_get関数をどのようにしたら、Data_Check()で、登録した構造体を取得できるのか教えてください。長くなってすみません。

専門家に質問してみよう