2014-07-04 53 views
0

我在我的項目中有一個文件,有一個本地結構數組定義像MyStruct_t myStruct[SIZE],我可以很好地使用該模塊。現在我想,使其對不同的代碼模塊可訪問的,所以我想出了一個功能:返回靜態結構數組指針與get()

MyStruct_t *GetStruct(void) { 
    return myStruct; 
} 

但是,當我把這個從我的不同的模塊,我得到一個錯誤expression must be a modifiable lvalue。我的來電看起來像:

void myFunc(void) { 
    MyStruct_t locStruct; 
    locStruct = GetStruct(); 
} 

我該如何做到最好?

回答

1

例如,你可以做以下方式

void myFunc(void) 
{ 
    MyStruct_t locStruct[SIZE]; 
    MyStruct_t *p = GetStruct(); 
    memcpy(locStruct, p, SIZE * sizeof(MyStruct_t)); 
} 

或者它可能是足有一個指向數組

void myFunc(void) 
{ 
    MyStruct_t *locStruct = GetStruct(); 
} 

的第一個元素在這種情況下,語法用於訪問陣列的元素將與例如相同locStruct[i]

+2

我不認爲他想要的數組的副本! – ooga

1

GetStruct返回一個指針,所以你的locStruct變量也應該是一個指針。

void myFunc(void) { 
    MyStruct_t *locStruct; 
    locStruct = GetStruct(); 
} 
2

GetStruct返回指向myStruct[SIZE]元素的指針,而不是MyStruct_t。除非你真的需要一個副本,讓locStruct指針,就像這樣:

MyStruct_t *locStruct = GetStruct(); 

注意locStruct陣列的MyStruct_t,大小SIZE的。

如果你想製作一個副本,解引用GetStruct()的結果:

MyStruct_t locStruct = *GetStruct(); 

這將產生myStruct數組的初始元素的副本。

由於GetStruct不提供額外的服務,除非訪問myStruct,你還不如讓的myStruct全球(extern),而不是static

最後,您可以更改GetStruct以訪問特定元素。這也將照顧檢測超支的 - 即企圖得到一個元素過去SIZE或負指數:

bool GetStruct(int index, MyStruct_t *ptr) { 
    if (index < 0 || index >= SIZE) { 
     return false; 
    } 
    *ptr = myStruct[index]; 
    return true; 
} 

現在的GetStruct()調用是這樣的:

MyStruct_t locStruct; 
if (GetStruct(5, &locStruct)) { 
    // All good 
} else { 
    // Error 
} 
1

如果myStruct在其他模塊中是全局的,那麼您可能正在尋找extern關鍵字。只要把這個其他模塊:

extern MyStruct_t myStruct[]; 

(我假定MyStruct_t是typedef版名稱。否則,當然需要在其之前放置關鍵字struct)。

這也需要訪問MyStruct的聲明。把它放在一個頭文件中,並將它包含在兩個模塊中。

這裏有一個簡單的例子:

// main.h ------------------------------------------------ 

typedef struct { 
    int a, b, c; 
} AStruct; 

// func.h ------------------------------------------------ 

void func(void); 

// main.c ------------------------------------------------ 

#include <stdio.h> 
#include "main.h" 
#include "func.h" 

AStruct as[100]; 

int main(void) { 
    func(); 
    printf("%d,%d,%d\n", as[0].a, as[0].b, as[0].c); 
    return 0; 
} 

// func.c ------------------------------------------------ 

#include "main.h" 
#include "func.h" 

extern AStruct as[]; 

void func(void) { 
    as[0].a = 1; 
    as[0].b = 2; 
    as[0].c = 3; 
}