Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro
DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro
DJI presenta Mic Mini 2, un sistema microfonico wireless ultra-compatto progettato per democratizzare l'audio di alta qualità nella fascia entry-level. Con un peso di soli 11 grammi per il trasmettitore elimina i fastidi tipici dei modelli più pesanti sui vestiti. Nonostante la miniaturizzazione Mic Mini 2 offre prestazioni tecniche di rilievo: registrazione omnidirezionale a 48 kHz/24-bit, tre preset vocali (Regular, Bright, Rich) e un sistema di cancellazione attiva del rumore a due livelli.
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Motorola propone in fascia media il nuovo Moto G77 5G, uno smartphone che punta sul display AMOLED da 1.5K a 120Hz, e sulla fotocamera da 108 MP con stabilizzazione ottica per affrontare la fascia media. Il tutto insieme a una batteria da 5200mAh in soli 7,3 millimetri di spessore, con una scocca certificata con standard militari
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI ha appena ufficializzato la serie Lito, la sua nuova gamma di droni entry-level destinata a chi si avvicina per la prima volta alla fotografia aerea. Al centro dell'annuncio ci sono due modelli ben distinti per fascia di prezzo e specifiche tecniche: DJI Lito 1 e DJI Lito X1. Entrambi si collocano sotto la soglia regolamentare dei 249 grammi, che permette di volare con requisiti burocratici più semplici rispetto ai droni più pesanti.
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


DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro DJI Mic Mini 2: audio 48 kHz / 24-bit e protocol...
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico Recensione Moto G77: display AMOLED e buona auto...
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla DJI Lito 1 e Lito X1 recensione: i nuovi droni p...
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi Sony World Photography Awards 2026: i premiati, ...
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince Una settimana con Hyundai Ioniq 5 N-Line: divert...
Il ritorno del Commodore 64: il nuovo C6...
Google Gemini entra nei sistemi classifi...
Nuovi MacBook Pro 14,2" con chip M5...
Configuratore Corsair FRAME, il punto di...
I giochi digitali su PS4 e PS5 hanno un ...
Robot umanoidi negli aeroporti: a Tokyo ...
I nuovi processori Intel Wildcat Lake so...
La dashcam 70mai A800SE a 109€ registra ...
The Blood of Dawnwalker: il sistema dei ...
Numeri a tre cifre contro le truffe tele...
Fine di un'era nel gaming PC: Denuvo &eg...
Hisense Smart TV serie U72Q in super sco...
OnePlus punta sul gaming: ecco il nuovo ...
Scope elettriche Tineco e Dreame: lavano...
Resident Evil Requiem: ecco cosa preferi...
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: 09:59.


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