2017-04-08 63 views
3

我有2個結構數組容易使用多個結構數組

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

我需要一種方法來將兩個結構結合起來,這樣我就可以使用它像:

*(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

你已經有的代碼將工作,如果你指定所有的指針 –

回答

2

爲確保leds_leftleds_right確實分配在連續的內存中,它們必須「結構化」在一起。這與union組合可以提供你想要的東西:

#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; 
} 

編譯和Cygwin中使用gcc測試在Windows 10(64位):

$ 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()' _ 有另一種方式使用你的不錯的解決方案,它支持非默認構造? – shoutcool

+1

@shoutcool 1. C中沒有構造函數(錯誤的標籤?)2.對於不完整的'struct',您不可以分配內存('static' /'extern'和'malloc')。如果你只有指向不完整'struct'的指針,上面的解決方案超出了你的可能性。在這種情況下,忘記你的「優化」 - 你無法控制分配是否允許這樣做。 – Scheff

+0

@shoutcool在這種情況下,你可以擁有的最好的數組是指向這些'struct'的指針。 [所有內容都可以通過另一個級別的間接方式解決。](https://en.wikipedia.org/wiki/Indirection) – Scheff

0

我剛剛找到了一個對我來說足夠好的解決方案。因爲組合數組的好方法是不可能的,所以我只寫了一個函數來檢查索引,然後訪問其中一個數組中的正確元素。

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'並不是真的不完整。恐怕我們仍然沒有看到/發現你的實際問題... – 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