Array-Größe in Funktion bestimmen



  • Die Alternative (von globalen Variablen mal abgesehen) für das Übergeben der Array-Größe wäre dann evtl noch eine Präprozessor-Anweisung à la

    #DEFINE ANZAHL_SCHLUEMPFE 200
    

    Macht natürlich nur Sinn bei Arrays mit wirklich fester Größe und stellt im Vergleich zur "fest angenommen" Kodierung der Arraygröße in der aufgerufenen Funktion lediglich einen Wartbarkeitsvorteil dar.

    Sollten Schlumpfine und Schlaubischlumpf Nachwuchs zeugen oder Papa Schlumpf das zeitliche segnen, musst Du dann nur an der Stelle des defines den Wert ändern, statt an mehreren Stellen (Funktionsaufruf und Funktion).

    Ansonsten - wie gesagt - bleibt nur die Übergabe der Größe als Funktionsparameter - bietet sich auch der Debugbarkeit halber an.

    So hast Du z.B. beim Aufruf der Funktion üblicherweise gleich den entsprechenden Wert parat, bei #defines stellt sich das "eher schwierig" dar.

    Am Hochachtungsvollsten

    HübschDruck



  • Was hat mich da geritten?

    Natürlich heißt es korrekterweise

    #define SCHLUMPFCOUNTER 101
    

    Also lowercase define 🙂



  • SPAM!

    Hm, der Bot-Filter ist anscheinend aus - ich darf keine Kopfrechenaufgaben mehr lösen. 😞 Ich wollt doch so gern Rechenkönigin werden!



  • ok, danke für die Vorschläge. Da das übergebene Array den "Rückgabestring" der Funktion enthalten soll, übergebe ich der Funktion nur ein deklariertes Array, es enthält also noch keine Werte, auch kein terminierendes 0.
    Deswegen bleibt mir wohl nur die Übergabe der Arraylänge an die Funktion.

    Doch eine Frage habe ich noch:
    Weshalb funktioniert das außerhalb der Funktion und nicht innerhalb? Denn was weiß der Prozessor (oder wer das das auch genau auswertet 😃 ) mehr, falls die Grösse ausserhalb der Funktion ermittelt wird? Auch ausserhalb ist doch bloss der Pointer als Startadresse des Arrays bekannt???



  • fdsa schrieb:

    Doch eine Frage habe ich noch:
    Weshalb funktioniert das außerhalb der Funktion und nicht innerhalb? Denn was weiß der Prozessor (oder wer das das auch genau auswertet 😃 ) mehr, falls die Grösse ausserhalb der Funktion ermittelt wird? Auch ausserhalb ist doch bloss der Pointer als Startadresse des Arrays bekannt???

    Er weiß, dass es ein Verweis auf ein Array ist, welches auf dem Stack liegt. Anfänger haben oft Schwierigkeiten, zwischen Array und Zeiger zu unterscheiden, dabei kann ein Zeiger eben auch auf andere Sachen zeigen. Der Verweis auf das Array hingegen ist konstant und kann nicht neu zugewiesen werden, weshalb dies dem Compiler erlaubt, Informationen über das Array abzusichern.

    Dieses Abfragen der Größe eines Arrays geht AFAIK nur bei Arrays auf dem Stack.



  • Ein Zeiger ist ein Zeiger ist ein Zeiger und insbesondere kein Array.
    Der Compiler kann (verständlicherweise) nicht anhand einer Adresse bestimmen, wieviel Speicherplatz dahinter definiert wurde, zumindest nicht portabel.
    Arrays als Funktionsparameter werden implizit zu Zeigern, per Sprachstandarddefinition, d.h.

    void funktion(char array[4711])
    {
      size_t st=sizeof(array);
    }
    

    wird niemals das von Anfängern und diversen Fachbuchautoren beabsichtigte Ergebnis liefern.



  • Wer als Autor ein solches Werk dann als Fachbuch bezeichnet, sollte sich nicht wundern, wenn es im Allgemeinen als Lachbuch angesehen wird 🙂

    Mal kurz gesponnen:

    Angenommen, man packt selbst ausschließlich druckbare Zeichen ins Array.
    Könnte man dann - ziemlich unportabel und bestimmt nicht defensiv programmiert - die Größe des Arrays durch Suchen nach dem ersten "nicht druckbaren" Zeichen laut ASCII bestimmen?



  • In irgendeiner Funktion definierst du das Array. Und in der Funktion ist auch die Größe bekannt.
    Globale Variablen ausgenommen.



  • PrettyP schrieb:

    Wer als Autor ein solches Werk dann als Fachbuch bezeichnet, sollte sich nicht wundern, wenn es im Allgemeinen als Lachbuch angesehen wird 🙂

    Mal kurz gesponnen:

    Angenommen, man packt selbst ausschließlich druckbare Zeichen ins Array.
    Könnte man dann - ziemlich unportabel und bestimmt nicht defensiv programmiert - die Größe des Arrays durch Suchen nach dem ersten "nicht druckbaren" Zeichen laut ASCII bestimmen?

    Die Annahme, dass uninitialisierter Speicher keine druckbaren Zeichen enthält, ist höchst gefährlich. Zum einen gibt es 96 druckbare Zeichen von 256 möglichen Werten eines Bytes, also hat es selbst bei postuliertem Zufall eine Chance von 37,5%, fehlzuschlagen, zum anderen musst du damit rechnen, dass das Array in Speicher gelegt wird, den du vorher schon mal benutzt hast, beispielsweise als String druckbarer Zeichen.

    Man kann, wenn man unbenutzte Werte zur Verfügung hat, natürlich seine Daten mit einem solchen terminieren - so geschieht es ja bei Strings. Das muss man vorher aber auch selbst tun.

    Ansonsten:

    fdsa schrieb:

    Denn was weiß der Prozessor (oder wer das das auch genau auswertet 😃 ) mehr, falls die Grösse ausserhalb der Funktion ermittelt wird?

    Da liegt nämlich der Hase im Pfeffer begraben. sizeof ist keine Funktion, und sizeof-Ausdrücke werden nicht zur Laufzeit ausgewertet. Der Compiler ersetzt zur Compilezeit den sizeof-Ausdruck durch eine Zahl, und das kann er natürlich nur da, wo ihm die Größe des Arrays bekannt ist. Innerhalb einer Funktion, der ein Array als Zeiger übergeben wurde, ist das nicht der Fall.



  • aha, sehr interessant eure infos.
    Besten Dank!
    Markus


Anmelden zum Antworten