[C] Array an Funktion übergeben -> Array größe?

Gast #1923181
Lesenswert?

Vermutlich ist die Grösse des Arrays während des Programmablaufs 
veränderlich?
Ich schreibe, vermutlich, weil Du diese Frage als C-Programmierer mit 
einigen Kenntnissen sonst nicht stellen würdest. Aber leider wissen wir 
ja nichts von Deinen Vorkenntnissen.

Falls nicht, dann kannst Du Arrays ja grundsätzlich mit einer festen 
Grösse vereinbaren und ebenso in der Funktionsdeklaration angeben. 
sizeof wird dann die richtige Grösse ergeben.

Falls die Grösse aber doch während des Programmablaufs veränderlich ist, 
so käme es darauf an, was in dem Array drin ist. Wiederrum mag es 
überflüssig sein, danach zu fragen, aber falls es sich um ein char-Array 
handelt, das übliche Zeichenketten mit abschliessender Null handelt ist 
der Fall recht einfach, den die üblichen string Funktionen können damit 
umgehen.

Falls es sich nicht um char arrays handelt aber dennoch die Inhalte, 
aufgrund der Anwendung gewisse Werte nicht enthalten können kann man 
diese speziellen Werte als Endekennzeichnung verwenden.

Hilft Dir das weiter?
Gast #1923226
Lesenswert?

Die Größe der Arrays steht zwar fest, aber es geht mir darum einer 
Funktion verschieden große Arrays übergeben zu können.

Aber wenn es da nur die Alternativen Ende markieren oder Größe übergeben 
gibt kann man wohl nix machen :)

Danke aber für die Klarstellung :)

Gruß
Gast #1923239
Lesenswert?

>Die Größe der Arrays steht zwar fest, aber es geht mir darum einer
>Funktion verschieden große Arrays übergeben zu können.

Das ist als Erklärung für die Situation nicht ganz vollständig.
Es gibt zwei Möglichkeiten.

1. Du willst während das Programm läuft Arrays verschiedener Länge an 
die Funktion übergeben.
2. Du willst jeweils zwei oder mehr Programme schreiben die jeweils 
Arrays verschiedener Länge behandeln. Innerhalb eines Programmes aber 
wird immer ein Array der selben Länge übergeben.

>Aber wenn es da nur die Alternativen Ende markieren oder Größe übergeben
>gibt kann man wohl nix machen
Andere Möglichkeiten kann es der Logik nach nicht geben. Entweder ist 
die Grösse zur Compile-Zeit festgelegt oder sie wird zur Laufzeit 
ermittelt.
Gast #1923252
Lesenswert?

>2. Du willst jeweils zwei oder mehr Programme schreiben die jeweils
>Arrays verschiedener Länge behandeln. Innerhalb eines Programmes aber
>wird immer ein Array der selben Länge übergeben.

In diesem Fall ist Du in jedem Programm eine eigene Deklaration für die 
fragliche Funktion mit einer festen Länge.

Programm 1:

...
Funktion (char x[12]);

....

Programm 2:

Funktion (char x[24]);

Eine allgemeine Lösung allerdings eine Funktion so zu deklarieren, das 
sie Arrays einer bestimmten Länge übergeben bekommt, diese aber zwischen 
verschiedenen Programmen unterschiedlich sein kann, gibt es nicht.
Wie sollte das auch gehen? Die Länge ist entweder bekannt oder sie ist 
es nicht. Die Länge hat einen bestimmten Wert oder sie hat sie nicht.

Das ganze klingt zugegeben ein wenig lakonisch. Aber stell Dir vor Du 
müsstest so eine Funktion schreiben, dann siehst Du was ich meine.
Gast #1923279
Lesenswert?

Huch schrieb:
> 1. Du willst während das Programm läuft Arrays verschiedener Länge an
> die Funktion übergeben.
> 2. Du willst jeweils zwei oder mehr Programme schreiben die jeweils
> Arrays verschiedener Länge behandeln. Innerhalb eines Programmes aber
> wird immer ein Array der selben Länge übergeben.


Geht mir eher um Typ1
Bin halt von PHP zu verwöhnt :D
Gast #1923284
Lesenswert?

>Geht mir eher um Typ1
>Bin halt von PHP zu verwöhnt :D

Das erklärt einiges.

PHP, Perl, Basic das sind alles Sprachen, welche Typen und Längen 
selbstständig verwalten und deswegen diesbezüglich weniger Achtsamkeit 
vom Programmierer erfordern.

Man unterscheidet streng typisierte und eher lax typisierte Sprachen.

C gehört zu ersteren wie etwa auch Pascal. Perl etc. zu den letzteren. 
Allerdings haben letztere auch einen ziemlichen Overhead, da sie die 
Typeninformationen immer zur Laufzeit mit berücksichtigen müssen.
Bei C musst Du Dich selber darum kümmern erhälst dafür aber schnellere 
Programme.
Persönliche Seite #1923288
Lesenswert?

Franz schrieb:
> Die Größe der Arrays steht zwar fest, aber es geht mir darum einer
> Funktion verschieden große Arrays übergeben zu können.

Du deklarierst den Prototypen so, dass ein Zeiger auf ein Array des 
Datentyps X übergeben werden muss. Du wirst kaum jemals ein komplettes 
Array an eine function übergeben, schon gar nicht auf einem MC 
(->stack!).

Wie viel Elemente das Array hat, ist in der function unbekannt. Woher 
sollte diese Info auch kommen?

RTFM :)

http://de.wikibooks.org/wiki/C-Programmierung:_Arrays
Moderator Persönliche Seite #1923623
Lesenswert?

Michael Buesch schrieb:
> Ich kenne auch keine Möglichkeit das in C zu machen.

Dann solltest du dir mal C99 ansehen.  Damit kann man sogar
temporäre Array innerhalb einer Funktion mit einer variablen
Länge angeben. Allerdings muss man die Länge natürlich als
separaten Parameter übergeben, da ein Array ja immer nur als
Zeiger vermittelt wird.  Also sowas hier geht:
1
void dosomething(int len, char array[len])
2
{
3
   char temparray[len];
4

5
   for (int i = 0; i < len; i++) {
6
      temparray[i] = array[i] + 42;
7
   }
8
}
9

10
...
11
   char a1[24], a2[42];
12
   dosomething(24, a1);
13
   dosomething(42, a2);

Was Sprachen with Python oder Perl eher draus machen ist jedoch
sowas:
1
struct arrayobject {
2
  int len;
3
  char *data;
4
};
5

6
void dosomething(struct arrayobject *o)
7
{
8
   char temparray[o->len];
9

10
   for (int i = 0; i < o->len; i++) {
11
      temparray[i] = o->data[i];
12
   }
13
}
14

15
...
16
   struct arrayobject a1, a2;
17
   a1.len = 42;
18
   a1.data = malloc(42);
19
   a2.len = 24;
20
   a2.data = malloc(24);
21
   ...
22
   dosomething(&a1);
23
   dosomething(&a2);

Damit sollte auch klar sein, warum in so einem Konzept der übergebene
Parameter "weiß", wie groß das Array ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren