Speicherfragen zu Arrays



  • agga ugga schrieb:

    das sind alles gleiche werte, die schreibweisen sind gleichwertig. 🙂

    Du hast recht, ich Unrecht, ich hatte vorhin eine Klammer verschludert, sorry 😉
    Ich werde mir wohl den multi_write nochmal anschauen müssen, *seufz*.
    Was mich in dem Zug erstaunt, was sizeof() für ein Tausendsassa ist. Dem ist es wurscht, ob er mit einem Typen, einem Arrayanker oder einem Arrayelement gefüttert wird. Kann mir jemand andeuten, wie das funktioniert oder einen guten Link dazu geben?



  • pointercrash() schrieb:

    Kann mir jemand andeuten, wie das funktioniert oder einen guten Link dazu geben?

    so lange der compiler die grösse eines objekts oder typs kennt, kann er überall wo du 'sizeof(..)' hinschreibst diesen wert einsetzten. sizeof ist keine funktion, sondern eher sowas wie ein platzhalter für die grösse von irgendwas und wird beim compilieren, also nicht zur laufzeit, ausgewertet.
    🙂



  • sizeof(freak)==0 😮



  • sizeof()-freak schrieb:

    so lange der compiler die grösse eines objekts oder typs kennt, kann er überall wo du 'sizeof(..)' hinschreibst diesen wert einsetzten. sizeof ist keine funktion, ... 🙂

    Gut, jetzt bitte nicht lachen: "array" war ja in dem Fall nur die Adresse auf das Array, woher weiß sizeof(), daß ich nicht die Größe haben will, die die Adresse einnimmt, sondern das Array, das sie referenziert.
    Weiters: Wie bekäme ich denn die Adressgröße heraus?



  • pointercrash() schrieb:

    "array" war ja in dem Fall nur die Adresse auf das Array, woher weiß sizeof(), daß ich nicht die Größe haben will, die die Adresse einnimmt, sondern das Array, das sie referenziert.

    welche adresse? gibst du 'sizeof' ein array, dann kriegste die grösse des ganzen arrays. der compiler weiss, wie gross das array ist und diese information kannst du ihm mit 'sizeof' entlocken. die grösse eines elements bekommst du mit: sizeof (array[0]) oder *sizeof(array).

    pointercrash() schrieb:

    Weiters: Wie bekäme ich denn die Adressgröße heraus?

    allgemein? etwa so: sizeof(void)*
    🙂



  • adressen-freak schrieb:

    allgemein? etwa so: sizeof(void)*

    Ich denke pointercrash meint eher sowas: sizeof &array[0]



  • Tim schrieb:

    adressen-freak schrieb:

    allgemein? etwa so: sizeof(void)*

    Ich denke pointercrash meint eher sowas: sizeof &array[0]

    hast recht, das meinte er wohl.
    überigens, du schreibst 'sizeof' ohne klammern, sowas sieht man selten.
    wie ist es eigentlich mit sizeof a+b;?
    ist das gleichbedeutend mit sizeof(a)+b oder ist es eher sizeof(a+b)?
    🙂



  • klammern-freak schrieb:

    überigens, du schreibst 'sizeof' ohne klammern, sowas sieht man selten.

    Echt? Ich finde nicht. Wobei ich zugebe, dass ich es auch oft mit Klammern verwende. Manchmal braucht man sie ja auch: sizeof(int) geht ja nicht ohne.

    klammern-freak schrieb:

    wie ist es eigentlich mit sizeof a+b;?
    ist das gleichbedeutend mit sizeof(a)+b oder ist es eher sizeof(a+b)?
    🙂

    Ersteres. Auch ein gutes Beispiel wo es mit Klammern besser wäre 🙂



  • Tim schrieb:

    Ich denke pointercrash meint eher sowas: sizeof &array[0]

    Meinte er 😉
    Das sizeof(void ) ist insofern problematisch, weil mein Compiler ein near/far- Modell hat und ich ihn zwingen kann, bestimmte Sachen im near- Bereich anzulegen. Bei void geht er automatisch von far aus.
    Sind

    size_t s= sizeof(&array[0]);
    size_t s = sizeof(&array);
    

    dann wirklich äquivalent?

    Übrigens bin ich bei der multi_write()- Methode wirklich auf was gestoßen, im Original belegt die struct 28 Bytes und es gibt 10 Elemente im Array, die Blocksize der adressierten Speicher ist aber maximal 256 Byte groß - na, schnackelt's 😉 . Typisch Modulo- Rollover.
    Ist mir nur nie aufgefallen, weil ich anscheinend nie mehr als 255 Bytes am Stück geschrieben habe, werd' das Ding zunächst zurechtfrickeln und irgendwann demnächst neu aufsetzen.

    Aber schön, wieder mal an den Basics genagt zu haben 🙄



  • pointercrash() schrieb:

    Sind

    size_t s= sizeof(&array[0]);
    size_t s = sizeof(&array);
    

    dann wirklich äquivalent?

    Nicht so richtig. Es sind untetschiedliche Typen. Ersteres ist T* , letzteres ein T(*)[NUM] . Wobei ich mir jetzt gerade keinen Fall vorstellen kann, wo das Ergebnis von sizeof unterschiedlich wäre 🤡



  • Tim schrieb:

    Wobei ich mir jetzt gerade keinen Fall vorstellen kann, wo das Ergebnis von sizeof unterschiedlich wäre.

    es gibt keinen. beides ist die adresse des ersten elements des selben arrays. selbst mit near/far kann man keinen unterschied erzwingen (es sei denn, der compiler ist kaputt).
    🙂



  • Tim schrieb:

    Nicht so richtig. Es sind untetschiedliche Typen. Ersteres ist T*, letzteres ein T(*)[NUM].

    gut erklärt 😋

    So findet man es nicht in einem Buch.



  • Liebe Leute,

    Fehler geknackt, mission completed, es war wirklich so, daß multi_write() nach Byte 255 bei Byte 0 munter weitergeschrieben hat 😞 .

    Um die restlichen Erklärungen bin ich aber auch sehr dankbar. Wenn's geht, wie man "das immer so macht", denkt man nicht mehr drüber nach, warum man das so gemacht hat. Wenn's dann plötzlich nicht tut, ziehe ich auch in Zweifel, was ich seit Ewigkeiten einfach nur Abnicke.

    Positiver Seiteneffekt - Diffuses wird mal wieder geschärft und so dediziert habe ich sizeof() eh noch nie betrachtet. Jedenfalls Danke nochmal!
    🙂


Anmelden zum Antworten