Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись в массив через функцию / 14 сообщений из 14, страница 1 из 1
12.11.2015, 07:30
    #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
12.11.2015, 08:38
    #39101373
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в массив через функцию
Smiz001
при этом не объясняют почему.

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

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



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

SashaMercuryЗачем int& count ?
Так мне же нужно что бы кол-во значений в массиве сохранялось. Разве не нужна ссылка на count для этого?
SashaMercuryИ я бы посоветовал вам возвращать результат, 1 - добавление прошло успешно, 0 в противном случае
Совет хороший, учту, только нельзя ничего возвращать в данной задаче.
...
Рейтинг: 0 / 0
12.11.2015, 09:07
    #39101395
Smiz001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в массив через функцию
Dima TРаботать с памятью можно одним из способов: или с помощью *alloc()/free(), или new/delete. Нельзя сначала выделить new, затем перевыделить через realloc().
Вот этого даже и не знал. На будущее учту, спасибо.
...
Рейтинг: 0 / 0
12.11.2015, 09:13
    #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
12.11.2015, 09:16
    #39101411
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в массив через функцию
Smiz001
Так мне же нужно что бы кол-во значений в массиве сохранялось. Разве не нужна ссылка на count для этого?

Да, можно и так.
Но советую вам объединить указатель на начало массива и его размер в структуру
...
Рейтинг: 0 / 0
12.11.2015, 11:43
    #39101568
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в массив через функцию
1й вариант при нехватке памяти аварийно завершится, 2й отработает верно, выбросив исключение.
...
Рейтинг: 0 / 0
12.11.2015, 13:49
    #39101804
Smiz001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в массив через функцию
Зимаргл, реалоком же я расширяю память.
...
Рейтинг: 0 / 0
12.11.2015, 13:54
    #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
12.11.2015, 18:54
    #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
12.11.2015, 19:17
    #39102278
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в массив через функцию
White OwlSmiz001"Это сишная функция, а мы занимаемся на с++, вот будет у вас ООП там такое не прокатит."ООП тут совершенно ни при чем.кое-причём, всё же.
я думаю, в ответе имелось ввиду то, что операция new, помимо выделения памяти, вызывает конструктор создаваемого объекта, чего не делает malloc(), так же как free() не вызывает деструктор, в отличие от delete.
Когда мы создаём встроенные типы разницы не видно, но, как только начинаем использовать классы - сразу наступаем на грабли во всю их ширину. И для ООП это различие в поведении куда важнее, чем возможно-различные менеджеры памяти у обоих механизмов.
...
Рейтинг: 0 / 0
12.11.2015, 21:26
    #39102389
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в массив через функцию
egorych,

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

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


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