Forum: PC-Programmierung VGA-Linien stimmen nicht beim Zeichnen.


von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Hallo , guten tag.

Warum stimmen die VGA-Linien 0 und 7 nicht mit 320 Farbpunkten?

Danke.
Gruss

-----------------------------------
#include <dos.h>
#include <conio.h>

#define VIDEO_SEGMENT  0xA000
#define SCREEN_WIDTH   320

void SetTextMode ()
{
    _AH = 0;
    _AL = 0x03;
    geninterrupt (0x10);
}

void SetMode13h ()
{
    _AH = 0;
    _AL = 0x13;
    geninterrupt (0x10);
}

void PutPixel (int x, int y, unsigned char color)
{
    pokeb (VIDEO_SEGMENT, (y * SCREEN_WIDTH) + x, color);
}

int main ()
{
    int x, y;

    SetMode13h ();

    for (x = 0; x <= 320; x++)
    {
      PutPixel (x, 0, 34);
    }

    for (x = 0; x <= 320; x++)
    {
      PutPixel (x, 7, 84);
    }

    while( !kbhit() ){ }
}
--------------------------------

von Rolf M. (rmagnus)


Lesenswert?

Peter B. schrieb:
> for (x = 0; x <= 320; x++)

Du beschreibst hier 321 Pixel!
1
for (x = 0; x < 320; x++)

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Wenn ich x zb auf 290 setze kommt unten das Gebilde raus.
Obwohl x bis 320 geht.

Liegt das evtl an dem Pokeb?

Gruss

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Mir fällt nichts dazu ein, außer dass int ein ungünstiger Typ für die 
Koordinaten ist, da Zwischenergebnisse bei der Berechnung negativ werden 
können. Das Problem kommt aber erst bei y-Koordinaten ab 103 zum Tragen.

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Wenn ich das so schreibe stimmen die Linien.
X muss bei 32 anfangen , warum?

Hier habe ich 200 saubere Linien.

Beim ersten Bild 1. Linie Gelb und Linie 200. Pink.

Gruss

-----------------------------
for (y = 0; y <= 199; y++)
{
   for (x = 32; x <= 351; x++)
   {
     PutPixel (x,y,y);
   }
}
----------------------------

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

Bitte asserts in die putpixel einbauen

assert(x >= 0 && x < 320);
assert(y >= 0 && y < 200);

Diese Wertebereiche darfst du nie verlassen sonst kommt Müll raus
und schau dir noch mal <= und < an, sieht immer ein wenig komisch aus 
bei dir

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> Bitte asserts in die putpixel einbauen
>
> assert(x >= 0 && x < 320);
> assert(y >= 0 && y < 200);
>
> Diese Wertebereiche darfst du nie verlassen sonst kommt Müll raus
> und schau dir noch mal <= und < an, sieht immer ein wenig komisch aus
> bei dir

Dein x geht von [32 bis 351] da eine linie nur 320 pixel hat bist du bei 
351 schon bei der naechsten Linie und 31 Pixel, deswegen die asserts 
einbauen

Das gleiche kann dir natuerlich auch bei y passieren

von cppbert (Gast)


Lesenswert?

da du jetzt schon mehrfach solche X zu gross Fehler gemacht hast würde 
ich dir raten die asserts IMMER in deine Routinen zu bauen, ist sowieso 
guter Stil

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.