2009-11-07 4 views
4

Это было давно, я не использую язык C, и это сводит меня с ума. У меня есть массив структур, и мне нужно создать функцию, которая будет копировать один массив в другой (мне нужна точная копия), но я не знаю, как определить вызов функции. Я думаю, мне нужно использовать указатели, но когда я пытаюсь, это дает мне ошибку.Копирование массивов структур в 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 ?? –

ответ

15

Это должно сделать это:

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

EDIT: Кстати: Это сохранить копию a в b

+0

Работает как очарование. Спасибо! –

+0

good old trusty memcpy. – toto

+1

Вы можете добавить «if (sizeof (b)> = sizeof (a))», проверьте также. – Fred

-1

компилятор не имеет никакой информации о размере массива после передачи их в качестве указателя в функцию так часто требуется третий параметр:.. размер массивов скопировать

.

раствор (без проверки ошибок) может быть:

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

Не правда. Исходный код передает массивы как указатели 'struct group (*) [4]' type не как типы указателей 'struct group *'. При правильно объявленном «copySolution» размер массива встроен в тип указателя. С вашим определением исходный код просто не будет компилироваться не только из-за отсутствующего третьего параметра, но также и потому, что тип аргумента не соответствует типу параметра. – AnT

+0

Я тоже пытаюсь передать массив в другую функцию, и он говорит следующее: simulated_annealing.c: В функции 'main': simulated_annealing.c: 39: warning: передающий аргумент 1 из ' chooseNeighbour»от несовместимого типа указателя кода: chooseNeighbour (& candidateSolution, nGroups) недействительной chooseNeighbour (структура группы * г [], Int размера) { \t Е ("% г \ п", г [0] - > вес); } –

+0

@ Víctor: Ваш звонок неправильный. Должно быть 'selectNeighbour (candidSolution, nGroups)'. Примечание: нет оператора '&'. – AnT

-3

Самый простой способ, вероятно,

b=a 

хотя решение с memcpy() также будет работать.

+0

'b = a;' не работает, когда, как в данном случае, 'a' и' b' являются массивами. – pmg

+0

b = a просто копирует значение указателя a в b, что не соответствует OP – Ponting

+0

'b = a' не работает - массивы не являются lvalues ​​в C, поэтому они не могут быть назначены так. –

0

Это ощущение плохо замаскараденный домашнее задание ... В любом случае, учитывая заранее определенный формат вызова для copySolution в исходное сообщение, правильное определение copySolution будет выглядеть следующим образом

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 никогда не мог ладить друг с другом :) –

3

Как пишет Johannes Weiß, memcpy() - хорошее решение.

Я просто хочу, чтобы указать на то, что вы можете копировать как обычные структур типа:

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

каждый компилятор, который я видел, назвал memcpy при использовании '=' при копировании структур. – Fred

+3

@Fred Сколько компиляторов вы видели? –

0

В моем случае предыдущие решения не работает должным образом! Например, Решение @Johannes Weiß не копировало «достаточно» данных (оно копировало около половины первого элемента).
Таким образом, в случае, кому-то нужно решение, которое даст вам правильные результаты, вот это:

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

Смежные вопросы