C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (2) < 1 [2] >
Разбивка строки на элементы, вероятно, есть ошибка при работе с памятью
Dimon.Ru
Отправлено: 01.09.2005, 13:12


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (Asher @ 31/08/2005, 17:59)
Привет.
Если тема еще интерсна, то есть еще вариант.
CODE

AnsiString s = "";
TStringList* psl = new TStringList();
psl->Delimiter = ';';
psl->DelimitedText = "195.2;11;154.254;-52;10;-544;1451;28";
int itEnd = psl->Count;
for(int itPos = 0; itPos < itEnd; ++itPos)//
s = psl->Strings[itPos];

Все само работает. biggrin.gif
Из минусов — завязка на VCL

P.S. <tpjgfcyjt преобразование в численные значения — отдельная тема

спасибо, но у меня builder5
gvg
Отправлено: 01.09.2005, 16:56


Машинист паровоза

Группа: Участник
Сообщений: 222



Создать массив в этой функции и вернуть указатель на него при выходе. Потом удалить. Если ошибка — возвращать NULL
vvoid
Отправлено: 01.09.2005, 17:17


Машинист паровоза

Группа: Участник
Сообщений: 171



А ошибка в твоём коде похоже была здесь (дальше я не смотрел — решил сразу написать, чтоб не забыть ;-) ):
CODE

//Выделяем память
result = new char *[kolvo];
for (d=0; d<kolvo; d++)
 result[d] = new char [leng];

Дело в том, что у тебя, есля я всё правильно понял, leng — количество букв в подстроке, а каждая строка в С/С++, как известно, заканчивается байтом 0х00 (\0), для которого тоже нужна память. Один байт это конечно не много, но возможно при определённых обстоятельствах это и приводило к AccessViolation.

PS* Я понимаю, что тут уже было предложено множество вариантов решения задачи, но думаю, что изложенная мной информация может быть полезной при дальнейшем программировании.
Dimon.Ru
Отправлено: 02.09.2005, 09:06


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (vvoid @ 01/09/2005, 17:17)
А ошибка в твоём коде похоже была здесь (дальше я не смотрел — решил сразу написать, чтоб не забыть ;-) ):
CODE

//Выделяем память
result = new char *[kolvo];
for (d=0; d<kolvo; d++)
result[d] = new char [leng];

Дело в том, что у тебя, есля я всё правильно понял, leng — количество букв в подстроке, а каждая строка в С/С++, как известно, заканчивается байтом 0х00 (\0), для которого тоже нужна память. Один байт это конечно не много, но возможно при определённых обстоятельствах это и приводило к AccessViolation.

PS* Я понимаю, что тут уже было предложено множество вариантов решения задачи, но думаю, что изложенная мной информация может быть полезной при дальнейшем программировании.

Да, ошибка была именно здесь smile.gif))
я ее уже исправил smile.gif)

спасибо!
Dimon.Ru
Отправлено: 02.09.2005, 09:10


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (gvg @ 01/09/2005, 16:56)
Создать массив в этой функции и вернуть указатель на него при выходе. Потом удалить. Если ошибка — возвращать NULL

есть одна проблема. сейчас эта функция вызывается... как бы это сказать-то...

короче говоря, я планирую вызывать эту функцию из dll.

как правильно выделять память в этом случае?

ведь если я ее выделил в длл, то и освободить должен там же. ведь так?

а использовать-то массив надо бы в самой программе...
vvoid
Отправлено: 02.09.2005, 14:20


Машинист паровоза

Группа: Участник
Сообщений: 171



Можно сделать, что-то по типу того, как у Microsoft-a во многих случаях сделано:
1. ты передаёшь в функцию буфер и его размер (точнее указатель на целочисленную переменную, которая содержит размер), если размера недостаточно — функция возвращает определённый код ошибки и необходимый размер буфера.
2. если в предоставленного буфера хватает (то есть он больше или равен необходимому), то выполняются необходимые действия и возвращается точный размер ЗАПОЛНЕНОГО буфера
3. если вместо указателя на буфер передаёся NULL, то функция возвращает необходимый размер буфера.

Реализовывать это на первый взгляд достаточно муторно, но если ты это всё формируешь в библиотеку в её прямом понимании (не для хука например), то такой подход может оказаться полезным
Dimon.Ru
Отправлено: 05.09.2005, 11:08


Станционный диспетчер

Группа: Участник
Сообщений: 92



спасибо, vvoid!
попробую сделать именно так!
стр.: (2) < 1 [2] >
Вернуться в Вопросы программирования в C++Builder