Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-12-2006, 04:35   #1
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9948
[C] E' possibile rendere 1 array locale visibile a tutto il programma?

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:
Codice:
extern char buffer[5000];
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 09:28   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Matrixbob
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:
Codice:
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
Codice:
char buffer[5000];
file2.c
Codice:
extern char buffer[];
non ti va bene??
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 10:39   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
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.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet

Ultima modifica di andbin : 11-12-2006 alle 10:53.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 12:02   #4
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9948
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? ).

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?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 12:13   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Matrixbob
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? ).

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....
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 12:19   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
La cosa più semplice è appunto passarlo come parametro...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 12:43   #7
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9948
Quote:
Originariamente inviato da andbin
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:
Codice:
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?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 13:09   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Matrixbob
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???
Ehm ... non è proprio banale ma dipende ovviamente da cosa vuoi "supportare" di XML.

Quote:
Originariamente inviato da Matrixbob
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:
Codice:
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.

Quote:
Originariamente inviato da Matrixbob
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).
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 18:04   #9
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9948
Quote:
Originariamente inviato da andbin
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!

Quote:
Originariamente inviato da Antonio23
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..
Quote:
Originariamente inviato da andbin
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?!

Quote:
Originariamente inviato da Antonio23
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.
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 ...

Quote:
Originariamente inviato da andbin
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.
Quote:
Originariamente inviato da cionci
La cosa più semplice è appunto passarlo come parametro...
La 3 mi piace assai. Che dici Cionci?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.

Ultima modifica di Matrixbob : 11-12-2006 alle 18:26.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 18:23   #10
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9948
Quote:
Originariamente inviato da andbin
Cioè ... ti stai scrivendo un parser XML???
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.

Quote:
Originariamente inviato da andbin
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?!
Codice:
# define SIZE_BUFFER 5000


Quote:
Originariamente inviato da andbin
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:
Codice:
EXTERN char buffer[];
Va bene anche questa soluzione?!
Sul libro di Kernighan dice che si usa fare anche così per scambiare informazioni tra funzioni.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.

Ultima modifica di Matrixbob : 11-12-2006 alle 18:29.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 22:43   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Matrixbob
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).
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Lo stealer VOLTA chiede a Claude, Kimi e...
Intel e Oracle puntano sulle CPU Xeon pe...
Offerte Amazon da urlo: Mac mini M6 a 89...
Bici elettriche a prezzi da record su Am...
Il boom dell'IA fa salire i costi: HP, A...
Cloudflare: 18,2 milioni di attacchi DDo...
GeForce RTX 2080 Ti con 22 GB di VRAM: f...
Dalla padella... ai server AI: Nvidia va...
1.000 cicli e ancora il 90,4% della capa...
SMS of Death fa crashare Android senza i...
BYD Yangwang U9 Xtreme da 2.977 CV fatta...
Altro che Made in USA: cosa si nasconde ...
Binance riapre dopo il maxi furto: gli u...
Ecovacs X12 OmniCyclone crolla a 599€ (p...
Solo le cialde Nespresso Original costan...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:14.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v