2016-12-09 1 views
4

私はint numbers [5]のような配列を持っていて、数値に数値[0] = 1または数値[3] = 4を割り当てることができます。言ってsomeNumberを割り当てる構造体とそれらに値を渡す

struct structName 
{ 
    int number0; 
    int number1; 
    int number2; 
}; 

次のような何かを行うにはどのような方法がある(これは、コードを動作していないに注意してください)

int main(void) 
{ 
    struct structName name; //how could i declare this to do the following 
    for(int i = 0; i < 2; i++) 
    { 
     name[i] = i; //maybe name.[i] 
    } 
} 

ので、名前を書くための方法がある[変数] = someNumber number0(変数が0の場合)またはnumber2(変数が2の場合)。 iveは日を探していて、これを行うものを見つけることはできません。

+1

の場合、 'struct structName {int num [3]; }; ''次に ''名前。 – BLUEPIXY

+2

http://ideone.com/x1pz4Z – BLUEPIXY

答えて

5

ないような何かを行うにはどのような方法がある(多分私はちょうどを探すために何を知っていない)、インデックスにより構造体のフィールドにアクセスする方法はありません。あなたは、インデックスによって値にアクセスする代わりに、配列を使用したい場合は、それが構造に埋め込まれていた場合でも、

struct structName name; 
name.number0 = someNumber; 
name.number1 = someOtherNumber; 

:次に

struct structName 
{ 
    int numbers[3]; 
    // other fields here 
}; 

あなたが言うことができますが、代わりにフィールドの名前を使用します:

struct structName name; 
for (int i = 0; i <= 2, i++) { 
    name.numbers[i] = i; 
} 
1

はい、奇妙で賢明でないメモリ操作があります。配列を使う方がはるかに優れています。

struct structName 
{ 
    int numbers[3]; 
}; 

int main(void) 
{ 
    struct structName name; 
    for(int i = 0; i <= 2; i++) 
    { 
     name.numbers[i] = i; 
    } 
} 

はまた、あなたがあなたのforループとoff-by-oneエラーにいくつかの構文エラーがあったことに注意してください。

4

インデックスを使用してフィールドにアクセスできるswitch文を使用する関数を記述できます。次のようなものがあります。

#include<stdio.h> 

struct structName{ 
    int number0; 
    int number1; 
    int number2; 
}; 

void assign(struct structName * name, int i, int j){ 
    switch(i){ 
     case 0: 
      name->number0 = j; 
      break; 
     case 1: 
      name->number1 = j; 
      break; 
     case 2: 
      name->number2 = j; 
      break; 
    } 
} 

int main(void){ 
    int i; 
    struct structName name; 
    for(i = 0; i <= 2; i++){ 
     assign(&name,i,i); 
    } 
    //test: 
    printf("%d\n",name.number0); 
    printf("%d\n",name.number1); 
    printf("%d\n",name.number2); 
    return 0; 
} 

(期待どおりに0,1,2を出力します)。

言うまでもなく問題の構造体は、既にAPIの一部またはすでに一部として定義されていない限り(単なる配列であるフィールドを有するのとは対照的に)これを行うに多くのポイントがない、と言って容易にリファクタリングされないコードベース。引数付き

+0

@BLUEPIXYは元の質問へのコメントのリンクの背後にあるOP問題のマクロ解を隠していたことを指摘しておく価値があります。 –

-1

マクロだから名前(1)(2)2のようになってしまう1名になる

#define name(x) x 

を動作するはずです。

+1

このマクロを使用してOPの 'struct'の' number2'フィールドに値を割り当てる方法を正確に提案しますか? –

-1

Cでは、スプーンはありません。今

struct structName name; 
int *idx = &name; // First we need a memory address to the struct 
for (int i = 0; i < sizeof(name)/sizeof(*idx); ++i) { 
    // idx[i] == name.numberX 
    idx[i] = i; 
} 

あなたがname.number0の値をチェックすると、name.number1、name.number2あなたは彼らが正しい値が含まれて表示されます。

これは構造体を使用するのには良い方法ではありませんが、一番上の応答が不可能であると主張した後、私は答えを求められました。

+1

この解決策はうまくいかないかもしれません - 'struct'にはあなたが考慮していないパディングが入っているかもしれません。これは実装依存の詳細です。 –

+0

構造体はパディングを含まない3つの整数のみです。索引が慎重に管理されている限り、常に索引によって構造体データにアクセスできます。ちょうど、この場合、整数のサイズで反復するのが最良でした。 – interputed

関連する問題