Почему все значения Индекса моего массива одинаковы?
ОБНОВЛЕНИЕ:
Такое со мной всегда случается. Указатели-это дьявол. Поэтому я считаю, что моя проблема заключается в том, что возвращаемое значение, которое хранится в моем новом массиве изображений [], является тем же адресом.
Я закончил тем, что напечатал адрес для каждого индекса изображений[]. Все адреса разные. Однако, когда я печатаю изображения следующего уровня[i][0], все адреса одинаковы.
Я изложу свои мысли в разделе Что я сделал
Я не часто работаю в C/C++, поэтому мне всегда приходится обновлять указатели.
ОРИГИНАЛ:
У меня есть программа, которая находит список bmp-файлов в каталоге. Оттуда я обрабатываю их все по одному и сохраняю в массиве. Каждое изображение состоит из структуры,связанной с R, G,B. Когда я обрабатываю одно изображение, я вставляю его в свой массив изображений в следующем доступном индексе. Однако, когда я закончу открывать все bmp-изображения и распечатывать данные в каждом индексе, они будут одинаковыми.
вот этот процесс
во первых структура которая используется для изображений это
typedef struct pixel { uint8_t r; uint8_t g; uint8_t b; } pixel;
//image_names = name of all images which have been sorted //num_images = total number of images //IMG_Y = 360 //IMG_X = 640 pixel** img; struct pixel** images[num_images]; // Allocate image structure which will be used to load images img = (pixel**)malloc (IMG_Y * sizeof (pixel*)); for (i = 0; i < IMG_Y; i++) { img[i] = (pixel*)malloc (IMG_X * sizeof (pixel)); } for (i = 0; i < num_images; i++) { // Open image and ensure it's successful. if (open_bmp (*(image_names + i), img) == EXIT_FAILURE) { return EXIT_FAILURE; } images[i] = img; } }
просто для фона вот open_bmp()
<pre>int open_bmp (char * file_name, pixel** img) { // Variable declarations long offset = 0; unsigned char buff[100]; int x = 0, y = 0; FILE *f = fopen (file_name, "rb"); // open file in binary mode // Verify that the file opened is in the correct format if (verify_bmp (f, &offset, file_name) == EXIT_FAILURE) { printf ("Unable to proceed\n"); return EXIT_FAILURE; } // Read pixel data fseek (f, offset, SEEK_SET); // go to beginning of pixel data while ((fread (&buff, 3, 1, f) >= 1) && y < IMG_Y) // while not EOF (or done with image), read next pixel { img[y][x].r = buff[2]; img[y][x].g = buff[1]; img[y][x].b = buff[0]; x++; // read next column if (x >= IMG_X) { // finished reading row, go to next row y++; x = 0; } } if (PRINTBMPDATA) { for (y = 0; y < IMG_Y; y++) { for (x = 0; x < IMG_X; x++) { printf ("%02x%02x%02x ", img[y][x].b, img[y][x].g, img[y][x].r); } printf ("\n"); } printf ("\n"); } // Close image file now that we have copied it to the img structure if (fclose (f)) { printf ("Unable to close image file\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
Что я уже пробовал:
Я сделал распечатку заявлений в нескольких местах, чтобы проверить работу различных частей. Например, "if (PRINTBMPDATA)" я изменил на значение 1, чтобы он всегда печатал результаты open_bmp(). Я проверил, что каждое изображение, отправленное в open_bmp (), на самом деле отличается.
Я также вставил цикл печати сразу после вызова open_bmp() и напечатал выходную переменную "img", возвращаемое значение которой каждый раз отличается.
Однако, когда я зацикливаю "images[]", независимо от того, какой индекс Я смотрю, он точно такой же, как и следующий.
Я не знаю, чего мне не хватает. Любые предложения будут оценены по достоинству.
ОБНОВЛЕНИЕ:
Так что указатели. в этом случае я передаю переменную img как двойной указатель, да, это ново для меня, поэтому я предполагаю, что она работает точно так же, как точка, и на самом деле просто передает адрес, где я хочу хранить данные. Поэтому, когда я говорю возвращаемое значение open_bmp (), я на самом деле не очень хорошо соображаю. Однако я предполагаю, что когда я назначаю img изображениям[], я на самом деле назначаю адрес img, который никогда не меняется от одного файла к другому.
Как передать значение img, а не адрес, когда мы говорим о двойных указателях?
CPallini
Вы отметили этот вопрос как " C++", но ваш код-C. действительно ли вам нужно использовать C? Не могли бы вы вместо этого использовать C++?
Кроме того, опубликованный код не является полным (например, в нем отсутствует verify_bmp определение функции), мы не можем отлаживать его в его нынешнем виде.
Nightpoison
@CPallini да, извините за это. Я только что сменил его на С. хаббит. Я не хотел загружать весь код, так как его гораздо больше. verify_bmp может быть проигнорировано в том, что касается тестирования. Код в исходном формате работает просто отлично, то есть если я хочу открыть изображение, обработайте его, а затем откройте следующее изображение и обработайте его отлично. Я пытаюсь сначала открыть все изображения, а затем последовательно обработать каждое из них.
Nightpoison
CPallini я думаю, что я только что понял это. Это проблема указателя. Каждый индекс моего массива изображений имеет уникальный адрес. Я только что распечатал их. Однако, когда я печатаю первый адрес изображений следующего уровня[i][0], все адреса одинаковы.