Just nu i M3-nätverket
Gå till innehåll

Snabba små-frågor, C++


sww

Rekommendera Poster

Hej! Lite små-frågor som vore skönt att få svar på.

 

Går rakt på sak:

 

1. Vad gör <> i den här raden:

std::vector<SDL_Rect> &get_rects();

 

2. Om jag definerar en klass på det här sättet:

#ifndefine TEST
#define TEST
....kod..
#endif

Förutom att den förhindar omdefinering(?), använder man symbolen TEST på nåt sätt nån gång och hur i så fall?

 

3. Vad står typedef för?

 

4. Vad står egentligen en Vektor för (inom programmering)? Är det verkligen helt samma sak som en array? Jag får lite olika uppfattningar på de sidor jag har läst om det.

 

4b. std klassen vector. Vad gör den om en vektor bara enkelt kan defineras som hej[3] ?

 

Det var nog allt jag kom på just nu. Kommer säkert ställa lite fler småsaker med tiden.

 

Tack på förhand //Simon

 

Länk till kommentar
Dela på andra webbplatser

Vad gör <> i den här raden:

Det specificerar typen av element som vektorn tar. Detta använder sig hårt typade språk av.

 

Förutom att den förhindar omdefinering(?), använder man symbolen TEST på nåt sätt nån gång och hur i så fall?

I det här fallet är det just vad du använder den till, för att se till att ingen annan inkluderad fil (eller kodstycke längre upp) gör samma sak.

 

Vad står typedef för?

Används för att ge datatyper aliasnamn.

 

Vad står egentligen en Vektor för (inom programmering)? Är det verkligen helt samma sak som en array? Jag får lite olika uppfattningar på de sidor jag har läst om det.

Det beror på språk (i C++ är det en dynamisk array). En vektor i C++ har mer funktionalitet än en vanlig array, men generellt är de rätt likvärdiga i alla språk.

 

Sista frågan förstod jag inte

 

Länk till kommentar
Dela på andra webbplatser

Används för att ge datatyper aliasnamn.

Ok, varför bara inte använda datatyps-namnet?

 

Vad menas med &-tecknet i raden? Nån form av referens?

std::vector<SDL_Rect> &get_rects();

 

Sista frågan förstod jag inte

Ja alltså, om jag kan skapa en vektor genom att bara int hej[10],

varför då inkuldera en vektor klass. Men jag tror jag fattar lite mer varför i och med ditt svar på fråga 4.

 

[inlägget ändrat 2007-09-21 23:21:32 av sww]

Länk till kommentar
Dela på andra webbplatser

I det här fallet är det just vad du använder den till, för att se till att ingen annan inkluderad fil (eller kodstycke längre upp) gör samma sak.

 

Jo precis, men jag menar om 'den' används på något annat sätt i vanliga sammanhang? Är den värd någonting? Förutom infon om att den har blivit definerad!

 

Länk till kommentar
Dela på andra webbplatser

5. Vad är Uint32, Uint8 etc. för datatyper? vad används de till?

 

6. Vad använder mman extern till? t.ex extern const int Hej

[inlägget ändrat 2007-09-21 23:43:50 av sww]

Länk till kommentar
Dela på andra webbplatser

Ok, varför bara inte använda datatyps-namnet?

 

Kombinationen C++ och STL har en viss förmåga att generera extremt långa och komplicerade typnamn som man helst inte vill behöva skriva in om och om igen.

 

En annan anledning är att man kan skriva sin kod mer generell. Säg att du har en dator där man ska använda datatypen int16 för att representera en integer. På en annan dator kanske man ska använda long. I början av koden definierar man sin egen heltalsdatatyp och låter den vara int16 i ena fallet, long i andra fallet. I koden använder man sedan sin egendefinierade datatyp.

 

Vad menas med &-tecknet i raden? Nån form av referens?

 

Japp!

 

Det är ett sätt att inte behöva skicka stora datamängder på stacken vid metodanrop.

 

om jag kan skapa en vektor genom att bara int hej[10],

varför då inkuldera en vektor klass.

 

Om du har gjort plats för ett visst antal element men efter ett tag kommer på att du behöver plats för många fler kommer en vektor att automatiskt sköta omallokering av minne på ett effektivt sätt.

 

En annan anledning är att "alla" vet hur en vector fungerar. Alla vet hur man sorterar en vector, hur man tar bort och lägger till element m m.

 

vector (och string) är definierade på ett sätt så de enkelt kan användas med kod som inte använder STL. Elementen i en vector lagras i "contiguous memory" och tar man adressen till första elementet i en vector kan man använda den adressen som en pekare till första elementet i en array (med vissa restriktioner).

 

[inlägget ändrat 2007-09-22 00:03:59 av lizardKng]

Länk till kommentar
Dela på andra webbplatser

Är den värd någonting? Förutom infon om att den har blivit definerad!

 

Nej. Det är det enda den är till för.

 

Ofta använder man liknande konstruktion när man inkluderar filer.

 

-------- typer.h ------------

#ifndef TYPER_H

#define TYPER_H

 

...

massa kod

...

#endif

------------------------------

 

Denna konstruktion förhindrar att det som definieras i typer.h inkluderas mer än en gång i samma .c-fil. Det kan lätt hända annars med filer som definierar grundläggande saker och som används flitigt.

 

Personlig åsikt: Det här med inkludefiler är ett elände i C/C++!!!

 

Länk till kommentar
Dela på andra webbplatser

5. Vad är Uint32, Uint8 etc. för datatyper? vad används de till?

 

Uint8 betyder unsigned integer, 8 bitar.

 

6. Vad använder mman extern till? t.ex extern const int Hej

 

Används för att ha globala variabler. Om variabeln är deklarerad på annat ställe (t ex int maxNumberOfUsers) och du vill referera till den använder du extern.

 

Tips: Försök undvika detta! Använd istället singletons.

 

http://en.wikipedia.org/wiki/Singleton_pattern

 

Men mekanismen med extern används ofta i C så ska du använda ett kodbibliotek skrivet i C kommer du kanske behöva använda extern.

 

Länk till kommentar
Dela på andra webbplatser

Är den värd någonting? Förutom infon om att den har blivit definerad!

Nej. Det är det enda den är till för.

Jo, den är värd precis det som det den är ersättning för, dvs mer än "infon" som du kallar det för. En typedef är en syntaktiskt ersättning som kompilatorn i sin första parse ersätter med det den definierar. Smeknamn är väl den enklaste omskrivningen.

 

5. Vad är Uint32, Uint8 etc. för datatyper? vad används de till?

Utöver vad lizardKng redan skrivit så betyder U:et, dvs unsigned att den mest signifikanta biten i en byte eller ett ord inte används som +/- bit. Om detta inte låter bekant alls bör du kanske inte hålla på med c++ utan välja något simplare som vb. Eller åtminstone börja i rätt ände.

 

Länk till kommentar
Dela på andra webbplatser

6. Vad använder mman extern till? t.ex extern const int Hej

Används för att ha globala variabler. O

 

lizardKng, mig veterligen är du den enda jag känner som använder c++ under .Net. Används verkligen "extern" där på det sätt du förklarar? I c# används det för att referera till externa, i praktiken främst, funktioner i Win32.

 

Länk till kommentar
Dela på andra webbplatser

Jo, den är värd precis det som det den är ersättning för

 

Ahh, jag tänkte bara på "TEST", inte på typedefen...

 

Om detta inte låter bekant alls bör du kanske inte hålla på med c++

 

Hmmm, man m¨ste ju börja nånstans? Jag visste inte hellre vad unsigned var innan jag lärde mig det :)

 

 

 

Länk till kommentar
Dela på andra webbplatser

Min användning av c++ under .NET är bara på hobbynivå. Jag har dock inte använt extern hittils.

 

Men frågan gällde väl inte enbart C++ under .NET hoppas jag? ;) SIP-stacken vi använder på jobbet är skriven i C och använder extern mycket flitigt.

 

Men jag glömde att nämna att extern också används för funktioner.

 

Nå. jag var trött :)

 

Länk till kommentar
Dela på andra webbplatser

Okej. Jag tror jag är med.

 

Så Uint32 kan skrivas som 'unsigned int' ? 'int' är väll 32-bitar stor?

 

Alltså genom unsigned kan talet bli dubbelt så stort?

 

Annars tack för alla svar!

 

Länk till kommentar
Dela på andra webbplatser

Så Uint32 kan skrivas som 'unsigned int' ?

 

Uint32 är unsigned förvisso men den tar alltid upp 32 bitar. Se nedan.

 

int' är väll 32-bitar stor?

 

Det behöver itne vara så. Jag vet inte om det finns några övre eller undre gränser, jag är rätt säker på att jag sett varianter där int tar 16, 32 eller 64 bitar. Det bestäms när koden kompileras (cpu-typ, ...).

 

Alltså genom unsigned kan talet bli dubbelt så stort?

 

Ja. Man skippar ju halva talområdet.

 

Länk till kommentar
Dela på andra webbplatser

8. Vad är egntligen nyckelordet NULL för något? Skillnad mot 0? Jag har använt det jätteofta men aldrig riktigt varit säker på om vad det egentligen är för värde.

 

Länk till kommentar
Dela på andra webbplatser

NULL är inget nyckelord, det är en konstant.

 

I C++ tycker jag man ska strunta i NULL och använda 0 istället, Bjarne Stroustrup tycker samma sak om man läser hans "The C++ Programming Language".

 

Här kan du läsa mer om ämnet:

 

http://discuss.techinterview.org/default.asp?design.4.195262.19

 

[inlägget ändrat 2007-09-26 20:00:42 av lizardKng]

Länk till kommentar
Dela på andra webbplatser

  • 5 months later...

Hallå!

 

En ny snabbfråga:

 

Om jag har en klass nämnd Bild så kan jag skapa ett objekt på två olika sätt:

 

1. Bild havet;

 

2. Bild stranden = new Bild();

 

Vad är egentligen skillnaden? (förutom att man kan skicka med parametrar till konstruktorn med hjälp av new !?)

 

[inlägget ändrat 2008-03-08 14:52:13 av sww]

Länk till kommentar
Dela på andra webbplatser

Bild havet; är en variabel som kan innehålla objektet Bild. Denna är dock definerad som null eftersom du inte tilldelat den något.

 

Bild stranden = new Bild(); här skapar du direkt ett nytt objekt av typen Bild

 

Bild havet;

havet = new Bild();

 

hade man fått skriva för att få samma effekt.

om vi säger att ditt objekt Bild innehåller get/set metod på Size

och du hade skrivitsåhär:

 

Bild havet;

Console.WriteLine(havet.Size.ToString());

 

så hade du fått NullException kastat. Objektet finns inte helt enkelt.

medans den andra hade fungerar alldeles utmärkt!

 

Där har du skillnaden :P

 

Länk till kommentar
Dela på andra webbplatser

så hade du fått NullException kastat. Objektet finns inte helt enkelt.

medans den andra hade fungerar alldeles utmärkt!

 

Tack för svar, men förvirring återstår.

 

Det fungerar nämligen att bara göra så här:

 

Bild havet;

 

cout << havet.size();

 

Bild havet; verkar inte vara definerad som Null ?! eller är det nåt annat som jag missar?

 

[inlägget ändrat 2008-03-08 16:11:36 av sww]

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
Det fungerar nämligen att bara göra så här:

 

Bild havet;

 

cout << havet.size();

Har du kollat vad resulatet av detta är? =)

Så länge du har definierat en variabel så har den i de flesta språk ett default-värde när den inte har tilldelats något värde.

[inlägget ändrat 2008-03-08 21:56:44 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Corrulum har blandat ihop C++ med något annat språk, det Corrulum beskriver stämmer inte för C++.

 

Bild havet;

 

Skapar ett objekt av typen Bild med namn havet. Objektet är skapat "lokalt" vilket bl a innebär att när du returnerar från den metod du är i så kommer objektet att destrueras (tas bort) automatiskt.

 

Bild stranden = new Bild();

 

Felskrivet, ska vara:

 

Bild *stranden = new Bild();

 

Skapar ett objekt av typen Bild och låter _pekaren_ stranden peka ut detta objekt.

 

Objektet är dynamiskt allokerat och kommer att existera tills du tar bort det manuellt.

 

Bild havet;

 

cout << havet.size();

 

Helt korrekt, inget konstisgt med det.

 

Länk till kommentar
Dela på andra webbplatser

Bild havet; verkar inte vara definerad som Null ?! eller är det nåt annat som jag missar?

 

Det var nog bara Crollum som böandade ihop C++ med nåt annat språk :)

 

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...

Håller på att utveckla i en 3d-motor nu. Motorn använder sig av en "enhet" 'Real' för att ange positioner etc. Min fråga är då att i exempel kod för dessa Real variabler ett värde på det här sättet:

Real position = 10.0f

 

Vad betyder det där 'f'et i slutet? vad gör det?

 

mvh simon

 

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...