Помогите найти ошибку! С

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Logrus
Сообщения: 2
Зарегистрирован: 01 апр 2018, 20:55

01 апр 2018, 21:08

Есть задача:
Из элементов массива А из n элементов, стоящих на нечетных местах и расположенных правее минимального элемента данной последовательности, сформировать новый массив C. Для формирования массива С напишите функцию с использованием указателей.

Не могу понять почему в нулевой эллемент массива попадает мусор, а не то что нужно... Помогите разобраться.

Код: Выделить всё

void fillMas(int *, int);					
void printMas(int *, int);
int *created_mas(int*, int, int*, int);
void main() {
	srand(time(NULL));
	int size, size2 = 0, index_min = 0;
	cin >> size;
	int *arr = new int[size];
	fillMas(arr, size);
	printMas(arr, size);

	for (int i = 1; i < size; i++)
		if (arr[index_min] > arr[i])
			index_min = i;
	for (int i = index_min + 1; i < size; i++)
		if (i % 2 != 0)
			size2++;
	int *result_arr = new int[size2];
	*result_arr = *created_mas(arr, size, result_arr, index_min);
	printMas(result_arr, size2);

	delete[] arr;
	delete[] result_arr;
	arr = nullptr;
	result_arr = nullptr;
}

void fillMas(int *mas, int size) {
	for (int i = 0; i < size; i++)
		*(mas + i) = rand() % 90 + 10;
}
void printMas(int *mas, int size) {
	for (int i = 0; i < size; i++)
		cout << *mas++ << " ";
	cout << endl;
}
int *created_mas(int* a, int size, int* b, int min) {
	for (int i = min + 1; i < size; i++) 
		if (i % 2 != 0) {
			*b++ = *(a + i);
		}
	return b;
}
Вывод такой:
[ATTACH]2469[/ATTACH]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

01 апр 2018, 23:14

А дебажить не пробовал? В два счёта ведь находится, что не так, если прошагать по коду.

Убирай к чёрту возвращаемое значение created_mas, и тот ужас, который ты делаешь с этим возвращаемым значением в месте вызова упомянутой функции. Подозреваю, что это были попытки побороть непонятную ошибку.

А сама ошибка крылась в невинной строке:

Код: Выделить всё

*b++ = *(a + i);
Правильно будет вот так:

Код: Выделить всё

*(b++) = *(a + i);
Надеюсь, объяснения почему это была ошибка и почему скобки нужны излишни.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Logrus
Сообщения: 2
Зарегистрирован: 01 апр 2018, 20:55

02 апр 2018, 22:45

Спасибо, огромное ! Долго голову ломал... Вот что значит нужно внимательно все читать)
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

03 апр 2018, 00:09

Да тут не в чтении дело. Дебагер сразу показывает, в чём проблема. Учись отлаживаться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

04 апр 2018, 19:44

Такой вопрос: у нас на современных системах int будет 4-8 байт. Почему надо делать, как выше указано, а не так:

Код: Выделить всё

*(b) = *(a + i*sizeof(int));
b+= sizeof(int);
Это компилятор умный, что сам инкрементирует соответственно размеру переменной, или я что-то не понимаю? Если первое, то будет ли компилятор так делать только с базовыми типами или с любой единицой информации (Объекты классов)?
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

04 апр 2018, 22:40

Skwoogey писал(а):Такой вопрос: у нас на современных системах int будет 4-8 байт. Почему надо делать, как выше указано, а не так:

Код: Выделить всё

*(b) = *(a + i*sizeof(int));
b+= sizeof(int);
Это компилятор умный, что сам инкрементирует соответственно размеру переменной, или я что-то не понимаю? Если первое, то будет ли компилятор так делать только с базовыми типами или с любой единицой информации (Объекты классов)?

Указатели инкрементируются и декрементируются не на один байт, а на размер типа на который они указывают. Соответственно, void* инкрементировать нельзя. По второму вопросу - да, это работает со всеми типами, в т.ч c инстансами шаблонов.
2B OR NOT(2B) = FF
Ответить