/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
hjælp til pointer
Fra : Allan Juhl Krisensen


Dato : 26-04-02 11:46

Hej

Hvis jeg har en pointer som peger på en int (16bit) også gerne vil have
en pointer til at pege på samme adresse men som retuner en long int
(32bit) hvordan kan men gøre dette ?

mvh
Allan


 
 
Byrial Jensen (26-04-2002)
Kommentar
Fra : Byrial Jensen


Dato : 26-04-02 12:32

Allan Juhl Krisensen <All@nKristensen.dk> skrev:
> Hej
>
> Hvis jeg har en pointer som peger på en int (16bit) også gerne vil have
> en pointer til at pege på samme adresse men som retuner en long int
> (32bit) hvordan kan men gøre dette ?

Hvis din int allerede findes, er det ikke sikkert at det er muligt
at placere en long int på samme adresse pga. forskellige
alignment-krav.

Du kan placere forskellige objekter på samme adresse ved at lave en
union:

union min_union
{
int min_int;
long min_long;
} min_var;

Men det var nok bedre hvis du fortalte hvad du prøver på at opnå med
at have objekter på samme adresse. Måske findes der andre og bedre
løsninger på dit problem.

Mogens Hansen (26-04-2002)
Kommentar
Fra : Mogens Hansen


Dato : 26-04-02 12:40


"Allan Juhl Krisensen" <All@nKristensen.dk> wrote

> Hvis jeg har en pointer som peger på en int (16bit) også gerne vil have
> en pointer til at pege på samme adresse men som retuner en long int
> (32bit) hvordan kan men gøre dette ?
>

Er du sikker på at du vil det du siger ?

I C:

int* ip = ...;
long int* lip = (long int*) ip;

I C++:
int* ip = ...;
long int* lip = reinterpret_cast<long int*>(ip);


Venlig hilsen

Mogens Hansen



Allan Juhl Krisensen (26-04-2002)
Kommentar
Fra : Allan Juhl Krisensen


Dato : 26-04-02 13:55

Hej

Tak for bække svar.
Jeg skal modtage et audio signal på 24 bit (L) og 24 bit (R), det svære kan
hardwaren kun modtage 16 bit af gangen så jeg får et array på x*16 bit : 16
bit MSB (L), 8 bit LSB (L) + 8 bit MSB (R), 16 bit LSB (L) osv..

Nu vil jeg så gerne lave nogle beregninger på de to signaler og skal der
for have den spildet op i 32 bit (L) og 32 bit (R)

Dette har jeg klaret ved at kopier dataene over i en long int array
samtidig med at jeg bruget shift (<<) ,and ( & ) og or ( | ) men dette
tager meget lang tid og bruger en del resurser

Der for kom mit spørgsmål så om at få en pointer som peger på en int
(16bit) også gerne vil have en pointer til at pege på samme adresse men som
returner en long int (32bit).

Jeg er godt klar over at det ikke er god programmerings skik, men håber man
kan forsvare det fordi det er tids kritisk !! men hvis i hare beder
løsnings for slag er jeg åben

Mvh
Allan



Mogens Hansen (27-04-2002)
Kommentar
Fra : Mogens Hansen


Dato : 27-04-02 09:15


"Allan Juhl Krisensen" <All@nKristensen.dk> wrote

>
> Jeg er godt klar over at det ikke er god programmerings skik, men håber
man
> kan forsvare det fordi det er tids kritisk !!

Hvis du vil bruge data for hver kanal som en long (32 bit), er du vel nødt
til at kopiere de 24 bit som du har modtager og sætte de mest betydende 8
bit til 0.

> men hvis i hare beder
> løsnings for slag er jeg åben
>

Det man jo altid kan gøre, er at indkapsle "det grimme og implementerings
afhængige", så applikationen ikke bliver svinet til. Det kan gøres sikkert
og effektivt, f.eks.:

#include <mem.h>

class audio_data
{
public:
void l_msb(int value);
void l_lsb_r_msb(int value);
void r_msb(int value);

long left(void) const;
long right(void) const;

private:
void set_data(int value, size_t offset);

private:
// some constants
enum { LEFT_CHANNEL = 0,
RIGHT_CHANNEL = 1,
CHANNELS = 2,
BYTES_PR_CHANNEL = 3
};
char data[CHANNELS*BYTES_PR_CHANNEL];
};

inline void audio_data::set_data(int value, size_t offset)
{
memcpy(&data[offset], reinterpret_cast<char*>(&value), sizeof(value));
}

inline void audio_data::l_msb(int value)
{
set_data(value, 0);
}

inline void audio_data::l_lsb_r_msb(int value)
{
set_data(value, 2);
}

inline void audio_data::r_msb(int value)
{
set_data(value, 4);
}

inline long audio_data::left(void) const
{
long result;
memcpy(reinterpret_cast<char*>(&result)+1,
&data[LEFT_CHANNEL*BYTES_PR_CHANNEL], BYTES_PR_CHANNEL);
return result & 0xffffff;
}

inline long audio_data::right(void) const
{
long result;
memcpy(reinterpret_cast<char*>(&result)+1,
&data[RIGHT_CHANNEL*BYTES_PR_CHANNEL], BYTES_PR_CHANNEL);
return result & 0xffffff;
}

int receive_audio(void)
{
return 0; // dummy data
}


int main(int argc, char* argv[])
{
audio_data sound[1024];

// receive audio data
for(audio_data* s = sound; &sound[sizeof(sound)/sizeof(sound[0])] != s;
++s) {
s->l_msb (receive_audio());
s->l_lsb_r_msb(receive_audio());
s->r_msb (receive_audio());
}
}


Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408846
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste