• ベストアンサー

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

いつもお世話になってます。 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"を確認したところ、正常に値が取得できているのですが、メイン関数では取得できていません。 どうかアドバイスをよろしくお願いします。

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

  • ベストアンサー
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.5

#4です サンプルに間違い… m(__)m getdata(&exp.getdata[i].num, &exp.getdata[i].data); でなく getdata(&exp.getdata[i].num, exp.getdata[i].data); にしてください

その他の回答 (4)

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.4

動かないコードを掲示してアドバイスを求められてもねえ。 とりあえずサンプル 関数の引数で値を戻すには、ポインタにする必要があります。 C++なら、参照型が使えますけどね、、 /* 構造体宣言 */ typedef struct EXP1 {  char sTime[17]; /* 開始日時 */  struct _tagdata {   int num; /* データ数 */   float data[96]; /* データ */  } getdata[5]; } EXP1; void getdata(int *num, float *pdata) {  if ( NULL == num ) return;  if ( NULL == pdata ) return;    *num = 3;  pdata[0] = 1.0f;  pdata[1] = 2.0f;  pdata[2] = 3.0f; } void main(void) {  int i;  EXP1 exp = {0};  for ( i = 0; i < 5; i++ )  {   getdata(&exp.getdata[i].num, &exp.getdata[i].data);   // exp.getdata[i].numが3になっているはず  } }

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

提示されたソースをそのままコンパイルしたところ、 >int func1( ここに引数の並びがないことによるエラーが頻発しました。 また、main関数の記述が見あたりません。 さらに、 >if( ans = 0 ){ ansにゼロを「代入」していますが、いいのですか? というわけで、質問者さんのところで実行できているという プログラムのもとになっているソースをあますところなく提示してください。

agl
質問者

お礼

すみません。 こちらの事情でソース全てを公開することができません。 なので、質問したかった箇所のみを抜粋する形になってしまいました。

  • shinh
  • ベストアンサー率39% (363/926)
回答No.2

#1です。 訂正 float の ポインターのポインターを渡すなら  誤り float の ポインターを渡すなら          正

agl
質問者

お礼

ありがとうございました。 ポインターを渡したかったので、インデックスを追加したら 上手く処理できました。

  • shinh
  • ベストアンサー率39% (363/926)
回答No.1

float の ポインターのポインターを渡してしまっている。 >ans = funcGet( array1, &ex1.getdata[loop].data );                    ↑ float の ポインターのポインターを渡すなら   ex1.getdata[loop].data   & を付けたいなら   &ex1.getdata[loop].data[0] とする。

関連するQ&A