Returnér array

Tags:    c++

Hej! Jeg sidder og nørkler lidt med en gammel opgave fra Dansk Datalogi Dyst. Opgaven lyder således, hvis nogle skulle være interesserede: http://www.ioi.emu.dk/opgaver/camelot/camelot.htm .
Jeg er forholdvis grøn i C++ og er derfor stødt på et problem. Jeg vil gerne returnere et 2-dimensionelt array bestående af int's fra en funktion. Jeg kan bare ikke finde ud af syntaksen :-(

Min kode er her:
Fold kodeboks ind/udKode 


Det er funktionen "read" der skal returnere arrayet "field". Hvordan gør jeg? :S



Indlæg senest redigeret d. 08.02.2011 22:54 af Bruger #14210
Du kan ikke returnere en array. Variable deklareret inde i et givet scope eksisterer kun indenfor dette scope. Antag lige at returtypen void var array i stedet og gyldig:
Fold kodeboks ind/udKode 


Årsagen til det virker med andre værdier som int's er fordi at de er copy-by-value, altså værdien bliver kopieret. De originale variabler eksister stadig kun inden i scopet.

I stedet kan du bruge "output-parameters":
Fold kodeboks ind/udKode 


Hvis du kigger godt efter vil du se at meget c-kode som handler mere komplekse typer ind ints og floats gør ligeledes.

Det skrevet ud fra hukommelsen så kan være småfejl.



Indlæg senest redigeret d. 08.02.2011 23:03 af Bruger #14645
Tak for det hurtige svar :-)
Jeg har siddet og prøvet at få det til at virke, men det gør det stadig ikke :-(
Her er min kode:
Fold kodeboks ind/udKode 

.. og min build log:
Fold kodeboks ind/udKode 


Jeg har prøvet at ændre på syntaxen hvor jeg kalder funktion uden held.



Indlæg senest redigeret d. 08.02.2011 23:43 af Bruger #14210
Prøv og slette det her tegn:
void read(const char filename[], int* field[][8]) {



Well...arrays behøver ikke at ligge på stakken. De kan allokeres dynamisk med 'new' (i C++) eller 'malloc' i C.



Har siddet og eksperimenteret lidt og ændret lidt i koden
Fold kodeboks ind/udKode 


variblen der bliver printet ud i main-scope't er det samme som det blev sat til i read-funktionen. Er array's pass'ed som pointers selvom man ikke "siger den skal det"?



Er array's pass'ed som pointers selvom man ikke "siger den skal det"?

Korte version:
Korrekt. Der er ingen måde at sende en array eller string (char*) "by-value"/kopiere.

Længere:
En array er faktisk en pointer til starten af noget data der ligger samlet. field er en pointer til der hvor array'en er i hukommelsen. Når du skriver field[3][3] finder compileren ud af hvad du faktisk mener og henter værdien det rigtige sted i det stykke data.

Lyder som om du fik det til at virke?



Indlæg senest redigeret d. 09.02.2011 12:49 af Bruger #14645
ja det gjorde jeg. Mange tak for hjælpen :-)
Vil det sige at man kun kan sende primitive typer "by-value"?



ja det gjorde jeg. Mange tak for hjælpen :-)
Vil det sige at man kun kan sende primitive typer "by-value"?

Nej du kan godt sende primitive typer by-reference. En pointer er blot adressen på noget data. Sådan får du en pointer til en int:
Fold kodeboks ind/udKode 


Så kan du kalde en function med den. *num 'dereferencer' pointeren. Hvis du har en pointer til en int har du nu den bagvedliggende int.
Fold kodeboks ind/udKode 


Samlet:
Fold kodeboks ind/udKode 





ja det gjorde jeg. Mange tak for hjælpen :-)
Vil det sige at man kun kan sende primitive typer "by-value"?


Du kan sende primitive typer by reference, by value eller by pointer.

Structs og objekter kan også sendes by value, men det vil man typisk ikke gøre, da det kræver en komplet kopi af objektet/strukturen...og med et objekt (i C++) bliver constructoren kaldt igen....noget snask.



Så fik jeg svar på alle mine spørgsmål :-)
Mange tak :-)



t