[C++, duża tablica] internal compiler error
Ostatnio zmodyfikowano 2014-10-31 03:42
AssSoft Temat założony przez niniejszego użytkownika |
[C++, duża tablica] internal compiler error » 2014-10-27 21:12:33 Witam, tworząc pewien drobny program ( kod na dole ) zauważyłem dziwny błąd kompilacji: internal compiler error: in change_address_1, at emit-rtl.c:1996 Nie mam zielonego pojęcia skąd się wziął. Używam Orwell Dev-c++. Kod: #include <iostream> #include <cstdio> #include <ctime> #include <cstdlib> #include <conio.h> #include <windows.h> using namespace std; struct LivePlace { int write = 0; int x; int y; bool somethink = 0; bool live = 0; int liveID; bool food = 0; }; struct Live { int ID; int lvl; int foods = 0.6; int type; int x; int y; double todie = 2; bool be = false; }; int waitsec( float time ) { clock_t czasS; clock_t stoper = time * CLOCKS_PER_SEC; czasS = clock(); while( clock() - czasS < stoper ) ; return 0; }
int waitmsec( float time ) { time = time / 1000; clock_t czasS; clock_t stoper = time * CLOCKS_PER_SEC; czasS = clock(); while( clock() - czasS < stoper ) ; return 0; }
int waitmin( float time ) { time = time * 60; clock_t czasS; clock_t stoper = time * CLOCKS_PER_SEC; czasS = clock(); while( clock() - czasS < stoper ) ; return 0; } int randomnum( int maxnum, int minnum ) { return( rand() % maxnum ) + minnum; } int main() { srand( time( 0 ) ); int ref = 0; LivePlace world[ 50 ][ 50 ]; Live live[ 100000000 ]; int livenum = 0; int i = 0; int ii = 0; while( i < 50 ) { while( ii < 50 ) { world[ i ][ ii ].x = i; world[ i ][ ii ].y = ii; if( world[ i ][ ii ].somethink == 0 ) { if( randomnum( 10, 1 ) == 1 ) { world[ i ][ ii ].somethink = true; world[ i ][ ii ].live = true; world[ i ][ ii ].liveID = livenum; live[ livenum ].ID = livenum; live[ livenum ].lvl = 0; live[ livenum ].type = randomnum( 2, 1 ); live[ livenum ].x = i; live[ livenum ].y = ii; live[ livenum ].be = true; livenum++; world[ i ][ ii ].write = 1; } if( randomnum( 10, 1 ) == 2 ) { world[ i ][ ii ].somethink = true; world[ i ][ ii ].food = true; world[ i ][ ii ].write = 2; } } ii++; } ii = 0; i++; } int iii = 0; int nearlive = 0; for(;; ) { i = 0; ii = 0; while( i < 50 ) { while( ii < 50 ) { cout << world[ i ][ ii ].write; ii++; } cout << endl; ii = 0; i++; } cout << endl << "czas: " << ref << endl; i = 0; ii = 0; iii = 0; while( iii < livenum ) { i = 0; ii = 0; while( i < 3 ) { while( ii < 3 ) { if( world[ live[ iii ].x + i - 1 ][ live[ iii ].y + ii - 1 ].live == true && live[ world[ live[ iii ].x + i - 1 ][ live[ iii ].y + ii - 1 ].liveID ].type == live[ iii ].type ) { nearlive++; } ii++; } ii = 0; i++; } if( nearlive < 2 || nearlive > 5 ) { live[ iii ].todie--; } if( nearlive == 2 && live[ iii ].todie < 11 ) { live[ iii ].todie++; } if( live[ iii ].foods == 0 ) { live[ iii ].todie--; } if( live[ iii ].todie < 1 ) { live[ iii ].be = false; world[ live[ iii ].x ][ live[ iii ].y ].live = false; if( world[ live[ iii ].x ][ live[ iii ].y ].food == false ) { world[ live[ iii ].x ][ live[ iii ].y ].somethink = false; } goto endoflive; } if( live[ iii ].type == 1 ) { } endoflive:; iii++; } waitsec( 5 ); system( "cls" ); ref++; } return 0; } Pełen log kompilacji Kompilator: TDM-GCC 4.7.1 64-bit Release Wykonywanie g++.exe... g++.exe "C:\C++ wszystko\Live.cpp" -o "C:\C++ wszystko\Live.exe" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.7.1\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.7.1\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc -lwinmm C:\C++ wszystko\Live.cpp:10:14: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\C++ wszystko\Live.cpp:13:19: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] C:\C++ wszystko\Live.cpp:14:14: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] C:\C++ wszystko\Live.cpp:16:14: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] C:\C++ wszystko\Live.cpp:22:14: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] C:\C++ wszystko\Live.cpp:26:17: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default] C:\C++ wszystko\Live.cpp:27:12: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
C:\C++ wszystko\Live.cpp: In function 'int main()': C:\C++ wszystko\Live.cpp:180:1: internal compiler error: in change_address_1, at emit-rtl.c:1996 Please submit a full bug report, with preprocessed source if appropriate. See <http://tdm-gcc.tdragon.net/bugs> for instructions.
Compilation succeeded in 0,64 seconds with warnings |
|
Chlorek |
» 2014-10-29 18:22:53 Pomijając wszystkie dziwactwa jakie są w tym kodzie (a przynajmniej dla mnie są one dziwne) to kod ogólnie "kompiluje się". Internal error oznacza jakiś wewnętrzny błąd - nieprzewidziany przez twórcę kompilatora, zawsze może coś umknąć. Przejrzałem kod i wydaje mi się, że problemem może być pewna tablica w funkcji main(): Live live[ 100000000 ]; Ten rozmiar jest... hmm.. chory? :D To może powodować problem. Spróbuj coś takiego na razie. Live live[ 100000 ]; Poza tym polecam zrobić update kompilatora (aktualne, zwykłe mingw w wersji 32-bit). Tak poza tym to ten program jak dla mnie crashuje zaraz po starcie (potraktuj to debuggerem jak w ogóle się skompiluje), nie wczytywałem się na tyle, żeby wiedzieć co on w ogóle robi, ale jest nieźle zakręcony. Tyle co mogę powiedzieć to przerzuć się na obiektowe programowanie z takimi rzeczami. |
|
AssSoft Temat założony przez niniejszego użytkownika |
» 2014-10-31 03:42:38 To miała być druga główna kompilacja, więc tak kod jest cały dziwny. Na tym etapie na 100% zrobiłem przynajmniej kilka błędów, które oddzielnie mogą spowodować crash... Oczywiście znając moje szczęście kompilator znów zechce mnie pomęczyć.
Używam 64 bitowego GCC, ale po wprowadzeniu tej poprawki zadziałało... Dziwne, w innych programach robiłem tablice o kilka zer większą struktur przy których ta jest malusieńka.
Dzięki za pomoc. Szkoda, że nie można tutaj dać jakiejś pochwały czy tam łapki w górę, czy jak to nazywają. |
|
« 1 » |