jockeeMedlem sedan sep. 200024 inlägg Undrar om det går att skicka arrayer in och ut ur funktioner?
Här är lite kod som jag försökte med, tacksam för hjälp:
int array[1];
// har en array som jag vill ändra lite med en funktion
array = doStuffWithArray(array);
funktionen är nåt liknande:
int doStuffWithArray(int array[1]) {
array[0]=12;
array[1]=9;
return array;
}
det här fungerar inte, ny som jag är på det här förstår jag inte riktigt hur man gör rätt.
Raden jag får fel på är den med "array = doStuffWithArray(array);"
Felet är:
incompatible types in assignment of `int' to `int[1]'
Är detta helt åt skogen?
[Redigerat av jockee den 13 aug 2001]
UlfTMedlem sedan maj 20018 027 inlägg <font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">int array[1];
Jag förstår att du avsåg att deklarera en array med elementen 0 och 1. Men då gör man istället såhär:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">int array[2];
dvs en array med två element. Din deklaration gav en array med bara ett element.
Efter ovanstående deklaration är variabeln array en pekare till första elementet i arrayen, dvs array[0]. Men båda elementen är allokerade i och med att du deklarerade array[2].
När du anropar doStuffWithArray() ska du skicka pekaren array. Det innebär att du måste deklarera argumentet som en pekare, i det här fallet en pekare till en int eftersom första elementet är en int:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">int * doStuffWithArray(int * array)
{
array[0]=12;
array[1]=9;
return array; // Här valde du att returnera pekaren array, se hur jag har ändrat funktionsdeklarationen
// egentligen behövde du inte returnera något för funktionen ändrade inte på pekaren, utan på det pekaren pekade på
// Om du programmerat VB är du nog bekant med ByRef-argument. Det här är något liknande.
}
jockeeMedlem sedan sep. 200024 inlägg Tack, är väldigt glad över svaret. :)
Undrar lite fortfarande, läste lite om pekare men undrar lite över funktionen.
Kollade på din kod och undrar lite över det det här:
int * doStuffWithArray(int * array)
Varför sätter man * framför funktionsnamnet?
Känner att jag inte har full koll på hur man ska använda pekarna.
[Redigerat av jockee den 14 aug 2001]
UlfTMedlem sedan maj 20018 027 inlägg * framför funktionsnamnet är om man vill att funktionen ska returnera en pekare. Jämför med variabeldeklarationer:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">int * array; // pekare till en int
int * func() // funktion som returnerar pekare till en int
Jag vill dock påpeka att i ditt exempel behöver du inte returnera någon array. Det är så att variabeln array innehåller en minnesadress. Den ändrar du aldrig på i din funktion. Däremot ändrar du på innehållet i det minnesblock som array pekar på. Efter den funktionen kommer array alltså fortsätta peka på samma minnesblock, men innehållet i minnesblocket är annorlunda. Du får räkna med att det tar lite tid att få full koll på pekare, men genom övande i c-programmering kommer du vänja dig. Man kommer inte ifrån pekare i vare sig c eller c++.
PhOrPhErMedlem sedan feb. 20002 300 inlägg Jag kan inte låta bli att kommentera placeringen av stjärnan bara. :e
Alltså det funkar ju alldeles utmärkt som du skriver (int * doStuffWithArray (int * array))men det är svårt att se vad stjärnan tillhör på nåt sätt.. :)
Jag tycker nog att det borde se ut såhär: int *doStuffWithArray(int *array).
Jag gick 5-poängs C++ kurs i vintras och då ville vår lärare skilja på C och C++ genom att vid C skriva en pekardeklaration som jag gjort ovan och i C++ skriva int* doStuffWithArray(int* array).
Fast tja.. Smaken är ju som baken.. :e
------------------
- Erik Hellström -
- Datalogiprogrammet - MDH -
- http://3d.burken.nu -
UlfTMedlem sedan maj 20018 027 inlägg Visst kan man ha stjärnan på flera sätt:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
int *var; // *var pekar på datatypen int
int* var; // var är av datatypen heltalspekare
Båda två är ju förstås samma sak, det är en smaksak hur man ser det.
Hur motiverade din lärare sitt val med int *var; i C och int* var; i C++;?
Jag rekommenderar
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">int* ptr1 = NULL; // bra
hellre än
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">int *ptr2 = NULL; // dåligt
Den stilen använder bland annat C++ språkets "pappa" Bjarne Stroustrup.
Motiveringen är att du deklarerar en pekare till en integer int* och asterisken hör till variabeltypen.
Samtidigt uppmanar jag att bara deklarera en variaber per rad, annars faller förstås mitt resonemang (int* a, b är farligt - det är bara a som blir en pekare). Man vinner heller inget på att ha fler än 1 variabeldeklaration per rad.
Detta har tidigare debatterats på passagen, ursprungliga inlägget var http://debatt.passagen.se/html/500000000000002/500000000000067/10000000000945160.shtml
Min kommentar på http://debatt.passagen.se/html/500000000000002/500000000000067/10000000000945570.shtml och "Hampus" sakliga inlägg på http://debatt.passagen.se/html/500000000000002/500000000000067/10000000000946191.shtml.
Jag är också nyfiken varför din lärare ville skriva olika i C och C++. (Vikten av att kunna C är i min mening inte längre särskilt stor annat än om man jobbar med mikroprocessorer då det fortfarande lever kvar. Det mesta skrivs nuförtiden i C++ eller andra objektorienterade språk. Jag vet ingen som längre jobbar med C för att det är det enda alternativet)
[Redigerat av developer den 14 aug 2001]
PhOrPhErMedlem sedan feb. 20002 300 inlägg Tja.. Vi fick nog ingen motivering varför han tyckte så. Och jag är ju i trotsåldern så jag skriver inte så i vilket fall. :e
Jag skriver (int *foo) och kommer förmodligen alltid att göra det. Svårt att göra sig av med gamla vanor. :)
------------------
- Erik Hellström -
- Datalogiprogrammet - MDH -
- http://3d.burken.nu -