powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись в массив через функцию
14 сообщений из 14, страница 1 из 1
Запись в массив через функцию
    #39101345
Smiz001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро. Учусь на втором высшем и столкнулся с заданием в котором нужно записывать значение в динамический массив, при условии в нем такого значения еще нету.
Вот решение мое данной задачи, мне говорят что так нельзя делать и надо делать через new, при этом не объясняют почему.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void AddInArray(int*& myArray, int &count, int value)
{
	int* pArr = myArray;
	for (int i = 0; i < count; i++)
	{
		if (value == pArr[i])
		{
			return;
		}
	}
	count++;
	myArray = (int*)realloc(pArr, count * sizeof(int));
	pArr = myArray;
	pArr[count - 1] = value;
	
}


Вариант через new:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
void addString1(int *&p, int& M2) 
{
	int tmp;
	std::cout << "\n Enter new value: \n";
	std::cin >> tmp;
	
	bool f = 0;
	for (int i = 0; i < M2; i++) 
	{
		if (p[i] == tmp) 
		{
			f = 1;
			break;
		}
	}
	
	if(!f)
	{
		M2++;
		int *pNew = new int[M2];
		for (int j = 0; j < M2-1; j++) 
		{
			pNew[j] = p[j];
		}
		pNew[M2-1] = tmp;
		delete[] p;
		p = pNew;
	}
}


Хотелось бы узнать в чем причина недовольства и вариант с new я взял не свой конечно.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101373
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smiz001
при этом не объясняют почему.

Так вы бы спросили почему. Почему не спросили ? Мало ли кто и что говорит

Зачем int& count ?
Указатель pArr у вас избыточный(хотя это не ошибка).
И я бы посоветовал вам возвращать результат, 1 - добавление прошло успешно, 0 в противном случае. А в целом ваша первая функция должна работать в соответствие с вашим заданием
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101385
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗачем int& count ?
чтобы
Smiz001
Код: plaintext
1.
	count++;



Smiz001мне говорят что так нельзя делать и надо делать через new, при этом не объясняют почему.
Потому что изначально память была выделена с помощью new.
Работать с памятью можно одним из способов: или с помощью *alloc()/free(), или new/delete. Нельзя сначала выделить new, затем перевыделить через realloc().
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101389
Smiz001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercury, на мой вопрос почему был дан ответ: "Это сишная функция, а мы занимаемся на с++, вот будет у вас ООП там такое не прокатит."

SashaMercuryЗачем int& count ?
Так мне же нужно что бы кол-во значений в массиве сохранялось. Разве не нужна ссылка на count для этого?
SashaMercuryИ я бы посоветовал вам возвращать результат, 1 - добавление прошло успешно, 0 в противном случае
Совет хороший, учту, только нельзя ничего возвращать в данной задаче.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101395
Smiz001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TРаботать с памятью можно одним из способов: или с помощью *alloc()/free(), или new/delete. Нельзя сначала выделить new, затем перевыделить через realloc().
Вот этого даже и не знал. На будущее учту, спасибо.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101407
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryЗачем int& count ?
чтобы
Smiz001
Код: plaintext
1.
	count++;



Smiz001мне говорят что так нельзя делать и надо делать через new, при этом не объясняют почему.
Потому что изначально память была выделена с помощью new.
Работать с памятью можно одним из способов: или с помощью *alloc()/free(), или new/delete. Нельзя сначала выделить new, затем перевыделить через realloc(). В общем случае это так. Оператор new может быть перегружен и пользоваться собственным менеджером памяти. Но стандартный new/delete вызывает alloc()/free(). Так что должен работать.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101411
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smiz001
Так мне же нужно что бы кол-во значений в массиве сохранялось. Разве не нужна ссылка на count для этого?

Да, можно и так.
Но советую вам объединить указатель на начало массива и его размер в структуру
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101568
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1й вариант при нехватке памяти аварийно завершится, 2й отработает верно, выбросив исключение.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101804
Smiz001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зимаргл, реалоком же я расширяю память.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39101812
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smiz001Зимаргл, реалоком же я расширяю память.
Память не резиновая, надо проверять результат "расширения".
http://www.cplusplus.com/reference/cstdlib/realloc/?kw=realloc If the function fails to allocate the requested block of memory, a null pointer is returned, and the memory block pointed to by argument ptr is not deallocated (it is still valid, and with its contents unchanged).
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39102263
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smiz001SashaMercury, на мой вопрос почему был дан ответ: "Это сишная функция, а мы занимаемся на с++, вот будет у вас ООП там такое не прокатит."Это не совсем правильное объяснение. ООП тут совершенно ни при чем.
1) Если ты выделил память через new а освободил через free (или наоборот alloc-delete) то могут возникнуть проблемы. Во многих реализациях С++, new и delete физически реализованы через вызовы alloc и free, в этом случае проблем не возникнет. Это возможно, но не гарантированно. Это могут быть и совершенно независимые механизмы основанные на разных принципах и тогда проблемы будут обязательно.
2) Если ты используешь библиотеки рассчитанные на С++, то с вероятностью 99.(9)% внутри этих библиотек используется new/delete механизм работы с памятью. Если ты используешь Си библиотеки, то в них 100% используется alloc/free механизм. Если ты
используешь две такие библиотеки в одной программе, то есть большая вероятность что у тебя будут использоваться две модели памяти одновременно и придется следить чтобы не перепутать где какая.
3) Разные рантаймы по разному реализуют работу с памятью, поэтому очень часто при переносе библиотек из одного компилятора в другой возникают проблемы (особенно этим Builder знаменит). Лечится полной перекомпиляцией библиотек на новом рантайме.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39102278
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSmiz001"Это сишная функция, а мы занимаемся на с++, вот будет у вас ООП там такое не прокатит."ООП тут совершенно ни при чем.кое-причём, всё же.
я думаю, в ответе имелось ввиду то, что операция new, помимо выделения памяти, вызывает конструктор создаваемого объекта, чего не делает malloc(), так же как free() не вызывает деструктор, в отличие от delete.
Когда мы создаём встроенные типы разницы не видно, но, как только начинаем использовать классы - сразу наступаем на грабли во всю их ширину. И для ООП это различие в поведении куда важнее, чем возможно-различные менеджеры памяти у обоих механизмов.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39102389
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

malloc/free, это понятно. но ОО аналога у realloc нет, точнее есть расширяемые коллекции, в которых аналог может быть реализован более эффективно, чем создание инициализированного конструктором по умолчанию массива с последующим копированием и удалением каждого объекта.

к стати конструктор копии по умолчанию просто делает memcpy из объекта в объект. никакой магии нет. так же можно поступить с массивом объектов.
...
Рейтинг: 0 / 0
Запись в массив через функцию
    #39102712
Smiz001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych, mcureenab , я вас примерно понял, наверно полностью окончательно пойму в следующем семестре.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись в массив через функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]