1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Berichtigungen im Code

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Marcw13, 22.07.08.

  1. Marcw13

    Marcw13 Gloster

    Dabei seit:
    03.08.07
    Beiträge:
    65
    Ich dachte mir mal, da ich gerade versuche mit C zu programmieren (ich kann auch noch keine andere Sprache), dass das hier ein ganz nützliches Thema sein könnte, in dem Anfänger so wie mir geholfen wird, wenn mal ein Problem entsteht.

    Dann will ich auch gleich mal anfangen:
    Ich lese im Moment das Buch "C Programmieren von Anfang an" und habe nun ein kleines Problem in einem Programm.
    Die letzte Zeile lautet:

    printf("\n\tDie größere Zahl lautet %i"), (x<y) ? x : y);

    Ich bekomme aber dem Error: syntax error befone ')' token. habe aber keine Ahnung was ich falsch mache oder auch nicht was das heißen soll.

    Ich hoffe, das ich nicht der einzige bleibe, der dieses Thema benutzt und bedanke mich bei allen, die anderen helfen wollen.
     
  2. TDH

    TDH James Grieve

    Dabei seit:
    07.07.04
    Beiträge:
    133
    Du hast eine Klammer zu viel oder dich vertippt hier.
     
  3. macaneon

    macaneon Kaiserapfel

    Dabei seit:
    19.06.07
    Beiträge:
    1.727
    Es fehlt auf den ersten Blick betrachtet eine schließende Klammer.

    Edit:
    Nein, ich glaube, vor der Formel fehlt eine öffnende.
     
  4. Nighthawk

    Nighthawk Linsenhofener Sämling

    Dabei seit:
    16.12.06
    Beiträge:
    2.558
    Du hast da eine Klammer zuviel (nach dem %i").
     
  5. Marcw13

    Marcw13 Gloster

    Dabei seit:
    03.08.07
    Beiträge:
    65
    Wow gleich so viele danke.

    Das war der erste Feher aber jetzt bekomme ich stattdessen den error: syntax error at end of input
     
  6. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Den neuen Syntax (T)Error kann ich nicht erklären, Dein Programm hat aber noch einen logischen Fehler, da es nicht die größere, sondern die kleinere Zahl anzeigt.
     
  7. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Wie einige schon sagten, richtig ist:
    Code:
    printf("\n\tDie größere Zahl lautet %i", (x<y) ? x : y);
    Um den zweiten Fehler zu finden müsste man mal Dein ganzes Programm sehen

    Alex
     
  8. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Das zeigt, warum man Anfänger erstmal mit diesem C Konstrukt verschonen sollte.
    Ein
    Code:
    int i;
    if (x>y)
    i = x;
    else
    i = y;
    wäre sicher klarer.

    Alex
     
  9. Marcw13

    Marcw13 Gloster

    Dabei seit:
    03.08.07
    Beiträge:
    65
    Danke an alle ich hab ihn jetzt ich vergesse immer kleine Zeichen, die aber trotzdem von großer Bedeutung sind wie diesmal }
     
  10. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    ;) Das hängt vom Standpunkt ab. Es gibt Leute die würden sagen, daß auch das nicht klar genug ist und man doch bitte schreiben möge:
    Code:
    int maximum;
    if (x>y) {
        maximum= x;
    }
    else {
        maximum= y;
    }
    
    Fortgeschritten Perl Programmierer finden dieses Konstrukt sehr hübsch:
    Code:
    my $maximum= [ $x => $y ] -> [ $x <= $y ]
    
    Letzteres nur um Perls Nimbus als unverständliche Sprache zu untermauern.
     
  11. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Count me in! Es dürfte jedem klar sein, was der Code bedeutet.

    Manche Leute verstehen möglichst unklare Sourcen als Pimmelverlängerung. Eigentlich sollte man denen einen Porsche schenken.
     
  12. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Okay… laßt uns abschweifen…

    Das ist nur so lange unklar, wie man nicht zu 133t gehört ;)

    Nein! Dummfug. Ich empfinde den dargestelltn Code als hübsch und kann mich daran erfreuen ihn zu verstehen zu versuchen. Das mag geekig sein, ist mir aber auch egal.

    In produktivem Code würde ich das natürlich nicht einsetzen. Allerdings dieses hier schon:
    Code:
    1<<a>>1
    Es sei denn, Du kannst mir treffenderen Code geben und mich davon überzeugen, daß "meiner" wirklich nur der Verwirrung dient.

    Ach! Was den Porsche angeht: Ich verzichte aus folgenden Gründen:
    • Ist mir zu schnell
    • Schluckt zuviel Treibstoff
    • Meine Familie paßt nicht rein
    • geschweige denn das Gepäck für uns
    • Ich hätte schwierigkeiten mich da rein zu quälen
     
  13. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Sehr gut, ich nehm ihn!

    Alex
     
  14. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Wende Dich vertrauensvoll an Amin.
     
  15. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Wenn du Geek als Fachmann meinst, so ist es nicht geekig. Der Code ist unklar. Ein Fachmann würde auf klaren Code bestehen.

    Wozu dann überhaupt? Um sich als geekig zu bezeichnen?

    Kommt darauf an, was der Wertebereich von a ist,was wiederum vom Problemabhängt, welches du nicht beschreibst. In jedem Falle ist bereits
    Code:
    (1<<a)>>1
    treffender, weil es die Operatorprioritäten expliziert. Aber es zeigt dann auch gleich, dass es viel klarer geht, als etwas erst nach links zu schieben, um es dann nach rechts zu schieben:
    Code:
    1<<(a-1)
    Das stimmt freilich nur dann, wenn das höchste Bit nie gesetzt ist,was ich mangels Problembeschreibung nicht beurteilen kann. Aber auch dann würde ich ein & bevorzugen, um dieses Ziel zu explizieren. So ist das nämlich ein "Seiteneffekt", der sicher gerne übersehen wird. Wetten wir, dass bestimmt 30 % den Unterschied nicht bemerken?

    Siehe oben. Man kann das allerdings nicht verallgemeinern. Wenn es dir inhaltlich wirklich um einWobbel-Dobbel-Hin-Her-Jojo-Code geht, mag sogar deine Formulierung klarer sein. (man hat so etwas etwa, wenn man Register von Controllern lädt.)

    Wenn es dir darumgeht, um a-1 zu schieben und das höchste Bit zu löschen, ist er völlig unklar.


    Du bist kein echter Mann
    Du bist kein echter Mann.
    Du bist kein echter Mann.
    Du bist kein echter Mann.
    Du bist kein echter Mann.
     
  16. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Alex bekommt den nicht. Der hat viel zu viel Stil als das er "geekigen" Code schreiben würde.
     
  17. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Was ist da unklar?

    Weil es hübsch aussieht.


    a ist ein Integer im Bereich 0-9. Es soll dasjenige Bit gesetzt werden, das a angibt, wobei wir aber bei 1 zu zählen beginnen (also 1= Bit 0 wird gesetzt) und 0 bedeutet, daß kein Bit gesetzt ist.

    Mit anderen Worten: Du schreibbst statt a+b-c auch (a+b)-c. Und wenn nicht, warum nicht?

    Was aber bedeutet, daß man wissen muß, daß ein , Verschieben um -1 nach links einem Verschieben um 1 nach rechts entspricht. Ganz ehrlich: Ich war mir da nicht so sicher.

    Okay. Die Problembeschreibung habe ich Dir geschuldet und mit den Seiteneffekten (die hier zu vernachlässigen sind) hast Du recht.

    Ja. Ging es. Wobei ich meines immer noch klarer finde, wegen der angesprochenen -1-Problematik.

    Ich werde das nicht abstreiten.
     
  18. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Hatte ich doch geschrieben:
    a) Die Operatorenbindung
    b) Ob der Seiteneffekt des gelöschten obersten Bits gewollt ist.

    Schönheit steht im Auge des Betrachters. Ich finde eher, dass das wie eine Teddybär-SMS aussieht.

    Dann kannst du dich glücklich schätzen, dass der von dir übersehende Seiteneffekt keine Rolle spielt.

    Weil das Menschen seit der Grundschule wissen. Wenn es um Lesbarkeit geht, geht es um Lesbarkeit für den Menschen

    Übrigens, wenn etwa zu einer Variablen eine Differenz addiert werden soll, so formuliere ich das durchaus so:
    Code:
    a+(b-c)
    Das hat mathematisch oder programmiertechnisch keinen Vorteil oder Nachteil. Es zeigt aber die Semantik:Der Jung will zu a die Differenz von b zu c addieren. Mit klareren Variablennamen (gerne: Position und Weite) ist das dann häufig sofort einsichtig und selbsterklärend.

    Nein, das muss man nicht wissen. Man muss wissen, dass wenn man eine Stelle weniger nach links verschiebt,dies einem Verschieben nach links entspricht. Da steht nicht:
    Code:
    (1<<a)<<-1
    sondern
    Code:
    1<<(a-1)
    Das hat wenig mit C oder Mathematik zu tun. Wenn du drei Waggons weiter den Speisewagen besuchst,wirst du auch nicht vier Waggons ablaufen, um dann wieder einen zurück zu gehen.

    Die du offenbar auch jetzt noch nicht übersehen hast. Die beiden letzten Codezeilen erzeugen völlig unterschiedliche Ergebnisse, ganz unabhängig von negativen Verschiebungen.


    Das macht der Code jedoch nicht! Er verschiebt ein Bit weniger – was du wolltest – und löscht das oberste Bit. Das mag in deinem Anwendungsfall gleichgültig sein. Alleine der Umstand, dass du das nicht sahst, zeigt, dass der Code unklar ist. Wieso in Gottes Namen formulierst du nicht genau das, was du willst? Was willst du damit beweisen?


    Ich dachte,dies sei dieselbe Kategorie wie "Geek".
     
  19. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Ich behaupte einfach frech: Wäre der Wertebereich von a größer (also ab 15) hätte ich mir mehr gedanken darum gemacht!

    D.h. also wenn Menschen ähnlich lange mit Bitschiebereien zu tun hätten, wie mit Grundrechenarten, könnte man sich die von Dir gewünschten Klammern sparen. Okay.

    Ich wage zu widersprechen. Denn durch Dein Konstrukt tritt ein anderer grenzwertiger Seiteneffekt auf. Eben der, was passiert, wenn a den Wert 0 hat. Das ist einer der zulässigen Werte für a. Wenn man jemand ist, dem man für das Verständnis von Bitschiebereien Klammern geben sollte, dann ist man sicherlich auch jemand, der nicht weiß, daß 1<<-1 (bei a==0) dasselbe ergibt wie 1>>1.

    Das zeigt mir, daß Du keine Freundin/Frau hast oder, wenn doch, eine, die keine richtige Frau ist. Weißt Du, wie eine Frau einen Weg beschreibt? Um das mal beim Speisewagenbeispiel zu bleiben: "Ute, Du weißt doch, wo die Schlafwagen sind, nä? In die Richtung (deutet nach hinten). Wenn Du bei denen angekommen bist, dann bist Du schon einen Wagen zu weit" ;)

    Nicht im angegebenen Grenzbereich, ansonsten: Ja.

    Weil es sich beim Programmieren so ergeben hat. Als ich vor dem Problem stand, das angegebene Bit zu setzen, bin ich zunächst auf dieses Konstrukt gekommen: 2**a/2. Da hätte ich aber noch die Nachkommastellen abschneiden müssen. Dann fiel mire ein, daß ich /2 ja auch mit >>1 erreiche, also: 2**a>>1 uhd dann erst ging mir auf, daß 2** auch 1<< sein kann und ich schrieb 1<<a>>1. Das hat mir gefallen und so blieb es stehen.
     
  20. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Das mag ja stimmen. Aber jemand der das liest muss sich diese Gedanken machen. Und der sieht dann, wenn er Ahnung hat: Wird um a-1 verschoben und das oberste Bit gelöscht.

    Selbstverständlich. Und wenn englische Wörter anders geschrieben würden, dann wären anders geschriebene Variablennamen lesbarer.

    Es kommt ganz und gar auf das menschliche Verständnis an. Und das hängt natürlich davon ab, was Menschen lernen.

    Jede Operation hat Bereichsprobleme. Es geht darum, dass dein Ausdruck etwas ganz anderes macht, nämlich das oberste Bit maskieren. In meinem Code steht eine Verschiebung uns es wird eine verschiebung vorgenommen. Dies hat das Problem der Bereichsprüfung bei Verschiebungen.

    In deinem Code steht eine Verschiebung und es wird eine Verschiebung vorgenommen und eine Bitmaskierung. Dies hat das Problem der Bereichsprüfung bei Verschiebungen. Und es hat das Problem der Bitmaskierung. Dies ist ein Effekt, der dort semantisch nicht explizit steht. Da fragt sich der geneigte Leser: "Will der dat wirklich?" Und in diesem Falle war es sogar so, dass du das gar nicht wolltest! Klarer kann man das Problem doch kaum machen!


    Das würde sie in Abrede stellen wollen.

    Ich würde das zwar nicht als typisch weiblich bezeichnen. Aber unabhängig von der Geschlechtsspezifizität dieser Beschreibung, würde ich eine solche im Sourcecode eben nicht als klar bezeichnen, sondern als ganz und gar hinrissig.

    (In Wahrheit taucht übrigens bei jeder Wegbeschreibung einer Frau ein Schuhgeschäft auf. Aber das nur am Rande.)

    Der Leser deiner Source weiß erst einmal nicht von deinem Grenzbereich.

    Man merkt sofort, dass die sein deutlich klarerer Gedankengang ist als: "Ich will um a-1 verschieben, also schreibe ich 1<<(a-1)"

    Abwegig, dies als klar zu bezeichnen. Toital kompliziert von mir gedacht. Einfach das machen, was man machen will. WO KOMMEN WIR DENN DAHIN!!!!!!!
     

Diese Seite empfehlen