crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Странное поведение программы, Вылетает программа
Гость_Гость_berserk_*_*
сообщение 7.7.2009, 21:52
Сообщение #1





Гости








    


Привет всем!
Пишу программу для работы с последовательным портом. в программе 3 класса. Первый работает непосредственно с портом, второй - форма, 3 ий для разбора полученной инфы.
В программе есть платформозависимый код (в классе работы с портом)

Первый прикол случился когда я в заголовочном файле объявил переменные в определённой последовательности))) притом в линуксе всё работало, а в винде на экран пёрли смайлики))). Долго ломал голову, поменял местами 2 объявления переменных и всё заработало.
так работало только в линуксе, в винде были смайлики:

private:
    bool state;
    char* buff;
    QString str;
#ifdef Q_WS_WIN
    WCHAR* port;
    DCB dcb;
    HANDLE COM;
    DWORD dwByteRead;
    COMMTIMEOUTS touts;
#endif

#ifdef Q_WS_X11
    int fd;
    struct termios options;
    QFile file;
#endif


а так работало везде
private:
#ifdef Q_WS_WIN
    WCHAR* port;
    DCB dcb;
    HANDLE COM;
    DWORD dwByteRead;
    COMMTIMEOUTS touts;
#endif

#ifdef Q_WS_X11
    int fd;
    struct termios options;
    QFile file;
#endif
    bool state;
    char* buff;
    QString str;

buff переменная в которую пихались байты с порта, а затем выводились на экран, так вот если по первому коду после объявления buff объявлял что нибудь ещё, то в винде было смайлы)))

второе.
Сегодня на работе добавил 3 класс в котором разбирается строка прочитанная с порта.

#ifndef WRITESQL_H
#define WRITESQL_H

#include <QObject>

class writesql : public QObject
{
    Q_OBJECT

public:
    writesql();

public slots:
    void get_string(QString str);
};

#endif // WRITESQL_H

#include "writesql.h"

writesql::writesql()
{

}

void writesql::get_string(QString str)
{
    int i = 0, a = 0;
    QString temp_str;
    for(i; i <= str.size(); i++)
    {
        if (str.at(i) == ' ')
        {
            temp_str = str.mid(a, i-a);
            a = i+1;
        }
    }
}

В винде всё компилируется и работает, а в линуксе программа вылетает при чтении данных с порта. При этом если 3 класс не наследует QObject или его потомков то всё работает (ну кроме сигналов и слотов которые нужны)

подозреваю что косяк с #ifdef Q_WS_WIN/#ifdef Q_WS_X11

кто что понял с моих слов помогите плиз)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.7.2009, 21:59
Сообщение #2


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

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

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




Репутация:   94  


Цитата(Гость_Гость_berserk_*_* @ 8.7.2009, 1:52) *
притом в линуксе всё работало, а в винде на экран пёрли смайлики))).
скорее всего дело в кодировке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 7.7.2009, 22:01
Сообщение #3


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

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

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




Репутация:   44  


Ты бы показал как с buff работаешь.
Что-то мне подсказывает, что ты память затираешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.7.2009, 22:02
Сообщение #4


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

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

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




Репутация:   94  


Цитата(Гость_Гость_berserk_*_* @ 8.7.2009, 1:52) *
for(i; i <= str.size(); i++)
Цитата(Гость_Гость_berserk_*_* @ 8.7.2009, 1:52) *
if (str.at(i) == ' ')
ты вылазишь на одну позицию за перделы строки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.7.2009, 23:55
Сообщение #5


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Гость_Гость_berserk_*_* @ 7.7.2009, 22:52) *
Первый прикол случился когда я в заголовочном файле объявил переменные в определённой последовательности))) притом в линуксе всё работало, а в винде на экран пёрли смайлики))).


Дай угадаю. В винде используется вижуал, в линуксе gcc?

for(i; i <= str.size(); i++)


Тут я бы еще понял, если бы переменная i начиналась в 1-цы. При твоем раскладе цикл выполнится 11 раз, если в строке 10 символов.

Сообщение отредактировал SABROG - 7.7.2009, 23:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
berserk
  опции профиля:
сообщение 8.7.2009, 7:30
Сообщение #6


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 7.7.2009, 22:59) *
Цитата(Гость_Гость_berserk_*_* @ 8.7.2009, 1:52) *
притом в линуксе всё работало, а в винде на экран пёрли смайлики))).
скорее всего дело в кодировке.


а как кодировка может повлиять на порядок определения переменных?

Цитата(BRE @ 7.7.2009, 23:01) *
Ты бы показал как с buff работаешь.
Что-то мне подсказывает, что ты память затираешь.

void comport::read_byte()
{
#ifdef Q_WS_WIN
    ReadFile(COM, buff, 1, &dwByteRead, NULL);
    if (*buff != '\n')
    {
        str = str + *buff;

    }
    if (*buff == '\n')
    {
        emit read_data(str);
        str = "";
    }
    //CloseHandle(COM);
#endif
#ifdef Q_WS_X11
    file.readLine(buff, 2);
    //sleep(1);
    cout << buff;
    if (*buff != '\n')
    {
        str = str + *buff;

    }
    if (*buff == '\n')
    {
        emit read_data(str);
        str = "";
    }
#endif
}




Цитата(SABROG @ 8.7.2009, 0:55) *
Цитата(Гость_Гость_berserk_*_* @ 7.7.2009, 22:52) *
Первый прикол случился когда я в заголовочном файле объявил переменные в определённой последовательности))) притом в линуксе всё работало, а в винде на экран пёрли смайлики))).


Дай угадаю. В винде используется вижуал, в линуксе gcc?

for(i; i <= str.size(); i++)


Тут я бы еще понял, если бы переменная i начиналась в 1-цы. При твоем раскладе цикл выполнится 11 раз, если в строке 10 символов.


в винде mingw
с циклом согласен, день был тяжёлый...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_kuzulis_*_*
сообщение 8.7.2009, 7:44
Сообщение #7





Гости








    


Цитата
Первый прикол случился когда я в заголовочном файле объявил переменные в определённой последовательности))) притом в линуксе всё работало, а в винде на экран пёрли смайлики))).


а как вывод происходил? код в студию!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.7.2009, 7:52
Сообщение #8


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

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

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




Репутация:   44  


А куда buff указывает? Где память для него выделяется?

Код
if (*buff != '\n')
{
    str = str + *buff;
}
if (*buff == '\n')    // Здесь else не подходит?
{
    emit read_data(str);
    str = "";
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.7.2009, 10:39
Сообщение #9


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

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

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




Репутация:   94  


Цитата(berserk @ 8.7.2009, 11:30) *
а как кодировка может повлиять на порядок определения переменных?
ни как, просто когда ты в виндовозе (студии) файл редактировал и затем сохранил, возможно, студия скорректировала кодировку файла.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 8.7.2009, 11:25
Сообщение #10


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

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

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




Репутация:   7  


а не проще ли
вместо:
rivate:
    ...
    char* buff;
    ...

написать тогда уж:
rivate:
    ...
    char buff;
    ...


и читать :
ReadFile(COM, &buff, 1, &dwByteRead, NULL);

??
раз уж чтение по одному байту идет... ну и в нагрузку переписать чуть для юникса код


и вообще использовать уже готовые для этого библиотеки либо QextSerialPort либо QSerialDevice :)
зачем "лисапетить" ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 24.4.2024, 22:51