Вопрос по C++

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Morfin
Лейтенант
Лейтенант
Сообщения: 237
Зарегистрирован: 19.10.2007
Поблагодарили: 1 раз

#1 Сообщение 09.04.2010, 18:45

В общем имеется некий struct для хранения некоторых данных, я не хочу сразу выделять место под него, я создаю указатель
lpPacket packet=NULL;
дальше в функции я вызываю функцию myrealloc:

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

static void *myrealloc(void *ptr, size_t size)
{
  /* There might be a realloc() out there that doesn't like reallocing
     NULL pointers, so we take care of it here */
  if(ptr)
    return realloc(ptr, size);
  else
    return malloc(size);
}
следующим образом:

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

 packet=(lpPacket)myrealloc((void*)packet,sizeof(Packet));
т.к packet равен NULL, то в теории должно выделять число байт, равное sizeof(Packet);
Но оно не выделяет по какой-то причине и в итоге возвращает NULL, в итоге далее передается NULL и жопа приходит программе.
P.S Пишу я в Linux
Изображение

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#2 Сообщение 09.04.2010, 19:07

Ты хоть под отладчиком смотрел?

Morfin
Лейтенант
Лейтенант
Сообщения: 237
Зарегистрирован: 19.10.2007
Поблагодарили: 1 раз

#3 Сообщение 09.04.2010, 19:23

Смотрел уже ничего такого. Что-то не то с malloc, именно он не выделяет память
Изображение

Fire666
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 2600
Зарегистрирован: 15.02.2007
Откуда: Москва
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

#4 Сообщение 09.04.2010, 19:45

хм, а почему sizeof(Packet), а не sizeof(lpPacket)
ты же измеряешь размер указателя, а не структуры.
Разницы конечно никакой, так как это указатель на структуру, но все же.

Morfin
Лейтенант
Лейтенант
Сообщения: 237
Зарегистрирован: 19.10.2007
Поблагодарили: 1 раз

#5 Сообщение 09.04.2010, 19:53

Хм дак мне же надо выделить место под структуру, а не под указатель, я и пытаюсь выделить 375, а потом вернуть указатель на эту память
Изображение

Morfin
Лейтенант
Лейтенант
Сообщения: 237
Зарегистрирован: 19.10.2007
Поблагодарили: 1 раз

#6 Сообщение 15.04.2010, 14:49

Еще один вопрос - как перегрузить std::string::append. В общем я юзал string &append(const char* string,...).
Изображение

nstrogg5
Сержант
Сержант
Сообщения: 73
Зарегистрирован: 27.04.2008

#7 Сообщение 29.06.2010, 22:43

ЕМНИП malloc deprecated в C++, юзай new.

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#8 Сообщение 30.06.2010, 00:13

nstrogg5 писал(а):ЕМНИП malloc deprecated в C++, юзай new.
ЧТОА? O_o

Fire666
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 2600
Зарегистрирован: 15.02.2007
Откуда: Москва
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

#9 Сообщение 30.06.2010, 00:24

nstrogg5 писал(а):ЕМНИП malloc deprecated в C++, юзай new.
гм, а разве можно через new выделять произвольный объем памяти ?

типа

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

char *test = (char *)malloc(512);
и
char *test = new(char[512]);
да и вообще имхо лучше без необходимости не выделять память таким образом

и писать, не

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

char *test = (char *)malloc(512);
а
char test[512];
да и память подчищать
memset( test, 0, sizeof(test) );
а выделение памяти через new и malloc в неправильных руках приводят к порче хипа и утечкам памяти.

п.с.
это я к посту nstrogg5, а не к коду в первом посте

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#10 Сообщение 30.06.2010, 10:48

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

char* p;
p = new char[10];
.......
delete [] p;
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#11 Сообщение 09.08.2010, 18:26

Pascal(Deplhi) я знаю более-менее, ну уж точно не нуб. На C++ писал программки на телефон(эльфы для SE, может кто знает)
Но в Visual C++ (2010 Express) совсем запутался.
Вот в Pascal есть тип string, а тут их целая куча, char'ы разные. и LPCTSTR и тп, System::string и другие. Как их конвертировать между собой?
И ещё как вывести сообщение(ShowMessage в Delphi).
И почему при использовании itoa выскакивает предупреждение?

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#12 Сообщение 09.08.2010, 18:30

GanGSISoft
Вот в Pascal есть тип string, а тут их целая куча, char'ы разные. и LPCTSTR и тп, System::string и другие. Как их конвертировать между собой?
Освоить приведение типов, конечно же.. А вообще, используй только char*. Не припомню случая, чтобы понадобился другой тип для строки.
И ещё как вывести сообщение(ShowMessage в Delphi).
printf?
И почему при использовании itoa выскакивает предупреждение?
Оно не "появляется", а намекает тебе на проблему. Прочитать пробовал?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#13 Сообщение 09.08.2010, 19:03

NiGHt-LEshiY писал(а):GanGSISoft
Вот в Pascal есть тип string, а тут их целая куча, char'ы разные. и LPCTSTR и тп, System::string и другие. Как их конвертировать между собой?
Освоить приведение типов, конечно же.. А вообще, используй только char*. Не припомню случая, чтобы понадобился другой тип для строки.
System::string используется в textBox1->Text и др. LPCTSTR в GetFullPathName, я ещё в этом не опытный и скачал готовую функцию поиска файлов, оно там использовалось.

Добавлено спустя 2 минуты 22 секунды:
NiGHt-LEshiY писал(а):
И почему при использовании itoa выскакивает предупреждение?
Оно не "появляется", а намекает тебе на проблему. Прочитать пробовал?
Читал, что то не совсем понятно

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

warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See online help for details.
1>          C:Program Files (x86)Microsoft Visual Studio 10.0VCincludestdlib.h(867): см. объявление "itoa"

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

	private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {

	char *sss;
	sss="1";
	itoa(1,sss,1);
              }
Добавлено спустя 11 минут 48 секунд:
И куда делить подсказки, когда вводиш textBox1-> или itoa(
Последний раз редактировалось GanGSISoft 09.08.2010, 18:53, всего редактировалось 2 раза.

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#14 Сообщение 09.08.2010, 19:10

Ты пытаешься сразу писать графические приложения с классами и прочей лабудой, толком не освоив языка.
Все надо делать постепенно, не спеши.
Читал, что то не совсем понятно
Теперь вместо itoa нужно писать _itoa, только и всего
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#15 Сообщение 09.08.2010, 19:22

NiGHt-LEshiY писал(а):Теперь вместо itoa нужно писать _itoa, только и всего
Пробовал. Тоже самое.
NiGHt-LEshiY писал(а):Ты пытаешься сразу писать графические приложения с классами и прочей лабудой, толком не освоив языка.
Все надо делать постепенно, не спеши.
Остальное то понятно, я уже писал на С++, основы программирования знаю, но вот эта "прочая лабуда" и не понятна

Добавлено спустя 1 минуту 57 секунд:
И printf это по моему для консольного приложения, а мне нужен MessageBox

Ответить