Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme
ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme
ASUS e Noctua tornano a collaborare con la GeForce RTX 5080 Noctua OC Edition, una scheda pensata per chi cerca potenza estrema e silenziosità assoluta. Il nuovo sistema di raffreddamento, con tre ventole Noctua NF-A12x25 G2 da 120 mm e una camera di vapore maggiorata, promette temperature record e rumorosità quasi impercettibile. Non mancano dual BIOS, materiali di qualità e ampie possibilità di overclock. Ma quanto migliora davvero rispetto alla Founders Edition? Scoprilo nel nostro test completo.
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Il più recente robot per la pulizia domestica di Dreame, modello Aqua10 Ultra Roller, abbina un potente motore di aspirazione della polvere a un sofisticato sistema di lavaggio con rullo integrato. Il tutto governato dalla logica di intelligenza artificiale, per i migliori risultati
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Siamo volati fino a Belfast, capitale dell'Irlanda Del Nord, per scoprire il nuovo Realme 15 Pro 5G Game Of Thrones Limited Edition. Una partnership coi fiocchi, quella tra Realme e HBO, un esercizio di stile davvero ben riuscito. Ma vi raccontiamo tutto nel nostro articolo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-11-2001, 19:46   #1
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Una delucidazione in C++

qual'è la differenza secondo voi tra queste 2 dichiarazioni?


a) TPanel** Panel = new TPanel*[100];

b) TPanel* Panel = new TPanel[100];
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2001, 20:22   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
La prima alloca un array di 100 puntatori a oggetti TPanel, la seconda alloca un array di 100 oggetti TPanel
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2001, 21:15   #3
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
so che hai usato bcb; quindi ti chiedo:

a) TImage** Image = new TImage*[100];
b) TImage* Image = new TImage[100];

io devo allocare dinamicamente dei TImage facendo in modo che con delete[] all'uscita dell'aplicazioni venga liberata completamente la memoria.

Avevo scritto una cosa tipo:

c) TImage *Image[100];

in questo caso specifico mi hanno riferito che la chiamata a delete[] nel momento in cui desidero eliminare un elemento della matrice e deallocare la memoria è inutile in quanto vengono deallocati solo i punatori.

Ho provato le tre soluzioni (a/b/c) ma il risultato che ottengo apparentemente è il medesimo.

Sai qualcosa a tal proposito?

Grazie
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2001, 21:23   #4
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da misterx
aggiungo questo scorcio di programma che mostra su una form delle immagini ridimensionate; una sorta di anteprima.

int x=0,y=0;
TImage *Image[100]; // qui è l'errore

for (int i =0; i <FileListBox1->Items->Count; i++)
{
x+=105;
if(x>=105*5) {x=0;y+=105;}

Image[i] = new TImage(Form1);
Image[i]->Top = 5;
Image[i]->Left = 5;
Image[i]->Stretch = true;
Image[i]->Width = 90;
Image[i]->Height = 90;
Image[i]->Parent = Form1;

Image[i]->Picture->LoadFromFile(FileListBox1->Items->Strings[i]);
}



Grazie
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2001, 22:39   #5
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da misterx
[b]so che hai usato bcb; quindi ti chiedo:

a) TImage** Panel = new TImage*[100];

b) TImage* Panel = new TImage[100];

io devo allocare dinamicamente dei TImage facendo in modo che con delete[] all'uscita dell'aplicazioni liberi completamente la memoria.

Avevo scritto una cosa tipo:

c) TImage *Image[100];

in questo caso specifico mi hanno riferito che la chiamata a delete[] nel momento in cui desidero eliminare un elemento della matrice e deallocare la memoria è inutile in quanto dealloca solo i punatori.

Ho provato le tre soluzioni (a/b/c) ma il risultato che ottengo apparentemente è il medesimo.

Sai qualcosa a tal proposito?

Grazie
Ciao.
Nel primo caso allochi effettivamente un array di 100 puntatori. Di conseguenza devi creare poi dinamicamente gli ogggetti uno ad uno. Ad esempio con
for ( int i=0 ; i<100; i++ )
Image[i] = new TImage;
Di conseguenza quando devi eliminare il tutto devi pure fare l'opposto. Eliminare i cento puntatori col delete e poi fare il delete[] sull'array.

con b) invece viene allocato dinamicamente un array di 100 oggetti. Quando fai delete[] sull'array viene chiamato il distruttore per ognuna delle cento istanze e quindi non occorre fare altro.

ancora piu' semplice con c). L'array e' allocato staticamente e non occorre elimiarlo. Gli oggetti vengono eliminati alla chiusura del programma.

a) e' piu' scomodo pero' ha il pregio che puoi inizializzare gli oggetti con costruttori diversi da quelli di default.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2001, 08:05   #6
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
a) TImage** Panel = new TImage*[100];
b) TImage* Panel = new TImage[100];
c) TImage *Image[100];

tra le dichiarazioni (a/c) ottengo solo una differenza di prestazioni del programma.

Ho compilato il programma usando la dichiarazione (a) e poi (b); ho eliminato tutti i delete/delete[] per capire se la memoria allocata viene deallocata automaticamente da codice aggiunto dal compilatore.

Ebbene: in entrambi i casi, la memoria viene liberata senza la necessità di richiamare alcun distruttore.

Non ho capito perchè.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2001, 08:09   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
ancora piu' semplice con c). L'array e' allocato staticamente e non occorre elimiarlo. Gli oggetti vengono eliminati alla chiusura del programma.
Attenzione, anche c) dichiara un array di 100 puntatori
Un array di 100 oggetti dovrebbe essere creato con
TImage Images[100];
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2001, 13:28   #8
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
marco

in tutte le mie dichiarazioni non c'è alcun bisogno di deallocare la memoria in quanto mi hanno riferito che nelle specifiche della VCL è compresa la deallocazione automatica.

Beh, si lavora meno...

Grazie ancora anche a ilsensine

Ciao
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2001, 22:35   #9
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da ilsensine
[b]
Attenzione, anche c) dichiara un array di 100 puntatori
Un array di 100 oggetti dovrebbe essere creato con
TImage Images[100];
Ops... hai ragione
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 18:57   #10
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
e per rendere l'array dinamico?
anzichè 100 elementi un numero indefinito?


int x=0,y=0;
TImage *Image[???];

for (int i =0; i <FileListBox1->Items->Count; i++)
{
x+=105;
if(x>=105*5) {x=0;y+=105;}

Image[i] = new TImage(Form1);
Image[i]->Top = 5;
Image[i]->Left = 5;
Image[i]->Stretch = true;
Image[i]->Width = 90;
Image[i]->Height = 90;
Image[i]->Parent = Form1;

Image[i]->Picture->LoadFromFile(FileListBox1->Items->Strings[i]);
}
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 19:01   #11
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
TImage **Image = (TImage**) malloc (sizeof(TImage*)*FileListBox1->Items->Count);

(...fai quello che devi fare...)

free(Image)

Scusa per il malloc, ma ci sono rimasto affezionato
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 19:27   #12
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
ottimo ilsensine; ora sono alle prese con le variabili locali/globali;

se la tua dichiarazione la metti localmente in una funzione, le altre funzioni non possono accedere agli Image dichiarati in essa.....

se sposti la tua dichiarazione nell'header, si rifiuta di compilarla.....

manca sempre 30 a fare 31.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:13   #13
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Dichiara TImage **Image in un file c (fuori dalle funzioni), e in un header dichiari
extern TImage **Image;
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:16   #14
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Devi mettere la semplice dichiarazione nell'header, e poi definirla in un solo file.
Ad esempio, se voglio avere un array di questi oggetti:

nell'header:

extern TImage** Image;

in un file .cpp

TImage** Image = new TImage* [blabla->count];
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:18   #15
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
ho già provato ma il linker mi dice che non trova le definizioni degli altri componenti....
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:18   #16
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
TImage** Image = new TImage* [blabla->count];
Ehm...è un pò difficile mettere questa riga (compreso il new) fuori da una funzione
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:19   #17
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
non vale !
mi hai anticipato ancora !
uffi !

/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:21   #18
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
porc... toppato ancora

dovrei avere un po' meno fretta nello scrivere
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:21   #19
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Ehm...è un pò difficile mettere questa riga (compreso il new) fuori da una funzione
Ariehm...ho detto una c@zz@t@
(o meglio, si può usare una new con parametro di array costante, ma non variabile ovviamente)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2001, 20:26   #20
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Fiuu... ogni tanto le intivo allora !
Da un certo punto di vista hai ragione comunque. In quella funzione devi fare riferimento a valori che siano gia' noti, e non sempre la cosa e' immediata ( se utilizzi costanti che stanno in altri files .cpp potrebbero non essere ancora state inizializzate ).

Forse la cosa migliore sarebbe quella di utilizzare funzione opportuna
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme ASUS GeForce RTX 5080 Noctua OC Edition: una cus...
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti Recensione Realme 15 Pro Game Of Thrones: un ver...
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Arlo Ultra 2 in super offerta su Amazon:...
MacBook M3 e GeForce RTX 5090? Possibile...
Da Hinton a Wozniak, ecco chi chiede di ...
Gli autobus elettrici possono essere pi&...
Come aggiornare il PC spendendo poco: GP...
Netflix punta sull'interattività:...
Amazon lancia Blink Mini 2K+ e Blink Arc...
CMF Watch 3 Pro: dice la sua a meno di 1...
Hacker guadagnano oltre 500.000 dollari ...
Nintendo annuncia un nuovo Direct dedica...
Windows 11: problemi di accesso su alcun...
Fastweb down oggi in tutta Italia sia su...
Non si sa cos'è, ma questo nuovo ...
Meta introduce un nuovo sistema di prote...
Amazon scatena gli sconti: TV OLED, smar...
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: 15:55.


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