die binäre null :/

  • hi, also ich hab mal nen test prog und bitte es mal den einen oder anderen bei sich auszuführen ...

    es geht hier um das "temp" feld, da ist es so dass da nie eine binäre null reingeschrieben wird, und bei nem kumpel trotzdem eine drin ist ... bei mir z.b. (so wie es sein muss) nciht ...

    weiss da einer wie das gehen kann, ist es villeicht der compiler der das bei meinem kumpel erledigt?

  • Das könnte man hübscher, standardkonformer, idiomatischer, besser und überhaupt viel wohlriechender auch so formulieren:

    Ohne lustige und höchst unnötige und nein, ganz bestimmt nicht "schnellere" oder "effizientere", weil nämlich ganz äquivalente, Pointerarithmetik sieht man auch gleich, daß du auf Element 3 des dreielementigen Arrays temp zuzugreifen versuchst, dessen Elemente aber 0, 1, 2 heißen. Was mit solchen illegalen Zugriffen passiert, kann sich deine Kombination aus Hardware/Betriebssystem/Compiler beliebig aussuchen. Insofern kein Wunder, daß auf einer anderen Plattform was anderes passiert.

    *plantsch*

  • ist ja egal wie der code aussieht, sollte nur zum testen sein ...

    und wo greif ich bitte auf das 3 element zu? die ausgabe? wieso sollte das ein problem sein?
    das 3 element ist aber trotzdem bestandteil des feldes, da steht z.b. die binäre null drin... und laut meinem prof. darf man auf das letzte element problemlos schreiben, nur ist es recht sinnlos, da dann die ausgabe net mehr richtig geht...

    nur ist die frage wieso es sich der eine compiler erlaubt und der andere net... wobei eigentlich will ich nur wissen was den STANDARD entspricht, also ob mein compiler richtig arbeitet oder der meines kumpels.

    denn ich hab auch noch folgendes problem:

    char chf[]={'A','B','C'};

    hier habe ich z.b. auch keine binäre null, d.h. es wird solange ausgegeben, bis mal zufällig im speicher ne null ist...bei meinem kumpel gehts natürlich wieder :/

    ich muss da folgendes schreiben:

    char chf[]={'A', 'B', 'C', '\0'};


    welcher compiler arbeitet hier nun richtig?

  • ist ja egal wie der code aussieht, sollte nur zum testen sein ...


    Je klarer der Code, umso leichter siehst du deine Fehler. Und die Leute, die du bittest, deinen Code zu debuggen, tun es lieber. Außerdem ist es einfach nur strange, grundlos die Form *(base + offset) zu verwenden.

    Zitat

    und wo greif ich bitte auf das 3 element zu?


    Im Ausdruck *(temp + 3) bzw. temp[3].

    Zitat

    wieso sollte das ein problem sein?


    Weil temp deklariert ist als vom typ char [3], deswegen sind genau die Indizes 0, 1, 2 zulässig. 3 nicht mehr, sonst hätte das Feld ja vier Elemente.

    Zitat

    das 3 element ist aber trotzdem bestandteil des feldes


    Nein. (Diskutieren sinnlos, ich habe recht. Akzeptiers oder werde ignoriert.)

    Zitat

    nur ist die frage wieso es sich der eine compiler erlaubt und der andere net... wobei eigentlich will ich nur wissen was den STANDARD entspricht, also ob mein compiler richtig arbeitet oder der meines kumpels.


    Der Standard stellt dem Compiler explizit frei, in solchen Fällen beliebiges zu tun. (Genauer: Code zu generieren, der beliebiges tut.) Abstürze zum Beispiel sind auch erlaubt. Oder das Löschen aller deiner Daten.


    Beide arbeiten wieder richtig. char chf[]={'A','B','C'} ist kein C-String, wenn du versuchst, ihn als C-String zu verwenden, machst du als Programmierer den Fehler. Der Compiler hat wiederum das Recht, zu tun, was er will.

    *plantsch*

  • Zitat


    (Diskutieren sinnlos, ich habe recht. Akzeptiers oder werde ignoriert.)



    sry, aber das gillt auch für dich ... mein prof ist mir da doch glaubwürdiger;)

  • Wieso schreibst du dann ins Informatikforum?

    Das 3te Feld ist Bestandteil, da hast du Recht, aber du schreibst ins 4te Feld!

    Index: 0 -> Feld 1
    Index: 1 -> Feld 2
    Index: 2 -> Feld 3 (Das ist das dritte Feld)
    Index: 3 -> Feld 4 (Und nicht das hier)



    Wenn du hier Fragen stellst, dann hör dir auch die Antworten an bzw. glaube sie. Schöne Grüße an deinen Lehrer..

    640K ought to be enough for anybody. :eek2:


  • und wo greif ich bitte auf das 3 element zu? die ausgabe? wieso sollte das ein problem sein?
    das 3 element ist aber trotzdem bestandteil des feldes, da steht z.b. die binäre null drin... und laut meinem prof. darf man auf das letzte element problemlos schreiben, nur ist es recht sinnlos, da dann die ausgabe net mehr richtig geht...

    Negativ, ein 3-elementiges Array kann nur von 0 bis 2 addressiert werden, alles darueber (oder darunter) fuehrt zu arbitraeren Ergebnissen und haengt vom verwendeten Compiler ab. Siehe auch http://en.wikipedia.org/wiki/Off-by-one_error


    nur ist die frage wieso es sich der eine compiler erlaubt und der andere net... wobei eigentlich will ich nur wissen was den STANDARD entspricht, also ob mein compiler richtig arbeitet oder der meines kumpels.

    Findet man in http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

    Beide. Fuer "echte" strings muss in einem char-array immer ein Element mehr vorhanden sein, damit die trailing-zero abgespeichert werden kann.

  • sry, aber das gillt auch für dich ... mein prof ist mir da doch glaubwürdiger;)


    in dem fall ist dein prof die (binaere) null. du bist off-by-one und "Plantschkuh!" kannst du bei solchen fragen mit an sicherheit grenzender wahrscheinlichkeit vertrauen.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • also ich weiss das in jedem buch steht das (in diesem bsp.) die 3 nicht dazu gehört das hat mein prof in den ersten vorlesungen auch immer gesagt.

    irgendwann gegen ende, meinte der das es doch irgendwie dazu gehört, da dort immer die binäre null liegt... ich mein der mann war jahre auf dem MIT, also doch recht glaubwürdig...

    aber eben nach nem test mit sizeof musste ich festellen das die binäre null doch ein eigenes feldelemt braucht... find ich net so toll von meinem prof:mad:


  • irgendwann gegen ende, meinte der das es doch irgendwie dazu gehört, da dort immer die binäre null liegt... ich mein der mann war jahre auf dem MIT, also doch recht glaubwürdig...

    wenn er nur die abkürzung gesagt hat, kann es sich genauso um das Mannsteinsche Institut für Theologie handeln ;)

    Zitat

    aber eben nach nem test mit sizeof musste ich festellen das die binäre null doch ein eigenes feldelemt braucht... find ich net so toll von meinem prof:mad:

    schulinformatiklehrer haben eben zu 99% keine ahnung, weil ihre informatikausbildung aus einem zweitägigen wordkurs bestand. aber wenigstens gibt es jetzt ein lehramt, es wird langsam besser...

  • also ich weiss das in jedem buch steht das (in diesem bsp.) die 3 nicht dazu gehört das hat mein prof in den ersten vorlesungen auch immer gesagt.

    irgendwann gegen ende, meinte der das es doch irgendwie dazu gehört, da dort immer die binäre null liegt... ich mein der mann war jahre auf dem MIT, also doch recht glaubwürdig...

    aber eben nach nem test mit sizeof musste ich festellen das die binäre null doch ein eigenes feldelemt braucht... find ich net so toll von meinem prof:mad:


    Vielleicht hat dein Lehrer einen Null-Terminierten-String gemeint:

    Code
    char* txt = "Hallo"; //5 Zeichen, jedoch ein Feld mit 6 Elementen


    Der Compiler macht dabei ein Feld mit 6 Elementen und ins letzte Feld kommt die "binäre Null" oder besser gesagt das Zeichen '\0', welches den String terminiert.
    Du kannst dieses Feld also auch so anlegen:

    Code
    char txt[6];
    txt[0]='H'; //beachte hier die einfachen Hochkommas!!!
    ...
    txt[4]='o';
    txt[5]='\0';


    Also Text in Doppel-Hochkommas "bla" werden automatisch terminiert (mit einem '\0' Zeichen). Wenn du einzelne Zeichen verwendest nimmst du einfache Hochkommas 'a'.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!