работа с class |
Здравствуйте, гость ( Вход | Регистрация )
работа с class |
astra |
7.2.2014, 14:45
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 7.2.2014 Пользователь №: 4050 Спасибо сказали: 0 раз(а) Репутация: 0 |
Не хотел создавать тему, но пришлось...
реализую вот такие вещи (черновичок - отладка алгоритма): *.h Раскрывающийся текст
*.cpp Раскрывающийся текст
с помощью лингвиста перевожу... и на выходе получаю "строка3строка3строка3строка3" а должно присваиваться "строка0строка1строка2строка3". укажите на мои ошибки. благодарю |
|
|
crot26rus |
7.2.2014, 22:19
Сообщение
#2
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 4.4.2010 Пользователь №: 1593 Спасибо сказали: 5 раз(а) Репутация: 0 |
вот здесь твои ошибки:
toUtf8() создаёт QByteArray, в котором хранятся данные и на каждой следующей строчке старый объект удаляется и создаётся новый. В итоге все указатели хранят один и тот же адрес и указывают на область памяти, которая уже освобождена (теперь там хранится мусор: последние записанные туда данные). P.S. может я не совсем правильно описал происходящие процессы (знающих людей прошу поправить), но надеюсь моя мысль понятна. |
|
|
astra |
8.2.2014, 0:08
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 7.2.2014 Пользователь №: 4050 Спасибо сказали: 0 раз(а) Репутация: 0 |
crot26rus,
Благодарю, скорей всего ты прав, не догадался об этом... решил сей вопрос: Раскрывающийся текст
но что то внешне как-то громоздко получается... у меня будет намного больше строк. Не знаю стоит ли здесь задавать этот вопрос, или перенесите тему в нужный подфорум, но вопрос таков: "есть ли более изящное решение ?" |
|
|
ilyabvt |
8.2.2014, 7:34
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: 3 |
Если говорить о старом коде то можно сделать так:
Вся проблема в том что в старом коде шло копирование указателей, а не строк. "str0.toUtf8 ()" создает временный объект который после выражения будет уничтожен. Соответственно нужно скопировать строку, а не ее адрес. А перед эти еще и выделить достаточно памяти. Т.е. mesblock0 должен быть либо массивом достаточного размера, либо в конструкторе messageBlock нужно выделять память из кучи. Учитывая дополнительные операции выделения/освобождения памяти, такое решение трудно будет назвать изящным.Цитата mesblock0 = array0.data (); mesblock1 = array1.data (); mesblock2 = array2.data (); mesblock3 = array3.data (); Ну и смысл в этом коде? Тут прямой ошибки нет, но зачем лишний указатель. Используйте тогда уж везде "array0.data ()" типа такого:
Тогда кстати не придется забивать голову выделением памяти. P.S. QByteArray в данном контексте тоже в принципе не обязателен. Можно сделать так:
Сообщение отредактировал ilyabvt - 8.2.2014, 7:53 |
|
|
astra |
8.2.2014, 9:41
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 7.2.2014 Пользователь №: 4050 Спасибо сказали: 0 раз(а) Репутация: 0 |
ilyabvt, Спасибо я рассмотрю, предложенный тобой вариант. =)
|
|
|
ViGOur |
10.2.2014, 13:28
Сообщение
#6
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
А еще неплохо было бы оптимизировать твой код, примерно так:
Код
|
|
|
astra |
11.2.2014, 21:28
Сообщение
#7
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 7.2.2014 Пользователь №: 4050 Спасибо сказали: 0 раз(а) Репутация: 0 |
ViGOur, ооо я благодарю тебя за оптимизацию, но я думал как бы это сделать, но у меня задача в том что будет около 14-18 строк с разной информацией, грубо говорят по выполнению моей бооольшой программы, у меня создается внешний файл с инфой, а этот пример- промакашка(проба способов использования Qtlinguist).
|
|
|
astra |
13.2.2014, 10:02
Сообщение
#8
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 7.2.2014 Пользователь №: 4050 Спасибо сказали: 0 раз(а) Репутация: 0 |
не учел детали основного кода, не могу разобраться, схема такая
Раскрывающийся текст
Раскрывающийся текст
Раскрывающийся текст
ошибка вот такая : main.cpp: In function 'int main(int, char**)': main.cpp:32:41: error: parameter 2 of 'void PrintfMessageFile(char*, MSgblk)' has incomplete type 'MSgblk' Не очень понимаю ошибку. Вообще как лучше сделать в данной ситуации? |
|
|
crot26rus |
13.2.2014, 12:58
Сообщение
#9
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 4.4.2010 Пользователь №: 1593 Спасибо сказали: 5 раз(а) Репутация: 0 |
Цитата void PrintfMessageFile (char *fileOut, class MSgblk) должно быть, например, так: Цитата void PrintfMessageFile (char *fileOut, const MSgblk& blk) { fdd= fopen ( fileOut , "wt"); fprintf ( fdd, blk.mesblock0 ); /// ... flose(fdd); } Цитата void PrintfMessageFile (char *fileOut, class MSgblk) должно быть, например, так: Цитата void PrintfMessageFile (char *fileOut, const MSgblk& blk) { fdd= fopen ( fileOut , "wt"); fprintf ( fdd, blk.mesblock0 ); /// ... flose(fdd); } Поторопился, вот правильный вариант:
|
|
|
Текстовая версия | Сейчас: 2.1.2025, 21:27 |