IF
Igor FedyaevТам. 16, 2017, 2:37 Т.Ж.

Сборка Qt / C++ проекта под windows и linux

Доброго времени суток
У меня есть приложение на Qt на двух операционных системах
Я написал код под Qt ->windows ->компилятор msvc отладил и всё работало хорошо.Выдавало то что нужно.
Перенёс код Qt-> linux->компилятор GCC отладил и часть кода упала, выдаёт не то что надо
Подскажите пожалуйста что не так?(участок кода, который падает прикреплен ниже

    file.seek(NTH+NBH+NT*(N-1)+nDis*disFmTrace*(N-1));
    insbuf=file.read(NT+nDis*disFmTrace);
    memcpy(trace,insbuf,NT+nDis*disFmTrace);
    qDebug()<< "trace="<<*trace;
    for(int n=0;n<nDis;n++) traA.append(GetSample(n));

    qDebug()<<"traA= [ "<<traA.value(0)<<" ]";
    insbuf.clear();
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

34
Evgenii Legotckoi
  • Там. 16, 2017, 3:42 Т.Ж.

Вы случаем не используете виндовые библиотеки в этом проекте? А то что-то GetSample() подозрительно походит по написанию не виндовую функцию.


Помимо прочего, уточните строку, где падает приложение. А также какую-нибудь дополнительную информацию по значениями в переменных, которые должны быть, и которые туда передаются.
    IF
    • Там. 16, 2017, 3:59 Т.Ж.

    Я подключаю библиотеки в проекте в разных файлах
    ->
    #include <stdarg.h>
    #include <string>
    ->
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <math.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    ->
    Приложение выдает неурядицу в traA заполнении , не понимаю что не так
    GetSample это функция виртуальная и я её прикрепил ниже

    float segY::GetSample(int idx)
    {
        float   smp;
        int*    xmp = (int*)&smp;
        float*  dat = (float*)(trace+240);
    
        short*       int2ptr =  (short*)        dat;
        int*         int4ptr =  (int*)          dat;
        double*      int8ptr=   (double*)       dat;
        signed char* int1ptr =  (signed char*)  dat;
    
        if(_frmt==1)
        {
            smp =  dat[idx];
    //        qDebug()<< "smp="<<smp<<"\n"<<"idx="<<idx;
            ibm2ieee(&smp,swap);
    //        qDebug()<< "smp="<<smp;
        }
        else if(_frmt==2)
        {
            smp = swapi4(int4ptr[idx],swap);
        }
        else if(_frmt==3)
        {
            smp = swapi2(int2ptr[idx],swap);
        }
        //    else if(_frmt==4)
        //     {
        //        smp = dat[idx];
        //     }
        else if(_frmt==5)
        {
            *xmp = swapi4(int4ptr[idx],swap);
        }
        else if(_frmt==6 || _frmt==8)
        {
            smp = int1ptr[idx];
        }
        //    else if(_frmt==7)
        //    {
        //        smp =0;//??
        //    }
        //    else if(_frmt==8)
        //    {
        //        smp = int1ptr[idx];
        //    }
        else if(_frmt==9)
        {
            smp = swapi8(int8ptr[idx],swap);
        }
        //    else if(_frmt==10)
        //    {
        //        smp = swapi4(int4ptr[idx],swap);
        //    }
        //    else if(_frmt==11)
        //    {
        //        smp = swapi2(int2ptr[idx],swap);
        //    }
        //    else if(_frmt==12)
        //    {
        //        smp = swapi8(int8ptr[idx],swap);
        //    }
        //    else if(_frmt==15)
        //    {
        //        smp = 0;
        //    }
        //    else if(_frmt==16)
        //    {
        //        smp = int1ptr[idx];;
        //    }
        else
            smp = 0;
        int wgti = i2((byte*)trace,169, swap);
        if(wgti==0)return smp;
    
        double wgt = pow (2.,wgti);
    
    
        return smp/wgt;
    }

      IF
      • Там. 16, 2017, 4:01 Т.Ж.

      Я получаю разные показатели все время
      Я думаю это memcpy
      но как это проверить и доказать я не знаю....
      как печатать весь массив QByteArrey(insbuf) и как печатать массив char *(trace)

        Evgenii Legotckoi
        • Там. 16, 2017, 4:08 Т.Ж.

        Возможно и в memcpy дело, а вы не пробовали использовать для получения данных из файла QByteArray, да и для самого файла использовать QFile например? Чтобы не заморачиваться с ручным выделением памяти.

          IF
          • Там. 16, 2017, 4:19 Т.Ж.

          Я использую открытие файла (как раз подаю его )
          Моя задача
          ->забрать определённое количество байт в массив char*, для этого я использую контейнер QByteArrey ->заполняю его и перекопирую его через memcpy в массив char * trace (размеры которого определены выше)

          просто функция написана под массив char еще до Qt, на чистых с++ собиралось все иделально


          void segY::taketraceAhdr(QFile &file)
          {
              qDebug()<<1;
              int N=2,i;
              int n=sizeof(nbtrhd)/sizeof(int);
              double hdr;
              QByteArray insbuf;
          ......
          }

            Evgenii Legotckoi
            • Там. 16, 2017, 4:29 Т.Ж.
            • (өңделген)

            Я не уверен, но возможно, стоит передавать не сам QByteArray , а забирать из него сырые данные через метод constData()

            memcpy(trace,insbuf.constData(),NT+nDis*disFmTrace);
            Также вопросы вызывает вот это вычисление размера под данные
            NT+nDis*disFmTrace
            У QByteArray есть метод size(), который возвращает количество элеметов char.

            Скорее всего у вас выделяется недостаточное количество памяти для всего QByteArray через memcpy
              IF
              • Там. 16, 2017, 4:37 Т.Ж.

              Тогда вопрос, почему под windows она собрала и скоприровала всё правильно ,  а под linux крашнулась?????

                Evgenii Legotckoi
                • Там. 16, 2017, 4:42 Т.Ж.

                Just Win Must Die )))

                  IF
                  • Там. 16, 2017, 4:45 Т.Ж.

                  )))))))не ну умереть то слишком просто))))))))
                  А если говорить серьезна?
                  в чём может быть проблема?

                    BlinCT
                    • Там. 16, 2017, 4:53 Т.Ж.

                    Вот написание имени функции с большой буквы как то режет глаза) Я даже на работе по этому дискутировал с главным программеном, "зачем??!!"))
                    Но дело каждого)
                    И с последним постом Евгения я согласен)

                      Evgenii Legotckoi
                      • Там. 16, 2017, 4:54 Т.Ж.

                      Я вот не уверен до конца, но в Win и в Linux немного по разному работают некоторые методы у некоторых классов.

                      Например, метод QTextStream::readAll() в Windows не возвращает всех абсолютно строк, приходится в цикле по одной считывать, тогда как в Linux всё работает на отлично.
                      Здесь может быть похожая ситуация, плюс от компилятора может зависеть, то есть от того, какие они там оптимизации делают.
                      Дебажить нужно, обычно Segmenation Fault вываливается при обращении к неинициализированной области памяти, возможно, что GCC несколько иначе выделил память, чем MSVC...

                      Попробуйте при одинаковых данных сравнить размеры получаемых данных.
                        IF
                        • Там. 16, 2017, 5:09 Т.Ж.

                        подскажите пожалуйста как вывести в консольна печать например один элемент массива char*

                          Evgenii Legotckoi
                          • Там. 16, 2017, 5:13 Т.Ж.

                          что-то вроде такого можно сделать

                          std::cout << charArray[index];
                            BlinCT
                            • Там. 16, 2017, 5:27 Т.Ж.

                            Вот как так не знать как вывести в консоль?)
                            2 варианта, или std::cout << "text"<< value;
                            Или qDebug();

                              IF
                              • Там. 16, 2017, 5:36 Т.Ж.

                              Друг мой, я знаю как вывести в консоль несколькими способами
                              Но в данной задаче я вывожу в консоль, а он мне пустое место выдаёт после копирования в него байтовых значений
                              и у меня сразу вопрос возник....
                              может я не умею байты выдавайт на печать в консоль

                                IF
                                • Там. 16, 2017, 6:33 Т.Ж.

                                Проблема в строчке
                                в win сработало а в linux нет
                                что не так, может кто знает?

                                float*  dat = (float*)(trace+240);

                                  Evgenii Legotckoi
                                  • Там. 16, 2017, 6:44 Т.Ж.

                                  В C++ лучше кастовать не в C-style, а в каноничном C++-style, то есть строку стоит переписать так:

                                  float*  dat = static_cast<float*>(trace+240);
                                  Вы здесь перемещаете указатель...
                                  Также... А вас не напрягает, что char равен 1 байт(в котором объявлен trace), а float равен 4-ре?
                                  вполне возможно, что у вас происходит вылет за пределы инициализированной памяти. Уж не знаю, как это дело оптимизирует MSVC, что у вас всё работает, но GCC видимо ведёт себя иначе, и кстати, скорее всего правильнее.
                                    IF
                                    • Там. 16, 2017, 6:58 Т.Ж.

                                    Эта сторчка на сработала, говорит невозможно преобразовать char*  в float* , если от вашей логике отталкиваться(хотя я тоже про это думал (про байты)), то это реально не работает(((

                                    как переписать массив побайтно из char в float,теперь самый главный вопрос
                                    Я просто знал один способ только
                                    float* A=(float*)B

                                      Evgenii Legotckoi
                                      • Там. 16, 2017, 7:06 Т.Ж.

                                      Ну как вариант, можно испльзовать reinterpret_cast, но это самый беспардонный способ работы с компилятором.

                                      А вы какой вообще результат хотите получить? один char в одно float или 4-ре char в одном float?
                                        Evgenii Legotckoi
                                        • Там. 16, 2017, 7:09 Т.Ж.

                                        Вообще, обычно char кастуют в целочисленный тип int, зачем его кастовать во float, ума не приложу. Хак на велосипеде, да ещё костылём погоняет.

                                          IF
                                          • Там. 16, 2017, 7:31 Т.Ж.

                                          Мне нужно сделать
                                          допустим есть массив char*(1 байт представление)
                                          ->0
                                          ->1
                                          ->2
                                          ->3
                                          ->4
                                          ->5
                                          ->6
                                          ->7
                                          нужен массив float*(4байт представление)
                                          ->0123
                                          ->4567
                                          так же нужно будет
                                          ->short int* (2 байте представление)
                                          ->int* (4 байта пердставление)
                                          Я реализовывал на прямую просто , но не прокатило linux!11111

                                            Evgenii Legotckoi
                                            • Там. 16, 2017, 7:49 Т.Ж.
                                            • (өңделген)

                                            Ну... за такой подход к преобразованию значений из char во float по рукам надо бить. Это заведомо undefined behaviour, и на каждой новой платформе с новым компилятором ваш код будет ломаться. И дело не в том, что под linux не прокатило, а в том, что по какой-то причине это прокатило под Windows. А подход с "прокатило" / "не прокатило" вообще недопустим в программировании.


                                            Для таких преобразований нужно использовать специальные функции из стандартной библиотеки. Посмотрите на вот этот пример:
                                            #include <stdio.h>
                                            #include <stdlib.h>
                                            #include <string.h>
                                            
                                            int main()
                                            {
                                               float val;
                                               char str[20];
                                               
                                               strcpy(str, "98993489");
                                               val = atof(str);
                                               printf("String value = %s, Float value = %f\n", str, val);
                                            
                                               strcpy(str, "tutorialspoint.com");
                                               val = atof(str);
                                               printf("String value = %s, Float value = %f\n", str, val);
                                            
                                               return(0);
                                            }
                                            Получаемый вывод:
                                            String value = 98993489, Float value = 98993488.000000
                                            String value = tutorialspoint.com, Float value = 0.000000
                                            Исходя из этого примера Вам следует забирать из массива char по четыре элемента в специальный временный массив char с 4-мя элементами, а потом с помощью функции atof преобразовывать в число типа float. Массив float необходимо задать с определённым количество элементов, которое будет рассчитываться из количества элементов в char массиве.

                                            И вообще для таких целей лучше использовать QVector<float> и переписать часть функционала с соответствующей логикой.
                                            Полагаю, что там в проекте  масса таких некрасивых вещей с C-style кастами и прочих грязных хаков. Так что Вы там как на минном поле.
                                              IF
                                              • Там. 16, 2017, 9:37 Т.Ж.

                                              Подскажите пожалуйста:
                                              Если я забрад
                                              QBytearrey buf=file.read(4);
                                              и у меня есть
                                              QVector<float>A(1);
                                              Если я сделаю
                                              memcpy(A.data(),buf.data(),4);
                                              Это и будет моё
                                              -0
                                              -1
                                              -2
                                              -3

                                              -0123?

                                                Evgenii Legotckoi
                                                • Там. 16, 2017, 10:04 Т.Ж.

                                                А зачем вы в данном случае используете memcpy? это функция, которая копирует данные из одной области памяти в другую. Это будет справедливо, когда используются одинаковые структуры данных или массивы с одинаковыми типами данных, а не с разницей размеров, когда один элемент имеет 1 байт, а второй элемент имеет 4 байта.


                                                А вы в данном случае копируете char элементы в область памяти, которая представлена float элементами. Я же написал выше , что нужно использовать функцию atof для преобразования символов char в полноценный float. А тогда не нужно использовать mempcy.
                                                Просто добавляете в вектор через метод append() полученные элементы float.
                                                Вам нужно в цикле пройтись по массиву char с шагом в 4-ре символа и формировать в теле цикла временный массив char на 4-е элемента, который будет преобразоваться с помощью функции atof в переменную типа float, которую уже можно добавить в вектор.
                                                  BlinCT
                                                  • Там. 17, 2017, 2:57 Т.Ж.

                                                  На каждом новом примере все больше убеждаюсь что код написанный изначально на линуксе без привязки к API системы является полноценным кросс платформенным который и на других системах соберется. А вот если на мелкомягкой например собрать то потом в других системах что то отваливается. Это говорид о том что мелкомягкая позволяет писать и запускать с ошибками на которые компилятор работающий не по стандарту плюет. Такая же ситуация была у меня в дипломнйо работе, знакомый написал маленький кусок кода где порядок обьявления и использования был перевернут и тупой виндовый компилятор это принял как норму. Стоит задуматсья в какой системе программить.

                                                    IF
                                                    • Там. 17, 2017, 3:03 Т.Ж.

                                                    Да, вы правы !!!
                                                    и это я понял на своей шкуре)))

                                                      IF
                                                      • Там. 17, 2017, 11:06 Т.Ж.

                                                      вы имели ввиду это?
                                                      если да, то как то не работает(((

                                                      #include <iostream>
                                                      #include <bitset>   // заголовочный файл битовых полей
                                                      #include <iomanip>  // для манипулятора setw()
                                                      #include <math.h>
                                                      #include <string.h>
                                                      #include <stdlib.h>
                                                      using namespace std;
                                                      
                                                      int main()
                                                      {
                                                          bitset<8> number;
                                                      
                                                          cout << "Двоичное представление некоторых чисел:\n";
                                                          char* inp=new char[4];
                                                          inp[0]=0;
                                                          inp[1]=0;
                                                          inp[2]=0;
                                                          inp[3]=1;
                                                          for( int i = 0;i<4;i++) {
                                                              number = inp[i];
                                                              cout << setw(2) << number.to_ulong() << " = " << number << endl;
                                                          }
                                                          int out=atoi(inp);
                                                          printf("%032x\n",out);
                                                          cout<<"out="<<out<<endl;
                                                          return 0;
                                                      }

                                                        Evgenii Legotckoi
                                                        • Там. 18, 2017, 1:42 Т.Ж.

                                                        Вообще должно работать, хотя несколько смущает, что выделяете память по char через new - в этом нет необходимости.

                                                        А вот это так сайт выложил, или вы написали?
                                                        printf("%032x\n",out);
                                                        Целочисленное значение выводится через символ d
                                                        printf("%d",out);
                                                          IF
                                                          • Там. 18, 2017, 2:25 Т.Ж.

                                                          можно так, но предварительно подключить библиотеку #include <bitset>   // заголовочный файл битовых полей
                                                          cout<<bitset<32>(out)<<endl;

                                                            Evgenii Legotckoi
                                                            • Там. 18, 2017, 2:55 Т.Ж.

                                                            А вот тут я немного смущён, я не работал с bitset библиотекой. То есть это заработало?

                                                              IF
                                                              • Там. 18, 2017, 3:01 Т.Ж.

                                                              нет, я тут кое что попробую- о результатах скажу)))

                                                                Дмитрий
                                                                • Шілде 10, 2020, 7:12 Т.Ж.

                                                                Пардон за некропост)
                                                                У меня вопрос следующий:
                                                                Есть базовый класс, и есть наследники: один должен подклчаться под винду (там есть #include ), а другой - под линукс. В прошнике сделал так:

                                                                win32 {
                                                                    SOURCES += folder_name/win_controller.cpp
                                                                    HEADERS += folder_name/win_controller.h
                                                                }
                                                                
                                                                unix {
                                                                    SOURCES += folder_name/linux_controller.cpp
                                                                    HEADERS += folder_name/linux_controller.h
                                                                }
                                                                
                                                                

                                                                Собираю под линукс, но ругается на отсутствие windows.h. В Креаторе название "виндового" файла помечено серым цветом. Можно ли как-то сделать так, чтобы под линукс не ругался на виндовые хедеры?

                                                                  Дмитрий
                                                                  • Шілде 10, 2020, 7:35 Т.Ж.

                                                                  Отбой.
                                                                  Забыл в исходнике обернуть каждый #include макросом.

                                                                  #ifdef Q_OS_WIN32
                                                                  #include "win_controller.h"
                                                                  #else
                                                                  #include "linux_controller.h"
                                                                  #endif
                                                                  
                                                                  
                                                                    nayk1982
                                                                    • Шілде 20, 2020, 9:37 Т.Ж.

                                                                    Еще можно union для этих целей использовать:

                                                                    union union_type {
                                                                        char[4] char_val;
                                                                        float float_val;
                                                                    }
                                                                    
                                                                    union union_type cnv;
                                                                    cnv.char_val[0] = 4;
                                                                    cnv.char_val[1] = 3;
                                                                    cnv.char_val[2] = 2;
                                                                    cnv.char_val[3] = 1;
                                                                    
                                                                    cout << cnv.float_val << endl; 
                                                                    

                                                                      Пікірлер

                                                                      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                                                      Кіріңіз немесе Тіркеліңіз
                                                                      OI
                                                                      • Ora Iro
                                                                      • Жел. 24, 2024, 5:38 Т.Қ.

                                                                      C++ - Тест 001. Первая программа и типы данных

                                                                      • Нәтиже:40ұпай,
                                                                      • Бағалау ұпайлары-8
                                                                      AD

                                                                      C++ - Тест 004. Указатели, Массивы и Циклы

                                                                      • Нәтиже:50ұпай,
                                                                      • Бағалау ұпайлары-4
                                                                      m
                                                                      • molni99
                                                                      • Қаз. 26, 2024, 11:37 Т.Ж.

                                                                      C++ - Тест 004. Указатели, Массивы и Циклы

                                                                      • Нәтиже:80ұпай,
                                                                      • Бағалау ұпайлары4
                                                                      Соңғы пікірлер
                                                                      ИМ
                                                                      Игорь МаксимовҚар. 22, 2024, 10:51 Т.Қ.
                                                                      Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                                                      Evgenii Legotckoi
                                                                      Evgenii LegotckoiҚар. 1, 2024, 12:37 Т.Ж.
                                                                      Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                                                      A
                                                                      ALO1ZEҚаз. 19, 2024, 6:19 Т.Қ.
                                                                      Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                                      ИМ
                                                                      Игорь МаксимовҚаз. 5, 2024, 5:51 Т.Қ.
                                                                      Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                                      d
                                                                      dblas5Шілде 5, 2024, 9:02 Т.Қ.
                                                                      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                                      Енді форумда талқылаңыз
                                                                      Evgenii Legotckoi
                                                                      Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
                                                                      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                                      t
                                                                      tonypeachey1Қар. 15, 2024, 5:04 Т.Қ.
                                                                      google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                                      NSProject
                                                                      NSProjectМаусым 4, 2022, 1:49 Т.Қ.
                                                                      Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                                                      9
                                                                      9AnonimҚаз. 25, 2024, 7:10 Т.Қ.
                                                                      Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                                                      Бізді әлеуметтік желілерде бақылаңыз