Forum
Tipps
News
Menu-Icon

error string constant - C

Hallo,

Ich mache gerade eine Versuchsreihe von Betriebssysteme. Und zwar gernauer gesagt geht es dabei immer um das bekannte Thema, kann man in C/C++ einen Kernel schreiben!

Ich habe leider über 1Jahr nicht mehr in C bzw. C++ programmiert.

Leider hänge ich bei folgenden Code:

extern "C" void prnt(char *var);
extern char boot;

int main()
{
char *str;
str=&boot;
prnt(str);
return 0;
}


Meldung:
Z1 : kernel.c : parse error before string constant

Also IDE bzw. Compiler benutze ich DEV-C++ 4.9.9.0 von bloodshed.

Würd mich freuen auf eine schnelle Hilfe!


Antworten zu error string constant - C:

Hallo,

leider ist der Fehler noch nicht behoben. Ein Fehler hab ich in der ersten Zeile allerdings schon gefunden. prnt ---müsste eigendlich heißen---> print

Ich hoffe mir kann trotzdem noch jemand helfen bei Z1

Keine ahnung von C++ aber vielleicht hilft ja der hinweis das das 2te print auch ohne i ist(zeile 8). Manchmal sinds ja solche simplen sachen ():-)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hast du den Compiler vielleicht irgendwie in einer art "Kompatibilitätsmodus" oder so laufen, so dass er wie ein C-Compiler anstatt wie ein C++-Compiler agiert. Dann wäre das "C" ja überflüssig.

Ansonsten fällt mir auch nix ein, das "C" ist ja die einzige String-Konstante, die du da hast.

Ja, welchen C Compiler benutzt ihr den?

Weil das ist ein Code für einen Kernel. (Bitte nicht denken das das der ganze Code ist! XD )

Vielleicht hilft mir ein andern Compiler weiter!

Ach was ich noch schnell hinzufügen wollte. Ich brauche nur einen C++ Compiler! Weil Dev-Cpp hat einen Linker. Und er Linkt sofort nach dem Compileren. Und für das OS soll nur compiliert werden und linkt wird später mit dem ASM Kernel.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Alsoo deinen Kernel must du erstmal bischen überarbeiten ;D

Als erstes must du wissen das ALLE funktionen wie "system" "cout" oder "printf" NICHT gehen werden !

Alle Funktionen must du selber schreiben.
Und da ist meist sehr viel Assembler gefragt. Was mit abstand die schwerste programmiersprache ist die ich kenne.

Hier ein C Kernel beispiel:

**Code würde nicht Funktionieren !!**

und das return 0; brauchst du nicht weil das ja den wert 0 an das betriebssystem zurückgibt und da wir das betriebssystem selbst programmieren muss man das nich ;D

In den Kommentaren sind die Funktionen Beschrieben !

MFG
TOMEK 

« Letzte Änderung: 28.02.07, 19:10:54 von Sniper-Hawk »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Noch was sehr wichtiges:

um einen C kernel zu starten musst du ihn auch extra aufrufen. Der Aufruf läuft im prinzip über noch zwei andere "Kernel" das heist insgesamt 3 Kernel. So komisch es klingt aber es ist so. 2 in Assembler und 1 in C/C++.
Das lustige bei der ganzen sache ist... das alles muss unter PMode(=Protected Mode) laufen. Was meinem kernel wohl leider nicht entspricht. Naja war auch nur ein beispiel...
Da im Protected mode keine BIOS-Interrupts erlaubt sind. Ist es übertrieben schwer erstmal grundfunktionen hinzukriegen. Und noch lustiger ist es das man noch dazu den Tastatur-Treiber selber schreiben muss wenn du später was mit eingabe und so machen willst... alsoo ist das alles ultra kompliziert.. ich versuch mich auch durch diesen wahnsinn durchzukäpfen...

Hier ein Link zur anleitung für C Kernel: http://lowlevel.brainsware.org/wiki/index.php/C-Kernel_starten

Und guckt dich umbedingt hier um: http://lowlevel.brainsware.org/

MFG
TOMEK 

Ja, ich weiß das man 2 ASM Kernel braucht und 1 C/C++ Kernel. Zum testen habe ich da schon ein vorprogrammieren Code genohmen, der einfach nur auf 32Bit umschaltet und zum C Kernel verweist.

Eine frage noch... ...mit welche Compiler hast du den oberen Code compiliert?

Also welchen benutzt du dafür?

Du weißt es ja bestimmt selber...  ...aber ich möchte hier nochmal drauf hinweisen: Der Code soll nur compiliert werden und NICHT gelinkt werden, weil die 2 ASM Daten UND der 1 C Kernel ja zusammen gelinkt werden und nicht einzel! Leider tun viele C bzw. C++ IDE Compilieren und gleich dannach linken. Dies kann man bei den meinsten nicht abschalten.

Und so wie ich mir deinen Code angeguckt habe (hab ja nur schnell mal drüber geschaut) ist das ja wohl in C Code!

MfG
Kai

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich hab das mit Dev-Cpp Kompiliert....

Aber mit der CMD must du dann im verzeichniss von Dev-Cpp gcc.exe ansteuern.

Dann schreibst du z.B. vollgändes:
gcc -S datei.c
Natürlich fügst du deinen eigenen quelldateinamen an.

Edit des Codes :
Sorry... aber denk dir jetzt bitte meinen C Code weg...
Ich hab erst später gemerkt das er für den Protected Mode nicht geeignet ist... Und dass man C/C++ Kernel nicht im RealMode starten kann....
TML

MFG
TOMEK

 

Also, ich hab deinen Code ausprobiert so wie dus gesagt hast!
Leider kommen verschiedene Fehler:

 

Zitat
ckernel-CH.c:73: error: conflicting types for 'ASM_MAKE_COLOR'
ckernel-CH.c:68: error: previous implicit declaration of 'ASM_MAKE_COLOR' was here
ckernel-CH.c:99: error: conflicting types for 'ASM_DRAW_PIXEL'
ckernel-CH.c:95: error: previous implicit declaration of 'ASM_DRAW_PIXEL' was here
ckernel-CH.c: In function `VM_PutText':
ckernel-CH.c:122: error: syntax error before '[' token
ckernel-CH.c: At top level:
ckernel-CH.c:128: error: conflicting types for 'ASM_PUT_TEXT'
ckernel-CH.c:125: error: previous implicit declaration of 'ASM_PUT_TEXT' was here

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Sorry aber der kernel den ich da hatte würde doch nicht funktionieren..

Ich hab eine Header für sowas gemacht:

Kernel.h

#ifndef KERNEL_H
#define KERNEL_H

#include "READ_KEY.h"

int MONITOR_POS = 0x0B0000;

void MonitorPosition(int hexpos)
{
      MONITOR_POS = hexpos;
}

void Print(char* text)
{
     char *MONO = ( char* ) MONITOR_POS;
     *text = *MONO;
}

void LineDown()
{
     int MONP =  0x0B0000;
     int FIRST = 0x0B0000;
     int LAST  = 0x0B0050;
     if (MONITOR_POS > FIRST && MONITOR_POS < LAST)
     {
        MONITOR_POS = 0x0B0050;
     }
     while(1)
     {
        MONP  = MONP  + 0x50;
        FIRST = FIRST + 0x51;
        LAST  = LAST  + 0x51;
        if(MONITOR_POS > FIRST && MONITOR_POS < LAST)
        {
           MONITOR_POS = MONP;
           break;
        }
     }
}

#define in  0
#define out 1

#define MONO 0x000B0000

namespace IO
{
    void Adress(int adr, int *value, int type) //0 = in, 1 = out
    {
        if(type == in)
        {
            int *ADR = ( int* ) adr;
            int VALUE = ( int ) value;
            VALUE = ADR[0];
        }
        else if(type == out)
        {
            int *ADR = ( int* ) adr;
            int *VALUE = value;
            *ADR = *value;
        }
    }
}

void Reboot()
{
    __asm(" .byte 0x0EA   \n\t"
          " .long 0x0000  \n\t"
          " .long 0x0FFFF \n\t");
}     

#endif /*KERNEL_H*/

READ_KEY.h
#ifndef READ_KEY_H
#define READ_KEY_H

int *SEND;
int *OUT_ADR = ( int* ) 0x00000010;

void READ_KEY_PORT(int SCANNCODE_p ,int* OUTPUT_CODE)
{
    if(SCANNCODE == SCANNCODE_p)
    {
          while(1)
          {
             SCANNCODE = KEY_PORT[0];
             *SEND = *OUTPUT_CODE;
             *SEND = *OUT_ADR;
             if(SCANNCODE = 0xF0)
             {
                break;
             }
          }
    }
}

void READ_KEY(int var)
{
    var = OUT_ADR[0];
}   

#endif /*READ_KEY

dann sieht so ein Kernel z.B. so aus:

Kernel.cpp
#include "kernel.h"

int main()
{
    Print("Welcome to GAGA-OS"); //Nur ein beispiel ^^
    LineDown();
    Print("Press any Key to Reboot");
    while(1)
    {
       int VAR_C;
       int SCANNCODE= 0x01;
       READ_KEY_PORT(SCANNCODE, 0x00);
       SCANNCODE++;
       READ_KEY(VAR_C);
       if(VAR_C > 0x01)
       {
          break;
      }   
   }   
}   

Ich habs getestet.. compilieren lässt´s sich !  ;D

Hier die Funktionen die du Benutzen kannst:

Print(const char* text)
Gibt einen Text aus (Parameter 'text')

MonitorPosition(int hexpos)
verändert die Position schreib Position
Bei auflösung 80x25 (Zeichen keine Pixel !)
Die Position wird in Hexadeziemal angegeben.
Position 0 ist = 0x000B0000
jedes zeichen ist dann plus eins, alsoo Position 1 = 0x000B0001

LineDown()
Ein einfacher Zeilenumbruch.

IO::Adresse(int adr, int *value, int type)
Wenn der letzte Parameter 'type' gleich 'in' ist, dann ließt er von einer Adresse. Wenn 'out' dann schreibt er in eine Adresse.
Wenn Parameter gleich 'out':
Schreibt in eine Adresse (Parameter 'adr')
Den Wert zum schreiben (Parameter 'value')
Wenn Parameter gleich 'in':
Ließt von einer Adresse (Parameter 'adr')
Variable wo der Wert gespeicher wird (Parameter 'value')

Reboot()
Neustart des Computers.

READ_KEY_PORT(int SCANNCODE_p, int* OUTPUT_CODE)
Hier wird eine Taste vom TastaturPort gelesen und dann an einen Allgemeinen Tastaturpuffer geschickt.
Im Parameter 'SCANNCODE_p' schreibst du hin welche Taste abgefragt wird. Dazu musst du wissen welche Taste welchen Scanncode hat. Hier findest du eine liste mit der Deutschen scanncode belegung.
Im Parameter 'OUTPUT_CODE' musst du dem enstprechend einen Code liefern der in den TastaturPuffer geht. Verwende dazu eine eigene liste oder benutz meine: hier

READ_KEY(int var)
Hier wird aus dem Tastaturpuffer gelesen.
Im Parameter 'var' wird der Wert gespeichert !

Ich hoffe mal ich konnte dir helfen... hab mich fast tot gecoded ;D

Außerdem: kernel.h und READ_KEY.h in einem Ordner kopieren. Oder du änderst in kernel.h den #include !

MFG
TOMEK


 
   
« Letzte Änderung: 28.02.07, 20:52:35 von Sniper-Hawk »

Danke... ...im hab den Code zwar jetzt noch nicht getestet, aba das werde ich gleich morgen machen... ...ach un wenn du schonmal dabei bist könntest du mir auch gleich noch weiter helfen bei verschiedenen Sachen... ...meine ICQ nr. 244515909

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

gern ;D

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

sorry.. aber haste vielleicht MSN ? wäre besser...  ;D
Denn ich hab kein ICQ...  :P


« Microsoft Visual Basic 2005 ExpressGutscheinnummern mit Excel »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
C++
C++ ist eine von der ISO standardisierte Programmiersprache und eine erweiterte Form von C zur objektorientierten, generischen und prozeduralen Programmierung. Weitestgeh...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...