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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Помогите найти ошибку! С

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

Absurd » 04 апр 2018, 22:40

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

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

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

Указатели инкрементируются и декрементируются не на один байт, а на размер типа на который они указывают. Соответственно, void* инкрементировать нельзя. По второму вопросу - да, это работает со всеми типами, в т.ч c инстансами шаблонов.

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

Skwoogey » 04 апр 2018, 19:44

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

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

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

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

Romeo » 03 апр 2018, 00:09

Да тут не в чтении дело. Дебагер сразу показывает, в чём проблема. Учись отлаживаться.

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

Logrus » 02 апр 2018, 22:45

Спасибо, огромное ! Долго голову ломал... Вот что значит нужно внимательно все читать)

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

Romeo » 01 апр 2018, 23:14

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

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

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

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

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

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

*(b++) = *(a + i);
Надеюсь, объяснения почему это была ошибка и почему скобки нужны излишни.

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

Logrus » 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]

Вернуться к началу