crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Qt и mysql++ (ошибка сегментирования), Ошибка сегментирования при запуске проекта
tin_gimranoff
  опции профиля:
сообщение 19.10.2010, 17:28
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 19.10.2010
Пользователь №: 2127

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




Репутация:   0  


Всем доброго времени суток. Помогите плз... пишу вот такой код:
void new_connect::on_CheckButton_clicked()
{
    const char* HostName = this->ConvertToChar(ui->HostName->text());
    const char* UserName = this->ConvertToChar(ui->UserName->text());
    const char* UserPass = this->ConvertToChar(ui->UserPass->text());
    int DataBasePort = ui->PortNumber->text().toInt();

    mysqlpp::Connection test_connect;

    if(!test_connect.connect("information_schema", HostName, UserName, UserPass, DataBasePort))
    {
       //код

    }
    else
    {
       //код
    }

}


И когда дело доходит до этого события то проект вылетает вместе с QtCreator'ом с ошибкой сегментирования. Причём точно знаю что ошибку вызывает строка
if(!test_connect.connect("information_schema", HostName, UserName, UserPass, DataBasePort))

Почему так происходит, объясните плз, и как это дело исправить?

Заранее СПС!!!!
Причина редактирования: пользуйся тегами
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 19.10.2010, 19:18
Сообщение #2


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(tin_gimranoff @ 19.10.2010, 20:28) *
проект вылетает вместе с QtCreator'ом

прям с креатором ? Сильно! Пиши разработчикам о глюке :)


а так если
if(!test_connect.connect("information_schema", ui->HostName->text(), ui->UserName->text(), ui->UserPass->text(), DataBasePort))

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tin_gimranoff
  опции профиля:
сообщение 19.10.2010, 22:37
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 19.10.2010
Пользователь №: 2127

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




Репутация:   0  


Цитата(Алексей1153 @ 19.10.2010, 20:18) *
Цитата(tin_gimranoff @ 19.10.2010, 20:28) *
проект вылетает вместе с QtCreator'ом

прям с креатором ? Сильно! Пиши разработчикам о глюке :)


а так если
if(!test_connect.connect("information_schema", ui->HostName->text(), ui->UserName->text(), ui->UserPass->text(), DataBasePort))





А так он ругается вообще на несовместимость типов, т.к. connect требует в качестве аргументов const* char, а в QT объекты обрабатывают строки как я понимаю в QString


А вообще мне надо заюзать под Linux QT и законектиться к базе. Я нашёл тока mysql++ может быть есть ещё что нить для плюсов для работы с базами?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.10.2010, 6:02
Сообщение #4


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


tin_gimranoff, а ты уверен, что косяк именно в этом месте ? А вот сделай так (это исключает наличие ошибки в этом месте):
if(!test_connect.connect("information_schema", "localhost","имяюзера","парольюзера", DataBasePort))


Цитата(tin_gimranoff @ 20.10.2010, 1:37) *
и законектиться к базе.

тип базы - ? От способ подключения к базе не зависит от языка программирования
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 20.10.2010, 7:10
Сообщение #5


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(tin_gimranoff @ 19.10.2010, 23:37) *
А вообще мне надо заюзать под Linux QT и законектиться к базе. Я нашёл тока mysql++ может быть есть ещё что нить для плюсов для работы с базами?

А документацию по Qt почитать не получилось? ... на тему "QtSql Module"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tin_gimranoff
  опции профиля:
сообщение 20.10.2010, 10:16
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 19.10.2010
Пользователь №: 2127

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




Репутация:   0  


[quote name='Алексей1153' date='20.10.2010, 7:02' post='41509']
tin_gimranoff, а ты уверен, что косяк именно в этом месте ? А вот сделай так (это исключает наличие ошибки в этом месте):
if(!test_connect.connect("information_schema", "localhost","имяюзера","парольюзера", DataBasePort))


Так пробовал работает. Но стоит вместо статических значений запихнуть переменные, вылетает, соответственно ошибка именно в этой строке.



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.10.2010, 10:21
Сообщение #7


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


tin_gimranoff, это потому, что сохраняешь указатель на локальные данные

ошибка тут
    const char* HostName = this->ConvertToChar(ui->HostName->text()); 
    const char* UserName = this->ConvertToChar(ui->UserName->text());
    const char* UserPass = this->ConvertToChar(ui->UserPass->text());


text() возвращает QString, созданный на стеке. Ты берёшь адрес начала данных. Затем, по выходу из функции объект убивается, а указатель указывает на невалидные данные - и где-то потом, в обработчике сообщения кто-то пытается получить доступ к этому мусору

тут выход такой:сделать

QString HostName
QString UserName
QString UserPass

членами класса (new_connect , например) . Можно даже в одну структурку их определить. Так решится проблема потери валидности данных
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tin_gimranoff
  опции профиля:
сообщение 20.10.2010, 10:27
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 19.10.2010
Пользователь №: 2127

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




Репутация:   0  


Цитата(BRE @ 20.10.2010, 8:10) *
Цитата(tin_gimranoff @ 19.10.2010, 23:37) *
А вообще мне надо заюзать под Linux QT и законектиться к базе. Я нашёл тока mysql++ может быть есть ещё что нить для плюсов для работы с базами?

А документацию по Qt почитать не получилось? ... на тему "QtSql Module"




Спс, как раз вчера пересобрал Qt c поддержкой этого модуля. Просто первое что я нашёл это было MySQL++ и решил поюзать его.

Цитата(Алексей1153 @ 20.10.2010, 11:21) *
tin_gimranoff, это потому, что сохраняешь указатель на локальные данные

ошибка тут
    const char* HostName = this->ConvertToChar(ui->HostName->text()); 
    const char* UserName = this->ConvertToChar(ui->UserName->text());
    const char* UserPass = this->ConvertToChar(ui->UserPass->text());


text() возвращает QString, созданный на стеке. Ты берёшь адрес начала данных. Затем, по выходу из функции объект убивается, а указатель указывает на невалидные данные - и где-то потом, в обработчике сообщения кто-то пытается получить доступ к этому мусору

тут выход такой:сделать

QString HostName
QString UserName
QString UserPass

членами класса (new_connect , например) . Можно даже в одну структурку их определить. Так решится проблема потери валидности данных



Спс, сегодня попробую, если получится то буду юзаться всё же Mysql++ вместо QtSql
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 15:55