Autor Thema: Invalid Operand  (Gelesen 5751 mal)

syxce

  • Beiträge: 45
    • Profil anzeigen
Gespeichert
« am: 24. December 2005, 22:46 »
Hallo,
wenn ich folgende Zeile compilire erhalte ich immer den Fehler "invalid operands to binary".
Wie kann das sein, der wird doch wohl dividieren können ?

 case '\n':
  vidmem = (vidmem/160)*160 + 160;
  break;

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. December 2005, 22:54 »
Mal abgesehen davon, das (vidmem/160)*160 recht sinnfrei ist, welcher Datentyp ist vidmem? void *? vidmem sollte ein Integer oder ein nicht-void pointer sein. Eventuell findet der GCC es auch schwachsinnig Pointer zu dividieren, da man sowas ja normalerweise nicht macht.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #2 am: 24. December 2005, 23:41 »
Ich glaub das soll gerundet sein.
*post*

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 25. December 2005, 11:07 »
Achso^^
Wenn vidmem ein Pointer auf 0xB8000 ist, wird das aber nicht den gewünschten Effekt haben, da 0xB8000 sich nicht ohne Rest durch 160 teilen lässt. Speicher lieber ein Offset, und greif auf den Videospeicher dann so zu:

char *vidmem = (char *)0xB8000;
unsigned long offset = 0;

[...]

case '\n':
offset = (offset/160)*160 + 160;
break;

[...]

void printc(char *c) {
vidmem[offset++] = c;
vidmem[offset++] = attribut;
}


IMHO ist es auch leichter mit Zeilen und Spalten statt mit direkten Pointern/Offsets zu arbeiten.

syxce

  • Beiträge: 45
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 25. December 2005, 12:01 »
vidmem ist ein Integer, mag sein das es am gcc liegt, mit borland funktioniert es.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 25. December 2005, 12:20 »
int vidmem = 569;
vidmem = (vidmem/160)*160 + 160;

Funktioniert bei mir problemlos.

Könnte es sein, das der Fehler an einer anderen Stelle liegt?

 

Einloggen