C Проблемы программирования: передача, создание и возврат структур в функции.

Эта функция не работает, и я не могу понять, почему. Он компилируется отлично, и программа, похоже, работает, однако при внимательном рассмотрении и отладке я обнаруживаю, что:

newImg->x = b;
newImg->y = a;

На самом деле это не работает, и это вызывает проблемы. Я пытался копировать с помощью newImg = img, но это не позволяет мне позже менять значения newImg. Они остаются точно такими же. Я также попытался изменить значения img, а затем сделать newImg, но отладка показывает, что newImg получает экстремальные значения.

Вот структура:

typedef struct
{
 unsigned char grayscale;
} PGMPixel;

typedef struct
{
 int x, y;
 PGMPixel *data;
} PGMImage;

Вот функция:

static PGMImage *rotatePGM(PGMImage *img)
{ 
 PGMImage *newImg;


 // Memory allocation for pgm
 newImg = (PGMImage *)malloc(sizeof(PGMImage));
 if (!newImg) 
 {
 fprintf(stderr, "Unable to allocate memory\n");
 exit(1);
 }

 //memory allocation for pixel data
 newImg->data = (PGMPixel*)malloc(newImg->x * newImg->y * sizeof(PGMPixel));
 if (!newImg) 
 {
 fprintf(stderr, "Unable to allocate memory\n");
 exit(1);
 }

 int a = img->x;
 int b = img->y;
 newImg->x = b;
 newImg->y = a; 

 int u = a - 1;
 int v = b - 1;
 int i = 0;
 int j = 0;

 if(newImg)
 {
 for (i = 0; i < a; i++)
 {
 for (j = 0; j < b; j++)
 {
 img->data[(j*a)+(u-i)].grayscale = img->data[(i*b)+j].grayscale;
 }
 }
 } 
 return newImg;
}

Я использую MinGW GCC и Windows 8, если это помогает.

2 ответа

Линия

newImg->data = (PGMPixel*)malloc(newImg->x * newImg->y * sizeof(PGMPixel));

неверно - он использует newImg->x и newImg->y перед их инициализацией. Предположительно вы должны использовать значения из img вместо

newImg->data = malloc(img->x * img->y * sizeof(PGMPixel));

Я сделал еще одно небольшое изменение в этой строке - вам не нужно бросать возврат из malloc

Вы также используете неправильный экземпляр PGMPixel позже в строке

img->data[... = img->data[...

(это должно быть newImg->data вы назначаете)


newImg-> data = (PGMPixel *) malloc (newImg-> x * newImg-> y * sizeof (PGMPixel));

Здесь вы не инициализировали свои переменные.

licensed under cc by-sa 3.0 with attribution.