Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo
Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo
Find X9 Ultra è lo smartphone che tanti aspettavano, e finalmente è arrivato anche in Italia. Abbiamo provato il flagship di OPPO per diverse settimane, e siamo volati fino in Cina alla sua presentazione ufficiale. Tutto gira intorno al suo incredibile comparto fotografico in collaborazione con Hasselblad e con un totale di sei fotocamere. Il resto è un mix di specifiche di altissimo livello, così come il prezzo. Vi raccontiamo tutto nella nostra recensione completa.
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-12-2006, 03:35   #1
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
[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, 08:28   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 09:39   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 11-12-2006 alle 09:53.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 11:02   #4
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
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, 11:13   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 11: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, 11:43   #7
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
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, 12:09   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 17:04   #9
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
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 17:26.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 17:23   #10
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
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 17:29.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2006, 21:43   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo Recensione OPPO Find X9 Ultra: è lui il c...
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Motorola Edge 60 Neo è il compatt...
Stretto di Hormuz, finti funzionari iran...
Dragon Ball Xenoverse 3 annunciato uffic...
WINDTRE BUSINESS potenzia i servizi IoT ...
OPPO rinnova l'ecosistema: arrivano Watc...
OPPO Find X9 Ultra ufficiale: debutta il...
Renault Twingo: esposta a Milano per far...
Intel vuole cambiare: overclocking anche...
Anche PlayStation introduce la verifica ...
Samsung ed Sk hynix, i bonus per gli ope...
Windows 11 velocizza Esplora File: ecco ...
Funzioni nascoste nelle librerie ADLX Ra...
Itala rinasce: lo storico marchio automo...
Huawei Watch Fit 5 e 5 Pro ufficiali: di...
ECOVACS DEEBOT T90 PRO OMNI vs Roborock ...
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: 16:00.


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