array übergeben (spiel)

z3r00

Grünschnabel
hi leute

ich hab ein spiel programmiert, aber mein prof sagt das ich das nicht so machen darf.

es geht um folgendes:

ich hab ein struct erstellt:(im headder)
Code:
struct daten
{
	int array[8];//array für daten von spielfiguren
};

dann hab ich mir eine funktion erstellt das ein array wiedergibt:
Code:
struct daten info(int x, int y)
{
		daten array;
		
		for(int i=0;i<4;i++)// nummeriert die indexe durch
		{
			array.array[i]=4*x+i;  //    arrayindex zuweisung für j
		}
		
		array.array[4]=2*y;			// arrayindex zuweisung für i
		array.array[5]=(2*y)+1;


		array.array[6]=x;           //  position als zahlenwert z.b für a1 => 11 oder e2 => 52
		array.array[7]=y;			


	return (array); //rückgabe struct array
}

so mein prof meint das es reines glück ist, dass es überhaupt funktioniert, weil das array nur in der funktion existiert.

ist das wirklich so falsch?
 
Hallo!

Ja, da hat dein Lehrer recht. Du hast "daten array;" ja in der Funktion definiert, sie liegt also am Stack der Funktion. Das bedeutet, dass der Speicher für die Struktur mit dem Ende der Funktion wieder freigegeben wird, da der Stack am Ende der Funktion wieder freigegeben wird.

Lg
 
Moment.
Er gibt es doch als Returnwert zurück...
->Variable wird kopiert, geht.

Ein normales int i in der Funktion kann man ja auch normal zurückgeben,
auch wenn das int der Funktion später nicht mehr existiert.

Nicht in Ordnung wäre, einen rohen Arraypointer etc. zurückzugeben
(Pointer wird kopiert, aber nicht Arraydaten)

Hier wird das ganze Objekt kopiert, und die Arraydaten sind hier Teil des Objekts.
 
also darf ich bisschen klüg******en?^^

ich hab ihm versucht es so ungefähr zu erklären, aber aber da kam nur gelächter.

wäre schön wenn ich ihm das gegenteil beweisen kan aber erst wen nes wirklich so ok ist. :p
wie sagt man noch so schön rache ist süß
 
C:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

struct daten
{
	int arr[4];
};

struct daten funk(int i)
{
	struct daten b;

	printf("Funktionsaufruf\n");
	printf("Adresse b: %u\n", &b);
	printf("Adresse b.arr: %u\n\n", b.arr);

	b.arr[0] = i;

	return b;
}

int main()
{
	struct daten a;

	a.arr[0] = 1;

	printf("Adresse a: %u\n", &a);
	printf("Adresse a.arr: %u\n", a.arr);

	a = funk(2);
	printf("a.arr[0]: %d (sollte 2 sein)\n\n", a.arr[0]);

	a.arr[0] = 1;
	funk(2);

	printf("Adresse a: %u\n", &a);
	printf("Adresse a.arr: %u\n", a.arr);
	printf("a.arr[0]: %d (sollte 1 sein, obwohl b.arr in funk geaendert)\n", a.arr[0]);

	getchar();
	return 0;
}

Führ das einmal aus.
funk ist eine Funktion, die wie bei dir ein struct zurückgibt, dass ein Array enthält.

Die struct-Variable "array" in deiner Funktion ("b" hier) wird am Ende der Funktion gelöscht.
Der Lehrer behauptet, dass du die returnte struct-Variable im main nicht verwenden kannst,
weil du das am Funktionsende gelöschte Array verwenden würdest.

Ich behaupte, die struct-Variable samt Array drin wird beim return kopiert.
Das Original wird dann gelöscht, aber die Kopie "lebt" bis zum Main weiter
(wenn sie dort zu einer main-Variable zugewiesen wird bleibt das auch bestehen,
da der Inhalt wieder kopiert wird. Die Kopie der Funktion verschwindet dann auch,
aber die Variable vom main ist und bleibt da)

Das Testprogramm oben zeigt einereits, dass die Variable im main und die im struct
verschiedene Speicheradressen haben (und die auch verschieden bleiben).
Gilt auch für die Arrays, die in den structs enthalten sind.

Außerdem sieht man, dass Änderungen des Arrayinhalts der Funktion-struct-Variable
keine Änderungen des Arrayinhalts der main-struct-Variable bewirken
Im main gibt es also ein eigenständiges Array,
das nicht mit der Funktion zusammenhängt und am Funktionsende nicht gelöscht wird.

Dass das Übertragen des Arrayinhalts beim return trotzdem funktioniert sieht man auch noch.

PS: Bitte Netiquette beachten
 

Neue Beiträge

Zurück