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

Błąd kompilacji error: conflicting types for 'losowewypelnianie'|

Ostatnio zmodyfikowano 2020-12-28 20:38
Autor Wiadomość
Temat założony przez niniejszego użytkownika
Błąd kompilacji error: conflicting types for 'losowewypelnianie'|
» 2020-12-28 18:51:32
Dobry wieczór,
Napisałem program w C i próbowałem skompilować go za pomocą GNU GCC. Niestety podczas kompilacji otrzymuję taką wiadomość:
 error: conflicting types for 'losowewypelnianie'|
 i jest to jedyny błąd jaki pokazuje mi kompilator.
funkcja jest zadeklarowana przed użyciem i definicją.
Deklaracja wygląda tak:
void losowewypelnianie( struct plansza * wsk, char tab1[ 3 ][ 3 ] );

Sama funkcja wygląda tak:
C/C++
void losowewypelnianie( struct plansza * wsk, char tab1[ 3 ][ 3 ] )
{
   
struct plansza * h;
   
for( int i = 0; i < 9; i++ )
   
{
       
h = malloc( sizeof( struct plansza ) );
       
h->poprzednia = wsk;
       
for( int j = 0; j < 9; j++ )
       
{
           
h->obraz[ j / 3 ][ j % 3 ] = tab1[ j / 3 ][ j % 3 ];
       
}
       
if(( * h ).obraz[ i / 3 ][ i % 3 ] == '-' )
       
{
           
h->obraz[ i / 3 ][ i % 3 ] = 'o';
       
}
       
wyswietlanie(( * h ).obraz );
   
}
}

Czy jest ktoś w stanie pomóc z tym problemem?
P-177890
» 2020-12-28 19:04:30
Masz gdzieś inną deklarację tej funkcji i jej lokalizacja powinna być w treści błędu. Gdyby to zreprodukować, komunikat wygląda tak:
a.c:2:6: error: conflicting types for 'f'
 void f(float);
      ^
a.c:1:6: note: previous declaration of 'f' was here
 void f(int);
      ^
P-177891
Temat założony przez niniejszego użytkownika
» 2020-12-28 19:32:00
@Pekfos
mam tylko jedną deklarację, poza definicją, ale robię tak od zawsze ze wszystkimi funkcjami i zawsze wszystkie działają, więc dlaczego teraz kompilator stwierdził, że to jest błąd? Dla rozjaśnienia wrzucę może cały kod
C/C++
#include <stdio.h>
#include <conio.h>

///funkcje

void wyswietlanie( char tab[ 3 ][ 3 ] );
void ruchkomputera( char tab[ 3 ][ 3 ] );
void analizazwycienstwa( char tab[ 3 ][ 3 ] );
void ruchgracza( char tab[ 3 ][ 3 ] );
void losowewypelnianie( struct plansza * wsk, char tab1[ 3 ][ 3 ] );

///*********************

///Struktury

struct plansza
{
   
int ocena; //ocena ruchu, poprawna i brana pod uwagę tylko dla ruchu wygrywającego, w przeciwnym razie 10
   
int glebokosc; //ilość ruchów które komputer musi wykonać od początku gry do tej planszy
   
char obraz[ 3 ][ 3 ];
   
struct plansza * poprzednia;
};


///*********************

///Zmienne globalne
struct plansza * pop;
///*********************
int main()
{
   
   
char tab[ 3 ][ 3 ] = { { '-', '-', '-' }, { '-', '-', '-' }, { '-', '-', '-' } };
   
while( 1 )
   
{
       
ruchgracza( tab );
       
wyswietlanie( tab );
       
analizazwycienstwa( tab );
       
ruchkomputera( tab );
       
wyswietlanie( tab );
       
analizazwycienstwa( tab );
       
printf( "\n" );
   
}
}


//***********************

void ruchgracza( char tab[ 3 ][ 3 ] )
{
   
int c = getch();
   
c -= 49;
   
printf( "%d\n", c );
   
if( tab[ c / 3 ][ c % 3 ] == '-' )
   
{
       
tab[ c / 3 ][ c % 3 ] = 'x';
   
}
   
else
   
{
       
printf( "ruch niemozliwy, sproboj ponownie\n" );
       
ruchgracza( tab );
   
}
}

void analizazwycienstwa( char tab[ 3 ][ 3 ] )
{
   
for( int i = 0; i < 3; ++i )
   
{
       
if( tab[ i ][ 0 ] == 'o' && tab[ i ][ 1 ] == 'o' && tab[ i ][ 2 ] == 'o' )
           
 printf( "Wygrywa kulko" );
       
else if( tab[ 0 ][ i ] == 'o' && tab[ 1 ][ i ] == 'o' && tab[ 2 ][ i ] == 'o' )
           
 printf( "Wygrywa kulko" );
       
   
}
   
if( tab[ 0 ][ 0 ] == 'o' && tab[ 1 ][ 1 ] == 'o' && tab[ 2 ][ 2 ] == 'o' )
       
 printf( "Wygrywa kulko" );
   
else if( tab[ 2 ][ 0 ] == 'o' && tab[ 1 ][ 1 ] == 'o' && tab[ 0 ][ 2 ] == 'o' )
       
 printf( "Wygrywa kulko" );
   
   
   
for( int i = 0; i < 3; ++i )
   
{
       
if( tab[ i ][ 0 ] == 'x' && tab[ i ][ 1 ] == 'x' && tab[ i ][ 2 ] == 'x' )
           
 printf( "Wygrywa krzyzyk" );
       
else if( tab[ 0 ][ i ] == 'x' && tab[ 1 ][ i ] == 'x' && tab[ 2 ][ i ] == 'x' )
           
 printf( "Wygrywa krzyzyk" );
       
   
}
   
if( tab[ 0 ][ 0 ] == 'x' && tab[ 1 ][ 1 ] == 'x' && tab[ 2 ][ 2 ] == 'x' )
       
 printf( "Wygrywa krzyzyk" );
   
else if( tab[ 2 ][ 0 ] == 'x' && tab[ 1 ][ 1 ] == 'x' && tab[ 0 ][ 2 ] == 'x' )
       
 printf( "Wygrywa krzyzyk" );
   
}

void ruchkomputera( char tab[ 3 ][ 3 ] )
{
   
pop = malloc( sizeof( struct plansza ) );
   
pop->poprzednia = NULL;
   
for( int i = 0; i < 9; i++ ) //kopiowanie tablicy do struktury plansza
   
{
       
pop->obraz[ i / 3 ][ i % 3 ] = tab[ i / 3 ][ i % 3 ];
   
}
   
losowewypelnianie( pop, tab );
}

void wyswietlanie( char tab[ 3 ][ 3 ] )
{
   
   
for( int i = 0; i <= 2; ++i )
   
{
       
for( int j = 0; j <= 2; ++j )
       
{
           
printf( "%c ", tab[ i ][ j ] );
       
}
       
printf( "\n" );
   
}
}


void losowewypelnianie( struct plansza * wsk, char tab1[ 3 ][ 3 ] )
{
   
struct plansza * h;
   
for( int i = 0; i < 9; i++ )
   
{
       
h = malloc( sizeof( struct plansza ) );
       
h->poprzednia = wsk;
       
for( int j = 0; j < 9; j++ )
       
{
           
h->obraz[ j / 3 ][ j % 3 ] = tab1[ j / 3 ][ j % 3 ];
       
}
       
if(( * h ).obraz[ i / 3 ][ i % 3 ] == '-' )
       
{
           
h->obraz[ i / 3 ][ i % 3 ] = 'o';
       
}
       
wyswietlanie(( * h ).obraz );
   
}
}

//*******************************
///NOTATKI

///& daje wskaźnik, * daje to co jest pod wskaźnikiem
///wszystkie tablice są przekazywanie do funkcji przez referencje

Oczywiście sprawdziłem co się stanie po usunięciu pierwszej deklaracji, i program rzeczywiście zaczyna działać, ale nie zmienia to faktu, ze nie rozumiem dlaczego linia ta tak bardzo przeszkadza.

PS sory za tą losową próbę oznaczenia, ale nie doczytałem jak się to robi.
P-177892
» 2020-12-28 20:15:59
Decyduje kolejność zapisu
najpierw struktura potem deklaracje funkcji
P-177893
Temat założony przez niniejszego użytkownika
» 2020-12-28 20:38:48
Dzięki za pomoc!
Teraz już rozumiem.
P-177894
« 1 »
  Strona 1 z 1