Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-08-2010, 05:19   #1
Q_Q
Member
 
Iscritto dal: Jan 2008
Messaggi: 103
[c++] puntatori

Codice:
struct _ARGB2
{
        byte R;
        byte G;
        byte B;
        byte A;
};

typedef _ARGB2* ArgbPtr;
Che differenza c'è tra questo:

Codice:
_ARGB2 (*_in)[640] = new _ARGB2[480][640];
e questo ?

Codice:
ArgbPtr *_inPtr = new ArgbPtr[480];
if (_inPtr != null)
{
    for (int i = 0; i < 480; i++)
        _inPtr[i] = new _ARGB2[640];
e com'è che vanno cancellati ?
Q_Q è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2010, 13:27   #2
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
questo:
Quote:
Originariamente inviato da Q_Q Guarda i messaggi
Codice:
_ARGB2 (*_in)[640] = new _ARGB2[480][640];
é sbagliato: il fatto che tu specifichi una costante numerica nella dichiarazione fa si' che l'array di primo livello venga allocato staticamente, quindi in quel caso devi solo allocare gli array di secondo livello.

l'altro invece é corretto ma il controllo dell'if é inutile perché l'operatore new non restituisce mai NULL (in caso di risorse di sistema insufficienti lancia un'eccezione C++ di tipo std::bad_alloc).

per quanto riguarda la deallocazione, il secondo va deallocato all'inverso del primo, cioé iterando sull'array di primo livello e facendo delete su ciascun array di secondo livello ed infine facendo delete sull'array di primo livello. il primo invece non lo so
forse devi fare:
Codice:
delete[][] _in;
ma sono andato ad ipotesi.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 17:55   #3
Q_Q
Member
 
Iscritto dal: Jan 2008
Messaggi: 103
Ciao, grazie per la risposta
per il primo ho provato con delete [] [] _in; ma da errore, possibile che sia solo delete [] _in; ? perchè il [640] viene cancellato automaticamente ?
Q_Q è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 18:31   #4
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Q_Q Guarda i messaggi
per il primo ho provato con delete [] [] _in; ma da errore, possibile che sia solo delete [] _in; ? perchè il [640] viene cancellato automaticamente ?
si, puó essere ma ti confesso che non lo so proprio :|
la sintassi che hai usato tu, delete[] _in, si usa per deallocare gli array a una sola dimensione; forse si usa anche per quelli a piu dimensioni.
questa cosa interessa anche a me quindi se ho tempo provo a cercare qualcosa, altrimenti attendo con te un parere piu esperto.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 20:02   #5
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Q_Q Guarda i messaggi
Codice:
struct _ARGB2
{
        byte R;
        byte G;
        byte B;
        byte A;
};

typedef _ARGB2* ArgbPtr;
Che differenza c'è tra questo:

Codice:
_ARGB2 (*_in)[640] = new _ARGB2[480][640];
_in e' un puntatore ad arrays di 640 elementi che viene inizializzato
con un array che contiene 480 di tali elementi.

Quote:
Codice:
ArgbPtr *_inPtr = new ArgbPtr[480];
if (_inPtr != null)
{
    for (int i = 0; i < 480; i++)
        _inPtr[i] = new _ARGB2[640];
_inPtr e' un puntatore a puntatori, che viene inizializzato con un array di puntatori lungo 480. Ogni puntatore viene poi inizializzato con un array di 640 elementi.

La differenza fondamentale sta nella rappresentazione in memoria. Nel primo caso gli array stanno "tutti in fila" nell'array che li contiene, nel secondo caso hai invece dei soli puntatori.
Codice:
_in :
[[ .... ] [ ... ] [ ... ]]

_inPtr
[[  -  ][  -  ][  -  ]]
    |      |      |
  [...]  [...]  [...]
Se provi il seguente codice:
Codice:
    cout << "sizeof(_in)=" << sizeof(_in) << endl;
    cout << "sizeof(_in[0])=" << sizeof(_in[0]) << endl;

    cout << "sizeof(_inPtr)=" << sizeof(_inPtr) << endl;
    cout << "sizeof(_inPtr[0])=" << sizeof(_inPtr[0]) << endl;
Su una macchina a 32 bit otterrai il seguente output:
Codice:
sizeof(_in)=4
sizeof(_in[0])=2560
sizeof(_inPtr)=4
sizeof(_inPtr[0])=4
Quote:
e com'è che vanno cancellati ?
Per quanto visto sopra nel primo caso cancelli solo l'array piu' esterno, nel secondo caso anche quelli interni. Se la mia spiegazione ti ha confuso, segui un altro metodo infallibile: devi distruggere quello che hai allocato, per cui ad ogni new per un singolo oggetto corrisponde una delete, e ad ogni new per un array corrisponde una delete[].:

Codice:
delete [] _in;
for ( int i=0 ; < 480; ++i )
    delete [] _inPtr[i];
delete[] _inPTr;
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 20:07   #6
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
marco.r, si usa "delete[]" (con una sola coppia di parentesi quadre) anche quando con new si é allocato un array a due o piu dimensioni?
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 22:21   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da fero86 Guarda i messaggi
marco.r, si usa "delete[]" (con una sola coppia di parentesi quadre) anche quando con new si é allocato un array a due o piu dimensioni?
Si', perche' per il C++ non si tratta di array a due dimensioni, ma normale.
La peculiarita' del primo e' che gli elementi sono un qualcosa di piu' corposo di un semplice int o float.
Visto che gli array contenuti si trovano "in linea" il compilatore non ha bisogno di far altro che usare la sua dimensione (che e' decisa staticamente e quindi conosce, in questo caso 2560, 640*4) per poter deallocare correttamente l'array puntato da _in;
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 22:40   #8
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
grazie
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 23:45   #9
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Si', perche' per il C++ non si tratta di array a due dimensioni, ma normale.
La peculiarita' del primo e' che gli elementi sono un qualcosa di piu' corposo di un semplice int o float.
Visto che gli array contenuti si trovano "in linea" il compilatore non ha bisogno di far altro che usare la sua dimensione (che e' decisa staticamente e quindi conosce, in questo caso 2560, 640*4) per poter deallocare correttamente l'array puntato da _in;
mi verrebbe da chiedermi, non sapendo niente di c++, perché esista il delete[] allora, non basta delete? anche lì basta sapere il numero di byte da liberare
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 00:22   #10
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
mi verrebbe da chiedermi, non sapendo niente di c++, perché esista il delete[] allora, non basta delete? anche lì basta sapere il numero di byte da liberare
delete é diverso da delete[] perché se il blocco da cancellare é un array di oggetti devono essere invocati N distruttori, mentre se é un oggetto solo allocato dinamicamente deve essere invocato un distruttore solo.

le due delete in sostanza hanno una semantica diversa: delete senza parentesi quadre assume che tu gli abbia passato un blocco contenente un solo oggetto del tipo puntato, delete[] invece fa un calcolo di quanti oggetti di quel tipo sono contenuti nel blocco di memoria da liberare.

la spiegazione fa schifo ma spero che si comprenda.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 00:25   #11
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
ecco, prova per esempio questo codice:
Codice:
#include <iostream>
using namespace std;

class C {
public:
  ~C() {
    cout << "farewell" << endl;
  }
};

int main() {
  delete new C[3];
  return 0;
}
taluni compilatori potrebbero generarti un eseguibile che stampa "farewell" una volta sola anziché 3. il codice corretto é questo:
Codice:
#include <iostream>
using namespace std;

class C {
public:
  ~C() {
    cout << "farewell" << endl;
  }
};

int main() {
  delete[] new C[3];
  return 0;
}
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 00:30   #12
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
mi verrebbe da chiedermi, non sapendo niente di c++, perché esista il delete[] allora, non basta delete? anche lì basta sapere il numero di byte da liberare
Vero ho detto una cosa inesatta , in effetti pensandoci la ragione principale non e' tanto la memoria occupata (la free non ha bisogno di dimensioni...), quando la necessita' di sapere su quanti oggetti va chiamato il distruttore.
Faccio un esempio
Codice:
#include <iostream>

using namespace std;


struct Foo{ ~Foo(){ cout << "bye bye" << endl;}  };

int main()
{
    Foo* f1 = new Foo[10];
    Foo* f2 = new Foo[10];
    
    cout << "delete f1" << endl;
    delete f1;
    cout << "delete[] f2" << endl;
    delete[] f2;
}
L'output del programma e'
Codice:
delete f1
bye bye
delete[] f2
bye bye
bye bye
bye bye
bye bye
bye bye
bye bye
bye bye
bye bye
bye bye
bye bye
Il succo del discorso non cambia molto cmq. Nel caso del primo array iniziale, basta delete[] perche' gli array contenuti non devono liberare alcuna altra memoria, quella che occupano l'hanno "presa a prestito" dall'array che li contiene.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 00:31   #13
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da fero86 Guarda i messaggi
delete é diverso da delete[] perché se il blocco da cancellare é un array di oggetti devono essere invocati N distruttori, mentre se é un oggetto solo allocato dinamicamente deve essere invocato un distruttore solo.

le due delete in sostanza hanno una semantica diversa: delete senza parentesi quadre assume che tu gli abbia passato un blocco contenente un solo oggetto del tipo puntato, delete[] invece fa un calcolo di quanti oggetti di quel tipo sono contenuti nel blocco di memoria da liberare.

la spiegazione fa schifo ma spero che si comprenda.
Ops, vedo ora che hai gia' risposto correttamente tu.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 15:22   #14
Q_Q
Member
 
Iscritto dal: Jan 2008
Messaggi: 103
tnx
edit:
ah, secondo voi in un cellulare è meglio usare il primo o il secondo ( o non cambia nente da uno all'altro sui cell nuovi con trecentomillemiggglioni gb di ram ) ?

Ultima modifica di Q_Q : 16-08-2010 alle 15:26.
Q_Q è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 20:01   #15
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Q_Q Guarda i messaggi
tnx
edit:
ah, secondo voi in un cellulare è meglio usare il primo o il secondo ( o non cambia nente da uno all'altro sui cell nuovi con trecentomillemiggglioni gb di ram ) ?
dovresti mettere la semplicitá del codice prima della presunta efficienza: dal momento che conosci giá le dimensioni della matrice da allocare non serve allocarla dinamicamente, é meglio allocarla staticamente perché l'allocazione dinamica é piu difficile da gestire perché devi evitare il leak.

molto difficilmente avrai problemi di performance a causa di simili scelte, se ne dovessi mai avere é solo allora che dovrai refattorizzare, ammesso che la causa sia quella.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 20:49   #16
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Q_Q Guarda i messaggi
tnx
edit:
ah, secondo voi in un cellulare è meglio usare il primo o il secondo ( o non cambia nente da uno all'altro sui cell nuovi con trecentomillemiggglioni gb di ram ) ?
E' piu' efficiente il primo metodo, perche' eviti una doppia dereferenziazione e quindi hai un accesso alla ram in meno. Questo vale tanto per il cellulare quanto per il pc desktop.
In generale se uno vuole evitare inefficiente, in C++ evita di allocare un doppio array in questo modo, piuttosto si crea una classe apposita che utilizzi un unico array.
Qualcosa tipo
Codice:
template <typename T>
class Matrix
{
    typedef T& reference;
    typedef const T& const_reference;

    Matrix(size_t rows,size_t cols ):_nRows(rows),_nCols(cols)
    {        
        _data = new value_type[rows*cols];
    }
    reference operator()(size_t row,size_t col)
    {
        assert( row <_nRows );
        assert( col < _nCols );
        return _data[ _nRows*col + row ];
    }
    const_reference operator()(size_t row, size_t col) const;
    // etc
private:
    size_t _nRows;
    size_t _nCols;
};
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 21:12   #17
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da marco.r Guarda i messaggi
E' piu' efficiente il primo metodo, perche' eviti una doppia dereferenziazione e quindi hai un accesso alla ram in meno. Questo vale tanto per il cellulare quanto per il pc desktop.
si ma, ripeto, se le dimensioni sono note a priori (640x480) é inutile usare new e delete, basta semplicemente dichiarare la matrice:
Codice:
_ARGB2 _in[640][480];
cosi tra l'altro c'é un bel guadagno come tempi di esecuzione perché si evita la chiamata all'operatore new e successivamente quella all'operatore delete; a voler fare proprio i pignoli qualche millesimo di secondo secondo me lo risparmi
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 23:46   #18
Q_Q
Member
 
Iscritto dal: Jan 2008
Messaggi: 103
Quote:
Originariamente inviato da fero86 Guarda i messaggi
si ma, ripeto, se le dimensioni sono note a priori (640x480) é inutile usare new e delete, basta semplicemente dichiarare la matrice:
Codice:
_ARGB2 _in[640][480];
cosi tra l'altro c'é un bel guadagno come tempi di esecuzione perché si evita la chiamata all'operatore new e successivamente quella all'operatore delete; a voler fare proprio i pignoli qualche millesimo di secondo secondo me lo risparmi
c'è un problema (almeno con samsung bada non so con gli altri so per cellulari) se si fa così funziona solo nel simulatore e crasha sul telefono perchè l'array non sta nello stack
Q_Q è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Anche T-Mobile abbandona VMware e migra ...
In Italia crescono gli investimenti nell...
Samsung combina IA e quantum computing p...
Anthropic ammette: Claude Code usa un ap...
L'IA costa sempre di più: AWS aum...
Google prepara il blocco delle app non v...
Amazfit aggiorna il Cheetah 2 Ultra: ric...
L'FAA apre ai voli commerciali supersoni...
Amazon ha già abbastanza satelliti per a...
A2A ed Equinix uniscono le forze per rec...
Apple ha creato la crisi delle memorie? ...
GPU subito in cambio di una quota dei ri...
Firefly Aerospace potrà lanciare ...
Intesa Sanpaolo sposta i sistemi IT core...
Visa, Mastercard e Coinbase lanciano Ope...
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:48.


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