2017-04-08 11 views
3

私は2つの構造体アレイ簡単にアクセス

myStruct leds_left[20]; 
myStruct leds_right[20]; 

を持って、私は同じように使用できるように、私は、2つの構造体を結合する方法が必要になります。

*(structPtr[10]) // points to element of leds_left[10] 
*(structPtr[30]) // points to element of leds_right[10] 

私はすでに試しました以下:

myStruct ** structPtr = (myStruct**) malloc((20 + 20) * sizeof(myStruct*)); 
structPtr[0] = &leds_right[15]; //just with one element for testing 

*(structPtr[0]) = newValue; 

私は間違っていますか?

+0

として動作します。この回答を見てくださいhttp://stackoverflow.com/a/32315939/7255359 –

+0

あなたがすでに持っているコードは、ポインタ40個すべてを割り当てると –

答えて

2

leds_leftleds_rightが本当に連続したメモリに割り当てられることを確認するには、それらを一緒に構造化する必要があります。これはunionとの組み合わせで、あなたが望むものを提供することができます:

のWindows 10(64ビット)上のcygwinでgccでコンパイルおよびテスト
#include <stdio.h> 

typedef struct { int i; /* ... */ } myStruct; 

static union { 
    struct { 
    myStruct leds_left[20]; 
    myStruct leds_right[20]; 
    }; 
    myStruct leds_all[40]; 
} data; 

int main() 
{ 
    for (int i = 0; i < 20; ++i) { 
    data.leds_left[i].i = 1 + i; 
    data.leds_right[i].i = -(1 + i); 
    } 
    for (int i = 0; i < 40; ++i) { 
    printf(" %d", data.leds_all[i].i); 
    } 
    printf("\n"); 
    return 0; 
} 

$ gcc -std=c11 -o test-struct-array test-struct-array.c 

$ ./test-struct-array.exe 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 

$ 

注意を!

実際に含まれているコンポーネント(myStructが実際に含まれているかどうかに応じて)によって、パッキングとアラインメントが問題になることがあります。

+0

うわー、これは本当に素晴らしい解決策になります!残念ながら、myStructは自分自身で定義されておらず、デフォルトのコンストラクタがないようです。 従ってライン '体mystruct leds_all [40];' エラーを示す:_unionメンバ '<匿名組合> ::全て' 非自明 と '体mystruct ::体mystruct()' _ は別の方法があります非デフォルトのctor構造体をサポートする素敵なソリューションを使用するには? – shoutcool

+1

@shoutcool 1. Cにコンストラクタはありません(間違ったタグ?)2.不完全な 'struct'にはメモリ(' static'/'extern'も' malloc'もありません)を割り当てることはできません。不完全な 'struct'へのポインタしかない場合、上記の解決策はあなたの可能性を超えています。この場合、あなたの「最適化」を忘れてしまいます。割り当てで許可されているかどうかは制御できません。 – Scheff

+0

@shoutcoolこの場合には、これらの 'struct'へのポインタの配列があります。 [すべてが別のレベルのインダイレクションで解決できる](https://en.wikipedia.org/wiki/Indirection) – Scheff

0

私はちょうど私のために十分な解決策を見つけました。結合された配列の良い方法は不可能なので、私は関数の魔女がインデックスをチェックしていて、配列の1つで正しい要素にアクセスしていると書いています。

void setLED(int number, CRGB color){ 
     if (number < leds_left_size){ 
      leds_left[number] = color; 
     }else if (number >= leds_left_size && number < leds_left_size + leds_top_size){ 
      leds_top[number - leds_left_size] = color; 
     }else if (number >= leds_left_size + leds_top_size && number < leds_top_size + leds_left_size + leds_right_size){ 
      leds_right[number - leds_left_size - leds_top_size] = color; 
     }else{ 
      leds_bottom[number - leds_left_size - leds_top_size - leds_right_size] = color; 
     } 
    } 

それはまさに私の質問をanwerしませんが、それはあなたが一緒に構造体をマージするように見えます回避策

+0

これは少し驚きです:割り当ては不完全な 'struct'のために利用できないものです。おそらく、あなたの 'struct'は本当に不完全ではありません。私たちはまだあなたの実際の問題を見たり見つけたりしなかったのでしょうか... – Scheff

+0

'CRGB color'を' leds_left'に割り当てると、 'leds_left [number]'はこのタイプの配列だと思います。 – Scheff

+0

はい、あなたは正しいです: 'CRGB leds_left [leds_left_size];'とCRGBは構造体です。あなたがそれを見たいと思えば[ここ](https://github.com/FastLED/FastLED/blob/master/pixeltypes.h#L90)はgithubのコードです – shoutcool

関連する問題