conflicting types for "function"

Crash123

Erfahrenes Mitglied
Hallo Leute,

ich bin neu im Breich C, also danke für
euer Verständnis für eine wahrscheinlich
triviale Frage.

Ich habe folgenden Code:

Code:
#define A 8
#define B 8

struct Position
{
    int x;
    int y;
    int is_taken;    
};

struct Brett
{
       int a;
       int b;
       int damenCount;
       int positionsCount;
       
       struct Dame *damen;
       struct Position positions[A][B];
       struct Position next_Position;      
};

struct Brett spielbrett;

void add_Position(struct Position position)
{
     spielbrett.positions[position.x][position.y]=position;
     spielbrett.positionsCount++;
}

int main(){

    int x=0, y;

    for(;x < A;x++)
        for(y=0;y < B;y++){
            struct Position position;
            position.x = x;
            position.y = y;
            position.is_taken = 0;
            add_Position(position);
    }   
}

und bekomm dabei den im Btreff genannten Fehler:
HTML:
conflicting types for 'add_Position'
previous implicit declaration of 'add_Position' was here

Vielen Dank für eure Hilfe
 
Sicher, dass...
...da nicht mehr noch dabei ist?
...du nicht irgendwo eine alte Kopie der Datei kompilierst?
...

Je nach IDE vllt. mal ein neues, sauberes Projekt anlegen und den Quelltext reinkopieren.
 
Oha ... entschuldigt bitte ... ich sag ja ist wahrscheinlich eine triviale Lösung ^^
Das Problem war, ich habe es hier zwar in richtiger Reihenfolge gepostet aber
die Definition der Funktion add_position(...) steht nach ihrem Aufruf.

Aber jetzt bekomm ich ein error ohne Zeilen angabe:

Code:
[Linker error] undefined reference to `next_position' 
ld returned 1 exit status
 
ich hoffe ihr habt das Thema noch nicht abgehackt o_O ...

ich möchte nämlich kein Neues aufmachen wegen meinem
neuen Problem.

Jetzt bekomm ich ein
Code:
segmentation fault
beim Debuggen
also der Compiler sagt nix aber bei step-by-step im debugger sagt
er mir nach jedem schritt eben das.

Da es echt nervt Poste ich einfach den gesamten Code:

Es handelt sich um das 8 Demen Problem
(ich hoffe das ist nicht too much ;-) )
Code:
/********************HEADER-FILE**************************
*                                      Data_Base.h                                                   *
********************************************************/

#define A 8
#define B 8

struct Position
{
    int x;
    int y;
    int is_taken;    
};

struct Dame
{
       int x;
       int y;       
};

struct Brett
{
       int a;
       int b;
       int damenCount;
       int positionsCount;
       
       struct Dame *damen;
       struct Position positions[A][B];
       struct Position next_Position; 
            
};

/*************************C-FILE**************************
*                                    8_Damen_Problem_Main.c                                *
********************************************************/

#include <stdio.h>
#include <stdlib.h>

#include "Data_Base.h"

struct Brett *spielbrett;


void add_Position(struct Position position)
{
     spielbrett->positions[position.x][position.y]=position;
     spielbrett->positionsCount++;
}

void init_Spielbrett()
{
     
    spielbrett->a=A;
    spielbrett->b=B;
    spielbrett->damenCount=0;
    
    int x=0, y=0;
    
    for(;x < A;x++)
        for(y=0;y < B;y++){
            struct Position position;
            position.x = x;
            position.y = y;
            position.is_taken = 0;
            add_Position(position);
        }              
}

struct Dame init_Dame(int x, int y)
{
    struct Dame dame;
    dame.x = x;
    dame.y = y;
    
    return dame;     
}
/*
return 0 not done
return 1 done
*/
int add_Dame(struct Dame dame){
     
    if(spielbrett->positions[dame.x][dame.y].is_taken == 0)
    { 
        spielbrett->damen[spielbrett->damenCount]=dame;
        spielbrett->damenCount++; 
        
        struct Position position = spielbrett->positions[dame.x][dame.y];
        spielbrett->positions[dame.x][dame.y].is_taken = 1;
       
        int count_X = sizeof(spielbrett->positions),
            count_Y = sizeof(spielbrett->positions[position.x]),
            i=0, j=0;
            
        for(;i<count_Y;i++)
        {
            spielbrett->positions[position.x][i].is_taken = 1;
            
            for(j=0;j<count_X;j++)
            {
                spielbrett->positions[j][position.y].is_taken = 1;
                
                if(i - position.x == j - position.y)
                    spielbrett->positions[i][j].is_taken = 1;
            }
        }
        
        return 1;
    }
    return 0;
}

/*
return 0 non-collision
return 1 collision
*/
int check_collision(struct Dame dame_1, struct Dame dame_2)
{
    int x_1 = dame_1.x, y_1 = dame_1.y,
        x_2 = dame_2.x, y_2 = dame_2.y;
    
    if(
       x_1 == x_2 || y_1 == y_2 ||
       (x_1 - x_2) == (y_1 - y_2)
       )
               return 1;
    return 0;
} 
/*
return 0 non-collision
return 1 collision
*/
int check_all_collisions()
{
    int i=0, j=0 ,count = spielbrett->damenCount;
    for(;i < count;i++)
        for(j=0;j < count; j++)
            if(i != j && check_collision(spielbrett->damen[i], spielbrett->damen[j]))
                return 1;       
    return 0;
}

int next_free_position(){

    struct Position position;
    int i=0, j=0,
        count_X=sizeof(spielbrett->positions),
        count_Y=sizeof(spielbrett->positions[0]);
        
    for(;i<count_X;i++)
        for(j=0;j<count_X;j++)
            if(spielbrett->positions[i][j].is_taken == 0)
            {
                spielbrett->next_Position = spielbrett->positions[i][j];
                return 1;
            }
                
    return 0;
}

int main(int argc, char *argv[])
{
  init_Spielbrett();
  
  while(next_free_position())
  {
      struct Dame dame;
      dame.x = spielbrett->next_Position.x;
      dame.y = spielbrett->next_Position.y;
      
      add_Dame(dame);
  }   
  
  
  printf("Anzahl Damen: %d", spielbrett->damenCount);
  
  system("PAUSE");	
  return 0;
}
 
In der main-Funktion rufst du direkt init_Spielbrett auf. Diese Funktion verwendet sofort spielbrett was zu diesem Zeitpunkt ein unitialisierter Zeiger ist und daher irgendwo (wenn du Visual Studio im Debugmodus verwendet nicht irgendwo hin, sondern auf 0xCDCDCDCD) hinzeigt. Ergo gibt das zu 99% einen Runtimefehler (Access violation).
 
OK ich dachte mit struct Brett *spielbrett ist die Variable initialisiert?
Wie muss ich sie denn dann initialisieren bzw. einen Speicherbereich zuweisen?
 
OK ich dachte mit struct Brett *spielbrett ist die Variable initialisiert?

Wie kommst du darauf?
Du machst ja einen Pointer, der soll sich nicht selbst Speicher zuweisen.

a) Mit malloc Speicher anlegen und am Ende mit free wieder freigeben
oder b) Einfach spielbrett nicht als Pointer machen.
Im ganzen Programm gibts nirgends einen Grund, wofür ein Pointer nötig wäre.
Stern weg, dann ists eine echte Brett-Instanz mit eigenem Speicher.
Und die ganzen "spielbrett->" durch "spielbrett." ersetzen (Suchen/Ersetzen...nicht händisch)
 

Neue Beiträge

Zurück