Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Потеря данных в массивах

9.4K
06 ноября 2007 года
1_Aposym_1
68 / / 01.11.2007
Всем привет кто сюда заглянул. Есть проблем с потерей данных переменной типа чар.
Вообщем есть в классе структура в структуру указатель на чар.
И когда я его заполняю таким образам;
Есть цикл большой
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”;
То все нормально работает.
Помогите этот маара . м побороть!
350
06 ноября 2007 года
cheburator
589 / / 01.06.2006
Оператором Core.Mat.pyt=g.c_str() ты выполняешь не копирование строки, а присвоение указателю pyt адреса строки, хранящейся в g. Как только переменной g будет присвоено другое значение, Core.Mat.pyt может также измениться, а то и вовсе стать невалидным указателем.

ИМХО, подобный код в редких случаях вполне применим и работоспособен, но здесь автор либо имел в виду копирование строки (тогда код надо писать другой), либо надо обеспечить, чтобы переменная g не менялась.

Короче, заменяем
 
Код:
Core.Mat.pyt=g.c_str()

на
 
Код:
Core.Mat.pyt = new char [strlen (g.c_str()) + 1];
strcpy (Core.Mat.pyt, g.c_str());

и нужно не забыть обеспечить освобождение выделенной памяти. Лучше всего это сделать в деструкторе структуры Mat (если честно, сдается мне, что это не структура, а массив).
Можно поступить проще, и pyt объявить не как char*, а как std::string, или тот же AnsiString. Тогда простое присваивание будет работать как положено:
 
Код:
Core.Mat.pyt=g;

А чтобы приведенный тобой код работал без изменений, следует обеспечить неизменность g до самого последнего обращения к Core.Mat.pyt. Тут уже надо смотреть твой полный код.
3
06 ноября 2007 года
Green
4.8K / / 20.01.2000
Ошибка вот здесь: Core.Mat.pyt=g.c_str()
Указатель, который возвращается c_str будет валиден лишь до следующей неконстантной операции с AnsiString, поэтому сохранять его нет смысла. Кроме того, в твоем коде получается, что все pyt указывают на одну область памяти.
Тебе надо копировать строку.
Вопрос: зачем ты используешь char* совместно с AnsiString? Почему бы не использовать этот строковый тип?
9.4K
07 ноября 2007 года
1_Aposym_1
68 / / 01.11.2007
chebyrator Изначально у меня было AnsiStrig pyt но я его изменил на чар из-за быстроты работы она не значительна но все таки разница есть, ”плюс конвертировать&#8221; ансистринг в чар тоже нужны ресурсы, не знаю может придется вернуться к ансистрингу?(
На счет Мат это массив структур
принципи стало ясно и на этом спаибо
9.4K
07 ноября 2007 года
1_Aposym_1
68 / / 01.11.2007
И еще одна проблемка связанная с массивом структур. Пишу функцию которая считывает мой файл. Там есть такие строки
Код:
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++;
&#8230;.
}

Короче говоря когда она первый раз заходит NamMO=0 выделяется память под один элемент Mini_Object затем происходит считывание ShowMessage выдает правильно
2-й раз я память еще больше выделяю NamMO=1 ShowMessage выдает шо попало.
Мне так кажется что проблема с выделением памяти. Если я не правильно делаю что то то подскажите
3
07 ноября 2007 года
Green
4.8K / / 20.01.2000
Цитата: 1_Aposym_1
chebyrator Изначально у меня было AnsiStrig pyt но я его изменил на чар из-за быстроты работы она не значительна но все таки разница есть,


Огромное заблуждение!
Два вопроса на засыпку:
1) как определил изменение скорости работы?
2) это самое "тонкое" место по быстродействию в твоей программе?

Цитата: 1_Aposym_1

”плюс конвертировать” ансистринг в чар тоже нужны ресурсы,


Лес? Уголь?
А зачем конвертировать?
С чего ты взял, что это трудоемкая операция?

350
07 ноября 2007 года
cheburator
589 / / 01.06.2006
Конвертирование AnsiString или std::string в const char* - это метод c_str(). Поверь, если не во всех, то в подавляющем большинстве платформ AnsiString/string физически хранят содержимое в виде собсно сишной строки (и сдается мне, что во всех), и метод c_str() просто возвращает внутренний указатель. Многие компиляторы соптимизируют вызов, и времени не потратится даже на сам вызов/возврат.
А плюсы этих классов - автоматическое управление (выделение и освобождение) занимаемой памяти.

Со вторым вопросом ничего не понятно.
Что такое MObject?
Что такое NamMO?
В чем смысл твоего кода?
Приведи более полный код с комментариями, зачем он нужен и что он должен делать.
9.4K
09 ноября 2007 года
1_Aposym_1
68 / / 01.11.2007
1)Green есть модуль, который включается к коду твоей программы dll_odk_tsk он и показывает скорость выполнения участка программы, кстати, можете скачать он очень удобный
2)Нет это не самое тонкое место в моей программе но чем плохо писать проги которые быстро работают)
насчет конвертирования, мне так так казалось теперь все ясно.

chebyrator NamMO-это счетчик типа int, MObject[NamMO] это массив структур
смысл кода:
Кто-нибудь знает, как выглядит представления данных в файле формата 3DS, оно идет виде блоков. Мой файл тоже имеет такую структуру. DSChunk_ID - ключ(0х100, 0х101,0х102,,,,) когда программа находит в файле его, соответственно выполнятся одно из множеств условий по обработки этих блоков. Блок с ключом 0х100 может быть 1,а может и 100, когда NamMO=0 выделяем память, еще находим такой блок, надо выделять еще памяти и т. д. И к большому щастью я эту проблему решил. Как я предполагал вся проблема была в выделении памяти.
3
09 ноября 2007 года
Green
4.8K / / 20.01.2000
Цитата: 1_Aposym_1
1)Green есть модуль, который включается к коду твоей программы dll_odk_tsk он и показывает скорость выполнения участка программы, кстати, можете скачать он очень удобный


К коду моей программы подключаются профайлеры: VTune, AQTime и т.п.

Цитата: 1_Aposym_1

2)Нет это не самое тонкое место в моей программе но чем плохо писать проги которые быстро работают)


Плохо писать проги, которые не работают.
Преждевременная оптимизация - зло. Оптимизация "на глаз" - двойное зло.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог