Autor Thema: Nochmal fragen in C...  (Gelesen 19274 mal)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« am: 05. March 2005, 11:15 »
Hallo,
wenn ich das hier


void SetCursor(int, int);
void ClearScreen();
void NewLine();
void print(char *);

/*
Diese datei enthält die Video-Funktionen
*/


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

/**********************************************/

void SetCursor(int _xPos,int _yPos)
{
xPos = _xPos;
yPos = _yPos;
*VideoMem = (char*)0xB8000;
*VideoMem = *VideoMem + (xPos*2-2)
*VideoMem = *VideoMem + (yPos-1)*160
};

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

};

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++;
}
};
};

void NewLine
{
};

kompilieren will, dann kommenn total viele Fehlermeldungen, aber ich finde einfach keine Fehler, findet ihr welche?

Danke schon mal und ich hoffe ich nerv net....

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 05. March 2005, 11:56 »
welche fehlermeldungen denn?
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: 05. March 2005, 12:12 »

video.c: In Funktion »SetCursor«:
video.c:33: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
video.c:35: error: invalid operands to binary *
video.c:36: error: Fehler beim Parsen before '}' token
video.c: In Funktion »ClearScreen«:
video.c:49: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
In Datei, eingefügt von kernel.c:16:
video.c:55:47: Warnung: Zeichenkonstante mit mehreren Zeichen
video.c: In Funktion »print«:
video.c:68: error: Fehler beim Parsen before "else"
video.c: Auf höchster Ebene:
video.c:78: error: Syntaxfehler before '{' token



 :D

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. March 2005, 12:33 »
Hi,

Tut mir leid, aber der Code ist totaler schrott. Ein Tipp: Kauf dir ein anständiges Buch über C. (-> Amazon) oder lies dir zumindest ein paar Tutorials zu den grundlegensten(!) Sachen von C durch.

Ich geh hier mal auf die gröbsten Sachen ein.

in void SetCursor(int _xPos,int _yPos) :
Wenn du den Zeiger VideoMem verändern willst, musst du auch VideoMem schreiben und nicht *VideoMem. Du musst *VideoMem schreiben, wenn du einen Wert, an die Stelle, auf die VideoMem zeigt schreiben willst.


   *VideoMem = (char*)0xB8000;
   *VideoMem = *VideoMem + (xPos*2-2)
   *VideoMem = *VideoMem + (yPos-1)*160  

wird zu

   VideoMem = (char*)0xB8000;
   VideoMem = VideoMem + (xPos*2-2);
   VideoMem = VideoMem + (yPos-1)*160;  


Das Semikolon an dem Ende der Funktion ist überflüssig. Dafür müssen hinter die Zuweisungen welche.

in void ClearScreen():
Bei for-Schleifen steht im 2. Ausdruck, das, was wahr sein muss, damit die Schleife durchlaufen wird. Es muss also for (i=0; i<4000; i++) heissen. Es muss auch wieder VideoMem = (char*)0xB8000;  heissen und diese Anweisung muss vor der for-Schleife stehen!

void print (char *string):
bekannte fehler in:
for(*VideoMem = *string; *VideoMem =! '/0'; *VideoMem++)
muss wenn überhaupt so lauten:
for(; *string != '\0'; VideoMem++)
*VideoMem = *string sorgt dafür, dass der erste buchstabe in string in den videospeicher geschrieben wird. das ist aber nicht so sinnvoll, wenn es ein string der länge 0 ist. dann wird nämlich eine null an den videospeicher geschrieben.

die abbruchbedingung ist erfüllt, wenn der string zuende ist, nicht irgendwas im Videospeicher (*VideoMem) 0 ist. Außerdem ist *VideoMem =! '/0' syntaktischer Schrott. Es müsste wenn überhaupt *VideoMem != '\0' heissen. Von der Logik her passt es aber wie gesagt nicht.
Das VideoMem++ würd ich eher in die Schleife tun, weil das übersichtlicher wird. Dann wird die for-schleiche vereinfacht zu while(*string)

Die Schleife würde ich so schreiben:
while(*string)
   {
      *VideoMem++ = *string++; // sprich den wert in *string nach *VideoMem schreiben und beide (VideoMem und string) erhöhen
      *VideoMem++ = '7';  // sprich: 7 nach *VideoMem schreiben und VideoMem um 1 erhöhen

...


Ans ende der if-Abfragen und der for-schleifen kommen auch keine Semikolons.

void NewLine

soll wohl
void NewLine()
heissen

das sollten alle parse-errors gewesen sein. getestet hab ichs allerdings nicht
Dieser Text wird unter jedem Beitrag angezeigt.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 05. March 2005, 12:41 »
Ja, naja erstmal danke.
Kannst du ein gutes buch empfehlen?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 06. March 2005, 15:12 »
Suche mal "C von A bis Z" das gibt es als Online-Buch.
Ansonsten mal bei http://de.wikibooks.org nachschlagen, da is n C-Buch drin. Taugt aber m.E. nicht viel.

Mvh Svenska

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 08. March 2005, 14:07 »
Ich hab nochmal ne Frage:
Der C-Compiler hängt ja eine 0 an, aber ist das eine "normale" 0, oder "/0"?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 08. March 2005, 14:14 »
Was du meinst ist wohl "\0" und die "\0" ist die "normale" Null, nämlich einfach ein 0-Byte hinten drann, wenn du jetzt aber eine "0" in einen String eintippst, so ist dies keine null sondern das ASCII-Zeichen für Null, soweit ich weiß :)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 08. March 2005, 17:13 »
Ja, ich hab \0 gemeint. Danke

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 08. March 2005, 18:00 »
Noch was: Gibt es eine Schleife, ohne eine Bedingung, die ewig durchläuft?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 08. March 2005, 20:27 »
while(true)
{

}

du solltest wirklich C lernen...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #11 am: 10. March 2005, 09:29 »
Mein C Buch sagt zum Thema Endlosschleife:
for (;;) { Anweisungen }
aber ich nehme auch lieber while(1) { Anweisungen }
Also eine Bedingung muss Pro Forma bei Schleifen IMMER angegeben werden.
Aber es gibt noch eine Lösung die (keine Ahnung warum) recht verpönt sein soll. Und zwar mit Goto, das fügt dann direkt ein jmp im asm code ein, also ne endlose Wiederholung. Weiss jemand warum Goto so schlecht sein soll? Angeblich ja wegen der Übersicht, dem kann ich mich aber irgendwie nicht anschliessen. (liegt wohl daran das Asm-Coder an solch Zeug gewöhnt sind)
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #12 am: 10. March 2005, 10:54 »
mein informatik lehrer hat gesagt man hat angst das er dann irgendwo hinspringt wo man es nicht beabsichtigt.. meiner meinung nach ist das vollkommener stuss... :D

aber ich persönlich mache auch des while (1) { };

ich mache sogar immer noch semikolon hinter den geschweiften klammern obwohl es gar nicht verlangt ist, ausser bei strukturen glaube ich....

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 10. March 2005, 15:47 »
Und bei Klassen, die aber nur Strukturen mit Funktionen sind ;)

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #14 am: 11. March 2005, 15:50 »
und nem this-pointer und einiges andres zeug mehr;)
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 11. March 2005, 16:10 »
Und nach jedem normalen Befehl :D *unötigpost*

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #16 am: 11. March 2005, 18:09 »
und nach jedem unnötigen *unnötigpost" post...  (O.o);

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #17 am: 12. March 2005, 12:48 »
Nein ich meinte das Klassen viel mehr als Struktur+Funktion ist.
Z.B. gibt es den this-pointer.
Jetzt verstanden?
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 12. March 2005, 16:22 »
Sorry, aber ich hab noch ne Frage: Wenn ich

char*VideoMem=(char*)0xB8000;

int xPos=0;
int yPos=0;

void printf (char *string)
{
char zeichen=string;
while(zeichen != '\0')
{
switch(zeichen)
{
case '\n':
/*NewLine();*/
break;
case '\t':
/*PrintTab();*/
break;
default:
print(zeichen);
}
*string++;
zeichen=string;
}
}



void print(unsigned char _zeichen)
{
if(xPos==80)
{
xPos=1;
yPos++;
if(yPos==26)
{
/*ClearScreen();*/
yPos=1;
char*VideoMem=(char*)0xB8000;
}
}
VideoMem=_zeichen;
xPos++;
*VideoMem++;
VideoMem=7;
}

kompilieren will, dann kommen die Warnungen:
video.c: In Funktion »printf«:
video.c:8: Warnung: Initialisierung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
video.c:23: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
video.c: Auf höchster Ebene:
video.c:30: Warnung: type mismatch with previous implicit declaration
video.c:20: Warnung: previous implicit declaration of `print'
video.c:30: Warnung: »print« wurde bereits implizit deklariert, »int« zurückzugeben
video.c: In Funktion »print«:
video.c:42: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
video.c:45: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung

Kann mir da jemand helfen?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 12. March 2005, 21:46 »
ich hab mal an die veränderten zeilen // <- zeile xxx rangeschrieben damit man sie besser erkennt.

wenn du eine funktion (hier die print-funktion) verwendest, die du erst weiter unten definierst, musst du sie vorher deklarieren.
und dann noch ein paar sachen, wo du das * vergessen hast.

sollte so funktionuckeln, hab ich aber nicht getestet ...


char*VideoMem=(char*)0xB8000;

int xPos=0;
int yPos=0;

// du musst print deklarieren _bevor_ du es verwendest:
void print(unsigned char _zeichen); // <------- zeile 20/30

void printf (char *string)
{
   char zeichen=*string; // <------- zeile 8
   while(zeichen != '\0')
   {
      switch(zeichen)
      {  
         case '\n':
            /*NewLine();*/
            break;
         case '\t':
            /*PrintTab();*/
            break;
         default:
            print(zeichen);
      }
      *string++;
      zeichen=*string; // <------- zeile 23
   }
}



void print(unsigned char _zeichen)
{
   if(xPos==80)
   {
      xPos=1;
      yPos++;
      if(yPos==26)
      {
         /*ClearScreen();*/
         yPos=1;
         char*VideoMem=(char*)0xB8000;
      }
   }
   *VideoMem=_zeichen; // <------- zeile 42
   xPos++;
   *VideoMem++;
   *VideoMem=7; // <------- zeile 45
}
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen