mikrocontroller.net

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


Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Buesch (mb_)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:

void dosomething(int len, char array[len])
{
   char temparray[len];

   for (int i = 0; i < len; i++) {
      temparray[i] = array[i] + 42;
   }
}

...
   char a1[24], a2[42];
   dosomething(24, a1);
   dosomething(42, a2);

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

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

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

...
   struct arrayobject a1, a2;
   a1.len = 42;
   a1.data = malloc(42);
   a2.len = 24;
   a2.data = malloc(24);
   ...
   dosomething(&a1);
   dosomething(&a2);

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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".

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.