2016-02-10 3 views
0

Я пытаюсь скопировать содержимое структуры в другую структуру того же типа.Копирование содержимого структуры в другое

Я хотел бы иметь возможность изменять значения одной структуры, не затрагивая ее позже.

Я имею дело с чтением и редактированием файлов PPM. У меня есть:

-структура
typedef struct { 
    char format[4]; 
    char comments[MAX_COMMENT_LENGTH]; 
    int width, height, maxColourValue; 
    PPMPixel **pixels; 
} PPMImage; 

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

Я пытаюсь скопировать поля newPPM в messagePPM.

Ошибка:

incompatible types when assigning to type 'char[4]' from type 'char *' 
    messagePPM->format = newPPM->format; 
incompatible types when assigning to type 'char[100]' from type 'char *' 
    messagePPM->comments = newPPM->comments; 

Функция копирования:

//A function to copy contents of one PPMImage to another 
void copyPPM(PPMImage *newPPM, PPMImage *messagePPM) { 

    messagePPM->format = newPPM->format; 
    messagePPM->comments = newPPM->comments; 
    messagePPM->width = newPPM->width; 
    messagePPM->height = newPPM->height; 
    messagePPM->maxColourValue = newPPM->maxColourValue; 
    messagePPM->pixels = newPPM->pixels; 

}

Как исправить свою ошибку? Будет ли копирование полей таким образом достичь того, к чему я стремлюсь?

+0

вы должны использовать тетсру, чтобы скопировать значения полей формата и комментариев. Вы можете использовать strcpy, если значения null завершены. – bruceg

+0

Этому ответили здесь: - http://stackoverflow.com/questions/4931123/copying-one-structure-to-another – BryanT

+1

@bruceg Спасибо за отзыв, это решило мое сообщение об ошибке. – Porteous96

ответ

2

Вы можете скопировать содержимое одной структуры в другую с помощью простого задания:

void copyPPM(PPMImage *newPPM, PPMImage *messagePPM) { 
    *newPPM = *messagePPM; 
} 

Это означает, что вам не нужно даже функцию.

Однако структуры будут разделять массив pixels. Если вы хотите дублировать это, вам нужно будет выделить копию и скопировать содержимое.

Копирование одной структуры над другой может также привести к утере массива pixels.

Если вы хотите сделать глубокую копию структуры, необходимо выделить новые массивы пикселей таким образом:

void copyPPM(PPMImage *newPPM, PPMImage *messagePPM) { 
    *newPPM = *messagePPM; 
    if (newPPM->pixels) { 
     newPPM->pixels = malloc(newPPM->height * sizeof(*newPPM->pixels)); 
     for (int i = 0; i < newPPM->height; i++) { 
      newPPM->pixels[i] = malloc(newPPM->width * sizeof(*newPPM->pixels[i]); 
      memcpy(newPPM->pixels[i], messagePPM->pixels[i], 
        newPPM->width * sizeof(*newPPM->pixels[i])); 
     } 
    } 
} 
+0

Как я могу скопировать массив, чтобы у меня была версия его в каждой структуре? Это массив, использующий malloc для каждой ячейки и указывающий на пиксель, поэтому он работает как 2d-массив пикселей. – Porteous96

+0

@ Porteous96: Я обновил ответ для этой цели. – chqrlie

0

Вы можете просто сделать a = b, где и b - переменные типа PPImage.

+0

Это просто копирует адрес, вы имеете в виду * a = * b? –

+1

Я сказал, что они имеют тип PPImage, а не указатели. –

+0

Итак, в этом случае это делает поля, указывающие на то, что указывает поля b или действительно ли они копируют значения? Я новичок в C и все еще пытаюсь понять всю вещь указателя. – Porteous96