Autor Thema: Problem in C  (Gelesen 15465 mal)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« am: 24. February 2005, 16:40 »
Hallo,
wenn ich in C nen zeiger auf den Video-Speicher habe char *VideoMem = (char*)0xB8000; und dann den Bildschirm leeren will, dann mach ich das ja am besten mit einer while schleife,

char *VideoMem = (char*)0xB8000;

void ClearScreen(int i)
{
while(i=4000)
{
}
}

nur wie mach ich das, dass char *VideoMem nun auf das nächste byte zeigt, also auf VideoMem + die zählervariable i?
Ich hoffe man kan verstehen, was ich will

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 24. February 2005, 17:51 »
einfach den pointer erhöhen... soweit ich das mitbekommen habe ist mit "VideoMem" die adresse und mit "*VideoMem" der inhalt gemeint. also einfach "VideoMem++;". kann sein, dass ich mich täusche, bin net gut in C und pointer hab ich schon immer gehasst ;-)

EDIT: nunr kannst du also mit "*VideoMem" den inhalt ansprechen und dadurch mit:

char *VideoMem = (char*)0xB8000;

void ClearScreen(int i)
{
   while(i=8000)
   {
*VideoMem = 0
VideoMem++;
   }
}

den speicher leeren.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 24. February 2005, 17:55 »
ich auch  :wink:
Ja, den pointer erhöhen, schon klar, aber ich will ihn ja genau 4000mal erhöhen, aber ich weiß net wie des mit i machen soll

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 24. February 2005, 17:57 »
Zitat von: JG
ich auch  :wink:
Ja, den pointer erhöhen, schon klar, aber ich will ihn ja genau 4000mal erhöhen, aber ich weiß net wie des mit i machen soll


wozu mit i? kannst es auch nur so machen, is net so aufwändig.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 24. February 2005, 18:20 »
Ich hab grad mal im Code voon Pirat-os (z4ck) nachgeguckt und da is es so:

void ClearScreen (int _color)
{
int i;
for (i=0; i<(80*25*2); i++)
{
videomem[i] = '  ';
i++;
videomem[i] = _color;
}
posy=0;
posx=0;

};

Ich werd mal z4ck fragen, ob ich des übernehmen darf

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #5 am: 24. February 2005, 23:05 »
klar wenn du willst... ;)

ist aber nicht so ne optimale funktion... man könnte anstatt [ein byte schreiben, i erhöhen, ein byte schreiben] auch gerade [ein word schreiben und dann erhöhen] nehmen...
etc..

aber ist halt individuell ;)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 25. February 2005, 09:05 »
ok, danke

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 25. February 2005, 15:16 »
So, ich hab nur ne Frage:
geht die Funktion, oder sind da Fehler?

char *VideoMem = (char*)0xB8000;

void print (char *string)
{
for(*VideoMem = *string; *VideoMem =! '/0'; *VideoMem++)
{
*VideoMem++;
*string++;
*VideoMem = '7';
};
};

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 25. February 2005, 15:30 »
bin mir nich ganz sicher, denk aber das du die funktion max. 1 mal aufrufen kannst und es nachm 2ten mal zu fehlern kommt (nichtlöschung des bildschirms und überschreiben eines anderen speicherbereichs), falls dem tatsächlich so is benenn VideoMem in der funktion einfach um (überschreibt dann nähmlich einfach das original - is ja global)
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #9 am: 25. February 2005, 15:50 »
Ich habs so gelöst, das ich eine extra Variable habe die "Buch" darüber führt, an welcher Stelle sich der Cursor derzeit befindet.


char* pVideoMem = (char*)0xB8000;
unsigned int iVideo_ptr = 0;

void TextOut(char *pText, char cColor)
{
while(*pText)
{
if(*pText == '\r')
{
iVideo_ptr = (iVideo_ptr / 160) * 160;
}
else if(*pText == '\n')
{
iVideo_ptr = (((iVideo_ptr / 160) + 1) * 160) + (iVideo_ptr % 160);
}
else if(*pText == '\t')
{
iVideo_ptr += 8;
}
else
{
pVideoMem[iVideo_ptr] = *pText;
iVideo_ptr++;
pVideoMem[iVideo_ptr] = cColor;
iVideo_ptr++;
}

pText++;
}
}

----------------------
Redakteur bei LowLevel

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 25. February 2005, 16:39 »
So, ich hab den Code mal geändeet, so müsste es nun gehen, oder?

char *VideoMem = (char*)0xB8000;
int xPos=0;
int yPos=0;

void ClearScreen()
{
int i;
for (i=0; i==4000; i++)
{
videomem[i] = ' ';
i++;
videomem[i] = 7;
}
yPos=0;
xPos=0;

};

void print (char *string)
{
for(*VideoMem = *string; *VideoMem =! '/0'; *VideoMem++)
{
*VideoMem++;
*string++;
*VideoMem = '7';
if (xPos==80)
{
xPos=1;
if (yPos==25)
{
ClearScreen();
yPos=1;
};
else
{
yPos++;
};
xPos++;
};
};



Danke schon mal

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 26. February 2005, 16:03 »
Weiß das keiner?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #12 am: 26. February 2005, 16:24 »
Zitat von: JG
Weiß das keiner?


versuchs, dann siehst dus  8)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 26. February 2005, 16:27 »
ich arbeite ja noch amm kernel, der is noch net mal zum teil fertig

 

Einloggen