Nightpoison Ответов: 1

Почему все значения Индекса моего массива одинаковы?


ОБНОВЛЕНИЕ:

Такое со мной всегда случается. Указатели-это дьявол. Поэтому я считаю, что моя проблема заключается в том, что возвращаемое значение, которое хранится в моем новом массиве изображений [], является тем же адресом.

Я закончил тем, что напечатал адрес для каждого индекса изображений[]. Все адреса разные. Однако, когда я печатаю изображения следующего уровня[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], все адреса одинаковы.

1 Ответов

Рейтинг:
9

OriginalGriff

Вы повторно используете один и тот же блок данных (img) для хранения изображения, которое Вы читаете из файла.
Таким образом, каждый раз, когда вы идете по кругу, читая новый файл, вы перезаписываете bmp из предыдущего, и все image значения в конечном итоге указывают на ту же память, которая содержит последнее загруженное изображение.


Nightpoison

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