Verktyg Visningsval
2011-11-14, 22:02   #1

PapuPapu

Medlem

PapuPapus avatar

Plats: Stockholm

Registrerad: jul 2011

Klammerparenteser i programmering....


tja!

jag går min tredje programmeringskurs på universitetet och läser för tillfället C/C++ och har egentligen alltid undrat vad man har [] parenteser till. Har väl nästan bara använt dom för att deklarera arrayer såsom int [] tjofräs......; men har visserligen sätt många koder där man haft liknande kod:
final int x = 10;
int y [x];
brukar se ut aningen annorlunda men det som jag kom på just nu eller har de liknande funktion som () parenteser?

/danne
__________________
Lenovo y500 |....
PapuPapu är inte uppkopplad
2011-11-14, 22:09   #2

TheMrjonte

Medlem

Plats: Vallentuna

Registrerad: sep 2011

används till arrays i JavaScript, kan inte c/c++
TheMrjonte är inte uppkopplad
2011-11-14, 22:21   #3

Karstmannen

Medlem

Karstmannens avatar

Plats: Karlstad

Registrerad: okt 2001

Precis som TheMrjonte skriver kan de användas för arrayer. Om arrayOfNames är en array med namn kan du tex. använda arrayOfNames[2] för att komma åt tredje elementet i arrayen.
Karstmannen är inte uppkopplad
2011-11-14, 22:59   #4

PapuPapu

Medlem

PapuPapus avatar

Plats: Stockholm

Registrerad: jul 2011

okej, näe jag trodde de var lite mer avancerande än så... tack för svar
__________________
Lenovo y500 |....
PapuPapu är inte uppkopplad
2011-11-15, 00:37   #5

Teknocide

Medlem

Plats: i din garderob

Registrerad: sep 2007

Citat:
Ursprungligen inskrivet av PapuPapu Visa inlägg
okej, näe jag trodde de var lite mer avancerande än så... tack för svar
I C/C++ används de som offset för pekare. Jag är dåligt insatt i de språken så kan tyvärr inte ge mer information.
__________________
Bilanaloger är som Volvo — varenda svenne kör med dem
Teknocide är inte uppkopplad
2011-11-15, 06:12   #6

Alex87

Medlem

Alex87s avatar

Plats: Falun

Registrerad: feb 2010

Minns inte riktigt just nu, och har ingen möjlighet att testa det på några timmar, men jag har för mig att du ska kunna göra saker som:

int value = 100;
char lastChar = (char)value[3];

Som sagt är jag inte helt hundra på det, jag kan lika gärna ha drömt det hela.

Det jag menar isåfall är att du använder [] för offsets i minnet

Skickades från m.sweclockers.com

Senast redigerad av Alex87 2011-11-15 klockan 06:16.
Alex87 är inte uppkopplad
2011-11-15, 11:06   #7

pelleplu

Medlem

pelleplus avatar

Plats: Stockholm

Registrerad: jun 2003

Citat:
Ursprungligen inskrivet av Alex87 Visa inlägg
int value = 100;
char lastChar = (char)value[3];
Detta kommer inte att fungera. Att använda [] som offset fungerar bara ifall variabeln är en array eller pekare. Vad är det egentligen du försökte åstadkomma med den där kodsnutten?
pelleplu är inte uppkopplad Folding
2011-11-15, 17:12   #8

Alex87

Medlem

Alex87s avatar

Plats: Falun

Registrerad: feb 2010

Okej.. Nä, tänkte bara på att en int är 4 bytes, så att man kunde plocka ut värdet på en av dom bytesen.

Sen förväntar jag mig inte att det jag skrev skulle fungera till punkt och prickar. Det var bara nått jag kastade ihop på mobilen.

Skickades från m.sweclockers.com
Alex87 är inte uppkopplad
2011-11-15, 18:53   #9

Massy

Medlem

Plats: Kalmar

Registrerad: jun 2008

Så långt som jag lärt mig så är det bara arrayer man använder dem i, finns säkert något mer sammanhang.
Massy är inte uppkopplad
2011-11-15, 19:27   #10

xale89

Medlem

Plats: Uppsala

Registrerad: sep 2009

Citat:
Ursprungligen inskrivet av Alex87 Visa inlägg
Okej.. Nä, tänkte bara på att en int är 4 bytes, så att man kunde plocka ut värdet på en av dom bytesen.

Sen förväntar jag mig inte att det jag skrev skulle fungera till punkt och prickar. Det var bara nått jag kastade ihop på mobilen.

Skickades från m.sweclockers.com
Det enda problemet är väl egentligen ett parantesfel. Det hade funkat att skriva så om du hade skrivit ((char)value)[3].
xale89 är inte uppkopplad
2011-11-15, 19:42   #11

Dosshell

Medlem

Dosshells avatar

Plats: Göteborg

Registrerad: jun 2006

asd[3] är samma sak som *(asd+3) där asd är av typen int* / int[], vilket helt riktigt påpekat av Teknocide är en pekaroffset.
observera att 3[asd] fungerar också tack vare kommutativitet.
Edit:
Tänk också på att det är vanligt att overloada operatorn för datastrukturer och då gäller andra saker.

Rekommenderad läsning som tar upp en del av ämnet:
http://www.cplusplus.com/doc/tutorial/pointers/ (under rubriken "Pointers and arrays")

Senast redigerad av Dosshell 2011-11-15 klockan 19:55.
__________________
citera!
Dosshell är inte uppkopplad
2011-11-15, 20:40   #12

pelleplu

Medlem

pelleplus avatar

Plats: Stockholm

Registrerad: jun 2003

Citat:
Ursprungligen inskrivet av xale89 Visa inlägg
Det enda problemet är väl egentligen ett parantesfel. Det hade funkat att skriva så om du hade skrivit ((char)value)[3].
Det går inte eftersom value inte är en array eller pekare. Det kommer att generera ett kompilatorfel, i alla fall på gcc. Men ifall den hade lyckats tolka value som en pekare, så hade den ju gjort om intens värde till en char (och möjligen tappat information), och sedan försökt komma åt minnet på adressen: värdet av den trunkerade int:en plus en offset på 3 * storleken av en char. 100 + 3 * sizeof(char) = 103 (om en char är 1 byte).

Om man vill komma åt "sista" (LSB) byten i en int, får man maska bort det ointressanta, eller möjligen använda sig av en union (dock inte lika pålitligt eftersom man kan få olika värden beroende på vilken endianness maskinen man använder har).
pelleplu är inte uppkopplad Folding
2011-11-15, 21:03   #13

xale89

Medlem

Plats: Uppsala

Registrerad: sep 2009

Citat:
Ursprungligen inskrivet av pelleplu Visa inlägg
Det går inte eftersom value inte är en array eller pekare. Det kommer att generera ett kompilatorfel, i alla fall på gcc. Men ifall den hade lyckats tolka value som en pekare, så hade den ju gjort om intens värde till en char (och möjligen tappat information), och sedan försökt komma åt minnet på adressen: värdet av den trunkerade int:en plus en offset på 3 * storleken av en char. 100 + 3 * sizeof(char) = 103 (om en char är 1 byte).

Om man vill komma åt "sista" (LSB) byten i en int, får man maska bort det ointressanta, eller möjligen använda sig av en union (dock inte lika pålitligt eftersom man kan få olika värden beroende på vilken endianness maskinen man använder har).
hehe jo det har du rätt i. Hade inte riktigt alla hästar hemma när jag skrev det. Korrekt isf borde väl vara ((char*)&value)[3]. Testade det också och det funkade fint. Bra att du påpekade det iaf
xale89 är inte uppkopplad
2011-11-16, 07:08   #14

pelleplu

Medlem

pelleplus avatar

Plats: Stockholm

Registrerad: jun 2003

Citat:
Ursprungligen inskrivet av xale89 Visa inlägg
hehe jo det har du rätt i. Hade inte riktigt alla hästar hemma när jag skrev det. Korrekt isf borde väl vara ((char*)&value)[3]. Testade det också och det funkade fint. Bra att du påpekade det iaf
Jo det där borde fungera på en big endian maskin, men jag hade nog avrättat den personen som skrev sådan kod ;-)
pelleplu är inte uppkopplad Folding
2011-11-16, 12:21   #15

Tott3

Medlem

Tott3s avatar

Plats: Timrå

Registrerad: okt 2004

Här står det som arrayer på Svenska.

http://www.blinkenlights.se/articles...rguide/part13/

Sen har du ju

http://www.youtube.com/watch?v=DYZxs...f=list_related
http://www.youtube.com/watch?v=7Fn8e...feature=relmfu

Finns säkert mer advancerade saker dom andvänds till, jag har inte en aning iaf. Är nybörjare som dig. ^^
__________________
Mvh, Totte.
Tott3 är inte uppkopplad
2011-11-16, 21:13   #16

Gramner

Medlem

Gramners avatar

Registrerad: nov 2004

Citat:
Ursprungligen inskrivet av xale89 Visa inlägg
Korrekt isf borde väl vara ((char*)&value)[3]. Testade det också och det funkade fint.
Fast nu är det ju enligt C-standarden strict aliasing violation att referera till samma minnesadress från olika perkartyper på det där sättet så korrekt C-kod är det inte. Sen att det kan råka fungera ändå ibland är en annan femma.
Gramner är inte uppkopplad Folding
2011-11-16, 21:47   #17

dazen

Medlem

Plats: Boden

Registrerad: feb 2003

Citat:
Ursprungligen inskrivet av Gramner Visa inlägg
Fast nu är det ju enligt C-standarden strict aliasing violation att referera till samma minnesadress från olika perkartyper på det där sättet så korrekt C-kod är det inte. Sen att det kan råka fungera ändå ibland är en annan femma.
Char är ett undantag, en char-pekare får alltid vara ett alias till vilken typ some helst (dock bara åt ena hållet).
__________________
Point das kuk
dazen är inte uppkopplad
2011-11-16, 22:14   #18

xale89

Medlem

Plats: Uppsala

Registrerad: sep 2009

Citat:
Ursprungligen inskrivet av dazen Visa inlägg
Char är ett undantag, en char-pekare får alltid vara ett alias till vilken typ some helst (dock bara åt ena hållet).
Citat:
Ursprungligen inskrivet av Gramner Visa inlägg
Fast nu är det ju enligt C-standarden strict aliasing violation att referera till samma minnesadress från olika perkartyper på det där sättet så korrekt C-kod är det inte. Sen att det kan råka fungera ändå ibland är en annan femma.
Betyder detta att man aldrig får typecasta en pekare till annat än char*? Gäller det samma för att man inte får typecasta en struct{ float a,b,c; }* till en float*? Det beror inte på endianess tex och ger ett definerat resultat så långt jag ser. Vad jag har fått ut från min snabba googling på ämnet är att det är anledningen till att det är otillåtet.
xale89 är inte uppkopplad
Senaste nyheterna

Redaktionens senaste nyhetsrubriker

Sök jobb