C: Problem s include

Programovacie jazyky, rady, poradňa...
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

C: Problem s include

Príspevok od používateľa Anti »

Kde je chyba?

maps.cpp

Kód: Vybrať všetko

#include "defs.h"
#include "maps.h"
#include "images.h"

//nacita mapu do struktury MAP
mapStruct* loadMap(char* filename)
{  

}

//zobrazi mapu podla struktury &MAP
void showMap(char* filename)
{ 	

}

maps.h

Kód: Vybrať všetko

#ifndef MAPS_H
    #define MAPS_H
    
mapStruct* loadMap(char* filename);
void showMap(char* filename);

#endif

Kód: Vybrať všetko

2 sdl\maps.cpp In file included from maps.cpp 
4 sdl\maps.h expected constructor, destructor, or type conversion before '*' token 
4 sdl\maps.h expected `,' or `;' before '*' token 
6 sdl\maps.cpp expected constructor, destructor, or type conversion before '*' token 
6 sdl\maps.cpp expected `,' or `;' before '*' token 
sdl\Makefile.win [Build Error]  [maps.o] Error 1 
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Máš niekde nadeklarované to mapStruct?
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

Príspevok od používateľa Anti »

takze som to trochu pomenil a problem je nasledovny

Kód: Vybrať všetko

4 sdl\maps.cpp In file included from maps.cpp 
11 sdl\maps.h expected init-declarator before '*' token 
11 sdl\maps.h expected `,' or `;' before '*' token 
sdl\maps.cpp In function `void showMap()': 
30 sdl\maps.cpp `backgroundSurf' undeclared (first use this function) 

  (Each undeclared identifier is reported only once for each function it appears in.) 
maps.cpp ostava v podstate rovnaky, maps.h sa zmenil na

Kód: Vybrať všetko

#ifndef MAPS_H
    #define MAPS_H

#include "defs.h"
    
typedef struct                                                                /
{
    int tile[MAP_HEIGHT][MAP_WIDTH];
}mapStruct;    
mapStruct MAP;
extern SDL_Surface* backgroundSurf = NULL;
    
void loadMap(char* filename);
void showMap();

#endif
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

V hlavičkovom súbore má byť len deklarácia (a teda tam nebudeš do tej premennej priraďovať NULL), navyše to vyzerá tak, že tú premennú backgroundSurf nemáš nikde nadefinovanú.
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

Príspevok od používateľa Anti »

okej, to priradenie NULL som si neuvedomil :) dik

Ale nic sa nezmenilo.
Hlasi to

Kód: Vybrať všetko

`backgroundSurf' undeclared (first use this function) 
Ved ja predsa deklarujem v maps.h

A tie ostatne hlasky ostavaju

maps.cpp vyzera

Kód: Vybrať všetko

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

#include "maps.h"
#include "images.h"

//nacita mapu do struktury MAP
void loadMap(char* filename)
{  
    FILE* FileHandle;			
    int x, y;                        											
    
    if((FileHandle = fopen(filename, "rw")) == NULL)
    {
        printf("Nepodarilo sa otvorit mapu.\n");
        exit(1);
    }																
    
    for(y=0; y<MAP_HEIGHT; y++) 
        for(x=0; x<MAP_WIDTH; x++)
            fscanf(FileHandle, "%d", &MAP.tile[y][x]);							

    fclose(FileHandle);
}

//zobrazi mapu podla struktury MAP
void showMap()
{ 	
	int x, y ;
    	
	backgroundSurf = load_BMP("gfx/tiles.bmp");
	 	 
    for(y=0; y<MAP_HEIGHT; y++) 
    {
        for(x=0; x<MAP_WIDTH; x++) 
        {
     		
            if(&MAP.tile[y][x] != 0);											
            {
			    //
	        }
	    }
	}
}
maps.h

Kód: Vybrať všetko

#ifndef MAPS_H
    #define MAPS_H

#include "defs.h"
    
typedef struct                                                               
{
    int tile[MAP_HEIGHT][MAP_WIDTH];
}mapStruct;    
mapStruct MAP;
SDL_Surface* backgroundSurf;
    
void loadMap(char* filename);
void showMap();

#endif
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

chybove hlasky musis brat od zaciatku lebo prekladac sa pokusa domysliet si casti kodu aby mohol pokracovat v preklade.

takze prva vec je na riadku 11:
11 sdl\maps.h expected init-declarator before '*' token // za touto hlaskou sa skryva "neviem co je to pred hviezdickou, predpokladam ze je to premenna ale neviem aky typ"

s toho vyplyva ze ti chyba include ktory ti definuje SDL_Surface,

kvoli tomu nie je definovana ani premenna backgroundSurf pouzita na riadku 30
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Chýba ti tam include súboru SDL.h a definovanie premennej backgroundSurf.
Anti
Expert
Expert
Príspevky: 187
Registrovaný: 16 feb 2006, 18:04

Príspevok od používateľa Anti »

Jasne!
Uplne som zabudol, ze tam pouzivam typ od SDL.
Dakujem :)

No ten zdrojak bude asi prekliaty..

Kód: Vybrať všetko

  multiple definition of `MAP' 
  first defined here 
  multiple definition of `backgroundSurf' 
  first defined here 
Skusil som maps.h zmenit na

Kód: Vybrať všetko

extern mapStruct MAP;
extern SDL_Surface* backgroundSurf;
a errory sa zmenili

Kód: Vybrať všetko

  [Linker error] undefined reference to `MAP' 
  [Linker error] undefined reference to `backgroundSurf' 
Vysvetlite mi to niekto prosim?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Keď pri tých premenných nemáš extern, tak sa ti tá premenná nadefinuje v každom súbore, v ktorom máš include toho súboru maps.h.
Keď tam máš to extern, tak sa automaticky nenadefinuje nikde, to musíš urobiť ty. A teda, do niektorého cpp súboru (do toho, ku ktorému tie dáta logicky patria) dáš ešte definíciu tých premenných (a teda verziu bez extern).
Napísať odpoveď