2009-11-07 104 views
4

這是一個漫長的,因爲我不使用C語言,而這是推動我瘋了。我有結構的數組,我需要建立一個將複製一個陣列到另一個(我需要一個精確副本)的功能,但我不知道如何定義函數調用。我想我需要使用指針,但是當我嘗試它給了我一個錯誤。複製陣列

struct group{ 
    int weight; 
    int x_pos; 
    int y_pos; 
    int width; 
    int height; 
}; 

struct group a[4]; 
struct group b[4]; 

copySolution(&a, &b); 

最後一個聲明給我一個錯誤。正如我所說,這是一個漫長的,因爲在C語言編程,所以我有點現在失去:(

+0

什麼是copySolution的原型? – 2009-11-07 17:54:20

回答

15

應該這樣做:

memcpy(&b, &a, sizeof(a)); 

編輯:順便說一句:這將節省的a副本中b

+0

工程就像一個魅力。謝謝! – 2009-11-07 17:55:50

+0

好老可靠的memcpy。 – toto 2009-11-07 18:08:47

+1

您可能會添加一個「if(sizeof(b)> = sizeof(a))」,並檢查。 – Fred 2009-11-07 18:10:13

-1

的編譯器對數組的大小將它們作爲指針變成功能後,沒有信息所以,你經常需要第三個參數:。數組的大小複製

溶液(沒有任何錯誤檢查)可能是:

void copySolution(struct group* a, struct group* b, size_t size) { 
    memcpy(a, b, size * sizeof(*a)); 
} 
+1

不正確。原始代碼將數組作爲'struct group(*)[4]'類型的指針傳遞,而不是作爲指針'struct group *'類型。通過正確聲明的'copySolution',數組大小被嵌入到指針類型中。根據您的定義,原始代碼不會編譯,不僅因爲缺少第三個參數,而且還因爲參數類型與參數類型不匹配。 – AnT 2009-11-07 18:06:50

+0

我也想這個,因爲我需要傳遞數組到另一個函數,它說: simulated_annealing.c:在函數'main'中: simulated_annealing.c:39:warning:將參數1傳遞給'從兼容的指針類型 代碼chooseNeighbour」: chooseNeighbour(&candidateSolution,NGROUPS) 空隙chooseNeighbour(結構組* G [],INT大小){ \t的printf( 「%I \ n」 個,G [0] - >重量); } – 2009-11-07 18:15:32

+0

@Víctor:你的電話是錯誤的。應該是'chooseNeighbour(candidateSolution,nGroups)'。注意:沒有'​​&'運算符。 – AnT 2009-11-07 18:20:54

-3

最簡單的方法可能是

b=a 

雖然與memcpy()的解決方案也可以工作。

+0

'b = a;'在這種情況下不起作用,'a'和'b'是數組。 – pmg 2009-11-07 18:10:57

+0

b = a簡單地將a的指針值複製到b,這不是OP所要求的 – Ponting 2009-11-07 18:11:16

+0

b = a'不起作用 - 數組在C中不是左值,因此不能像這樣分配它們。 – 2009-11-07 18:11:29

0

這有僞裝的不良家庭作業的感覺......總之,在原崗位給出的預定呼叫格式copySolutioncopySolution正確的定義將如下所示

void copySolution(struct group (*a)[4], struct group (*b)[4]) 
{ 
    /* whatever */ 
} 

現在,裏面的copySolution你可以在你喜歡的任何方式複製陣列。無論是使用週期

void copySolution(struct group (*a)[4], struct group (*b)[4]) 
{ 
    const struct group *pb, *pbe; 
    struct group *pa; 

    for (pa = *a, pb = *b, pbe = pb + sizeof *b/sizeof **b; 
     pb != pbe; 
     ++pa, ++pb) 
    *pa = *pb; 
} 

或使用memcpy以上

void copySolution(struct group (*a)[4], struct group (*b)[4]) 
{ 
    memcpy(b, a, sizeof *b); 
} 

當然的建議,你必須首先決定你想要哪個方向的陣列中被複制。你沒有提供的信息,所以大家只是跳到一些結論。

+0

這是一種家庭作業,因爲這是我最後的項目職業生涯:P真的,這已經有一段時間了,我是一個C永遠無法相處的人:) – 2009-11-07 18:19:13

3

由於約翰內斯Weiss說,memcpy()是一個很好的解決方案。

我只是想指出的是您可以複製結構像普通類型:

for (i=0; i<4; i++) { 
    b[i] = a[i]; /* copy the whole struct a[i] to b[i] */ 
} 
+0

我見過的每個編譯器都調用了memcpy當複製結構時使用'='。 – Fred 2012-02-02 18:55:26

+3

@Fred你見過多少編譯器? – 2014-07-31 22:53:29

0

在我來說,以前的解決方案不能正常工作!例如, @Johannes魏斯的解決方案並沒有複製「足夠」的數據(它複製有關的第一個元素的一半)。
所以在情況下,有人需要一個解決方案,那會給你正確的結果,那就是:

int i, n = 50; 
struct YourStruct *a, *b; 

a = calloc(n, sizeof(*a)); 
b = malloc(n * sizeof(*b)); 
for (i = 0; i < n; ++i) { 
    // filling a 
} 

memcpy(b, a, n * sizeof(*a)); // <----- see memcpy here 

if (a != NULL) free(a); 
a = calloc(n*2, sizeof(*a)); 

memcpy(a, b, n * sizeof(*b)); // <------ see memcpy here again 

的一些注意事項,我用釋放calloc的,因爲在「//填充」的一部分我正在做需要初始化數據的操作。

+0

我想我必須擁有。我會刪除錯位的評論。 – Davislor 2015-12-07 19:22:15