könnt mir jemand sagen warum das nicht funktioniert??



  • Deine Beschreibung verwirrt noch mehr, also noch mal korrekt:

    mit deiner Struktur Datensatz erstellst du einen Bereich (Array)

    Datensatz Daten[4];
    

    dieser Bereich beinhaltet jetzt 4 freie Plätze. (erinnere dich... ein Bereich hat immer ein Element mit 0 (0 -> 3 = 4 Stellen))

    Und da in der Schleife auf den Index mit der Nummer 4 zugegriffen wird, schreibst du ins Daten-Nirvana (bzw. korrekterweise: du zerstörst die Stack-Daten)...



  • Th69 schrieb:

    dieser Bereich beinhaltet jetzt 4 freie Plätze. (erinnere dich... ein Bereich hat immer ein Element mit 0 (0 -> 3 = 4 Stellen))

    nein das ist nicht korreckt.

    der bereich Datensatz Daten[4] hat 5 freie Plätze. und 4 dieser freien plätze kannst du mit daten belegen.

    Der bereich Daten sieht doch wie folgt aus
    0 <- 1. platz
    1 <- 2. platz
    2 <- 3. platz (hier hörst du auf zu schreiben)
    3 <- 4. platz (hier hör ich auf zu schreiben)
    4 <- 5. platz (hier hörte neo47 auf zu schreiben & der puffer läuft über)

    und platz 5 hat neo47 mit i <= 4 (= 4) erreicht.

    durch meine größenzuweisung des bereiches mit DATASIZE 5 (entstehen 6 freie plätze) und dem festlegen der bedingung der schleife i < 5 schreibt er nun auf den 5. platz da ein Bereich eben auch ein Element mit 0 hat 😉



  • @rT!f@Ct schrieb:

    der bereich Datensatz Daten[4] hat 5 freie Plätze. und 4 dieser freien plätze kannst du mit daten belegen.

    Wieso sollte da denn ein Platz reserviert werden der nicht nutzbar ist? Das wäre einfach nur Speicherverschwendung.



  • Verschwender von Gedanken schrieb:

    Wieso sollte da denn ein Platz reserviert werden der nicht nutzbar ist? Das wäre einfach nur Speicherverschwendung.

    Th69 gab die Antwort & schrieb:

    Und da in der Schleife auf den Index mit der Nummer 4 zugegriffen wird, schreibst du ins Daten-Nirvana (bzw. korrekterweise: du zerstörst die Stack-Daten)...



  • @rT!f@Ct schrieb:

    der bereich Datensatz Daten[4] hat 5 freie Plätze. und 4 dieser freien plätze kannst du mit daten belegen.

    Selten so einen Schwachsinn gehört...



  • @rT!f@Ct schrieb:

    der bereich Datensatz Daten[4] hat 5 freie Plätze. und 4 dieser freien plätze kannst du mit daten belegen.

    Datensatz Daten[4];heisst, das man ein array aus 4 elementen erzeugt und nicht, das der höchste index 4 sein soll.



  • mad_martin schrieb:

    Selten so einen Schwachsinn gehört...

    erstmal danke für die beleidigung, ist das alles was du kannst 😕

    dann erkläre du doch warum bei Daten[4] und (i <= 4) das programm in die knie geht. meinem verständniss nach ist es eben so wie ich es erklärt hab. wenn das falsch ist, klär mich/uns auf.



  • @rT!f@Ct schrieb:

    mad_martin schrieb:

    Selten so einen Schwachsinn gehört...

    erstmal danke für die beleidigung, ist das alles was du kannst 😕

    Es ist keine Beleidigung. Wenn ich dich hätte beleidigen wollen, dann hätte das anders ausgesehen. Nur deine Äußerungen waren einfach falsch.

    Und als du hier dann noch die richtige Erklärung als falsch hingestellt hast, fand ich deine Äußerung noch unsinniger.

    @rT!f@Ct schrieb:

    Th69 schrieb:

    dieser Bereich beinhaltet jetzt 4 freie Plätze. (erinnere dich... ein Bereich hat immer ein Element mit 0 (0 -> 3 = 4 Stellen))

    nein das ist nicht korreckt.

    der bereich Datensatz Daten[4] hat 5 freie Plätze. und 4 dieser freien plätze kannst du mit daten belegen.

    Datensatz Daten[4] reserviert 4 im Speicher direkt aufeinander folgende Variablen des Types Datensatz , gemeinhin Array genannt, auf dem Stack.

    Bei for (int i = 0; i <= 4; i++) wird die Schleife 5x durchlaufen. i=0, i=1, i=2, i=3, i=4
    Das Programm geht folgendermaßen durch:
    1. Schleifendurchlauf: Daten[0] wird beschrieben.
    2. Schleifendurchlauf: Daten[1] wird beschrieben.
    3. Schleifendurchlauf: Daten[2] wird beschrieben.
    4. Schleifendurchlauf: Daten[3] wird beschrieben.
    5. Schleifendurchlauf: Daten[4] wird beschrieben. BÄM!

    Im 5. Durchlauf wird auf nicht angeforderten Speicher nach den Feld Daten[] geschrieben, sozusagen auf das 5. Element. Es gibt aber nur 4, also Crash.

    Steht aber alles schon hier, man muss nur etwas zwischen den Zeilen lesen.



  • sieh mich jetzt nicht als beratungsresistent an.
    ich verstehe schon was du sagen willst, nur erkläre ich halt nicht das 0 Element als 0. stelle sondern eben als 1. stelle.

    und wir kommen halt zu den gleichen ergebniss, nämlich das man das 5 Element(sagst sogar du) nicht beschreiben kann.

    somit sehe ich das nicht als schwachsinn an, was ich geschrieben hab. ich drück mich halt nur anderst bzw. leihenhaft aus, weil programmieren für mich ein hoppy ist.

    [NEW EDIT]
    darf ich deshalb anderen keine hilfestellung geben? oder muss man meine erklärung deshalb als schwachsinn betitteln?



  • @rT!f@Ct schrieb:

    sieh mich jetzt nicht als beratungsresistent an.

    Das ist gut, das ist nämlich der erste Schritt, um weiterzukommen.

    @rT!f@Ct schrieb:

    ich verstehe schon was du sagen willst, nur erkläre ich halt nicht das 0 Element als 0. stelle sondern eben als 1. stelle.

    Ich erkläre es auch als 1. Stelle.

    @rT!f@Ct schrieb:

    und wir kommen halt zu den gleichen ergebniss, nämlich das man das 5 Element(sagst sogar du) nicht beschreiben kann.

    Das Ergebnis mag vielleicht gleich sein. Aber deine Begründung war falsch. Und es hilft dem Fragesteller nichts, wenn er was falsches lernt. Das 5. Element kann nicht beschrieben werden, weil der Speicher, auf den der []-Operator zeigt, nicht existiert. Und nicht, weil es ein Pufferelement ist, dass nicht zum Überschreiben gedacht ist.

    @rT!f@Ct schrieb:

    mit deiner strucktur Datensatz erstellst du einen Bereich (Array)

    Datensatz Daten[4];
    

    dieser bereich beinhaltet jetzt 5 freie plätze. (erinnere dich... ein bereich hat immer ein Element mit 0 (0 -> 4 = 5 Stellen))

    Das wäre der erste falsche Punkt. Bei Datensatz Daten[4]; sind es einfach 4 Plätze. Da kann man nicht drum herum reden und was von 5 sprechen. Es sind einfach nur 4.

    @rT!f@Ct schrieb:

    du sagst deiner schleife (i <= 4) dein datensatz ist auch 4 elemente groß, somit geht deine schleife bis ans allerletzte element und das ist nicht gut bei einem bereich, da dieser immer ein element mehr haben soll als tatsächlich reingeschrieben werden. dieses letzte element in dem bereich ist der puffer und wenn du den angreifst, bricht dein programm i.d.r zusammen.

    Diesen Ansatz finde ich echt schräg. Es gibt keinen Puffer bei einem Array. Es gibt die definierte Anzahl Speicherplätze, nichts danach oder davor. Die Schleife sagt nicht, dass der Threadersteller annimmt, es seien 4 Elemente, sondern durch den <= testet er auf 5 Elemente. Was klarerweise in die Hose geht.

    @rT!f@Ct schrieb:

    wenn du also einen bereich mit einer schleife durchläuft, egal ob du nun daten in den bereich schreibst, oder daten aus diesem bereich ausliest. solltest du immer darauf achten, das du mit der schleife NIE das allerletzte element (puffer) in dem Bereich berührst.

    Auch wieder falsch. Natürlich kann man das letzte Element eines Arrays nutzen. Aber eben nicht darüberhinaus. Das sagst du aber nicht. Du redest von einem Puffer, den es so nicht gibt, außer vielleich im Kopf des Programmierers. Ich empfinde sowas aber als unsauber, vor allem, weil es unnötig ist, wenn man sich der Grenzen des Arrays bewusst ist.

    @rT!f@Ct schrieb:

    ne kleine hilfe dabei ist, sich ne konstante zuzulegen

    #define DATASIZE 5
    

    diese für die Bereichserstellung und für die Schleife zu nutzen. und die bedingung für die schleife nicht kleiner gleich (<=) sondern nur auf kleiner (<) festzulegen.

    Mit dem Vergleichsoperator hast du definitiv recht, das ist eine sinnvolle Änderung. Aber die Konstante ist wiederum seltsam. Warum 5, wenn man 4 will?

    @rT!f@Ct schrieb:

    somit sehe ich das nicht als schwachsinn an, was ich geschrieben hab. ich drück mich halt nur anderst bzw. leihenhaft aus, weil programmieren für mich ein hoppy ist.

    [NEW EDIT]
    darf ich deshalb anderen keine hilfestellung geben? oder muss man meine erklärung deshalb als schwachsinn betitteln?

    Klar darfst du anderen Hilfestellung geben. Aber gerade bei Anfängern ist es wichtig, ihnen nicht irgendwas zu erzählen (nichts für ungut, aber deine Pufferidee von oben zählt zu "irgendwas"), sondern ihnen das wesentliche und vor allem richtig zu erklären.

    Ein Anfänger sieht bei deinen Erklärungen nicht, was du sagen willst, sondern etwas anderes, wenn du dich nicht genau ausdrückst. Gerade Programmieren ist eine präzise Arbeit.

    Das ich das ganze als "Schwachsinn" betituliert habe, lag einfach daran, dass du die richtige Erklärung als falsch dargestellt hast. Sowas bringt keinen weiter.
    Wenn jemand meine Dinge als falsch bezeichnet, dann überlege ich, ob der andere nicht vielleicht recht haben kann. Nur wenn ich mir sicher bin, dass ich richtig liege, verbessere ich das dann.

    Es war nicht böse oder verletzend gemeint, sondern einfach nur eine Wertung deiner Aussage. Und das man hier im Forum nicht mit Samthandschuhen kämpft, solltest du doch auch wissen 😉
    Also, nichts für ungut.


Anmelden zum Antworten