PDA

Visualizza la versione completa : [c++] puntatori


raphi01
25-11-2003, 17:35
ciao!
ho problemi con i puntatori..
uso la CopyMemory per unire 32 elementi di una lista; questo e' quello che faccio:

void* pBuffer = new char[32768];
DWORD dwPosInBuffer = 0L;
POSITION pos_prima;
POSITION pos = m_listOfBuffer.GetHeadPosition();
contatore_pos = 0;

while (contatore_pos <= 31)
{
pos_prima = pos;
CWaveBuffer* p_waveBuffer = (CWaveBuffer*) m_listOfBuffer.GetNext(pos);

CopyMemory( (char*)pBuffer + dwPosInBuffer, p_waveBuffer->GetBuffer(), 1024 );

dwPosInBuffer += 1024;

m_listOfBuffer.RemoveAt( pos_hashlk );
contatore_pos++;
}

..adesso mi serve leggere il contenuto di quei 32 elementi della lista..
io conosco pBuffer che secondo me rappresenta l'indirizzo del primo elemento..
visualizzandolo, ho che:
pBuffer=00CC0068
&pBuffer=0012FE60

come faccio a prendere il valore contenuto in quella cella di memoria??.. sapendo che la dimensione e' di 2Byte..

$$$
25-11-2003, 17:51
sapendo che questo è l'indizizzo dinamico di base 0012FE60
che ti viene fornito da un puntatore
basta che ti fai un ciclo e ti copi in una variabile
a 16bit quel valore e poi incrementi il puntatore di 2 :-/

o forse nn ho capito io bene? :-|

raphi01
25-11-2003, 18:10
il mio problema e' che non ho capito bene i puntatori..
se il valore di pBuffer e' un indirizzo (00CC0068) come faccio a prendere il contenuto di quella cella di memoria??..

LeleFT
25-11-2003, 18:18
Forse la faccio troppo semplicistica... ma se 'p' è un puntatore il contenuto della locazione della memoria puntata da 'p' è '*p'


int a, *p;
a = 25;
p = &a;
printf("Indirizzo di 'a': %d; valore di 'a':%d", p, *p);


Ciao.

raphi01
25-11-2003, 18:21
questo e' ok ma nel mio caso nella riga dove faccio:

cout << *pBuffer;

mi da quest'errore:

C:\Programmi\Microsoft Visual Studio\MyProjects\MFC\command_line\hashlk\WaveIn.c pp(673) : error C2100: illegal indirection

e non capisco dove e' la differenza da quello che hai scritto tu..

LeleFT
25-11-2003, 18:55
Non capisco perchè tu abbia dichiarato pBuffer come puntatore void... :master:

Perchè non dichiararlo come puntatore a char?


Ciao.

raphi01
25-11-2003, 19:00
in realta' semplicemente perche' uso una funzione simile in un altro pezzo del programma dove mi serve che sia void..
qua effettivamente non ha significato..

raphi01
26-11-2003, 18:14
che ne dite di qualcosa del genere??:

short aaa[16384];
for(int cont_buff=0;cont_buff<=16384-1;cont_buff++)
{
aaa[cont_buff] = (short)*pBuffer_hashlk;
pBuffer_hashlk = pBuffer_hashlk + 2;
}

raphi01
27-11-2003, 16:29
..e' normale che sia short che float mi diano gli stessi risultati??
..comunque non sono quelli giusti..

raphi01
28-11-2003, 17:04
ciao!
sono ancora qua con questo problema..
ho messo pBuffer come puntatore a char:
char* pBuffer = new char[32768];

il CopyMemory e' come prima:
CopyMemory( pBuffer + dwPosInBuffer, p_waveBuffer->GetBuffer(), 1024);

il resto sta cambiando..:

signed short int aaa[16384];
for(int cont=0;cont<=16384-1;cont++)
{
aaa[cont]=(unsigned short)*pBuffer*256+(unsigned short)*(pBuffer+1);
pBuffer = pBuffer + 2;
}

ma cosi' ho parecchi problemi perche' in ingresso (p_waveBuffer->GetBuffer()) posso avere valori sia positivi che negativi..

secondo me sarebbe meglio leggere i 2 byte insieme come un'unica stringa di caratteri e poi convertire la stringa cosi' trovata in INT16 (= signed short int).. ma il mio problema e': come si fa a leggerli insieme?? e poi a convertire??

grazie e ciao!

Loading