Потеря данных в массивах
Вообщем есть в классе структура в структуру указатель на чар.
И когда я его заполняю таким образам;
Есть цикл большой
Core- класс
Mat-структура
char *pyt-путь либо любая фраза
AnsiString g=”C:\\IP_PROGS\\QFTP1\\teremok.bok”:
for(int i=0;i<3;i++)
{
Core.Mat.pyt=g.c_str()
….
Вот тут чудеса происходят
Memo1->Lines->Add(Core.Mat.pyt); //все нормально
}
Memo1->Lines->Add(Core.Mat[0].pyt); //тут в конце исчезает символ
К вот результат программы:
C:\\IP_PROGS\\QFTP1\\teremok.bok
C:\\IP_PROGS\\QFTP1\\teremok.bo,
И к стати запятая что в конце она непостоянна вчера к примеру была L или просто последний знак отсутствовал k. А если так сделать Core.Mat.pyt=”C:\\IP_PROGS\\QFTP1\\teremok.bok”;
То все нормально работает.
Помогите этот маара . м побороть!
ИМХО, подобный код в редких случаях вполне применим и работоспособен, но здесь автор либо имел в виду копирование строки (тогда код надо писать другой), либо надо обеспечить, чтобы переменная g не менялась.
Короче, заменяем
Код:
Core.Mat.pyt=g.c_str()
на
Код:
Core.Mat.pyt = new char [strlen (g.c_str()) + 1];
strcpy (Core.Mat.pyt, g.c_str());
strcpy (Core.Mat.pyt, g.c_str());
и нужно не забыть обеспечить освобождение выделенной памяти. Лучше всего это сделать в деструкторе структуры Mat (если честно, сдается мне, что это не структура, а массив).
Можно поступить проще, и pyt объявить не как char*, а как std::string, или тот же AnsiString. Тогда простое присваивание будет работать как положено:
Код:
Core.Mat.pyt=g;
А чтобы приведенный тобой код работал без изменений, следует обеспечить неизменность g до самого последнего обращения к Core.Mat.pyt. Тут уже надо смотреть твой полный код.
Указатель, который возвращается c_str будет валиден лишь до следующей неконстантной операции с AnsiString, поэтому сохранять его нет смысла. Кроме того, в твоем коде получается, что все pyt указывают на одну область памяти.
Тебе надо копировать строку.
Вопрос: зачем ты используешь char* совместно с AnsiString? Почему бы не использовать этот строковый тип?
На счет Мат это массив структур
принципи стало ясно и на этом спаибо
Код:
while (ftell (MY_FILE) < filelength (fileno (MY_FILE)))
{
fread (&DSChunk_ID, sizeof(unsigned short), 1, MY_FILE);
switch (DSChunk_ID)
{
case 0x100:
if(NamMO==0)
MObject=new Mini_Object [1];
else
MObject =(Mini_Object*)realloc(MObject,(NamMO+1)*sizeof(Mini_Object));
PoligonObjectRead(&MObject[NamMO].object,MY_FILE);
ShowMessage(FloatToStr(MObject[0].object.Model.Ver[0].x)+" X0");
NamMO++;
….
}
{
fread (&DSChunk_ID, sizeof(unsigned short), 1, MY_FILE);
switch (DSChunk_ID)
{
case 0x100:
if(NamMO==0)
MObject=new Mini_Object [1];
else
MObject =(Mini_Object*)realloc(MObject,(NamMO+1)*sizeof(Mini_Object));
PoligonObjectRead(&MObject[NamMO].object,MY_FILE);
ShowMessage(FloatToStr(MObject[0].object.Model.Ver[0].x)+" X0");
NamMO++;
….
}
Короче говоря когда она первый раз заходит NamMO=0 выделяется память под один элемент Mini_Object затем происходит считывание ShowMessage выдает правильно
2-й раз я память еще больше выделяю NamMO=1 ShowMessage выдает шо попало.
Мне так кажется что проблема с выделением памяти. Если я не правильно делаю что то то подскажите
Цитата: 1_Aposym_1
chebyrator Изначально у меня было AnsiStrig pyt но я его изменил на чар из-за быстроты работы она не значительна но все таки разница есть,
Огромное заблуждение!
Два вопроса на засыпку:
1) как определил изменение скорости работы?
2) это самое "тонкое" место по быстродействию в твоей программе?
Цитата: 1_Aposym_1
”плюс конвертировать” ансистринг в чар тоже нужны ресурсы,
Лес? Уголь?
А зачем конвертировать?
С чего ты взял, что это трудоемкая операция?
А плюсы этих классов - автоматическое управление (выделение и освобождение) занимаемой памяти.
Со вторым вопросом ничего не понятно.
Что такое MObject?
Что такое NamMO?
В чем смысл твоего кода?
Приведи более полный код с комментариями, зачем он нужен и что он должен делать.
2)Нет это не самое тонкое место в моей программе но чем плохо писать проги которые быстро работают)
насчет конвертирования, мне так так казалось теперь все ясно.
chebyrator NamMO-это счетчик типа int, MObject[NamMO] это массив структур
смысл кода:
Кто-нибудь знает, как выглядит представления данных в файле формата 3DS, оно идет виде блоков. Мой файл тоже имеет такую структуру. DSChunk_ID - ключ(0х100, 0х101,0х102,,,,) когда программа находит в файле его, соответственно выполнятся одно из множеств условий по обработки этих блоков. Блок с ключом 0х100 может быть 1,а может и 100, когда NamMO=0 выделяем память, еще находим такой блок, надо выделять еще памяти и т. д. И к большому щастью я эту проблему решил. Как я предполагал вся проблема была в выделении памяти.
Цитата: 1_Aposym_1
1)Green есть модуль, который включается к коду твоей программы dll_odk_tsk он и показывает скорость выполнения участка программы, кстати, можете скачать он очень удобный
К коду моей программы подключаются профайлеры: VTune, AQTime и т.п.
Цитата: 1_Aposym_1
2)Нет это не самое тонкое место в моей программе но чем плохо писать проги которые быстро работают)
Плохо писать проги, которые не работают.
Преждевременная оптимизация - зло. Оптимизация "на глаз" - двойное зло.