Выложил архивчик
От: Sheridan Россия  
Дата: 04.03.10 17:23
Оценка:
Тут лежит. Собственно это сам проект, я его потом всеравно куда-ть на sf дену...
Так и продолжает валиться на cmainwindow->show();
avalon 1.0rc3 rev 315, zlib 1.2.3
build date: 15.02.2010 00:26:03 MSK +03:00
Qt 4.6.1
Matrix has you...
Re: Выложил архивчик
От: Alexey F  
Дата: 04.03.10 18:17
Оценка: 12 (1)
Здравствуйте, Sheridan, Вы писали:

S>Так и продолжает валиться на cmainwindow->show();

Будешь смеяться, но... Как бы я его не пытал (debug, release), сколько qDebug не убирал — не падает.
Компилировал под Mingw-gcc 4.4.0 (из поставки Qt), моя версия Qt: 4.6.0, система — WinXP SP2, напичканная обновлениями под завязку.
Re[4]: Не вижу
От: Yuki-no Tenshi Украина  
Дата: 04.03.10 18:27
Оценка: 10 (2)
AF>По-идее, приватные переменные уже не глобальное пространство имён и работать должно. Хотя так я, на всякий случай, не делаю

И правильно, не знаю как с этим у GCC дела, но при использовании имён с подчеркиваниями у полей классов в VisualStudio 2008 SP1 и студиях до неё,я периодически получал Internal Linker Error вплоть до ошибок генерации кода и вылетания непонятных исключений на ровных местах.
雪の天使
Re[2]: Выложил архивчик
От: alsemm Россия  
Дата: 04.03.10 18:46
Оценка: :)
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, Sheridan, Вы писали:


S>>Так и продолжает валиться на cmainwindow->show();

AF>Будешь смеяться, но... Как бы я его не пытал (debug, release), сколько qDebug не убирал — не падает.
AF>Компилировал под Mingw-gcc 4.4.0 (из поставки Qt), моя версия Qt: 4.6.0, система — WinXP SP2, напичканная обновлениями под завязку.
Неужели Linux sucks (C)?
Re: Выложил архивчик
От: Alexey F  
Дата: 04.03.10 19:54
Оценка: 18 (1) +1
Здравствуйте, Sheridan, Вы писали:

Ещё покопался, встретил не относящуюся к краху ошибку:
// x3data.h

enum EWareTypes
{
    wtEat        = 001,
    wtWeapon    = 002,
    wtMissile    = 003,
    wtEnergy    = 004,
    wtOre        = 005,
    wtEatSrc    = 006,
    wtDrone        = 007,
    wtPassenger    = 008,
    wtBullet    = 009,
    wtOther        = 010
};


Дело в том, что с нуля записываются числа в восьмеричной системе счисления. wtPassenger (8) и wtBullet (9) должны дать ошибку компиляции. А 010 == 8.



QApplication уже имеет метод instance, который позволяет обратиться к нему из любой части программы (см. также qApp). Его (CApplication) можно смело убрать из singleton'а. Я к чему это всё — меня не покидает ощущение, что глюк растёт откуда-то из этих мест. Можно попробовать убрать наследование от QApplication, создавать его на стеке в main. С такими странностями (я о том, что в моём случае он запускается без краха), ИМХО, можно упрощать код до тех пор, пока программа не перестанет падать.

Я попытался сам это сделать, причём рубанул с плеча весь CSingleTone, да потом как-то завяз в зависимостях и макросах...
Re[2]: Выложил архивчик
От: Sheridan Россия  
Дата: 04.03.10 20:02
Оценка:
Приветствую, Alexey F, вы писали:

AF> Будешь смеяться, но... Как бы я его не пытал (debug, release), сколько qDebug не убирал — не падает.

AF> Компилировал под Mingw-gcc 4.4.0 (из поставки Qt), моя версия Qt: 4.6.0, система — WinXP SP2, напичканная обновлениями под завязку.

тщьорт...
У меня на мощном компе кстати тоже не падает, а на нетбуке рушится....
Ну в любом случае спасибо

Кстати, вопрос. Ты не знаешь, синглтон на указателях на функции (как я реализовал сейчас) будет быстрее\медленнее того что закомментирован?
avalon 1.0rc3 rev 315, zlib 1.2.3
build date: 15.02.2010 00:26:03 MSK +03:00
Qt 4.6.1
Matrix has you...
Re[3]: Выложил архивчик
От: Alexey F  
Дата: 04.03.10 21:25
Оценка: 15 (1)
Здравствуйте, Sheridan, Вы писали:

S>У меня на мощном компе кстати тоже не падает, а на нетбуке рушится....

На своём нетбуке проверил — там WinXP SP3 — не падает. В *nix возможности проверить нет, так как в них я дуб дубом...

S>Кстати, вопрос. Ты не знаешь, синглтон на указателях на функции (как я реализовал сейчас) будет быстрее\медленнее того что закомментирован?

Если честно, я понял, что делает код на указателях только после того, как прогнал его через g++ -E (посмотрел вывод препроцессора)
Я бы не сказал, что это вообще ощутимо должно повлиять на производительность. Не миллиарды раз же они будут вызываться?
Но по-идее, через указатели должно быть медленнее.

Сейчас профайлером посмотрю на таком коде:
// 9.cpp
int main () {
    // Плохой стиль, но мне лень сейчас лишний .h делать :)
    void ifVersionTest ();
    void ptrVersionTest ();
    
    ifVersionTest ();
    ptrVersionTest ();
}

// 9_1.cpp
#include <cstdio>


typedef int Resource;


struct IfVersion {
    IfVersion () {
        resource_ = 0;
    }


    ~IfVersion () {
        delete resource_;
    }


    Resource* resource () {
        if ( !resource_ ) {
            resource_ = new Resource ();
        }
        return resource_;
    }
    
    
private:
    Resource* resource_;
};


struct PtrVersion {
    PtrVersion () {
        resource_ = 0;
        gettingFunction_ = &PtrVersion::createFunction;
    }


    ~PtrVersion () {
        delete resource_;
    }


    Resource* resource () {
        return ( this->*gettingFunction_ ) ();
    }
    
private:
    typedef Resource* ( PtrVersion::*GettingFunction ) ();
    
    
    Resource* createFunction () {
        resource_ = new Resource ();
        gettingFunction_ = &PtrVersion::getFunction;
        return resource_;
    }
    
    
    Resource* getFunction () {
        return resource_;
    }
    
private:
    GettingFunction gettingFunction_;
    Resource* resource_;
};


// Константа в первом тесте была поменьше на пару знаков - не помню, какая точно:
std::size_t const amountTests = 4200000000ul;


void ifVersionTest () {
    IfVersion ifVersion;
    
    for ( std::size_t i = 0; i < amountTests; ++i ) {
        if ( *ifVersion.resource () ) {
            puts ( "Something wrong" );
        }
    }
}


void ptrVersionTest () {
    PtrVersion ptrVersion;

    for ( std::size_t i = 0; i < amountTests; ++i ) {
        if ( *ptrVersion.resource () ) {
            puts ( "Something wrong" );
        }
    }
}


Компилировали:

g++ -pg -g -O3 9.cpp 9_1.cpp


Результат (см. колонку self seconds; в тегах code, иначе форматирование съедает):
Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 44.72     15.54    15.54 4199999999     0.00     0.00  PtrVersion::getFunction()
 40.72     29.69    14.15        1    14.15    29.69  ptrVersionTest()
 14.56     34.75     5.06        1     5.06     5.06  ifVersionTest()
  0.00     34.75     0.00        1     0.00     0.00  PtrVersion::createFunction()


Или, меряя разницу в других единицах:
// 9.cpp:
#include <cstdio>
#include <cassert>
#include <windows.h>

int main () {
    void ifVersionTest ();
    void ptrVersionTest ();
    
    LARGE_INTEGER frequency;
    if ( !QueryPerformanceFrequency ( &frequency ) ) {
        assert ( false && "unsupport performance counter" );
    }
    
    LARGE_INTEGER timeStart;
    LARGE_INTEGER timeEnd;
    {
        QueryPerformanceCounter ( &timeStart );
        ifVersionTest ();
        QueryPerformanceCounter ( &timeEnd );
        
        std::printf (
            "ifVersion: %I64d, %f\n",
            timeEnd.QuadPart - timeStart.QuadPart,
            static_cast<double> ( timeEnd.QuadPart - timeStart.QuadPart ) / frequency.QuadPart
        );
    }
    
    
    {
        QueryPerformanceCounter ( &timeStart );
        ptrVersionTest ();
        QueryPerformanceCounter ( &timeEnd );
        
        std::printf (
            "ptrVersion: %I64d, %f\n",
            timeEnd.QuadPart - timeStart.QuadPart,
            static_cast<double> ( timeEnd.QuadPart - timeStart.QuadPart ) / frequency.QuadPart
        );
    }
}


Получаем (после запятой время в секундах):

ifVersion: 17989928976, 5.635801
ptrVersion: 289695785864, 90.754551

Из ассемблерного кода видно, что халтуры в отношении ifVersion нет — компилятор честно каждый раз проверяет значение переменной.
Re[4]: Выложил архивчик
От: Sheridan Россия  
Дата: 04.03.10 23:15
Оценка:
Спасибо большое.
Пожалуй попробую поковырять систему, хотя все остальное пашет совершенно нормально...
avalon 1.0rc3 rev 315, zlib 1.2.3
build date: 15.02.2010 00:26:03 MSK +03:00
Qt 4.6.1
Matrix has you...
Re: Выложил архивчик
От: Anton Batenev Россия https://github.com/abbat
Дата: 05.03.10 12:26
Оценка:
Здравствуйте, Sheridan, Вы писали:

S> Тут лежит. Собственно это сам проект, я его потом всеравно куда-ть на sf дену...

S> Так и продолжает валиться на cmainwindow->show();

$ make
make: *** Нет правила для сборки цели `/usr/share/qt4/mkspecs/linux-g++/qmake.conf', требуемой для `Makefile'.  Останов.


$ qmake x3complex.pro
$ make
...
In file included from src/ui/cmainwindow.cpp:2:
build/x3complex/ui/ui_cmainwindow.h: In member function ‘void Ui_CMainWindow::setupUi(QMainWindow*)’:
build/x3complex/ui/ui_cmainwindow.h:121: ошибка: ‘class QMenuBar’ has no member named ‘setNativeMenuBar’
make[1]: *** [build/x3complex/obj/cmainwindow.o] Ошибка 1
make[1]: Leaving directory `/home/abbat/projects/x3complex'
make: *** [release] Ошибка 2


Qt version 4.5.2 (на 4.6 в моем дистрибе еще пока не обновили, а руками компилить лениво).
avalon 1.0rc3 rev 318, zlib 1.2.3
Re: Выложил архивчик
От: Skorodum Россия  
Дата: 05.03.10 13:14
Оценка: 6 (1)
Здравствуйте, Sheridan, Вы писали:

Не падает:
Qt-4.6.0
gcc version 3.4.5
Linux 2.6.15.2 #3 SMP Mon Oct 9 17:29:06 MSD 2006 i686 pentium4 i386 GNU/Linux

Qt-4.5.0, 4.3.3 не собирает:

In file included from src/ui/cmainwindow.cpp:2:
build/x3complex/ui/ui_cmainwindow.h: In member function `void Ui_CMainWindow::setupUi(QMainWindow*)':
build/x3complex/ui/ui_cmainwindow.h:121: error: 'class QMenuBar' has no member named 'setNativeMenuBar'

Гм...
От: Sheridan Россия  
Дата: 05.03.10 22:33
Оценка:
Действительно видимо проблема вовне... Навел порядок в системе (emerge --depclean; revdep-rebuild; emerge qt...) — вроде работает теперь, всем спасибо
avalon 1.0rc3 rev 315, zlib 1.2.3
build date: 15.02.2010 00:26:03 MSK +03:00
Qt 4.6.1
Matrix has you...
Re: Бейте меня ногами...
От: shadone Норвегия  
Дата: 09.03.10 14:34
Оценка: 17 (2)
Здравствуйте, Sheridan, Вы писали:

S>Кусок capplication

S>[c]
S>CApplication::CApplication(int argc, char ** argv) : QApplication(argc, argv)

классическая ошибка. в качестве первого аргумента QApplication принимает _ссылку_ на argc и сохраняет ее внутри.
QApplication::QApplication ( int & argc, char ** argv )
http://doc.qt.nokia.com/4.6/qapplication.html#QApplication
Re[2]: Бейте меня ногами...
От: Sheridan Россия  
Дата: 09.03.10 16:25
Оценка:
Приветствую, shadone, вы писали:

s> классическая ошибка. в качестве первого аргумента QApplication принимает _ссылку_ на argc и сохраняет ее внутри.

s> QApplication::QApplication ( int & argc, char ** argv )
s> http://doc.qt.nokia.com/4.6/qapplication.html#QApplication

Гм, похоже действительно изза этого. Спасибо
avalon 1.0rc3 rev 315, zlib 1.2.3
build date: 15.02.2010 00:26:03 MSK +03:00
Qt 4.6.1
Matrix has you...
Re[3]: Бейте меня ногами...
От: jazzer Россия Skype: enerjazzer
Дата: 10.03.10 07:45
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, Alexey F, вы писали:


AF>> Скажу сразу — подчёркивания, тем более двойные в начале идентификатора (да ещё какого — макроса!) — зарезервированы для компилятора (как минимум в глобальной области видимости; в форуме C/C++ это неоднократно обсуждалось). Причина, конечно, не в этом, но предупредить я должен.

S>Из макросов убрал, а для классов я привык приватные переменные префиксировать подчеркиванием....
Значит, надо поскорее отвыкнуть
И привыкнуть к чему-нибудь другому, например, к суффиксу: member_; или префиксу с буквой: m_member.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.