Autor Wątek: Irrlicht - Błąd biblioteki  (Przeczytany 3081 razy)

Offline walkinguer

  • Użytkownik

# Lipiec 27, 2013, 20:30:28
Sprawa jest strasznie głupia. Swoją tekstową grę postanowiłem zrobić na silniku Irrlicht.

Irrlicht zainstalowany, projekt w Code::Blocks skonfigurowany, według tutoriala. Utworzyłem Hello World:

#include <Irrlicht.h>
using namespace irr;

int main()
{
    IrrlichtDevice *device =
        createDevice( video::EDT_OPENGL );

    if (!device)
        return 1;

    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();
    gui::IGUIEnvironment* guienv = device->getGUIEnvironment();

    guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!",
        core::recti(10,10,260,22), true);

    while (device->run()) {
        driver->beginScene(true, true, video::SColor(255,100,101,140));

        smgr->drawAll();
        guienv->drawAll();

        driver->endScene();
    }
    device->drop();

    return 0;
}

I działał. Kompilował się, uruchamiał. Pisał tekst. Wyłączyłem PC, włączyłem po godzinie i nagle przestał działać. Nie uruchamia się żaden kod, program kompiluje się i dostaje Crash'a, a Debug podaje następujące informacje:

Building to ensure sources are up-to-date
Selecting target:
Debug
Adding source dir: G:\CTutorial\Irrlicht\IrrlichtBasic\
Adding source dir: G:\CTutorial\Irrlicht\IrrlichtBasic\
Adding file: G:\CTutorial\Irrlicht\IrrlichtBasic\bin\IrrlichtBasic.exe
Changing directory to: G:/CTutorial/Irrlicht/IrrlichtBasic/bin/
Set variable: PATH=.;G:\Program Files\CodeBlocks\SDK\Irrlicht\lib;G:\Program Files\CodeBlocks\SDK\Irrlicht\lib;C:\MinGW\bin;C:\MinGW;C:\Program Files\AMD APP\bin\x86;C:\Program Files\PC Connectivity Solution;C:\Program Files\NVIDIA Corporation\PhysX\Common;C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Common Files\Adobe\AGL;C:\Program Files\QuickTime\QTSystem
Starting debugger: C:\MinGW\bin\gdb.exe -nx -fullname  -quiet  -args G:/CTutorial/Irrlicht/IrrlichtBasic/bin/IrrlichtBasic.exe
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb (GDB) 7.4
Child process PID: 2332
Program received signal SIGSEGV, Segmentation fault.
In ?? () (G:\Program Files\CodeBlocks\SDK\Irrlicht\lib\Irrlicht.dll)

No i masz. O co tu chodzi? Wszystkie ustawienia w C::B są poprawne. Podmieniałem bibliotekę na oryginalną licząc, że jakimś cudem została edytowana, ale to nie to.

Przeglądałem problemy innych użytkowników w internecie i z reguły chodzi o błąd w kodzie, a konkretnie błąd którejś zmiennej. Różnica polega na tym, że mój kod działał a nagle przestał.

Cieszyłem się że czysty c++ mi wychodzi i teraz pójdzie z górki, w końcu to tylko tekstowa gra. A jednak silnika żadnego nie moge skonfigurować (jestem już po nieprzyjemnej przygodzie z Ogre)..

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Lipiec 27, 2013, 20:46:41
Swoją tekstową grę postanowiłem zrobić na silniku Irrlicht.
Jakiś specjalny powód? Bo dla mnie to przeogromny overkill.

Prześledź debuggerem, w którym miejscu leży błąd. Postaw breakpoint na linijce z addStaticText() i sprawdź, czy przypadkiem któryś z trzech wcześniejszych wskaźników nie jest zerem. Jeśli wszystko jest OK, to klikając cały czas "Step Out" (czy jak to się nazywa w C::B) zobacz, w którym dokładnie miejscu się wysypuje.

Offline walkinguer

  • Użytkownik

# Lipiec 28, 2013, 12:20:59
Cóż. Pomysł stąd, że swoją grę chciałem wstawić już we właściwą pętlę silnika. Robić ją w poprawny sposób.


Program siada po linijce o której napisałeś. Przejechałem po każdym z argumentów po kolei i nie wywaliło błędu. Dopiero jak przejde niżej (na pustą linię) to pojawia się błąd. Nie wiem jak to rozumieć, zwłaszcza, że wczoraj o 15 kod działał, a o 17 już nie.


To troche chore, bo jedynymi silnikami jakie działały u mnie poprawnie były UDK oraz Unity. Tyle, że nie kręcą mnie takie aplikacje. Za dużo poznawania, wolę działać i się uczyć, niż najpierw uczyć się kilka tygodni żeby wreszcie zrobić cokolwiek (czyt. 10 lat robić grę).

Z bibliotek próbowałem Ogre, Irrlicht, Horde3D i coś tam jeszcze. W każdym mam inny problem. Irrlicht działał a nagle przestał, za to w Horde pojawia się jakiś błąd z "undefined reference to `WinMain@16`". Jak to możliwe, że tyle ludzi robi gry i każdy ma inne problemy (od wczoraj miotam się pomiędzy kompilatorem a Google).

Aż się prosi o jakiś mały malutki silniczek, który po prostu uruchomie w Code::Blocks, skompiluje, żeby sprawdzić czy działa i zacznę edytować. Męczący interes, prędzej zrobiłbym to w czystym DirectX niż uruchomił jakiś silnik.

Offline Adam27

  • Użytkownik

# Lipiec 28, 2013, 12:33:00
undefined reference to `WinMain@16`
Pewnie tworzyłeś aplikację konsolową zamiast okienkowej. Jak to możliwe, że tego nie znalazłeś w Googlach...

Offline walkinguer

  • Użytkownik

# Lipiec 28, 2013, 15:07:09
Korzystałem z gotowych projektów / generowanych przez CMAKE.

 
Szczęśliwie w całym tym nieszczęściu byłem tak zdesperowany że w końcu pobrałem Visual C++ + Ogre 1.8.1 i wreszcie wszystko ruszyło. Bez zbędnych kompilacji i komplikacji. Zwłaszcza bez tymczasowo działających programów. Mogłem zrobić to od razu zamiast ładować sie w C::B, debil.

Proszę o usunięcie/zamknięcie tematu :).

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +2
# Lipiec 28, 2013, 15:48:46
Cytuj
Cóż. Pomysł stąd, że swoją grę chciałem wstawić już we właściwą pętlę silnika. Robić ją w poprawny sposób.
Nie ma jednego poprawnego sposobu. Inaczej będzie to wyglądało jak robisz grę pod WinAPI, inaczej we Flashu, inaczej na komórki (nawet w zależności od systemu), a jeszcze inaczej osobno w każdym z możliwych silników. No i oczywiście tekstówki konsolowe to też osobna kategoria.

Generalnie, to dopóki gra działa bez zarzutu, a programista nie łapie ciężkiej depresji patrząc na kod, to pętla i generalnie cały design gry jest OK.

Gry mają być fajne i działać a nie być pisane 13-zgłoskowcem z rymem parzystym. :)