Проблемы с распечаткой массива для файла ppm - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь создать массив, используя структуру, чтобы создать файл ppm. Затем я хочу вызвать другие функции, чтобы изменить значения цвета (rgb) для каждой ячейки, чтобы сделать фигуры.

Это насколько я пытался распечатать массив с тремя значениями для rgb.

bool writeImage(const Color image[][IMAGE_WIDTH], int height) {

    ofstream imgGen;

    imgGen.open("imgGen.txt");

    imgGen << "P3 \n";
    imgGen << IMAGE_WIDTH << " " << height << "\n";
    imgGen << COLOR_SCALE << "\n";

    for (int imageRow = 0; imageRow < height; imageRow++) {
       for (int imageColumn = 0; imageColumn < IMAGE_WIDTH; imageColumn++)
          imgGen << image[imageRow][imageColumn].red << " " << image[imageRow] 
              [imageColumn].green << " " << image[imageRow][imageColumn].blue;
       imgGen << endl;
    }

    imgGen.close();

return 0;
}

и это структура, которую я пытаюсь использовать для массива.

struct Color
{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

int main()
{
    Color image[IMAGE_HEIGHT][IMAGE_WIDTH];
    image[IMAGE_HEIGHT][IMAGE_WIDTH].red = 0;
    image[IMAGE_HEIGHT][IMAGE_WIDTH].green = 1;
    image[IMAGE_HEIGHT][IMAGE_WIDTH].blue = 2;

    writeImage(image, IMAGE_HEIGHT);

return 0;
}

У меня он распечатывается в виде текстового файла для проверки форматирования, и я пытаюсь заставить его распечатать три значения на пиксель, как показано ниже:

P3
200 300
255

255 0 0 0 0 255
0 255 0 0 0 0

Что не так с моим текущим подходом и что я могу сделать по-другому в моем коде? Спасибо за любую помощь!

1 Ответ

0 голосов
/ 24 января 2019

Линии

image[IMAGE_HEIGHT][IMAGE_WIDTH].red = 0;
image[IMAGE_HEIGHT][IMAGE_WIDTH].green = 1;
image[IMAGE_HEIGHT][IMAGE_WIDTH].blue = 2;

неправильно на двух счетах.

  1. Они обращаются к массиву, используя индексы за пределами границ, и, следовательно, вызывают неопределенное поведение.
  2. Они оставляют содержимое массива в неинициализированном состоянии.

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

for (int imageRow = 0; imageRow < IMAGE_HEIGHT; imageRow++)
{
   for (int imageColumn = 0; imageColumn < IMAGE_WIDTH; imageColumn++)
   {
      image[imageRow][imageColumn].red = 0;
      image[imageRow][imageColumn].green = 1;
      image[imageRow][imageColumn].blue = 2;
   }
}
...