Discussion:
Bereiche (Slices) eines Arrays
(zu alt für eine Antwort)
Robert Meissner
2007-07-12 17:23:03 UTC
Permalink
Hallo!

Ich habe z.B. folgenes int Array:

int a[] = {4,2,6,7,8,4,9,5};

... und folgende Funktion:

void test(int a*) {
...
}

Mit "test(a);" übergebe ich den Array-Zeiger der Funktion in
welcher ich dann vom Index 0 bis 7 auf das Array zugreifen
kann.

Nun möchte ich an die Funktion ein Teilarray übergeben, also
z.B. nur die Folge 6,7,8, also vom Index 2 bis zum Index 4
des Arrays. Funktioniert so etwas in C, z.B. in der Art wie
a[2..4].

Ich möchte keine zusätzlichen Parameter als Arraygrenzen
für das Teilarray mitführen!

Danke für Antworten!

MfG
Robert
Rainer Weikusat
2007-07-12 17:36:45 UTC
Permalink
Post by Robert Meissner
int a[] = {4,2,6,7,8,4,9,5};
void test(int a*) {
...
}
Mit "test(a);" übergebe ich den Array-Zeiger der Funktion in
welcher ich dann vom Index 0 bis 7 auf das Array zugreifen
kann.
Nun möchte ich an die Funktion ein Teilarray übergeben, also
z.B. nur die Folge 6,7,8, also vom Index 2 bis zum Index 4
des Arrays. Funktioniert so etwas in C, z.B. in der Art wie
a[2..4].
Ich möchte keine zusätzlichen Parameter als Arraygrenzen
für das Teilarray mitführen!
Den Anfang des Teil-Feldes bekommst Du mit a + <start offset>.
Das Ende wirst Du explizit uebergeben muessen.
Alexander Bartolich
2007-07-12 17:39:15 UTC
Permalink
Post by Robert Meissner
Hallo!
int a[] = {4,2,6,7,8,4,9,5};
void test(int a*) {
...
}
Mit "test(a);" übergebe ich den Array-Zeiger der Funktion in
welcher ich dann vom Index 0 bis 7 auf das Array zugreifen
kann.
Du übergibst damit einen Zeiger auf das erste Element. Dass es
dahinter noch weitere Elemente gibt (bzw. dass die Funktion "test"
darauf zugreift) geht weder aus Deklaration noch Aufruf hervor.
Post by Robert Meissner
Nun möchte ich an die Funktion ein Teilarray übergeben, also
z.B. nur die Folge 6,7,8, also vom Index 2 bis zum Index 4
des Arrays. Funktioniert so etwas in C, z.B. in der Art wie
a[2..4].
Nein. Du kannst allerdings die Adresse des dritten Elements
übergeben. Entweder so:

test(&a[2]);

oder so:

test(a + 2);
Post by Robert Meissner
Ich möchte keine zusätzlichen Parameter als Arraygrenzen
für das Teilarray mitführen!
Woher soll die Funktion dann wissen, dass sie nur noch auf
3 Elemente statt 8 zugreifen darf?
--
news.albasani.net
Robert Meissner
2007-07-12 18:12:36 UTC
Permalink
Post by Alexander Bartolich
Nein. Du kannst allerdings die Adresse des dritten Elements
test(&a[2]);
test(a + 2);
Danke! Alles klar, ich bin mittlerweise dahintergekommen.
Post by Alexander Bartolich
Post by Robert Meissner
Ich möchte keine zusätzlichen Parameter als Arraygrenzen
für das Teilarray mitführen!
Woher soll die Funktion dann wissen, dass sie nur noch auf
3 Elemente statt 8 zugreifen darf?
Der größte Index ist bekannt, er wird mit übergeben.

MfG
Robert
Marcel Müller
2007-07-12 18:17:46 UTC
Permalink
Post by Robert Meissner
Post by Alexander Bartolich
Post by Robert Meissner
Ich möchte keine zusätzlichen Parameter als Arraygrenzen
für das Teilarray mitführen!
Woher soll die Funktion dann wissen, dass sie nur noch auf
3 Elemente statt 8 zugreifen darf?
Der größte Index ist bekannt, er wird mit übergeben.
Dann muss man aber aufpassen, denn ab a+2 gerechnet ist der größte index
natürlich ein anderer. Also defacto erwartet die Funktion ein Array in
der Form erstes Element und die Anzahl der Elemente.


Marcel
Achim Peters
2007-07-12 18:00:28 UTC
Permalink
Post by Robert Meissner
int a[] = {4,2,6,7,8,4,9,5};
void test(int a*) {
...
}
Mit "test(a);" übergebe ich den Array-Zeiger der Funktion in
welcher ich dann vom Index 0 bis 7 auf das Array zugreifen
kann.
Woher weiss denn test, dass der Index bis 7 geht?
Post by Robert Meissner
Nun möchte ich an die Funktion ein Teilarray übergeben, also
z.B. nur die Folge 6,7,8, also vom Index 2 bis zum Index 4
des Arrays. Funktioniert so etwas in C, z.B. in der Art wie
a[2..4].
Ich möchte keine zusätzlichen Parameter als Arraygrenzen
für das Teilarray mitführen!
Dein test weiß auch bei Übergabe des ganzen Arrays nicht, wo das array
endet, außer, Du hättest es hart codiert. Du brauchst also auch ohne,
dass Du Teilarrays übergeben kannst, einen weiteren Parameter für die
Array-größe.

Bye
Achim
Claus Reibenstein
2007-07-13 06:56:16 UTC
Permalink
Post by Robert Meissner
void test(int a*) {
^

Syntaxfehler!
Post by Robert Meissner
Nun möchte ich an die Funktion ein Teilarray übergeben, also
z.B. nur die Folge 6,7,8, also vom Index 2 bis zum Index 4
des Arrays. Funktioniert so etwas in C, z.B. in der Art wie
a[2..4].
Das einzige, was bei einem Array übergeben wird, ist die Startadresse.
test(a+2) sollte also diesen Teil schon mal erledigen.
Post by Robert Meissner
Ich möchte keine zusätzlichen Parameter als Arraygrenzen
für das Teilarray mitführen!
Woher soll test dann wissen, wie groß Dein Array ist? Aus der
Startadresse kann C das nicht ermitteln. Du wirst also nicht umhin
kommen, einen weiteren Parameter einzuführen.

Gruß. Claus
haribohne
2007-07-15 13:04:27 UTC
Permalink
Hallo, Robert!
Vielleicht bin ich noch nicht ganz wach, aber..
Post by Robert Meissner
Hallo!
int a[] = {4,2,6,7,8,4,9,5};
void test(int a*) {
...
}
Mit "test(a);" übergebe ich den Array-Zeiger der Funktion in
welcher ich dann vom Index 0 bis 7 auf das Array zugreifen
kann.
Nun möchte ich an die Funktion ein Teilarray übergeben, also
z.B. nur die Folge 6,7,8, also vom Index 2 bis zum Index 4
des Arrays. Funktioniert so etwas in C, z.B. in der Art wie
a[2..4].
...übergibts Du hier nicht auch die Bereichsgrenzen?
Aus test(int *a) würde dann zB. test(int *a, int *b) und im Inneren
etwas wie while(a++ <= b), soweit a wirklich auf eine Position vor b
verweist.
Sonst ist (sowieso) etwas mehr zu schreiben.

Gruß,
Harald

Loading...