atari-home.de - Foren

Software => Coding => Thema gestartet von: matashen am So 18.05.2008, 22:46:53

Titel: C Code mit CC65 - nächste DAU-Frage
Beitrag von: matashen 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
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: tuxie am So 18.05.2008, 22:59:13
SO?

if (i=1) && (j=0) anweisung1;
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: Dennis Schulmeister 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)
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: matashen am Mo 19.05.2008, 18:37:59
Danke für die ausführliche Darlegung.

Ein Math.h hat der CC65 nicht.

Gruß Matthias
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: Dennis Schulmeister 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)
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: matashen 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...
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: gstoll am Di 20.05.2008, 20:32:59
Leer
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: gstoll am Di 20.05.2008, 20:38:27
Leer
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: Dennis Schulmeister 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)
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: simonsunnyboy 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.
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: Dennis Schulmeister 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)
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: Dennis Schulmeister 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)
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: matashen am Mi 21.05.2008, 23:52:20
Na da hab ich ja wieder was ausgelöst...
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: Dennis Schulmeister am Do 22.05.2008, 01:10:54
Hehehe, ja und? ;)
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: simonsunnyboy 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.
Titel: Re: C Code mit CC65 - nächste DAU-Frage
Beitrag von: Dennis Schulmeister 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)