Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, duża tablica] internal compiler error

Ostatnio zmodyfikowano 2014-10-31 03:42
Autor Wiadomość
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:
C/C++
#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
P-119543
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.
P-119629
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ą.
P-119716
« 1 »
  Strona 1 z 1