Arrays (Anfängerfragen)

Post Reply
Message
Author
Benni

Arrays (Anfängerfragen)

#1 Post by Benni »

Moin!

Ich habe 2 Anfängerfragen bezüglich Arrays, die mich zum verzweifeln bringen.

1.
Warum kann ich keine Array lokal deklarieren?
Wenn ich das tue spielt das Programm verrückt.
Wenn ich dagegen das Array global deklariere, läuft alles so wie es soll.

2.
Wie weise ich dem Rückgabewert einer Funktion, ein Array zu?

Das hier funktioniert natürlich nicht:
--
char array[]="Hallo";

char funktion()[]
{
return array;
}
--
Meine ganzen Probleme haben bestimmt was mit Zeigern zu tun, oder?

Hoffentlich kann mir jemand helfen.
Vielen Dank

Benni

kyle
Posts: 14
Joined: 30. Jan 2001 8:16

Re: Arrays (Anfängerfragen)

#2 Post by kyle »

Zum Thema Rückgabe wert

char array[] = "Hallo";

char* foo()
{
return array;
}

Obwohl man arrays nicht Global definieren sollte.

Zu deinem 2. Problem, kann ich mal ein Codeausschnitt sehen, dann kann ich dir helfen :)
Last edited by kyle on 03. Feb 2001 3:08, edited 1 time in total.
Warum durchs Fenster gehen, wenn die Tür offen steht?

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Arrays (Anfängerfragen)

#3 Post by hjb »

Hi,

soso, man sollte Arrays nicht global definieren. Woher hat der Herr diese Weisheit? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

@Benni: So wie sie dasteht, ist die Funktion korrekt. Nur die Schreibweise ist etwas ungewöhnlich. Da Arrays in C nichts weiter sind als ein Zeiger auf das erste Element, schreibt man normalerweise:

char* funktion()
{
return array;
}

Warum geht es schief, wenn du das Array lokal definierst? Weil man nie, *nie* einen Zeiger auf eine lokal definierte Variable zurückliefern darf, es sei denn, die Variable ist als static deklariert. Eine lokale Variable wird nämlich auf dem Stack angelegt und ist nicht mehr verfügbar, sobald die Funktion zur aufrufenden Funktion zurückkehrt. Und dann macht es Bumm. Leider meistens nicht sofort.

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Benni

Re: Arrays (Anfängerfragen)

#4 Post by Benni »

Hey! Vielen Dank!

So funkts:

char* foo()
{
return array;
}

So nicht:
char[] foo()
{
return array;
}

Dort bricht der Compiler mit ner Fehlermeldung ab. Komisch...

Es ist nur blöd das ich, daß Array global definieren muss.
Leider kann ich es nicht statisch machen...

Was tut man da?
Ich kann doch keine möglichen Namenskonflikte in Kauf nehmen, wenn ich die Funktionen in eine Header Datei bringe!

Trotzdem vielen Dank!
Ihr habt mir gut weitergeholfen.

Benni

Sebastian Ude

Re: Arrays (Anfängerfragen)

#5 Post by Sebastian Ude »

Naja eine Funktion als:

char[] foo() zu definieren ist echt etwas ungewöhnlich.
Denk daran das ein Array nichts weiter als ein Pointer auf den ersten Wert aus einer Folge von Werten ist.


Dann ... wie kommst du darauf dass du ein Array nur global definieren kannst ?

Poste doch bitte mal deinen Code hier, dann können wir vielleicht sehen was du da falsch machst / falsch verstehst.

Benni

Re: Arrays (Anfängerfragen)

#6 Post by Benni »

Klar, kann man ein Array lokal definieren.
Das ging bei mir nur zuerst nicht, weil ich die Funktion unter der Funktion hatte und sie nicht impliziet deklariert hatte.

Aber...
Ich kann ein lokal definiertes Array nicht der Funktion als Rückgabewert übergeben.
Dies hatte HJB ja oben auch anschaulich erklärt, warum es so nicht geht.
Aber es muss doch eine Möglichkeit geben das ich den Inhalt des Arrays zurückgeben kann.

Codeausschnitt:

char numbertable[36] = {'0','1','2','3','4','5','6','7','8','9',\
'A','B','C','D','E','F','G','H','I','J',\
'K','L','M','N','O','P','Q','R','S','T',\
'U','V','W','X','Y','Z'};

char ergebniss_string[]="";

char* dez_to_system(int zahl,int ziel_system)
{
int rest=0,i=0;

do {
rest=zahl%ziel_system;
zahl/=ziel_system;

ergebniss_string<i> = numbertable[rest];
i++;

} while(zahl);
ergebniss_string<i>='\0';
strswap(ergebniss_string); /* Dreht den String um */
return ergebniss_string;
}

Funktioniert ja auch, nur das ergebniss_string global ist.

Gruss

kyle
Posts: 14
Joined: 30. Jan 2001 8:16

Re: Arrays (Anfängerfragen)

#7 Post by kyle »

Brauchst du doch nicht reich doch einfach immer ein char Pointer durch :)
Ein Array kannst du entweder in einer Funktion durch

1. char foo1[10];
definieren der array geht aber nach verlassen der Funktion verloren oder durch

2. char* foo2 = (char*) calloc(sizeof(char),10); (gibt einen void* von 10 char zurück der auf char* gecasted wird um ihn zuzuweisen und mit 0 initialisiert wird. (bei malloc müsstest du das machen)

Das ist ein Pointer den du beliebig durch dein Programm reichen kannst und nur obendwann wenn er nicht mehr benötigt wird duch free() zustören mußt.
Warum durchs Fenster gehen, wenn die Tür offen steht?

Benni

Re: Arrays (Anfängerfragen)

#8 Post by Benni »

Klar, klingt logisch. :)

Ich hänge einfach noch immer zu sehr an der Pascal denkweise fest.

Jetzt funktionierts!!
Schade nur, daß man dem Array eine feste Grösse zuweisen muss.

Na ja, vielen Dank an Euch alle!

Benni

Post Reply