Jump to content

Recommended Posts

Posted (edited)

Boas, estava a tentar fazer uma função para ler uns mapas de um ficheiro, mas está-me a dar um erro que não consigo entender.

O erro é: error c2143: missing ';' before 'type'.

Código:

while(fscanf(fr,"%s",szfinputz)!=EOF) {
if (strcmp(szfinputz,"@name")==0) {
	fscanf(fr," %[^\n]\n",app.map.name); //ignora espacos, le uma string até ao final da linha e ignora o final da linha
} else if (strcmp(szfinputz,"@author")==0) {
	fscanf(fr," %[^\n]\n",app.map.author); //ignora espacos, le uma string até ao final da linha e ignora o final da linha
} else if (strcmp(szfinputz,"@dim")==0) {
	fscanf(fr," %i %i\n", &app.map.width, &app.map.height); //ignora espacos, le um int, ignora espacos, le um int e ignora o final da linha
} else if (strcmp(szfinputz,"@start")==0) {
	fscanf(fr," %i %i\n", &app.map.start.x, &app.map.start.y); //ignora espacos, le um int, ignora espacos, le um int e ignora o final da linha
} else if (strcmp(szfinputz,"@portal")==0) {
	fscanf(fr," %i %i", &ntmp1, &ntmp2); //ignora espacos, le um int, ignora espacos, le um int e ignora o fim da linha
	fscanf(fr," %i", &app.map.map[ntmp1][ntmp2].event.x); //ignora espacos, le um int
	fscanf(fr," %i\n", &app.map.map[ntmp1][ntmp2].event.y); //ignora espacos, le um int e ignora o final da linha
} else if (strcmp(szfinputz,"@end")==0) {
	fscanf(fr,"%i %i\n", &app.map.end.x, &app.map.end.y); //ignora espacos, le um int, ignora espacos, le um int e ignora o fim da linha
} else if (strcmp(szfinputz,"@map")==0) {
		for (unsigned y=0; y< app.map.height; y++) {
			for (unsigned x=0; x < app.map.width ; x++) {
				chtmp = fgetc(fr);
				while (chtmp=='\n') {
					printf("excepcao: papMapLoadFromFile, chtmp='\\n'\n");
					chtmp = fgetc(fr);
				}
				pmptmp.type = chtmp;
				app.map.map[x][y] = pmptmp;
			}
			chtmp = fgetc(fr);
		}
	}
}  

Já tentei compilar o projeto sem esta parte do programa e funciona sem erros. Ao incluir isto, dá-me errp que descrevi acima, mas tenho quase a certeza que não me falta nenhum ';' ou ')'.

Tenho tambem a dúvida de que se as regular expressions estão certas ou não.

Edited by xtrm0

<Signature goes here>

Posted

Boas, estava a tentar fazer uma função para ler uns mapas de um ficheiro, mas está-me a dar um erro que não consigo entender.

O erro é: error c2143: missing ';' before 'type'.

Isso é em compile time?

2143 parece ser a linha. Aonde é que está esse linha?

Tenho tambem a dúvida de que se as regular expressions estão certas ou não.

regular expressions ? onde?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted
           for (unsigned y=0; y< app.map.height; y++) {
               for (unsigned x=0; x < app.map.width ; x++) {
                   chtmp = fgetc(fr);
                   while (chtmp=='\n') {
                       printf("excepcao: papMapLoadFromFile, chtmp='\\n'\n");
                       chtmp = fgetc(fr);
                   }
                   pmptmp.type = chtmp;
                   app.map.map[x][y] = pmptmp;
               }
               chtmp = fgetc(fr);
           }

Então mas o teu programa é C (o quadro em que escolheste por a tua questão) ou é C++ (a linguagem que escolheste meter para o código)?

Se é C++ ignora a minha resposta (eu não sei C++) e pede a um moderador (posso ser eu) para mudar o tópico de quadro; se é C talvez queiras mudar a linguagem do código 🙂

A versão C de 1989 (aquela que o compilador Microsoft Visual Studio aceita) não reconhece a declaração de variaveis "dentro" do for. Passa a definição do x e y para fora:

           unsigned y;                              // y definido fora do for
           for (y=0; y< app.map.height; y++) {
               unsigned x;                          // x definido fora do for
               for (x=0; x < app.map.width ; x++) {
                   chtmp = fgetc(fr);
                   while (chtmp=='\n') {
                       printf("excepcao: papMapLoadFromFile, chtmp='\\n'\n");
                       chtmp = fgetc(fr);
                   }
                   pmptmp.type = chtmp;
                   app.map.map[x][y] = pmptmp;
               }
               chtmp = fgetc(fr);
           }

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted (edited)

xtrm0, vê as declarações no header. Erros no header podem ser reflectidas no código durante a compilação.

PS: Se quiseres envia-me o código que eu faço upload para o svn e vemos isso.

Edited by Flinger
Posted (edited)

já agora tenho uma sugestão para "limpar" o código

typedef
struct
{
 char name[32];
 int (*func)(papApp *, char *, FILE *);
} MapEntry;

// o argumento file está aqui para o caso da entrada @map
// visto que esta entrada requere a leitura das linhas seguintes
int readAuthor(papApp * app, char * line, FILE * file)
{
 // ...
}

int readMap(char * file)
{
 MapEntry entries[1]; // alterar para o número de entradas possíveis
 FILE * file = NULL;
 char line[256];
 int i = 0, found = 0;

 memset(entries, 0, sizeof(entries));

 // adicionar as entradas necessárias
 strcpy(entries[0].name, "@author");
 entries[0].func = readAuthor;
 // ...

 // abertura do ficheiro e ciclo de leitura
 // ...
 {
   // leitura da linha
   fgets(line, 256, file);

   // interpretar a linha
   found = 0;
   for(i = 0; i <= 1 && !found; i++) // alterar para o número de entradas
   {
     if (strstr(line, entries[i].name) == line)
     {
       entries[i].func(app, line, file);
       found = 1;
     }
   }
 }
 // fecho do ficheiro
 // ...
}

acho que alem de ficar mais legível o código é bem mais fácil adicionar tipos de entradas

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Obrigado pela ajuda. O problema era mesmo estar a declarar os unigned's dentro do for.

@happyhippyhippo, ache que não vale a pena estar a adicionar uma função para cada entrada no mapa, visto que assim estariamos a por em 200 linhas de código o que cabe em 50.

@Flinger, a função para carregar os mapas já está a funcionar como deve de ser. Se quiseres adicionar ao svn:

https://www.dropbox.com/s/rz7kswddt8iykad/labirinto.zip

Alterações feitas:

Adicionei dois erros novos ao errors.h (erros relacionados com a escrita e leitura em ficheiros)

Adicionei algumas linhas ao papMapClear(para limpar os teletransportes) e comentei outras que davam erro de compilação.

Acabei a função papMapLoadFromFIle.

No main.h adicionei os includes das bibliotecas como pragma comment(lib,"biblioteca.lib"), e adicionei um comment para funcionar com VS (#ifdef _WIN32

#undef main

#endif)

Edited by xtrm0

<Signature goes here>

Posted

@happyhippyhippo, ache que não vale a pena estar a adicionar uma função para cada entrada no mapa, visto que assim estariamos a por em 200 linhas de código o que cabe em 50.

a minha sugestão era para facilitar a adição de novos elementos do mapa, no entanto cada um é livre de implementar o como bem lhe entender (desde que funcione claro)

Adicionei algumas linhas ao papMapClear(para limpar os teletransportes) e comentei outras que davam erro de compilação.

estranho ... eu tenho essa função a compilar corretamente.

No main.h adicionei os includes das bibliotecas como pragma comment(lib,"biblioteca.lib")

não tenho a certeza mas acho que esse modelo de inclusão de bibliotecas é VS only ... meteste dentro de "#ifdef _MSC_VER" ??

IRC : sim, é algo que ainda existe >> #p@p
Posted
Citação

No main.h adicionei os includes das bibliotecas como pragma comment(lib,"biblioteca.lib")

não tenho a certeza mas acho que esse modelo de inclusão de bibliotecas é VS only ... meteste dentro de "#ifdef _MSC_VER" ??

Não tinha posto ainda. Vou por agora.

Citação

Adicionei algumas linhas ao papMapClear(para limpar os teletransportes) e comentei outras que davam erro de compilação.

estranho ... eu tenho essa função a compilar corretamente.

O erro estava aqui:

// limpar a informacao dos itens do mapa

/*for (iter_x = 0; iter_x < PAPGAMES_MAP_MAX_ITEMS; iter_x++) {

app.map.items[iter_x].type = 0;

app.map.items[iter_x].pos.x = 0;

app.map.items[iter_x].pos.y = 0;

app.map.items[iter_x].event.x = 0;

app.map.items[iter_x].event.y = 0;

}*/

Acho que depois alteraste o mapa para cada papMapPos guardar as informações dos items e te esqueceste de tirar isto.

<Signature goes here>

Posted (edited)

@Hippo: Deves-te ter esquecido de actualizar o map.h Não existe a constante PAPGAMES_MAP_MAX_ITEMS nem o membro items da estrutura papMap

Edited by Flinger

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.