crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

AD
  опции профиля:
сообщение 5.8.2008, 18:40
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Что-то я не понимаю, что за ерунда происходит: делаю проверку на isNull(), на isEmpty() - все это компилятор проглатывает, а строка так и остается невалидной. При присвоении другой строке он вылетает. Как исправить это глюк?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 22)
trdm
  опции профиля:
сообщение 5.8.2008, 19:01
Сообщение #2


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Цитата(AD @ 5.8.2008, 19:40) *
Что-то я не понимаю, что за ерунда происходит: делаю проверку на isNull(), на isEmpty() - все это компилятор проглатывает, а строка так и остается невалидной. При присвоении другой строке он вылетает. Как исправить это глюк?

В каком смысле не валидной? битый указатель?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.8.2008, 19:03
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(trdm @ 5.8.2008, 20:01) *
В каком смысле не валидной? битый указатель?

Не указатель, а строка. на строке проверки на !isEmpty() ломается. При этом проверку на !isNull() прошла нормально!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 5.8.2008, 19:06
Сообщение #4


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


кодом поделись как сломать строку %)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.8.2008, 20:10
Сообщение #5


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


а ты вообще чувствуешь разницу между null и has no characters(empty)?
строка является null, когда использован конструктор по умолчанию, т.е.
QString()

а пустой(empty, has no characters) она является в таком случае:
QString("")

теперь понятно? :)


в твоем случае, ты скорее всего делал так:
QString("")

т.к. именно в этом случае isNull вернет false, а isEmpty - true
и получится: !isNull() == true, !isEmpty() == false

Сообщение отредактировал void* - 5.8.2008, 20:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.8.2008, 20:11
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AD @ 5.8.2008, 23:03) *
на строке проверки на !isEmpty() ломается

AD, что значит ломается? Программа аврийно завершается? Изъясняйся по проще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.8.2008, 20:14
Сообщение #7


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


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

Сообщение отредактировал void* - 5.8.2008, 20:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.8.2008, 20:18
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(void* @ 6.8.2008, 0:14) *
т.к. ты присваеваешь всякий мусор,

я может что-то пропустил, но про присвоение я непомню???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.8.2008, 20:21
Сообщение #9


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


именно что пропустил
Цитата(AD @ 5.8.2008, 18:40) *
При присвоении другой строке он вылетает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.8.2008, 20:24
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


с тех пор он уже вот что написал:
Цитата(AD @ 5.8.2008, 23:03) *
на строке проверки на !isEmpty() ломается

я так понимаю, что уже до присвоения что-то не так.
---
бум ждать ответа от AD
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.8.2008, 20:32
Сообщение #11


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


могу лишь еще предположить, что под словом "ломается" он имел ввиду возвращение выражением !isEmpty() значения false :)
ждем виновника торжества © :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.8.2008, 21:21
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вах! Сколько всего понаписали, е-мое! :) Ладно, все по порядку.
1) Я естественно знаю разницу между null and empty!
2) В конструкторе по-умолчанию я строке намеренно присвавиваю значение "", чтобы не было у меня неиницилизированной строки!
3) Ломается, вылетает - это значит, что при запуске на исполнение программа вылетает в дебаггер (если под ним запущена) или же выдает ошибку и выходит из программы (если без дебаггера)! Смысл в том, что на строчке, где я пытаюсь проверить значение на пустоту isEmpty(), он вылетает. В дебаггере видно, что строка какая-то некорректная, но при этом он не считает ее за null! Завтра могу прислать картинку, как видно эту строку в дебаге!
4) Сижу за компом не у себя дома и не на работе, а тут одностроковые строчки кода, почему-то не видны! :blink: (Багира, опять я тебя мучить буду? :) )

Сообщение отредактировал Багира - 2.6.2017, 23:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.8.2008, 21:36
Сообщение #13


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


тогда код в студию, гадание на кофейной гуще нынче не в моде :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.8.2008, 0:15
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(void* @ 5.8.2008, 22:36) *
тогда код в студию, гадание на кофейной гуще нынче не в моде :)

Да код обычный, где-то строка создается с пустым значением. Где-то ей присваивается значение. А где-то используется. Вот там, где используется, там и ломается программа!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 6.8.2008, 7:13
Сообщение #15


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


2 AD
Скорее всего строка тут не причём. :)
Подобные вещи происходят тогда, когда ты разрушил память - кучу или стек.
Например вылетел за границы массива, дважды удалил один и тот же объект, или просто поработал по неинециализированному указателю.
Вот программа и валится в самых неожиданных местах.

2 void*
Если конструктор вызвался - объект уже инициализирован.
В QString() все данные корректно инициализируются, так что мусора там быть не может. Кроме случаев удара по памяти. :)

Сообщение отредактировал Tonal - 6.8.2008, 7:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.8.2008, 8:28
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 6.8.2008, 8:13) *
2 AD
Скорее всего строка тут не причём. :)
Подобные вещи происходят тогда, когда ты разрушил память - кучу или стек.
Например вылетел за границы массива, дважды удалил один и тот же объект, или просто поработал по неинециализированному указателю.
Вот программа и валится в самых неожиданных местах.

да я и указатель проверяю, естественно. Он в этот момент валидный, а строка почему-то нет! :(
Вот так это выглядит в дебаггере:
[attachment=164:debugger.JPG]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.8.2008, 9:07
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 6.8.2008, 8:13) *
2 AD
Скорее всего строка тут не причём. :)
Подобные вещи происходят тогда, когда ты разрушил память - кучу или стек.
Например вылетел за границы массива, дважды удалил один и тот же объект, или просто поработал по неинециализированному указателю.
Вот программа и валится в самых неожиданных местах.

Проблема решена.
Tonal, был прав! :) У меня в указателе самом лежал мусор! При обнулении указателя такое перестало происходить!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 6.8.2008, 9:50
Сообщение #18


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


(17)
Типа:
QString* str;
if (str->isEmpty()) {
трах-бабах.....
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.8.2008, 10:29
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(trdm @ 6.8.2008, 10:50) *
(17)
Типа:
QString* str;
if (str->isEmpty()) {
трах-бабах.....
}

Нет совсем не то! Вот так:

struct HARDEVENT
{
         int address;
         QString ev_name;
         HARDEVENT(): address(0), ev_name("") {}
         HARDEVENT(const HARDEVENT& ev): address(ev.address), ev_name(ev.ev_name) {}
};

// где-то
HARDEVENT* hard_event;

// еще где-то
void setHardEvent(HARDEVENT* evn)
{ 
      hard_event = (evn == 0) ? 0 : new HARDEVENT(evn);
}

// И в итоге - но этот set выполняется только при некоторых условиях
//  а в других случаях в hard_event и не нулевой указатель, и не корректное значение
// evn != 0
setHardEvent(evn);


/* а надо было перед этим сделать такое действие*/
hard_event = 0;


Сообщение отредактировал AD - 6.8.2008, 10:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.8.2008, 12:57
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Виноват, забыл написать еще один момент: вылетало при использовании hard_event
if(hard_event != 0)
{
     if(!hard_event -> ev_name.isNull())
    {
         if(!hard_event -> ev_name.isEmpty())    // вот на этой строке как-раз и вылетал
         {
                  // что-то делается
         }
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 6.8.2008, 13:25
Сообщение #21


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


1) Плохо использовать глобальные переменные.
2) Совсем плохо не инициализировать переменные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.8.2008, 13:38
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 6.8.2008, 14:25) *
1) Плохо использовать глобальные переменные.
2) Совсем плохо не инициализировать переменные.

1) Приведенный пример далек от программы. Я не использую глобальных переменных
2) А с инициализацией - это да! Проблема в том, что не могу конструктор создать. Нельзя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 7.8.2008, 7:34
Сообщение #23


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(AD @ 6.8.2008, 17:38) *
2) А с инициализацией - это да! Проблема в том, что не могу конструктор создать. Нельзя.

Серый волк не даёт? :o:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.6.2025, 10:21