Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: syxce am 24. December 2005, 22:46

Titel: Invalid Operand
Beitrag von: syxce 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;
Titel: Invalid Operand
Beitrag von: SSJ7Gohan 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.
Titel: Invalid Operand
Beitrag von: Legend am 24. December 2005, 23:41
Ich glaub das soll gerundet sein.
Titel: Invalid Operand
Beitrag von: SSJ7Gohan 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.
Titel: Invalid Operand
Beitrag von: syxce am 25. December 2005, 12:01
vidmem ist ein Integer, mag sein das es am gcc liegt, mit borland funktioniert es.
Titel: Invalid Operand
Beitrag von: SSJ7Gohan 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?