Autor Thema: C Code mit CC65 - nächste DAU-Frage  (Gelesen 9684 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline matashen

  • Benutzer
  • Beiträge: 1.779
C Code mit CC65 - nächste DAU-Frage
« am: So 18.05.2008, 22:46:53 »
ich machs kurz

wie definiere ich zwei Bedingungen

wie
if (i=1) and (j=0) anweisung1;

Das and will der CC65 nicht akzeptieren also geh ich davon aus das C-Code hier wieder irgend einen Blödsinn vorschreibt und mit den drei Buchstaben und nix anfangen kann.

Noch ne Frage wäre.
Wie mach ich nen Zufallsgenerator?

Schon mal danke für die Hilfe

Gruß Matthias
Have you played Atari today ?!

Offline tuxie

  • Benutzer
  • Beiträge: 6.830
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #1 am: So 18.05.2008, 22:59:13 »
SO?

if (i=1) && (j=0) anweisung1;
Tschau Ingo

Offline Dennis Schulmeister

  • Moderator
  • *****
  • Beiträge: 535
  • Do be do be do -- Sinatra.
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #2 am: Mo 19.05.2008, 17:52:05 »
Ingo hat Recht. In C-ähnlichen Sprachen werden die Operatoren nicht ausgeschrieben. Stattdessen gibt es Symbole

& bzw. && - AND
| bzw. || - OR
! - NOT
== - Prüfung auf Gleichheit !!!!! (Bitte nicht = verwenden, da das der Zuweisungsoperator ist!!!)

Der Unterschied zwischen &, | und &&, || ist, dass im letzteren Fall die Auswertung des Ausdrucks (von links nach rechts) abbricht, sobald das Ergebnis klar ist. z.B. false && true wertet nur den linken Teil aus, da durch den AND-Operator der Ausdruck nicht mehr true werden kann ...

Im Übrigen kann ich nur empfehlen, auch einzeilige Blöcke als Blöcke zu definieren. Also so:

if ((i == 1) && (j == 0)) {
  Anweisung;
  Anweisung;
  ...
}

Alles Andere ist meiner Meinung nach sclechter Stil und führt nur zu schwer zu findenden Fehlern!

Wg. dem Zufallsgenerator könntest du mal nach einer Funktion rand() suchen. Hat CC65 eine math.h? Da ist der sicher drin.

Gruß,
Dennis 8)
Wenn ich mal groß bin, will ich bei Atari arbeiten.

Offline matashen

  • Benutzer
  • Beiträge: 1.779
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #3 am: Mo 19.05.2008, 18:37:59 »
Danke für die ausführliche Darlegung.

Ein Math.h hat der CC65 nicht.

Gruß Matthias
Have you played Atari today ?!

Offline Dennis Schulmeister

  • Moderator
  • *****
  • Beiträge: 535
  • Do be do be do -- Sinatra.
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #4 am: Mo 19.05.2008, 23:38:51 »
Einen für den Hausgebrauch ausreichenden Zufalszahlengenerator kann man einfach selbst programmieren als:

(Primzahl ^ k) mod n;  k bei jedem Zug hochziehen, n = Maximum

Meine ich zumindest, im Hinterkopf zu haben ...

Gruß,
Dennis 8)
Wenn ich mal groß bin, will ich bei Atari arbeiten.

Offline matashen

  • Benutzer
  • Beiträge: 1.779
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #5 am: Mo 19.05.2008, 23:52:57 »
Ich zähl momentan einfach die Schleifendurchläufe bis eine Taste gedrückt wird. Funktioniert momentan auch ganz brauchbar...

Aber danke. Werds mir mal notieren und testen...
Have you played Atari today ?!

gstoll

  • Gast
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #6 am: Di 20.05.2008, 20:32:59 »
Leer
« Letzte Änderung: Fr 24.09.2010, 10:11:14 von gstoll »

gstoll

  • Gast
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #7 am: Di 20.05.2008, 20:38:27 »
Leer
« Letzte Änderung: Fr 24.09.2010, 10:09:11 von gstoll »

Offline Dennis Schulmeister

  • Moderator
  • *****
  • Beiträge: 535
  • Do be do be do -- Sinatra.
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #8 am: Di 20.05.2008, 22:25:34 »
Hallo Gerhard,

du hast schon recht. & bzw. | nehmen eine Bit-Weise verknüpfung vor. Die Auswirkung ist, dass ein Ausdruck

op1 & op2 & op3 ...

komplett ausgewertet wird.

&&, || gehen aber nicht Bit-Weise vor. Das heißt, folgende Ausdrücke werden nicht vollständig ausgewertet.

true || false || true ...  ===> true, gleich nach dem ersten true.
false && true && true ... ===> false, gleich nach dem ersten false.

Für ein ODER genügt es, wenn ein Operand true ist, damit der komlette Ausdruck true wird. Umgekehrt verhält sich UND. Wenn mind. ein Operand false ist, ist der gesamte Ausdruck false. Das heißt, der Computer kann ein wenig Rechenzeit sparen, wenn er mit der Auswertung abbricht, sobald das Ergebnis des Ausdrucks ohnehin feststeht.

So ist folgender Code z.B. sicher, das heißt, es findet kein Zugriff auf ein nicht initialisiertes Array-Element statt.

int i = 0;
int array[5] = {1, 1, 0, 1, 1};

for (i = 0; i < 100; i++) {
  if ((i < 5) && (array[i] == 1)) {
    // Irgendwas ...
  }
}

Obwohl i bis 100 hochgezählt wird, wird der Ausdruck (array[ i ] == 1) nur ausgewertet für (i < 5). Würde statt && auf & zurückgegriffen werden, wäre dem nicht so.

Gruß,
Dennis 8)
Wenn ich mal groß bin, will ich bei Atari arbeiten.

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.798
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #9 am: Mi 21.05.2008, 19:12:37 »
Ist dieses Verhalten im Standard für ANSI C enthalten?
Ich würde nämlich per se von einem solchen Verhalten niemals ausgehen wollen...praktisch ist das nur, solange sich wirklich _jeder_ Compiler daran hält, und genau das ist das Problem.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

Offline Dennis Schulmeister

  • Moderator
  • *****
  • Beiträge: 535
  • Do be do be do -- Sinatra.
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #10 am: Mi 21.05.2008, 22:57:13 »
Nicht nur in C selbst, sondern in allen C-ähnlichen Sprachen ist das so. Das ist ja gerade der Witz an den logischen Operatoren verglichen mit den Bit-Operatoren.

/* C-Version */
#include <stdio.h>

int f1() {
    printf("f1: false\n");
    return 0;
}

int f2() {
    printf("f2: true\n");
    return 1;
}

int main() {
    if (f1() && f2()) {
        printf("Beide true!\n");
    }

    printf("Ende!\n");

    return 0;
}

/* Java-Version */
public class logAnd {
    public static boolean f1() {
        System.out.println("f1: false");
        return false;
    }

    public static boolean f2() {
        System.out.println("f2: true");
        return true;
    }

    public static void main(String[] sArgs) {
        if (f1() && f2()) {
            System.out.println("Beide true...");
        }

        System.out.println("Ende!");
    }
}

/* PHP-Version */
<?php
    
function f1() {
        echo 
"f1: false<br/>";
        return 
false;
    }

    function 
f2() {
        echo 
"f2: true<br/>";
        return 
true;
    }

    if (
f1() && f2()) {
        echo 
"Beide true<br/>";
    }

    echo 
"Ende<br/>";
?>


Verhalten sich alle gleich. :) Die Ausgabe ist immer:


f1: false
Ende!


Gruß,
Dennis 8)
Wenn ich mal groß bin, will ich bei Atari arbeiten.

Offline Dennis Schulmeister

  • Moderator
  • *****
  • Beiträge: 535
  • Do be do be do -- Sinatra.
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #11 am: Mi 21.05.2008, 23:13:41 »
BTW: http://en.wikipedia.org/wiki/Iso646.h

Könnte man auch ganz easy selber machen

#define and &&
...

Gruß,
Dennis 8)
Wenn ich mal groß bin, will ich bei Atari arbeiten.

Offline matashen

  • Benutzer
  • Beiträge: 1.779
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #12 am: Mi 21.05.2008, 23:52:20 »
Na da hab ich ja wieder was ausgelöst...
Have you played Atari today ?!

Offline Dennis Schulmeister

  • Moderator
  • *****
  • Beiträge: 535
  • Do be do be do -- Sinatra.
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #13 am: Do 22.05.2008, 01:10:54 »
Hehehe, ja und? ;)
Wenn ich mal groß bin, will ich bei Atari arbeiten.

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.798
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #14 am: Do 22.05.2008, 10:20:09 »
Nicht nur in C selbst, sondern in allen C-ähnlichen Sprachen ist das so. Das ist ja gerade der Witz an den logischen Operatoren verglichen mit den Bit-Operatoren.

/* C-Version */
#include <stdio.h>

int f1() {
    printf("f1: false\n");
    return 0;
}

int f2() {
    printf("f2: true\n");
    return 1;
}

int main() {
    if (f1() && f2()) {
        printf("Beide true!\n");
    }

    printf("Ende!\n");

    return 0;
}

/* Java-Version */
public class logAnd {
    public static boolean f1() {
        System.out.println("f1: false");
        return false;
    }

    public static boolean f2() {
        System.out.println("f2: true");
        return true;
    }

    public static void main(String[] sArgs) {
        if (f1() && f2()) {
            System.out.println("Beide true...");
        }

        System.out.println("Ende!");
    }
}

/* PHP-Version */
<?php
    
function f1() {
        echo 
"f1: false<br/>";
        return 
false;
    }

    function 
f2() {
        echo 
"f2: true<br/>";
        return 
true;
    }

    if (
f1() && f2()) {
        echo 
"Beide true<br/>";
    }

    echo 
"Ende<br/>";
?>


Verhalten sich alle gleich. :) Die Ausgabe ist immer:


f1: false
Ende!


Gruß,
Dennis 8)

Ich meinte eher das Verhalten mit dem Schleifenzähle rund dem Array.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

Offline Dennis Schulmeister

  • Moderator
  • *****
  • Beiträge: 535
  • Do be do be do -- Sinatra.
Re: C Code mit CC65 - nächste DAU-Frage
« Antwort #15 am: Do 22.05.2008, 12:11:42 »
Wieso? Kommt duch aufs gleiche heraus.

Wenn der Ausdruck

((i < 5) && (array[ i ])) lautet, wird array[ i ] nicht ausgewertet, wenn (i < 5) nicht zutrifft.

Dem Operator && bzw. || ist es ja egal, woher die Werte kommen, die er verknüpft. Ob das nun eine Funktion ist, ein logischer Ausdruck, eine Konstante, ...

Gruß,
Dennis 8)
Wenn ich mal groß bin, will ich bei Atari arbeiten.