/ 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
Inline og <char*> ?
Fra : Torben W. Hansen


Dato : 04-07-02 19:56

Jeg forsøger at at lære C++ og læser for øjeblikket "Kris Jamsa C++" (vel
vidende at denne bog er udsat for en del kritik).

For at lære C++ hurtigs muligt læser jeg en del af kodeeksemplerne her i
gruppen, og i en tidligere tråd (se nedenfor) skrev Mogens Hansen følgende:

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

Med den forhåndværende sparsomme litteratur kan jeg ikke umiddelbart finde
nogen beskrivelse af udtrykkene "inline" eller <char*>. Jeg kunne måske have
fundet en foklaring i "Acellerated C++", hvilken jeg desværre ikke har fået
anskaffet på nuværende tidspunkt.

Eventuelle svar er meget velkomne - På forhånd tak...

--
med venlig hilsen
Torben W. Hansen




"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





 
 
Bertel Lund Hansen (04-07-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 04-07-02 20:31

Torben W. Hansen skrev:

>inline void audio_data::set_data(int value, size_t offset)

class Test {
   public:
      Test (string prompt) { cout << prompt << endl; }
      void assign_status (int stat);
      int read_status();

   private:
      int status;
};

void Test::assign_status (int stat) { status=stat; }

inline int Test::read_status () { return status; }

Konstruktøren er inline automatisk fordi kroppen er 'fyldt ud'
inden i klassen. Assign_status() er ikke inline. Read_status() er
inline fordi det er specificeret.

Inline bevirker at der genereres kode for hvert eneste kald til
metoden. Det er en fordel hvis koden er meget lille (så et kald
fylder næsten det samme). Non-inline-metoder står kun ét sted der
aktiveres ved hvert kald.

Templates er generelle opskrifter på klasser eller funktioner.
Den type der aktuelt skal benyttes, anbringes i <>. Det er lidt
avanceret stof som du nok hellere må læse om først.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Torben W. Hansen (04-07-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 04-07-02 21:53


"Bertel Lund Hansen" <nospam@lundhansen.dk> skrev i en meddelelse
news:ia89iucq10oj96u34fn1srmkb4d89ueefu@news.telia.dk...
> Torben W. Hansen skrev:
>
> >inline void audio_data::set_data(int value, size_t offset)
>
> class Test {
> public:
> Test (string prompt) { cout << prompt << endl; }
> void assign_status (int stat);
> int read_status();
>
> private:
> int status;
> };
>
> void Test::assign_status (int stat) { status=stat; }
>
> inline int Test::read_status () { return status; }
>
> Konstruktøren er inline automatisk fordi kroppen er 'fyldt ud'
> inden i klassen. Assign_status() er ikke inline. Read_status() er
> inline fordi det er specificeret.
>
> Inline bevirker at der genereres kode for hvert eneste kald til
> metoden. Det er en fordel hvis koden er meget lille (så et kald
> fylder næsten det samme). Non-inline-metoder står kun ét sted der
> aktiveres ved hvert kald.
>
> Templates er generelle opskrifter på klasser eller funktioner.
> Den type der aktuelt skal benyttes, anbringes i <>. Det er lidt
> avanceret stof som du nok hellere må læse om først.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Igor V. Rafienko (04-07-2002)
Kommentar
Fra : Igor V. Rafienko


Dato : 04-07-02 20:45

[ Torben W. Hansen ]

[ snip ]

> For at lære C++ hurtigs muligt læser jeg en del af kodeeksemplerne
> her i gruppen, og i en tidligere tråd (se nedenfor) skrev Mogens
> Hansen følgende:
>
> inline void audio_data::set_data(int value, size_t offset)
> {
> memcpy(&data[offset], reinterpret_cast<char*>(&value), sizeof(value));
> }
>
> Med den forhåndværende sparsomme litteratur kan jeg ikke umiddelbart
> finde nogen beskrivelse af udtrykkene "inline" eller <char*>.


inline er et _hint_ til kompilatoren om å prøve å substituere
funksjonens innhold der funksjonen blir kalt for å spare litt tid. Det
å kalle en funksjon innebærer ofte en mengde instruksjoner og dersom
funksjonskroppen i seg selv er temmelig liten (fx. over), vil prisen
av å kalle en funksjon være høy i forhold til det arbeidet som
funksjonen gjør. Men kompilatoren står fritt til å ignorere slike
hints, så verdien av inline-direktivet er, etter min mening, tvilsom.

<char*> i seg selv er meningsløs. I konteksten over er det

reintepret_cast< char* >( &value )

som er interessant. reintepret_cast kan brukes for å konvertere mellom
visse typer på en implementasjonsspesifikk måte. Standarden beskriver
nøyaktig hvordan reinterpret_cast virker.

"<char*>" kan også opptre i andre kontekster. Det mest opplagte er
templates. Fx. er std::string en typedef for:

typedet basic_string< char > string;

og her betegner "< char >" en bestemt template argument til en klasse
(basic_string). (Riktignok står det <char> og ikke <char*>, men
"resonnementet" er det samme)


> Jeg kunne måske have fundet en foklaring i "Acellerated C++",
> hvilken jeg desværre ikke har fået anskaffet på nuværende tidspunkt.


Det må være en særs dårlig bok, dersom den hverken nevner inline eller
reinterpret_cast.





ivr
--
C++: "an octopus made by nailing extra legs onto a dog"
            -- Steve Taylor, 1998

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


Dato : 04-07-02 22:31


"Torben W. Hansen" <mail@ins-intersoft.com> wrote

[snip]
> Jeg kunne måske have
> fundet en foklaring i "Acellerated C++", hvilken jeg desværre ikke har
fået
> anskaffet på nuværende tidspunkt.
>

"Accelerated C++" forklarer hvad "inline" er (på side 72).

"Accelerated C++" forklarer ikke hvad "reinterpret_cast" (eller andre former
for cast) er.
Den holder sig til sikre, forholdvis høj-niveau og meget nyttige
konstruktioner, og giver sig ikke ud for at dække hele sproget.
"reinterpret_cast" hører typisk til lav-niveau programmering, typisk hvor
der interfaces til hardware eller input-output, hvilket også var tilfældet i
det kode-eksempel du citerede (ellers er det et temmeligt sikkert tegn på at
man er ude i noget snavs).

Hvis man vil have en komplet beskrivelse af C++ er
The C++ Programming Language, Special Edition
Bjarne Stroustrup
ISBN 0-201-70073-5
et bedre bud.

Men det er ikke et spørgsmål om enten den ene eller den anden.
Min typiske anbefaling er at starte med "Accelerated C++" og derefter
fortsætte med "The C++ Programming Language".
Det svarer også til hvad der anbefales i "Accelerated C++" (side 293), som
desuden nævner
Generic Programming and the sTL
Matthew Austern


Venlig hilsen

Mogens Hansen



Torben W. Hansen (04-07-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 04-07-02 23:04

Tak for svarene Bertel, Igor & Mogens...

Jeg fik vist returneret dit svar Bertel - det var et uheld.

OK.
Dvs. at "inline" er en form for makro definitioner, hvor kode indsættes (af
pre-processor ?) frem for at foretage et funktionskald (iflg. Igor - hvis
kompileren altså har valgt at tage "inline" til efterretning).

og "<xxx>" specificerer den aktuelle type for en funktions-skabelonen. (jeg
var endnu ikke nået til "templates" i min bog, men smugkikkede efter jeres
svar).

Jeg fik svar på mine spørgsmål - Tusind tak...

Til Mogens:
Jeg har noteret mig dine foreslag til bøger, som du også nævnte tidligere.
Iøvrigt - går du og pønser på at skrive en dansk C++ bog ?

Til Igor :
> Det må være en særs dårlig bok, dersom den hverken nevner inline eller
> reinterpret_cast.

Det har du sikkert ret i - bogen har ihvertfald fået megen dårlig kritik...
men jeg har anskaffet den for lang tid siden. På den anden side så er den på
dansk, hvilket kan være en fordel i forbindelse med mit første bekendskab
med C++ inden jeg kaster mig ud i de lidt tungere amerikanske værker. Og så
kan det vel næppe skade at læse mere end een bog om C++.

Som jeg forstår skulle "Accelerated C++" være en af de bedre og Biblen "The
C++ Programming Language" af B.S. , men hvilken bog kan du da anbefale?

--
med venlig hilsen
Torben W. Hansen




Igor V. Rafienko (05-07-2002)
Kommentar
Fra : Igor V. Rafienko


Dato : 05-07-02 00:16

[ Torben W. Hansen ]

[ snip ]

> Dvs. at "inline" er en form for makro definitioner, hvor kode
> indsættes (af pre-processor ?) frem for at foretage et funktionskald
> (iflg. Igor - hvis kompileren altså har valgt at tage "inline" til
> efterretning).


Ikke bare ifølge meg:

7.1.2, p 2

A function declaration (...) with an inline specifier declares an
inline function (...) An implementation is not required to perform
this inline substitution at the point of call; (...)


> og "<xxx>" specificerer den aktuelle type for en
> funktions-skabelonen. (jeg var endnu ikke nået til "templates" i min
> bog, men smugkikkede efter jeres svar).


Riktig, dog, ikke bare template _functions_.

[ snip ]


> > Det må være en særs dårlig bok, dersom den hverken nevner inline
> > eller reinterpret_cast.
>
> Det har du sikkert ret i - bogen har ihvertfald fået megen dårlig
> kritik... men jeg har anskaffet den for lang tid siden. På den anden
> side så er den på dansk, hvilket kan være en fordel i forbindelse
> med mit første bekendskab med C++ inden jeg kaster mig ud i de lidt
> tungere amerikanske værker. Og så kan det vel næppe skade at læse
> mere end een bog om C++.


Erik Naggum har skrevet litt om akkurat denne holdningen.

<URL:news:3215960914006321@naggum.net>

Eller søk på

"engelsk norsk programmering group:no.it.* author:Erik author:Naggum"

på <URL:http://groups.google.com/> (Resonnementet gjelder dansk såvel
som norsk).


> Som jeg forstår skulle "Accelerated C++" være en af de bedre og
> Biblen "The C++ Programming Language" af B.S. , men hvilken bog kan
> du da anbefale?


Jeg? Du vil ikke høre på hva jeg har å anbefale. Hør heller på Mogens
(han har som regel mye bedre råd):

<URL:news:a4maeg$1744$1@news.cybercity.dk>
<URL:news:a6uqf4$1vgb$1@news.cybercity.dk>

(Bruk fx. <URL:http://groups.google.com>, dersom du ikke tar vare på
artikler lokalt).





ivr
--
C++: "an octopus made by nailing extra legs onto a dog"
            -- Steve Taylor, 1998

Torben W. Hansen (05-07-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 05-07-02 12:21


>> ..., men hvilken bog kan du da anbefale?
>
>
> Jeg? Du vil ikke høre på hva jeg har å anbefale. Hør heller på Mogens
> (han har som regel mye bedre råd):

På det C++ stadie hvorpå jeg befinder mig, vil jeg hellere bruge energi på
at hente konkret C++ information end på ordkløveri, så hvis du har en god
bog anbefaling er denne meget velkommen.

--
med venlig hilsen
Torben W. Hansen



Mogens Hansen (05-07-2002)
Kommentar
Fra : Mogens Hansen


Dato : 05-07-02 04:40


"Torben W. Hansen" <mail@ins-intersoft.com> wrote

[snip]
> Dvs. at "inline" er en form for makro definitioner, hvor kode indsættes
(af
> pre-processor ?) frem for at foretage et funktionskald (iflg. Igor - hvis
> kompileren altså har valgt at tage "inline" til efterretning).

Sådan kan man godt se det, blot man ikke tager det for bogstaveligt.
"inline" kan også opfattes som et af de steder, hvor C++ tilbyder et
alternativ til anvendelse af preprocessor makroer.
"inline" funktioner overholder alle regler som ikke "inline" funktioner -
f.eks. scope.

Tag følgende 2 implementeringer af "max" (som ikke er compileret, så der kan
være småfejl)

<med "inline">

template <class T>
inline T max(const T& t1, const T& t2)
{
return t1 > t2 ? t1 : t2;
}

void foo()
{
int a = 1;
int b = 2;
int c = max(a++, b++);
assert(2 == a); // No problem
assert(3 == b); // No problem
assert(2 == c); // No problem
}

</med "inline">

<med preprocessor macro>

#define max(t1, t2) (t1 > t2 ? t1 : t2)

void foo()
{
int a = 1;
int b = 2;
int c = max(a++, b++); // same as c = (a++ > b++ ? a++ : b++);
assert(2 == a); // No problem
assert(4 == b); // Ups - b++ evaluated twice!
assert(3 == c); // Ups
}

</med preprocessor macro>

Så vidt jeg husker Kris Jamsa ret glad for at bruge preprocessoren - også
til ting, hvor andre langt bedre konstruktioner ligger lige for.
Se f.eks. mine tidligere kommentarer
http://groups.google.com/groups?q=%22Mogens+Hansen%22+dansk&hl=da&scoring=d&
selm=9uj6rp%242qqf%241%40news.cybercity.dk&rnum=3

>
> og "<xxx>" specificerer den aktuelle type for en funktions-skabelonen.
(jeg
> var endnu ikke nået til "templates" i min bog, men smugkikkede efter jeres
> svar).

Blot var det væsentlige, som Igor V. Rafienko også sagde, i den kode du
spurgte til ikke "<char*>" men "reinterpret_cast", som ikke er en template
funktion.
"reinterpret_cast<char*>" er en måde at sige til kompileren, at "på den
adresse tager jeg som programmør ansvaret for at man læse en char*, og få så
dit typesystem til at holde op med at brokke sig!".

[snip]
> Til Mogens:
> Jeg har noteret mig dine foreslag til bøger, som du også nævnte tidligere.
> Iøvrigt - går du og pønser på at skrive en dansk C++ bog ?

Nej, det har jeg simpelthen ikke tid til.
Men når det er sagt, så ville jeg ønske at der var blot een god, moderne
introduktion til C++, så nytilkomne kan komme godt igang, inden de begiver
sig ud i den lange række af gode engelske bøger der findes..
Det er min klare opfattelse at der er et væsentligt potentiale for at
forbedre undervisningen i C++ i Danmark. Det generer mig når jeg ser
eksempler på elendig og inkompetent formidling. Jeg syntes at det er
skammeligt for dem, der som individer bliver udsat for dårlig undervisning
og for samfundet der betaler for det. Det er en væsentlig grund til at jeg
orker at svare på spørgsmål i denne nyhedsgruppe.

[snip]
> Som jeg forstår skulle "Accelerated C++" være en af de bedre og Biblen
"The
> C++ Programming Language" af B.S. , men hvilken bog kan du da anbefale?

Hvis du hurtigt vil se hvordan man kan skrive pæne, moderne og nyttige
programmer i C++, så tag "Accelerated C++" i den sikre forvisning om at hvis
man vil lære C++ virkeligt seriøst så slipper man ikke uden om "The C++
Programming Language".

Venlig hilsen

Mogens Hansen



Torben W. Hansen (12-07-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 12-07-02 07:51

Tak for svarene...

Jeg skal læse lidt C++ endnu før jeg får det fulde udbytte dine
kodeeksempler...

Med venlig hilsen

Torben W. Hansen



"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:ag347m$lbo$1@news.cybercity.dk...
>
> "Torben W. Hansen" <mail@ins-intersoft.com> wrote
>
> [snip]
> > Dvs. at "inline" er en form for makro definitioner, hvor kode indsættes
> (af
> > pre-processor ?) frem for at foretage et funktionskald (iflg. Igor -
hvis
> > kompileren altså har valgt at tage "inline" til efterretning).
>
> Sådan kan man godt se det, blot man ikke tager det for bogstaveligt.
> "inline" kan også opfattes som et af de steder, hvor C++ tilbyder et
> alternativ til anvendelse af preprocessor makroer.
> "inline" funktioner overholder alle regler som ikke "inline" funktioner -
> f.eks. scope.
>
> Tag følgende 2 implementeringer af "max" (som ikke er compileret, så der
kan
> være småfejl)
>
> <med "inline">
>
> template <class T>
> inline T max(const T& t1, const T& t2)
> {
> return t1 > t2 ? t1 : t2;
> }
>
> void foo()
> {
> int a = 1;
> int b = 2;
> int c = max(a++, b++);
> assert(2 == a); // No problem
> assert(3 == b); // No problem
> assert(2 == c); // No problem
> }
>
> </med "inline">
>
> <med preprocessor macro>
>
> #define max(t1, t2) (t1 > t2 ? t1 : t2)
>
> void foo()
> {
> int a = 1;
> int b = 2;
> int c = max(a++, b++); // same as c = (a++ > b++ ? a++ : b++);
> assert(2 == a); // No problem
> assert(4 == b); // Ups - b++ evaluated twice!
> assert(3 == c); // Ups
> }
>
> </med preprocessor macro>
>
> Så vidt jeg husker Kris Jamsa ret glad for at bruge preprocessoren - også
> til ting, hvor andre langt bedre konstruktioner ligger lige for.
> Se f.eks. mine tidligere kommentarer
>
http://groups.google.com/groups?q=%22Mogens+Hansen%22+dansk&hl=da&scoring=d&
> selm=9uj6rp%242qqf%241%40news.cybercity.dk&rnum=3
>
> >
> > og "<xxx>" specificerer den aktuelle type for en funktions-skabelonen.
> (jeg
> > var endnu ikke nået til "templates" i min bog, men smugkikkede efter
jeres
> > svar).
>
> Blot var det væsentlige, som Igor V. Rafienko også sagde, i den kode du
> spurgte til ikke "<char*>" men "reinterpret_cast", som ikke er en template
> funktion.
> "reinterpret_cast<char*>" er en måde at sige til kompileren, at "på den
> adresse tager jeg som programmør ansvaret for at man læse en char*, og få

> dit typesystem til at holde op med at brokke sig!".
>
> [snip]
> > Til Mogens:
> > Jeg har noteret mig dine foreslag til bøger, som du også nævnte
tidligere.
> > Iøvrigt - går du og pønser på at skrive en dansk C++ bog ?
>
> Nej, det har jeg simpelthen ikke tid til.
> Men når det er sagt, så ville jeg ønske at der var blot een god, moderne
> introduktion til C++, så nytilkomne kan komme godt igang, inden de begiver
> sig ud i den lange række af gode engelske bøger der findes..
> Det er min klare opfattelse at der er et væsentligt potentiale for at
> forbedre undervisningen i C++ i Danmark. Det generer mig når jeg ser
> eksempler på elendig og inkompetent formidling. Jeg syntes at det er
> skammeligt for dem, der som individer bliver udsat for dårlig undervisning
> og for samfundet der betaler for det. Det er en væsentlig grund til at jeg
> orker at svare på spørgsmål i denne nyhedsgruppe.
>
> [snip]
> > Som jeg forstår skulle "Accelerated C++" være en af de bedre og Biblen
> "The
> > C++ Programming Language" af B.S. , men hvilken bog kan du da anbefale?
>
> Hvis du hurtigt vil se hvordan man kan skrive pæne, moderne og nyttige
> programmer i C++, så tag "Accelerated C++" i den sikre forvisning om at
hvis
> man vil lære C++ virkeligt seriøst så slipper man ikke uden om "The C++
> Programming Language".
>
> Venlig hilsen
>
> Mogens Hansen
>
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste