Forum: Compiler & IDEs Arry aus einer Funktion übergebn


von Mathias F. (savag)


Lesenswert?

Hallo Leute ich GOOge schon seit 2h und habe immernoch kein example
das mir die Augen öffnet :(

Ich möchte einfach nur ein ARRY aus einer Funktion die in einer Lib ist 
in meine main() holen.

Hier mal ein einfacher Code der natürlich nicht geht aber vlt braucht es 
nur ganz wenig um mir da weiter zu helfen.
1
//header arry_test:
2
int arry_test();
3
4
//source arry_test:
5
int arry_test()
6
{
7
int arry[2];
8
9
arry [0] = 10;
10
arry [0] = 10;
11
arry [0] = 10;
12
13
return arry;
14
15
}
16
17
//main:
18
int zahl1 = arry_test[0];
19
int zahl2 = arry_test[1];
20
int zahl3 = arry_test[2];

Danke für jede antwort

von Udo S. (urschmitt)


Lesenswert?

Da hilft nur ein C Buch und viel Zeit zum lernen und üben. :-(

von Karl H. (kbuchegg)


Lesenswert?

Mathias Feld schrieb:
> Hallo Leute ich GOOge schon seit 2h und habe immernoch kein example
> das mir die Augen öffnet :(

Sieh dir mal
String-Verarbeitung in C
an. Und dort ganz speziell den Punkt 4



> aber vlt braucht es
> nur ganz wenig um mir da weiter zu helfen.

Leider nicht.
Da braucht es eher sogar ganz viel um zu verstehen, warum das nicht 
geht, welche Möglichkeiten man hat und warum in C, zumindest im 
allgemeinen Fall, alle Möglichkeiten in dem einen oder anderen Fall 
Krücken sind.


Allerdings ist dein Codebeispiel so grundlegend vermurkst, dass der 
Gedanke dir ein C-Buch mehr als dringen nahe zu legen, sich förmlich 
aufdrängt.

von Helge O. (_elko_)


Lesenswert?

Kann er sich nich einfach nen Zeiger auf das Array als 
Funktionsrückgabewert zurückgeben lassen?

von PittyJ (Gast)


Lesenswert?

>Kann er sich nich einfach nen Zeiger auf das Array als
>Funktionsrückgabewert zurückgeben lassen?

Nö, weil der Speicher dann schon wieder weg ist.
Klassischer Speicherzugriffsfehler.


Früher, als ich klein war, nannte man das auch noch Array.

von Helge O. (_elko_)


Lesenswert?

PittyJ schrieb:
> Nö, weil der Speicher dann schon wieder weg ist.
> Klassischer Speicherzugriffsfehler.

Aber nicht, wenn er sich den Speicher mit malloc innerhalb der Funktion 
holt, oder?

von Fred (Gast)


Lesenswert?

Ja. Theoretisch.

Nur wer gibt den Speicher dann wann wieder frei?

von Helge O. (_elko_)


Lesenswert?

Fred schrieb:
> Nur wer gibt den Speicher dann wann wieder frei?

Die gute free() Fee?

von Udo S. (urschmitt)


Lesenswert?

Helge O. schrieb:
> Die gute free() Fee?

Die gibts nur in anderen Sprachen, sprich Garbage Collector.
Mit all seinen Vor und Nachteilen

von Bitflüsterer (Gast)


Lesenswert?

Der TO hat ja erstmal grundlegendere Probleme.

1. Array Grössen-Deklaration
2. Lebensdauer von Variablen

Malloc/Free ist dann erst die Lösung, wenn er diese beiden gelöst resp. 
verstanden hat. Und selbst dann kommen erstmal noch die Zeiger und 
Zeiger auf Zeiger. malloc/free ist dann erst der nachfolgende Schritt.

von Mathias F. (savag)


Lesenswert?

Vielen dank Karl Heinz

Ich habe Allokierung durch den Aufrufer umgesetzt, funktioniert 
einwandfrei.

So ein Beispiel habe ich gesucht.

von Fred (Gast)


Lesenswert?

Helge O. schrieb:
> Fred schrieb:
>> Nur wer gibt den Speicher dann wann wieder frei?
>
> Die gute free() Fee?

Du hast nicht verstanden.

von bal (Gast)


Lesenswert?

Fred schrieb:
> Du hast nicht verstanden.

Doch, hat er.
Er hat deine Frage wer den Speicher, der innerhalb einer Funktion 
mittels malloc() angefordert und als Zeiger zurückgegeben wird, freigibt 
eindeutig und richtig beantwortet.

Nämlich der caller mittels free().

In der Interfacebeschreibung dieser Funktion muss natürlich vermerkt 
sein dass ein Speicherleck entstehen kann, wenn der Caller den Zeiger 
verwirft ohne den Speicher freizugeben.

von A. H. (ah8)


Lesenswert?

Karl Heinz schrieb:
> Mathias Feld schrieb:
>> Hallo Leute ich GOOge schon seit 2h und habe immernoch kein example
>> das mir die Augen öffnet :(
>
> Sieh dir mal
> String-Verarbeitung in C
> an. Und dort ganz speziell den Punkt 4

Mir fällt gerade auf, dass im zitierten Artikel eine wichtige 
Möglichkeit fehlt:
1
struct array_int_3 { int array[3]; };

Wer's testen möchte:
1
struct array_int_3 array_test() 
2
{ 
3
    // …
4
} 
5
6
int main() 
7
{ 
8
    struct array_int_3 array = array_test(); 
9
    printf("%d\n", sizeof(array_test())/sizeof(int)); 
10
    // …
11
    return 0; 
12
}

von Savag (Gast)


Lesenswert?

Super, werde es mal versuchen in dem aktuellen Projekt. Struct hatte Ich 
woanders gelesen aber war hatte zuerst dein Punkt vier versucht.

von Karl H. (kbuchegg)


Lesenswert?

A. H. schrieb:
> Karl Heinz schrieb:
>> Mathias Feld schrieb:
>>> Hallo Leute ich GOOge schon seit 2h und habe immernoch kein example
>>> das mir die Augen öffnet :(
>>
>> Sieh dir mal
>> String-Verarbeitung in C
>> an. Und dort ganz speziell den Punkt 4
>
> Mir fällt gerade auf, dass im zitierten Artikel eine wichtige
> Möglichkeit fehlt:

Korrekt.
Nur hat diese Methode wieder den Nachteil, dass sie nur mit fixen 
Array-Längen funktioniert.
Als Vorteil muss man allerdings anführen, dass man durch die Verpackung 
eines Arrays in eine struct zumindest die Zuweisbarkeit von speziellen 
Arrays hergestellt hat.

Fazit: Egal wie man es dreht und wendet, es gibt keine 'one size fits 
all' Methode in C. Irgendeine Krot muss man immer schlucken.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.