PDA

View Full Version : [C/C++] Come


Zero-Giulio
09-12-2008, 21:40
Non programmo da un bel po di tempo e non ricordo come si usano le variabili globali.

Ho scritto qualcosa ma ottengo errori di compilazione (uso DevC++ o Code::Blocks).

Allora... Ho creato un progetto. Ci stà il .h


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

struct nodes
{
double x;
double y;
double z;
};

struct edges
{
long int first_node;
long int second_node;
};

typedef struct nodes nodes;
typedef struct nodes *nodesptr;
typedef struct edges edges;
typedef struct edges *edgesptr;

nodesptr nodes_list=NULL;
edgesptr edges_list=NULL;

int read_nodes_file (char *);


un .c


#include "whitney.h"

extern nodesptr nodes_list;
extern edgesptr edges_list;

int read_nodes_file (char nodes_file_name[])
{
long int i;
long int cont, nodes_num;
double x, y, z;
FILE *nodes_file;

nodes_file=fopen (nodes_file_name, "r");
if (nodes_file == NULL)
{
printf ("\nError: can't open file %s.\n", nodes_file_name);
return 0;
}
fscanf (nodes_file, "%ld", &nodes_num);
nodes_list=(nodesptr) malloc ((nodes_num+1)*sizeof (nodes));
nodes_list[0].x=nodes_list[0].y=nodes_list[0].z=(double) nodes_num;
for (i=1; i<=nodes_num; i++)
{
fscanf (nodes_file, "%ld %lf %lf %lf", &cont, &nodes_list[i].x, &nodes_list[i].y, &nodes_list[i].z);
if (cont != i)
{
printf ("\nError: in line %ld of file %s.\n", i, nodes_file_name);
return 0;
}
}
fclose (nodes_file);
return 1;
}


e un secondo .c col main:


#include "whitney.h"

int main ()
{
int logic=0;
char nodes_file_name [40];
printf ("\nIntroduce the name of the file with the list of the nodes: \n\n\t");
scanf ("%s", nodes_file_name);
logic=read_nodes_file (nodes_file_name)
}


Come dicevo ho errori di compilazione. Dice che ci sono dichiarazioni multiple di nodes_list e di edges_list.

Non so come risolvere.

In pratica: ho due strutture, nodes e edges, e voglio due vettori globali di queste struct globali, perchè voglio utilizzarle ovunque (in tutte le funzioni di tutti i files (che saranno più dei due che ho messo sopra)). Come faccio?

Zero-Giulio
09-12-2008, 21:43
Ho dimenticato di completare il titolo del topic e ora non riesco a editare.

Sono uno sbadato, mi spiace. Speriamo qualcuno entri a leggere lo stesso.

PS: ho cut/copy il codice, e nel farlo ho perso l'indendatura. Spero riusciate a leggerlo cmq.

Kenger
09-12-2008, 23:11
Non ho mai usato i due IDE da te citati, ma penso che l'errore sia dovuto alla doppia inclusione del .h
Prova rimuovendo una delle due inclusioni. ^^

Alex_87_xelA
09-12-2008, 23:20
prova a toglioere ...


extern nodesptr nodes_list;
extern edgesptr edges_list;


... queste 2 linee di codice dal file .c e vedi cosa succede.

perchè includendo il file h automaticamente includi anche le 2 variabili ... quindi non dovresti dichiararle in quel modo ... lo dovevi fare se stavano in un altro file .c , mentre invece stanno in un file .h.

fammi sapere :D

Zero-Giulio
10-12-2008, 00:37
Non ho mai usato i due IDE da te citati, ma penso che l'errore sia dovuto alla doppia inclusione del .h
Prova rimuovendo una delle due inclusioni. ^^

eh, ma non posso togliere l'.h. Nel .h c'è dichiarato TUTTO, dalle struct ai prototipi. Devo per forza includerlo.


prova a toglioere ...

Codice:
[QUOTE]
extern nodesptr nodes_list;
extern edgesptr edges_list;
[QUOTE]
... queste 2 linee di codice dal file .c e vedi cosa succede.

perchè includendo il file h automaticamente includi anche le 2 variabili ... quindi non dovresti dichiararle in quel modo ... lo dovevi fare se stavano in un altro file .c , mentre invece stanno in un file .h.

fammi sapere

non va, nel .c non vede le variabili.

sottovento
10-12-2008, 09:11
Hai messo queste due linee:


nodesptr nodes_list=NULL;
edgesptr edges_list=NULL;


nel file di intestazione. Significa che dichiari piu' volte le stesse variabili globali, in due file diversi (quelli che includono il tuo file di intestazione, e che vengono compilati separatamente).

Queste due linee sono da rimuovere dal .h e sono da sostituire con una dichiarazione extern (cosi' che puoi "vedere" le variabili da tutti i file .c che lo includono).

La dichiarazione andra' poi fatta in UN SOLO file sorgente (per esempio, quello che contiene il main()).

Zero-Giulio
10-12-2008, 09:54
Già, è così...

Adesso funge, grazie...

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.