Hallo,
um arrays an Funktionen zu übergeben, bietet sich ja ein Pointer an.
Gibt es auch noch andere Möglichkeiten um ein Array mit einer fixen
Größe an die Fkt. zu übergeben? Wie muss dann der funktionsprototyp
aussehen?
So ist es.
Der sizeof-Operator lässt sich noch anwenden und die Größenangabe kann
das Lesen des Codes erleichtern. Ich kann mich allerdings nicht daran
erinnern, dass ich dieses Konstrukt in eigenem Code mal eingesetzt
hätte. Pointer beißen nicht!
Gut, es handelt sich um 2 charakter Zeichen. Immer 2, nicht mehr und
nicht weniger. Der Aufruf erfolgt mit Test("AB");, schade das sich das
nicht belassen lässt.
ich schrieb:> Gut, es handelt sich um 2 charakter Zeichen. Immer 2, nicht mehr und> nicht weniger.
Das das Array dabei die Länge 3 hat, ist dir aber bewusst, oder ?
Oliver
Konrad S. schrieb:> void f( int a[42] );
*Vorsicht!*
Das ist nichts anderes als eine glorifizierte andere Schreibweise für
1
voidf(int*a);
nicht mehr und nicht weniger.
Da steckt NICHT mehr dahinter, auch wenn die Schreibweise da was anderes
suggeriert.
1
#include<stdio.h>
2
3
voidf(inta[42])
4
{
5
printf("%d\n",sizeof(a));
6
}
7
8
intmain()
9
{
10
intb[9];
11
12
f(b);
13
}
Die Ausgabe ist 4, weil auf meinem System ein Pointer 4 Bytes groß ist!
Die Ausgabe hat nichts mit der tatsächlichen Größe von a innerhalb der
Funktion oder gar mit der Arraygröße des Aufrufers zu tun!
Arrays werden in C an Funktionen übergeben, in dem die Startadresse des
Arrays übergeben wird und die empfangende Funktion hat dafür eine
passende Pointer Variable bereitzustellen. Punkt.
Meine persönlichen Meinung nach, sollte man um sowas
1
voidf(inta[42]);
einen Bogen machen. Auf den ersten Blick mag das für Neulinge einfacher
erscheinen. Ist es aber nicht. Denn hier werden unterschwellig Dinge
suggeriert, die einfach nicht zutreffend sind. Die Arrayangabe oder gar
die Angabe der Arraygröße haben an dieser Stelle absolut nichts zu
sagen! Dei Arrayangabe kann an den Aufrufer noch ein gewisses Signal
sein, wie der Parameter von der Funktion verwendet werden wird, was
gegenüber Pointer ein gewisser dokumentarischer Vorteil sein kann. Aber
wir wissen alle, wie das mit derartigen Konventionen ist .... man kann
sich einfach nicht auf sie verlassen, solange sie nicht vom Compiler
eingefordert und überprüft werden.
Hallo, ich habe mit den Pointern doch ein Problem.
Prototyp ist z. B. der
1
voidtest(char*);
Funktionsaufruf
1
test("ABCD");
wird automatisch die Addresse der Speicherstelle von "A" übergeben oder?
wie muss jetzt die Funktion selbst aussehen?
1
voidtest(charfoo[5])
2
{
3
charlokales_arr[5];
4
5
hierdannursprünglichesarrayinneuesarraykopieren;
6
}
funktioniert, ich vermute aber das das Ganze nicht sauber ist, weil ich
ja ein Array in den Funktionsparameter angebe, aber ein Pointer
übergeben wird? Wie muss das Ganze stattdessen aussehen?
Ich möchte quasi die übergebenen Zeichen ABCD in ein anderes Array
kopieren, welches noch andere Daten enthält.
Da ein ordentlicher "String" in C eine Nullterminierung hat, könntest du
das in einer While-Schleife Zeichen für Zeichen kopieren. strncpy sollte
auch gehen, denke ich.
Gruß Dennis
Da reinkopieren ist sicher kein Problem, da es immer eine bestimmte
Länge ist und ich den Nullterminierung nicht brauche.
Ich habe ein Array "01234567890" und an Position 4 soll die
Zeichenfolge, die an die Funktion übergeben wurde, kopiert werden.
"0123ABCD890".
Allerdings geht es mir um den Funktionskopf,
1
voidtest(charfoo[5])
da ist meiner Meinung nch etwas faul, weil sie ja nicht mit dem
Funktionsprototypen übereinstimmt.
Malte S. schrieb:> Der lautet dann auchvoid test(char* foo)> Warum willst du die vereinbarte Länge da unbedingt drin haben. Mehr als> eine Vereinbarung ist sie eh nicht.
Muss nicht zwingend drinn sein, ist aber übersichtlicher.
Ok also void test(char* foo) und der Zugriff auf die einzelnen Elemente
wie?
Willkommen in der wunderbaren Welt der Arrays und Pointer in C. Sie kann
dir zu Füßen liegen oder unter selbigen zusammenbrechen. Das
vollständige Verständnis jeder Indizierung und jeder Dereferenzierung,
der Überblick über Herkunft und Zuverlässigkeit der Daten (Strings z.B.)
und entsprechendes Einhalten der Grenzen des jeweiligen Speicherbereichs
- ob in Gestellt eines Arrays oder eines blanken Pointers - helfen dir,
dass am Ende nicht alles zusammenbricht ;)
Malte S. schrieb:> Aber nur, wenn du absolut garantieren kannst, dass test() immer ein> ausreichend langes Array übergeben wird.
Seit C99 geht das teilweise:
1
chartest(charfoo[static2]){
2
returnfoo[1];
3
}
So deklariert darf man keinen Nullpointer und kein Array mit einer Länge
von weniger als zwei Elementen an die Funktion übergeben.
Arne Nonymous schrieb:> So deklariert darf man keinen Nullpointer und kein Array mit einer Länge> von weniger als zwei Elementen an die Funktion übergeben.
und woher soll der compiler die länge wissen?
int i = rand(10);
int* a = (int*)malloc(sizeof(int)*i);
//oder c++ int[] a = new int[i];
test(a) {
}
Peter II schrieb:> Arne Nonymous schrieb:>> So deklariert darf man keinen Nullpointer und kein Array mit einer Länge>> von weniger als zwei Elementen an die Funktion übergeben.>> und woher soll der compiler die länge wissen?
Der Compiler weiß das nicht und muss es auch nicht wissen. Das [static
2] ist lediglich eine Zusicherung des Programmierers, dass das Array
mindestens 2 Elemente enthält und kann vom Compiler zu
Optimierungszwecken verwendet werden. Für die Einhaltung dieser
Zusicherung ist der Programmierer aber selber verantwortlich. Der
Compiler überprüft sie nicht notwendigerweise.
So ist auch sichergestellt dass man nicht zu viel übergibt, und dass,
falls man zu wenig übergibt, die anderen Elemente default-initialisiert
werden (Integer auf 0, Klassen per Default-Konstruktor) - somit keine
Speicherfehler möglich. Die 1. Variante kopiert dabei den kompletten
Inhalt in den Funktions-scope, die 2. übergibt nur eine Referenz
(normalerweise schneller).
Man übergibt einen String als Pointer und eine Variable für die Größe
des Rückgabestrings.
Übergibt man also ein String/Array mit Inhalt "Hallo Welt!" und Größe=4
dann wird "Hall" zurückgegeben... Da ist aber noch nicht die mögliche
Überlänge von int groesse in Bezug auf die tatsächliche Länge des Arrays
berücksichtigt!
Martin schrieb:> Also bei mir würde die Funktion auch so aussehen:
Das ist genau das gleiche was strndup macht?! Btw, sizeof(char) ist
immer 1, das kann man also weglassen.