Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как это можно переделать с С на С++? заменить malloc на new 
V
    Опции темы
ksili
Дата 30.10.2009, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Работаю с TAPI. Там для получения информации о звонке используется  функция lineGetCallInfo, которой передаётся указатель на структуру типа LINECALLINFO. Дело в том, что размер структуры может оказатьяс разный, поэтому в этой же структуре содержится её размер. При вызове функции, если выделенного рамера под структуру не хватает, то она возвращается с соответствующей ошибкой, а в специальном поле структуры содержится необходимый размер. Надо заново выделить память уже нужного размера, и опять вызвать функцию. На С это делается так:

Код

HCALL hCall;
LINECALLINFO *plci;

plci=(LPLINECALLINFO)malloc(1000);
plci->dwTotalSize = sizeof(LINECALLINFO);
lineGetCallInfo(hCall,plci);

if(plci->dwNeededSize > plci->dwTotalSize)
{
    size = plci->dwNeededSize;
    free (plci);
    plci=(LPLINECALLINFO)malloc(size+100);    // ещё с запасом выделяем, чтобы в 3-й раз не пришлось выделять
    plci->dwTotalSize = size+100;
    lineGetCallInfo(hCall,plci);
}

...

free(plci);


Пытался сначала сделать это при помощи new и delete, но что-то не получилось. Может кто-нибудь знает как?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Andrey44
Дата 30.10.2009, 09:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Код

HCALL hCall;
LINECALLINFO *plci;
plci=new LINECALLINFO;
plci->dwTotalSize = sizeof(LINECALLINFO);
lineGetCallInfo(hCall,plci);
if(plci->dwNeededSize > plci->dwTotalSize)
{
    size = plci->dwNeededSize;
    delete plci;
    plci = (LPLINECALLINFO)new char[size+100];    // ещё с запасом выделяем, чтобы в 3-й раз не пришлось выделять
    plci->dwTotalSize = size+100;
    lineGetCallInfo(hCall,plci);
}
...
delete plci;

Хотя все это как-то............не правильно


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 30.10.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Код

struct LINECALLINFO2 : public LINECALLINFO {
 void* operator new(size_t sz, size_t add=0) {return new char[sz+add];}
 void operator delete(void* p) {delete[] (char*)p;}
};

CALL hCall;
LINECALLINFO2 *plci = new LINECALLINFO2;
plci->dwTotalSize = sizeof(LINECALLINFO);
lineGetCallInfo(hCall,plci);
if(plci->dwNeededSize > plci->dwTotalSize)
{
    size = plci->dwNeededSize;
    delete plci;
    plci = new (size+100) LINECALLINFO2;
    plci->dwTotalSize = size+100;
    lineGetCallInfo(hCall,plci);
}
...
delete plci;

PM MAIL   Вверх
ksili
Дата 30.10.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(Andrey44 @  30.10.2009,  13:41 Найти цитируемый пост)
Хотя все это как-то............не правильно

Согласен, некрасиво выглядит.

Да, я так и думал, что через new char придётся делать. Просто надеялся, а вдруг без этого возможно?

Всем спасибо.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
xvr
Дата 30.10.2009, 16:25 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Предыдущий пост видел?  smile 
 
PM MAIL   Вверх
ksili
Дата 30.10.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(xvr @  30.10.2009,  20:25 Найти цитируемый пост)
Предыдущий пост видел?

видел, new char там есть  smile 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
xvr
Дата 30.10.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(ksili @ 30.10.2009,  21:34)
Цитата(xvr @  30.10.2009,  20:25 Найти цитируемый пост)
Предыдущий пост видел?

видел, new char там есть  smile

Есть, только используется он по другому. (так как положено)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.