Forum: Compiler & IDEs [C] Array an Funktion übergeben -> Array größe?


von Franz (Gast)


Lesenswert?

Hallo

Ich benötige innerhalb einer Funktion die Größe des übergebenen Arrays.
Gibt es dazu eine Möglichkeit die Größe innerhalb der Funktion zu 
ermitteln? Oder muss die Größe immer explizit mit übergeben werden?

Konnte dazu irgendwie nix finden...

Gruß

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn die Größ enicht ohnehin statisch bekannt ist, kann sie auch nicht 
ermittelt werden --> Ende des Arrays markieren oder Größe übergeben

von Huch (Gast)


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?

von Franz (Gast)


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ß

von Huch (Gast)


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.

von Huch (Gast)


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.

von Franz (Gast)


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

von Huch (Gast)


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.

von Tom M. (tomm) Benutzerseite


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

von Michael B. (mb_)


Lesenswert?

Tom M. schrieb:
> Du wirst kaum jemals ein komplettes
> Array an eine function übergeben, schon gar nicht auf einem MC
> (->stack!).

Ich kenne auch keine Möglichkeit das in C zu machen. Arrays kann man nur 
per pointer übergeben. Lasse mich aber gerne belehren. :)
(Anders siehts bei structs aus, in die ein array eingebettet ist.)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Klaus W. (mfgkw)


Lesenswert?

Jörg Wunsch schrieb:
> Michael Buesch schrieb:
>> Ich kenne auch keine Möglichkeit das in C zu machen.
>
> Dann solltest du dir mal C99 ansehen....

Aber auch da wird nicht das Feld übergeben, sondern nur der Zeiger
auf das erste Element.
Du weisst das, aber darauf bezog sich Michaels "keine Möglichkeit".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.