Newsgroup: it.comp.lang.c
Titolo: Problema in fase di compilazione proget to su più files

Salve a tutti, ho notato che lavorando su più files spesso si verificano 
dei fastidiosi effetti collaterali: nel senso che si possono avere 
strani errori o warning per delle cose abbastanza stupide (non saprei 
farle esempi, mi sono solo accorto che ho molti più errori strani e 
difficili da scovare dovuti al fatto che le funzioni vengono definite ed
implementate in un file .h anzichè nel file principale, non parlo di
punti e virgola o parentesi dimenticati....).
Ho un problema a trovare l'errore in questo banale progetto sotto 
dev-cpp che vi copio e incollo. Il compilatore tramite il dev-cpp mi 
dice questo:
------
make.exe -f "E:\Archivi\Roberto\Università\Uni Informatica\Dispense\ANNO
I\Programmazione\Projects T4\03 Dec 03\Battaglia\Makefile.win" all
gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"   -Wall
main.c: In function `crea_mappa':
main.c:3: warning: `main' is normally a non-static function
main.c:33: parse error at end of input
funzioni.h:19: warning: `num' defined but not used
funzioni.h:19: warning: `n_tab' defined but not used
funzioni.h:19: warning: `m_tab' defined but not used
funzioni.h:19: warning: `xTbomb' defined but not used
funzioni.h:19: warning: `yTbomb' defined but not used
make.exe: *** [main.o] Error 1
Execution terminated
--------------
Non riesco a capire "`main' is normally a non-static function" dato che
prima di aggiungere la funzione "void crea_mappa(int, int);" nel file 
"funzioni.h" non me lo dava. Sapreste mica scovarmi dove sta il 
problema? Non ho mai visto infatti questo messaggio prima d'ora (a dire 
il vero sono poche settimane che ho iniziato a fare semplici programmini 
da consegnare all'università per passare un esame di Programmazione).
"main.c:33: parse error at end of input" questo messaggio invece mi sono
accorto che può voler dire di tutto: ho stampato il file su carta per
controllarlo meglio (!!) e controllato le parentesi e i punti e virgola
senza trovare errori (anche perchè non ho modificato il file che
contiene il main() rispetto a quando mi veniva compilato a parte l'aver 
aggiunto la chiamata alla funzione crea_mappa...
Solo dopo aver dichiarato ed implementato "void crea_mappa(int, int);" 
nel file "funzioni.h" mi si è presentato il problema. Se la tolgo il 
problema scompare. Ovviamente non mi alloca la memoria però....
Mi saprestee spiegare il perchè qualcosa va storto? Questo è uno di quei
problemi nuovi che mi si stanno presentando lavorando su progetti con
più files. Dove ho sbagliato? Le funzioni per l'allocazione della
memoria non possono forse contemporaneamente essere void e lavorare su
puntatori globali static?
      grazie per l'attenzione, rz.
file con il main():
----main.c---
#include "funzioni.h"
int main(int arg, char **argv){
if(arg==5){
     printf("nome: %s\ncognome: %s\ndimensioni campo di gioco: %dx%d", 
*(argv+1), *(argv+2), atoi(*(argv+3)), atoi(*(argv+4)));
         if( !( ((atoi(*(argv+3)))>MIN_COORD) && 
((atoi(*(argv+3)))<MAX_COORD ) && ((atoi(*(argv+4)))>MIN_COORD) && 
((atoi(*(argv+4)))<MAX_COORD) )  ){
                 printf("\nLe dimensioni devono essere comprese fra %d e 
%d", MIN_COORD+1, MAX_COORD-1);
                 exit(0);
         }
     printf("\nCONFERMI LE SCELTE? s/n");
     while(1){
         if(getch()=='s')
            break;
       else if(getch()=='n')
          exit(0);
         else;
     }
}
   else{
       puts("Parametri errati. command line: batnav <nome> <cognome> 
<dimens_x> <dimens_y>");
       exit(0);
   }
clrscr();
crea_mappa(atoi(*(argv+3)), atoi(*(argv+4)));
return 0;
}
----fine main.c----
--file funzioni.h----
#include <stdio.h>
#include <stdlib.h>
#include <conio.c>
#include <conio.h>
#define MIN_COORD 4
#define MAX_COORD 16
#define NUM 10
void cima(const int, const int);
void norm(const int, const int);
void infra(const int, const int);
void fondo(const int, const int);
void crea_griglia(const int, const int, const int);
void ch_in_sq(int, int, const int);
void crea_mappa(int, int); 
         //alloca mem per tab e mappa
static int num=NUM, n_tab, m_tab, xTbomb, yTbomb; 
         //num numero navi, n e m numero elementi tabella (nxm=rigxcol), 
x,yTbomb coordinate bombardamento
static int **tab, **mappa; 
         //tab è la tabella con le navi (CPU), mappa quella vista a schermo
//implementazioni
//GRAFICA (per modo di dire.....  )
void cima(const int rows, const int tabs){
register int i, ROWS;
     if( rows%2 == 0)
         ROWS=rows/2-1;
       else
           ROWS=(rows/2);
     for(i=0; i<tabs; i++){
         printf("\t");
     }
     printf("%c", 201);
     for(i=0; i<ROWS; i++){
         printf("%c%c%c%c", 205,203,205,203);
     }
     printf("%c%c\n", 205, 187);
}
void norm(const int rows, const int tabs){
register int i, ROWS;
     if( rows%2 == 0)
         ROWS=rows/2;
       else
           ROWS=(rows/2)+1;
     for(i=0; i<tabs; i++){
         printf("\t");
     }
     for(i=0; i<ROWS; i++){
         printf("%c %c ", 186, 186);
     }
     printf("\n");
}
void infra(const int rows, const int tabs){
register int i, ROWS;
     if( rows%2 == 0)
         ROWS=rows-2;
       else
           ROWS=(rows-1);
     for(i=0; i<tabs; i++){
         printf("\t");
     }
     printf("%c", 204);
     for(i=0; i<ROWS; i++){
         printf("%c%c", 205,206);
     }
     printf("%c%c\n", 205, 185);
}
void fondo(const int rows, const int tabs){
register int i, ROWS;
     if( rows%2 == 0)
         ROWS=rows/2-1;
       else
           ROWS=(rows/2);
     for(i=0; i<tabs; i++){
         printf("\t");
     }
     printf("%c", 200);
     for(i=0; i<ROWS; i++){
         printf("%c%c%c%c", 205,202,205, 202);
     }
     printf("%c%c", 205, 188);
}
void crea_griglia(const int r, const int c, const int tabs){
register int i;
     puts("\n\n\n\n");
     cima(c, tabs);
     if(c<1){
         puts("ERRORE: chiamata a crea_griglia con numero colonne minore 
di 1");
         exit(0);
         }
     if(r>1){
         for(i=0; i<r; i++){
                 norm(c, tabs);
                 if(i==r-1)
                     break;
                 infra(c, tabs);
         }
     fondo(c, tabs);
     }
       else
          if(r==1){
              norm(c, tabs);
              fondo(c, tabs);
          }
         else{
           puts("ERRORE: chiamata a crea_griglia con numero righe 
negativo");
           exit(0);
         }
}
void ch_in_sq(int RIGA, int COLONN, int ASC){
RIGA=5+(RIGA*2);
COLONN=16+(COLONN*2);
gotoxy(COLONN,RIGA);
putchar(ASC);
}
//FUNZIONI DI ALLOCAZIONE MEMORIA
void crea_mappa(int n_tab, int m_tab){
int i;
     tab = calloc(n_tab, sizeof(int));
         if(tab==NULL){
                 puts("Errore nell'allocazione delle righe");
                 exit(0);
         }
     for(i=0; i<n_tab; i++){
         *(tab+i)=calloc(m_tab, sizeof(int));
         if(*(tab+i)==0){
                 puts("Errore nell'allocazione delle colonne");
                 exit(0);
         }
     mappa = calloc(n_tab, sizeof(int));
         if(mappa==NULL){
                 puts("Errore nell'allocazione delle righe");
                 exit(0);
         }
     for(i=0; i<n_tab; i++){
         *(mappa+i)=calloc(m_tab, sizeof(int));
         if(*(mappa+i)==NULL){
                 puts("Errore nell'allocazione delle colonne");
                 exit(0);
         }
}
---fine funzioni.h----

battaglia navale? ;)

 punti e virgola o parentesi dimenticati....).
Ecco, quello e' un errore. Il compilatore non ti da warning o errori 
perche' si diverte, ma perche' ci son cose da mettere a posto.
Negli header vanno solo dichiarazioni, nei .c le definizioni. *NON* 
mettere mai variabili globali non-extern o definizioni di funzioni in un 
header, saltano fuori altrimenti parecchi errori.
Credo che quell'errore al main sia dovuto ad errori precedenti in 
funzioni.h che l'avevano confuso, e cosi' il successivo errore. Sicuro 
sicuro che le parentesi siano bilanciate, vero...?
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

 
Eeeh si! All'università ci chiedono questo ed altro :=). Cmq trovo che 
sia abbastanza istruttivo come programma.
		ciao, rz.

 
Era proprio un errore di parentesi :( (mi cospargo il capo di cenere)!!! 
Quel "warning: `main' is normally a non-static function" mi aveva 
mandato in TILT perchè pensavo che l'errore di parsing dipendesse dal 
warning e non ho pensato alla prima cosa a cui avrei dovuto pensare 
ovvero un banale errore di parentesi (d'altra parte quel messaggio di 
warning non mi avrebbe bloccato la compilazione quindi dovevo immaginare 
che c'era prima da risolvere l'errore di parsing).
Il fatto è che temo di brutto gli errori concatenati che danno come 
allarmi in fase di compilazione messaggi contradditori o non 
veritieri... a volte questo timore mi porta fuori strada.
Non trovate che gli editor dovrebbero avere una funzione che permette, 
quando inserita, di colorare le parentesi omologhe (intendo quelle 
corrispondenti) di colori uguali? Secondo me farebbe risparmiare tanto 
tempo in molte circostanze. Non è che qualche editor ha questa funzione?
	grazie 1000 per la disponibilità, rz.

 tempo in molte circostanze. Non è che qualche editor ha questa funzione?
In vim, col "%", puoi viaggiare tra le parentesi bilanciate, senza 
bisogno di 2 milioni di colori.


uhmmm e nn vi hanno dato anche un labirinto ed un semaforo? :D