Feld "returnen" in C

puitl

Grünschnabel
Hallo!
Ich habe ein Problem mit der Parameterübergabe von Feldern.

Mein Grund Gedanke sieht wie folgt aus:

PHP:
#include <stdio.h>
#include <conio.h>

char funktion()
{
char f[3];

f[0]='A';
f[1]='B';
f[2]='C';

return f;
}

void main()
{
int i=0;
char g[3];

g=funktion();

for(i=0;i<3;i++)
printf("%c",g[i]);
}

Fehlermeldungen:
1) warning C4047: 'return' : 'char ' differs in levels of indirection from 'char [3]'
2) warning C4172: returning address of local variable or temporary
3) warning C4047: '=' : 'char [3]' differs in levels of indirection from 'char '
4) error C2106: '=' : left operand must be l-value

1) und 2) zeigen auf die Zeile mit "return f;" und die anderen zwei auf die Zeile mit "g=funktion();"

Was muss ich machen um ein Feld mit return einem anderen Feld zuzuweißen?

Danke
Mfg Leo
 
Hi

1: deine Funktion muss "char *" zurückgeben
2: Im Main die Var g sollte nicht als "char ...[3]", sondern als "char *g;" deklariert werden.
3: Und das f in der Funktion gibts nicht mehr, sobald die funktion aus ist,
also ist es ...zufall ob was sinnvolles rauskommt :)

Besser wär es, das ohne return-zeug zu machen, dafür das g zu übergeben
Änderungen dafür:
1: Das "char f[3];" und das return (samt wert und ; natürlich :) ) löscht du aus deiner funktion
2: Die erste zeile davon änderst du in: void funktion(char *f);
3: und im main schreibst du statt
g=funktion();
jetzt:
funktion(g);

fertig

gruß
 
Danke!
Merke gerade das ich da locker selber hätte draufkommen müßen...:rolleyes:

Gibt es eine Möglichkeit das Feld mit return zurück zugeben?
Mfg Leo
 
Ja, du könntest (die vorgeschlagenen änderungen wieder wegmachen, ausser das
char *g) vor die variable f ein static schreiben
gruß
 
Was ist ein static? (Vielleicht nur kurz erklären, kann sein das ich davon noch im Unterricht höre...)
Wird das dann in der Funktion "funktion" vor jeder Variable f geschrieben?
Danke!
 
C++:
#include <iostream>

char function(int c)
{
char f[ c];

f[0]='A';
f[1]='B';
f[2]='C';

return *f;
}

int main(int argc, char *argv[])
{
int c=3; // Wieviele?
char g[sizeof(function(c))];

*g = function(c);

for(int i=0;i<c;i++)
{
printf("%c\n",g[i]);
}

system("PAUSE");
EXIT_SUCCESS;
}

Vielleicht hilft dir es ja weiter :D Ich weiß eigentlich garnicht was du genau möchtest. Musst mehrere Infos angeben. Dann bekommst du auch mehr zu sehen :D
 
Mehr will ich auch nicht sehen:), war genau das was ich wollte, danke!

Das "int argc, char *argv[]" sagt mir aber nicht viel. Werde meinen Lehrer befragen, aber wenn jemand Lust hat das kurz zu erklären habe ich auch nichts dagegen :)

Danke!
Mfg Leo
 
@KD3: Wusste nicht das C einen Header namens <iostream> hat. Normal sind in C die Standardheader auch mit Dateiendung versehen!

Dann ist dein Code kein gültiges Standard C++, aber, wenn wir von C99 sprechen, gültiges C. Vorher war eine dynamische Arraygröße nicht erlaubt!

Dann versteh ich deinen Code nicht ganz.
C++:
char g[sizeof(function(c))];
Sollte einem
C++:
char g[1];
entsprechen.

Deine Funktion "function" sollte lediglich ein 'A' zurück geben. Was passiert in deiner Funktion, wenn c < 3 ist?

Dein Beispiel zeigt 0, wie man mit Arrayrückgabe umgehen sollte!
Nun das Problem bei der Rückgabe von Arrays ist, das ein Zeiger Probleme machen würde. Ein Zeiger auf eine Lokale Variable ... das haut nicht hin. Die Variable wird beim verlassen des Scopes zerstört und vllt., mit sehr viel glück steht noch das da was wir brauchen. Aber definiert im Standard ist dies nicht und es kann irgendwas da stehen.

Dann geht es vllt. mit einem static-Array, d.h. der Array bleibt auch beim verlassen der Funktion bestehen und der Zeiger bleibt gültig. Ansonsten ist es am einfachsten, einen char** (demnach buffer) zu übergeben, dessen max. größe mit angeben lassen und dann dereferenzieren und Wert zuweisen.
 
Willst du mir ehrlich sagen, dass es keine dynamischen Arraygrößen in C++ geben kann? xD

Du hast wohl recht, ich hab vergessen, dass innerhalb einer Funktion die Variablen nach dem beenden einer Funktion, gelöscht werden, aber wenn ich noch einen Eingabeparameter in der Funktion verlangt hätte und einen Zeiger eingesetzt hätte, dann wäre auch dieses Problem behoben.

P.S: Ich programmiere im misch masch stil :)
 
Dynamische Array Größen (aufm Stack) sind nicht im Standard erlaubt. GCC bietet dies allerdings als Erweiterung an. Man nutzt dafür am besten std::vector oder ggf. einen anderen Container wie std::list, std::deque usw.
C++:
int** foo(int** data, size_t size)
{
    size_t i;
    for (i = 0; i < size; i++)
        *data[i] = 10;
    return data;
}
so sollte das problemlos gehen ;)

PS: Das ist C-Code. (deswegen auch i außerhalb der Initialisierung der for-Schleife!)
 
Zurück