Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2006, 15:42   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Problema con array dinamici

Mi capita una cosa strana. Nel mio programma dichiaro un array dinamico di interi:

int*nodiaperti;

All'interno di una funzione dichiaro : nodiaperti= new int[1000];

Alla fine della funzione dealloco il tutto : delete[] nodiaperti;

Quando richiamo la seconda volta la funzione, senza uscire dal programma, l'array viene ricreato ma non è vuoto. Alcune posizioni risultano occupate da numeri interi molto grossi. Ma perchè? Se dealloco l'array e lo rialloco, dovrebbe essere vuoto o sbaglio?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 15:56   #2
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Non vorrei dire una cavolata ma la new non "pulisce" la zona di memoria allocata quindi ti restituisce un indirizzo di memoria valido che può essere pieno di robaccia. Sta a te ripulirla prima di cominciare ad usarla.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 16:08   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da VICIUS
Non vorrei dire una cavolata ma la new non "pulisce" la zona di memoria allocata quindi ti restituisce un indirizzo di memoria valido che può essere pieno di robaccia. Sta a te ripulirla prima di cominciare ad usarla.

ciao
Pensavo che questo compito lo facesse il delete[] . Pero' scusa, se devo azzerare tutto il vettore per riusarlo, perdo il vantaggio dell'allocazione dinamica.
Dichiarando int*nodiaperti = new int[1000] e magari uso solo 500 posti, gli altri 500 li risparmierei. Invece, se sono costretto ad azzzerare tutti e 1000 gli elementi, è come avere un array statico di 1000 elementi.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 16:21   #4
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Quote:
Originariamente inviato da Unrue
Pensavo che questo compito lo facesse il delete[] . Pero' scusa, se devo azzerare tutto il vettore per riusarlo, perdo il vantaggio dell'allocazione dinamica.
Dichiarando int*nodiaperti = new int[1000] e magari uso solo 500 posti, gli altri 500 li risparmierei. Invece, se sono costretto ad azzzerare tutti e 1000 gli elementi, è come avere un array statico di 1000 elementi.
Forse hai le idee un pò confuse. Per come la dichiari, nodiaperti è una variabile puntatore ad int. A questa variabile assegni l'indirizzo del primo elemento dell'array allocato staticamente (!) tramite l'operatore new. Quest'ultimo ha semplicemente trovato e riservato un'area consecutiva di memoria sufficientemente grande per contenere 1000 interi.

DISCLAIMER: non tocco C++ da troppo tempo ormai, ti conviene attendere qualche risposta più 'autorevole'.
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer
°SetiEmperor°| Ninja Technologies
{ qualunque cosa sia, è veloce e fa male (cit.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 16:42   #5
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da Unrue
Pensavo che questo compito lo facesse il delete[] .
Il compito della delete e dire al sistema operativo che il tuo programma non ha piu bisogno di quella memoria.

Quote:
Originariamente inviato da Unrue
Pero' scusa, se devo azzerare tutto il vettore per riusarlo, perdo il vantaggio dell'allocazione dinamica.
Dichiarando int*nodiaperti = new int[1000] e magari uso solo 500 posti, gli altri 500 li risparmierei. Invece, se sono costretto ad azzzerare tutti e 1000 gli elementi, è come avere un array statico di 1000 elementi.
Il vantaggio della allocazione dinamica è che puoi allocare a tempo di esecuzione il numero esatto di elementi che ti servono. Se conosci a priori il numero di elementi che ti servono non ha senso usare l'allocazione dimanica. Se ti servono 372 elementi ne allochi 372, li azzeri per stare sicuro e poi li usi.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 18:52   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Unrue
Mi capita una cosa strana. Nel mio programma dichiaro un array dinamico di interi:

int*nodiaperti;

All'interno di una funzione dichiaro : nodiaperti= new int[1000];

Alla fine della funzione dealloco il tutto : delete[] nodiaperti;

Quando richiamo la seconda volta la funzione, senza uscire dal programma, l'array viene ricreato ma non è vuoto. Alcune posizioni risultano occupate da numeri interi molto grossi. Ma perchè? Se dealloco l'array e lo rialloco, dovrebbe essere vuoto o sbaglio?
vuol dire che usi Visual C++; ho indovinato? niente di grave comunque, vai di memset.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 20:44   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da Angus
Forse hai le idee un pò confuse. Per come la dichiari, nodiaperti è una variabile puntatore ad int. A questa variabile assegni l'indirizzo del primo elemento dell'array allocato staticamente (!) tramite l'operatore new. Quest'ultimo ha semplicemente trovato e riservato un'area consecutiva di memoria sufficientemente grande per contenere 1000 interi.

DISCLAIMER: non tocco C++ da troppo tempo ormai, ti conviene attendere qualche risposta più 'autorevole'.
Scusa se mi permetto ma l'operatore new non serve proprio per allocare dinamicamente qualcosa?. Se scrivo:

int*a= new int[10] a punta al primo indirizzo dell'array dinamico di interi.

Io non so a priori quanti elementi avrà questo array. Tale array cresce man mano che il programma avanza e ce li aggiunge. Io vorrei che al massimo mi occupasse 1000 posti,senza allocarli subito, quindi se alla fine ne ha utilizzati 500, gli altri 500 non li deve aver allocati. Non so se questo vuol dire memoria dinamica.

Ultima modifica di Unrue : 21-04-2006 alle 22:41.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 20:49   #8
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da 71104
vuol dire che usi Visual C++; ho indovinato? niente di grave comunque, vai di memset.
No, sto usando Borland C++ Builder 6
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 20:50   #9
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da VICIUS
Il compito della delete e dire al sistema operativo che il tuo programma non ha piu bisogno di quella memoria.


Il vantaggio della allocazione dinamica è che puoi allocare a tempo di esecuzione il numero esatto di elementi che ti servono. Se conosci a priori il numero di elementi che ti servono non ha senso usare l'allocazione dimanica. Se ti servono 372 elementi ne allochi 372, li azzeri per stare sicuro e poi li usi.

ciao
Certo, questo lo so. Ma non so quanti elementi avro', per questo la uso
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 01:39   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Unrue
No, sto usando Borland C++ Builder 6
aaargh
non avevo considerato la Borland

be' comunque la stessa cosa in determinati casi capita anche col VC++

ciao
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 11:57   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da 71104
aaargh
non avevo considerato la Borland

be' comunque la stessa cosa in determinati casi capita anche col VC++

ciao
Mi sai dire se, quando scrivo int*a= new int[1000]
se alloco dinamicamente un'array di interi? Perchè sopra mi hanno detto che cosi' l'allocazione è statica. Ma allora a cosa serve l'operatore new quando do' una dimensione fissa all'array? New serve solo quando la dimensione non è specificata subito ma durante l'esecuzione?

Del tipo : int*a= new int[dim] e dim gli e la do' successivamente in fase di esecuzione, per esempio come input da tastiera.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 12:35   #12
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Unrue
Mi capita una cosa strana. Nel mio programma dichiaro un array dinamico di interi:

int*nodiaperti;

All'interno di una funzione dichiaro : nodiaperti= new int[1000];

Alla fine della funzione dealloco il tutto : delete[] nodiaperti;

Quando richiamo la seconda volta la funzione, senza uscire dal programma, l'array viene ricreato ma non è vuoto. Alcune posizioni risultano occupate da numeri interi molto grossi. Ma perchè? Se dealloco l'array e lo rialloco, dovrebbe essere vuoto o sbaglio?
La new allora uno spazio in memoria pari a quello che specifichi. Ma non puoi anche costringerla ad inizializzare tutta la memoria che alloca. Cosa vorresti ci fosse dentro? Tutti 0? Tutti 1? La new alloca la memoria, poi sta a te inizializzarla.
Se vuoi fare tutto in un colpo, in questo modo inizializzi tutto a zero:
Codice:
nodiaperti = new int[1000]();
Altra cosa: e' buona norma poi mettere a zero il puntatore dopo la delete.

Codice:
delete[] nodiaperti;
nodiaperti = 0;
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 12:44   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da shinya
La new allora uno spazio in memoria pari a quello che specifichi. Ma non puoi anche costringerla ad inizializzare tutta la memoria che alloca. Cosa vorresti ci fosse dentro? Tutti 0? Tutti 1? La new alloca la memoria, poi sta a te inizializzarla.
Se vuoi fare tutto in un colpo, in questo modo inizializzi tutto a zero:
Codice:
nodiaperti = new int[1000]();
Altra cosa: e' buona norma poi mettere a zero il puntatore dopo la delete.

Codice:
delete[] nodiaperti;
nodiaperti = 0;

Quindi scrivere int*nodiaperti = new int[1000],

equivale a scrivere int a[1000];

int*nodiaperti= &a; ? Quindi è come fare l'allocazione statica se ho ben capito. Pero' io volevo che mi allocasse un elemento per volta , man mano che lo inserivo. Non tutti in un colpo. Per esempio, io credo che i vector facciano cosi, perchè si puo' dichiarare senza specificare le dimensioni, e poi inserire gli elementi con la pushback. In tal modo, alloca un elemento per volta, suppongo.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 12:48   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Unrue
Mi sai dire se, quando scrivo int*a= new int[1000]
se alloco dinamicamente un'array di interi? Perchè sopra mi hanno detto che cosi' l'allocazione è statica. Ma allora a cosa serve l'operatore new quando do' una dimensione fissa all'array? New serve solo quando la dimensione non è specificata subito ma durante l'esecuzione?

Del tipo : int*a= new int[dim] e dim gli e la do' successivamente in fase di esecuzione, per esempio come input da tastiera.
così è dinamica:
Codice:
int *a = new int[1000];
int *b = new int[dim];
e così è statica:
Codice:
int a[1000];
inoltre alcuni compilatori (come il gcc) ti permettono anche di scrivere cose tipo
Codice:
int b[dim];
ma sono veramente orribbili con due B.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 13:01   #15
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Unrue
Quindi scrivere int*nodiaperti = new int[1000],

equivale a scrivere int a[1000];

int*nodiaperti= &a; ? Quindi è come fare l'allocazione statica se ho ben capito.
Al massimo equivale a:
Codice:
int a[10];
int *b = a; // dove 'a' equivale a &a[0]
E non è come l'allocazione statica, perchè puoi allocare memoria "su richiesta". E' chiaro che poi entrambe allocano memoria.

Quote:
Originariamente inviato da Unrue
Pero' io volevo che mi allocasse un elemento per volta , man mano che lo inserivo. Non tutti in un colpo. Per esempio, io credo che i vector facciano cosi, perchè si puo' dichiarare senza specificare le dimensioni, e poi inserire gli elementi con la pushback. In tal modo, alloca un elemento per volta, suppongo.
Da quel che mi pare di capire, una lista sarebbe più pertinente come struttura.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 13:01   #16
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da 71104
così è dinamica:
Codice:
int *a = new int[1000];
int *b = new int[dim];
Pero' scusa, se scrivo :

int *a = new int[1000];

cosa c'e' di dinamico? La dimensione dell'array è fissata a priori.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 14:59   #17
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Nessuno ha ancora precisato una cosa, di cui non sono più tanto sicuro:

Codice:
int a[1000]; // alloca un array di 1000 interi nello stack
int* b = new int[1000]; // alloca un array di 1000 interi nello heap
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer
°SetiEmperor°| Ninja Technologies
{ qualunque cosa sia, è veloce e fa male (cit.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 15:05   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da Angus
Nessuno ha ancora precisato una cosa, di cui non sono più tanto sicuro:

Codice:
int a[1000]; // alloca un array di 1000 interi nello stack
int* b = new int[1000]; // alloca un array di 1000 interi nello heap
Si, questo è vero. pero' continuo a non capire cosa ci sia di dinamico se scrivo
int* b = new int[1000] . Io per dinamico intendo che l'allocazione la posso fare durante l'esecuzione. Se mi alloca subito 1000 interi non vedo cosa cambi dal punto di vista dell'occupazione di memoria, a parte che una scrive nello stack e l'altra nell'heap.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 16:09   #19
84seawolf
Member
 
Iscritto dal: Apr 2006
Messaggi: 89
Risposta al problema

Prima di risponderti premetto che non ho ancora letto le altre risposte che ti hanno dato...quindi è probabile che hai già risolto il problema. Cmq...
Quello che accade è questo:

Con l'operatore delete non cancelli il contenuto della memoria; ciò che fa l'operatore delete è la seguente cosa:
restituisce al sistema la memoria precentemente occupata dalla variabile (la dealloca); ciò vuol dire che in qualche modo è come se si avvertisse il programma che lo spazio precedentemente occupato non serve + e quindi può essere nuovamente usato e sovrascritto.
Fai attenzione a quello che ho detto: SOVRASCRITTO!!!
questo significa che è possibile addirittura recuperare le informazioni contenute in una variabile (o array) precedentemente deallocate che non sono state ancora sovrascritte.
Probabilmente i "numeri interi molto grossi" che vedi sono informazioni contenute in quell'area di memoria che non servono +.

Prima di concludere vorrei dirti un'altra cosa:
per l'allocazione dinamica della memoria (e in particolare per creare array dinamici) esistono le STL (Standard template Library) che sono MOOOOLTO efficienti e facili da usare. come disse il mio prof. di programmazione: "è inutile inventarsi ogni volta la ruota".

Spero che questo messaggio ti è stato d'aiuto!
84seawolf è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 21:24   #20
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6328
Quote:
Originariamente inviato da 84seawolf


Prima di concludere vorrei dirti un'altra cosa:
per l'allocazione dinamica della memoria (e in particolare per creare array dinamici) esistono le STL (Standard template Library) che sono MOOOOLTO efficienti e facili da usare. come disse il mio prof. di programmazione: "è inutile inventarsi ogni volta la ruota".

Spero che questo messaggio ti è stato d'aiuto!
Si lo so, infatti ho usato anche la classe template vector
Unrue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
iPhone 17 al minimo storico: oggi il 256...
Gli utenti italiani scelgono ChatGPT: &e...
Anche Xiaomi avrà il suo trifold:...
È Natale in casa Tesla: arriva la...
Shai-Hulud diventa più cattivo: e...
Aereo ultraleggero si schianta in atterr...
Windows 11 ha una nuova schermata Esegui...
Netflix si prende HBO, Harry Potter e il...
Meta, arriva il nuovo supporto dell'acco...
Spunta blu sotto accusa: perché l...
Motorola presenta edge 70 Cloud Dancer: ...
La Lexus LFA ritorna, ma è elettr...
Cristiano Ronaldo entra nell'intelligenz...
Wi-Fi 7 Mesh in ogni stanza: guida defin...
Hytale evita Steam al lancio per non ric...
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:18.


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