View Full Version : [C] E' possibile rendere 1 array locale visibile a tutto il programma?
Matrixbob
11-12-2006, 04:35
Chiedo questo perchè vorrei evitare di fare troppe modifiche ai parametri delle funzioni.
Ho provato anche ad usare 1 array extern:
funziona, ma mi da noia il fatto che devo fissargli già esternamente a tutto, main compreso, la dimensione. :(
es:
extern char buffer[5000];
Chiedo questo perchè vorrei evitare di fare troppe modifiche ai parametri delle funzioni.
Ho provato anche ad usare 1 array extern:
funziona, ma mi da noia il fatto che devo fissargli già esternamente a tutto, main compreso, la dimensione. :(
es:
extern char buffer[5000];Non ho ben capito il problema ... vuoi non dover fissare a priori una dimensione per l'array oppure non vuoi mettere extern char buffer[5000]; con la dimensione???
Vorrei capire meglio:
file1.c
char buffer[5000];
file2.c
extern char buffer[];non ti va bene??
Giusto per precisare ... visto che non ho ben capito il problema: una variabile dichiarata dentro una funzione sarà sempre e soltanto visibile alla funzione stessa.
EDIT: se la variabile locale ad una funzione fosse dichiarata static, avrebbe durata 'fissa' ma sarebbe comunque visibile solamente all'interno della funzione. Certo ... la funzione potrebbe ritornare o impostare da qualche altra parte un puntatore a quella variabile static ... ma è un altro discorso. ;)
Matrixbob
11-12-2006, 12:02
Allora, io ho 1 file unico x ora.
Chiamiamolo unico.c
Come ultima funzione ho la funzione main.
Sopra al main ho tutte le altre che chiamo (anche se bastava mettere i prototipi delle funzioni mi pare? :mbe: ).
Tra le funzioni sopra il main ho: salva, comportamento ed immetti.
Salva chiama prima comportamento e dopo immetti.
In comportamento ho scoperto che devo raccogliere delle informazioni, ho deciso di raccoglierle in 1 buffer.
Questo buffer adesso lo posso rendere visibile alla funzione immetti?!
---
[NB]
l'annidamento dei richiami è questo:
> Inizio Salva
>>Comportamento
>>Immetti
> Fine Salva
Adesso si capisce cosa voglio?! :)
Allora, io ho 1 file unico x ora.
Chiamiamolo unico.c
Come ultima funzione ho la funzione main.
Sopra al main ho tutte le altre che chiamo (anche se bastava mettere i prototipi delle funzioni mi pare? :mbe: ).
Tra le funzioni sopra il main ho: salva, comportamento ed immetti.
Salva chiama prima comportamento e dopo immetti.
In comportamento ho scoperto che devo raccogliere delle informazioni, ho deciso di raccoglierle in 1 buffer.
Questo buffer adesso lo posso rendere visibile alla funzione immetti?!
---
[NB]
l'annidamento dei richiami è questo:
> Inizio Salva
>>Comportamento
>>Immetti
> Fine Salva
Adesso si capisce cosa voglio?! :)Ci sono più modi per fare quello che vuoi:
- Metti la variabile che vuoi "condividere" come globale (fuori dalle funzioni, ad esempio all'inizio del sorgente o comunque prima di dove la usi).
- In Comportamento allochi dinamicamente la variabile che ti serve e poi fai ritornare un puntatore in modo da passarlo poi ad altre funzioni
- Prima di chiamare Comportamento allochi la variabile e passi il puntatore alle funzioni che devono usare la variabile.
Cosa scegliere, dipende ovviamente dal tipo e dimensione della variabile, da cosa devi fare, da quanto sai a priori della variabile, dal "significato" della variabile (è un dato davvero unico e "globale"???), ecc....
La cosa più semplice è appunto passarlo come parametro...
Matrixbob
11-12-2006, 12:43
Cosa scegliere, dipende ovviamente dal tipo e dimensione della variabile, da cosa devi fare, da quanto sai a priori della variabile, dal "significato" della variabile (è un dato davvero unico e "globale"???), ecc....
Ecco io sto ancora lavorando a quel parser, ma senza usare quelle librerie consigliate lo ho scritto da me.
DIMENSIONAMENTO
Ecco al riguardo ho operato come segue.
Per dimensionare il buffer faccio che accedere al file.xml, contarne i caratteri ed utilizzare questo valore per dichiarare:
char buffer[char_count];
Faccio questo x evitare segmentation fault od altri probblemi, sbaglio?!
Solo che poi sto buffer deve anche essere stampato dalla funzione immetti, e quindi devo renderglielo visibile.
Voi cosa consigliate?!
Ecco io sto ancora lavorando a quel parser, ma senza usare quelle librerie consigliate lo ho scritto da me.Cioè ... ti stai scrivendo un parser XML??? :eek:
Ehm ... non è proprio banale ma dipende ovviamente da cosa vuoi "supportare" di XML.
DIMENSIONAMENTO
Ecco al riguardo ho operato come segue.
Per dimensionare il buffer faccio che accedere al file.xml, contarne i caratteri ed utilizzare questo valore per dichiarare:
char buffer[char_count];Dichiarare un array di dimensione variabile è fattibile solo in C++ o nel C99, non in ANSI "C". Questo solo per precisare ... se ti va bene, per me è ok.
Faccio questo x evitare segmentation fault od altri probblemi, sbaglio?!
Solo che poi sto buffer deve anche essere stampato dalla funzione immetti, e quindi devo renderglielo visibile.
Voi cosa consigliate?!Se Comportamento e Immetti sono entrambe chiamate nel main, puoi dichiarare quella variabile nel main e passarla ad entrambe le funzioni (essendo un array, passi ovviamente un puntatore).
Matrixbob
11-12-2006, 18:04
Non ho ben capito il problema ... vuoi non dover fissare a priori una dimensione per l'array oppure non vuoi mettere extern char buffer[5000]; con la dimensione???
Entrambi!
se lo dichari con static, rimane visibile anche quando esci dalla funzione in cui l'hai dichiarato...[EDIT] nel senso però che la puoi trattare solo in chiamate a quella funzione, non è questo il tuo caso, scusa.. :stordita:
Giusto per precisare ... visto che non ho ben capito il problema: una variabile dichiarata dentro una funzione sarà sempre e soltanto visibile alla funzione stessa.
EDIT: se la variabile locale ad una funzione fosse dichiarata static, avrebbe durata 'fissa' ma sarebbe comunque visibile solamente all'interno della funzione. Certo ... la funzione potrebbe ritornare o impostare da qualche altra parte un puntatore a quella variabile static ... ma è un altro discorso. ;)
Quindi rimane come 1 traccia indelebile della funzione, come il ricordo di 1 "vita passata" da rincarnazione a rincarnazione?! :D
pensavo che avesse la necessità di mantenere un valore anche fuori dalla funzione - successive chiamate a quella funzione-, mi sono spiegato male, nn mi sembra questo il suo caso. :D
Infatti!!! Proprio quello.
Ma STATIC è applicabile ad 1 array?
Mi pare che il compilatore mi abbia detto che aveva le dimensioni troppo grosse l'array ...
Ci sono più modi per fare quello che vuoi:
- Metti la variabile che vuoi "condividere" come globale (fuori dalle funzioni, ad esempio all'inizio del sorgente o comunque prima di dove la usi).
- In Comportamento allochi dinamicamente la variabile che ti serve e poi fai ritornare un puntatore in modo da passarlo poi ad altre funzioni
- Prima di chiamare Comportamento allochi la variabile e passi il puntatore alle funzioni che devono usare la variabile.
La cosa più semplice è appunto passarlo come parametro...
La 3 mi piace assai. Che dici Cionci?! :)
Matrixbob
11-12-2006, 18:23
Cioè ... ti stai scrivendo un parser XML??? :eek:
Ehm ... non è proprio banale ma dipende ovviamente da cosa vuoi "supportare" di XML.
Si! Ma RSS 2.0 che copre solo 1 casistica non esagerata di casi.
Il Prof. spingeva poichè non perdessi tempo ad imparare le librerie che tu mi avevi indicato.
Lo scopo non è il parser, ma solo 1 pezzetto del progetto. :(
Dichiarare un array di dimensione variabile è fattibile solo in C++ o nel C99, non in ANSI "C". Questo solo per precisare ... se ti va bene, per me è ok.
Spiego cosa faccio:
- accedo al file.rss
- ne conto i caratteri
- ritorno il loro numero
- alloco 1 array[numero_caratteri]
Così creo array molto grossi effettivamente 200.000 char anche!
Forse meglio mettere delle macro fisse all'inizio?!
# define SIZE_BUFFER 5000
:confused: :mbe: :confused:
Se Comportamento e Immetti sono entrambe chiamate nel main, puoi dichiarare quella variabile nel main e passarla ad entrambe le funzioni (essendo un array, passi ovviamente un puntatore).
Eh farò così o la 3 che hai citato prima.
---
Domandone:
io adesso uso la variabile dichiarata al inizio file e poi nella funzione in cui la uso metto:
EXTERN char buffer[];
Va bene anche questa soluzione?!
Sul libro di Kernighan dice che si usa fare anche così per scambiare informazioni tra funzioni.
Spiego cosa faccio:
- accedo al file.rss
- ne conto i caratteri
- ritorno il loro numero
- alloco 1 array[numero_caratteri]
Così creo array molto grossi effettivamente 200.000 char anche!Nessun parser XML fa una cosa del genere! Generalmente si legge un blocco di byte per volta, non tanto grande, roba tipo 4096 bytes o suppergiù. Anzi in genere è l'applicazione e non la libreria del parser che fisicamente legge il file. Al parser viene passato di volta in volta solamente un blocco di tot bytes che il parser analizza per aggiornare il proprio stato interno e fare poi quello che serve, cioè crearsi l'albero dei nodi (metodo DOM) o informare l'applicazione del raggiungimento di certi punti specifici come l'inizio/fine dei tag (metodo SAX).
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.