Alten C-Code Umwandeln (C++)



  • bei Portierungen ist das alte und das neue System sehr relevant
    dazu hast du kaum Details geschrieben - bitte jede Frage beantwortet - wenigstens ein "keine Ahnung" und nicht einfach weglassen

    Windows-Konsolen Programm stammt von 1989

    Frage 1: also wohl Windows 2.1x - oder einfach nur DOS 3.x/5.x?, 16Bit kein 32Bit/Extender (wohl zu alt) => damit wissen wir dann ungefähr was so alles möglich war auf dem System
    Frage 2: welcher Kompiler (wird)wurde damals genutzt (Turbo,Borland,Microsoft C,...)? => damit können wir abschätzen wie Standardkonform/Portierbar dein Code ist und welche Strategie am sinnvollsten ist
    Frage 3: Wie umfangreich ist dein Code - wie viel Zeilen?
    Frage 4: Gibt es viele von diesen int86-Interrupt Aufrufen oder sogar Assembler in deinem Code?
    Frage 5: kannst du den Quelltext noch mit dem Original-Kompiler kompilieren und auf dem alten System aktiv nutzen? hast du eine funktionierende Testbasis
    Frage 6: Was ist dein Zielsystem - Win32/64, Linux,... - scheibar Windows - wegen deinen API-Aufrufen
    Frage 7: Warum nutzt du keinen ordentlichen/aktuellen Kompiler wie z.B. den im VS2015/2017 Community oder MinGW - dir unbekannt?, kein Platz auf der Platte? der LCC funktioniert, ist aber kein C++-Kompiler und "Industrie-Standard" ist der auch nicht
    Frage 8: kannst du dein Sourcecode Online stellen - dann ist es wohl am leichtesten dir zu helfen

    Anmerkungen:
    Jede Form von BIOS,Interrupts/Assembler aus deinem alten Projekt kannst du in die Tonne klopfen - maximal noch unter alten 32Bit Windows Versionen nutzbar - die neueren erlauben die Nutzung nicht, unter x64 erst recht nicht
    Aufpassen das deine Typ-Groessen sich geaendert haben int kann in einem alten System 8 Bit sein, in einem neuen z.B. 64 Bit - ganz bloed bei Pointer-Casts und solchen Sachen

    die C-Syntax aus alten Quellen wird von heutigen Kompilern nicht mehr so gerne Übersetzt 🙂 - auch wenn du den Interrupt/Asssembler-Code testweise auskommentierst
    wenn es viel Source ist würde ich den erstmal auf der Original-Plattform auf einen etwas aktuelleren Kompiler (Borland, DMC) ziehen und testen ob noch alles funktioniert

    Falls es Win-API sein soll
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms687401(v=vs.85).aspx
    http://codesteps.com/2014/07/06/win32-programming-how-to-create-a-simple-console-based-application/
    google hilft da schnell

    oder die "Improved Console 5" Library hier aus dem Forum nutzen
    https://www.c-plusplus.net/forum/307418





  • Hallo Gast3,
    vielen Dank für Deine ausführliche Antwort.
    Zu Deinen Fragen:
    1. war DOS Version 1989
    2. wahrscheinlich QC2 (Quick C)
    3. ca. 600 Codezeilen (aber nur die Funktions-Datei, das Projekt besteht aber aus insgesamt 6 Dateien, Gesamtgröße ca. 2000 Codezeilen
    4. 2 Interruptaufrufe, den einen habe ich ja schon ersetzt, den 2ten fast (siehe beigefügten Code)
    5. Nein es sind 28 Jahre vergangen
    6. Zielsystem ist WINDOWS 10 Pro 64 Bit
    7. Visual Basic 2015 ist vorhanden, ich dachte aber das die Umsetzung mit einem einfachen Compiler einfacher ist.
    8. Die entsprechende Funktion "Fwrite_str_to_disp()" steht am Anfang

    Das mit den Interrupts ist mir nun klar.

    Hier nun mein neuer Code für die Funktion "Fwrite_str_to_disp()"

    void Fwrite_str_to_disp(int iy,int ix,char output,int ilen,int color)
    {
        setcurs(iy,ix);
        HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute( handle, color);
        printf(output);
        SetConsoleTextAttribute( handle, color);
    
    }
    

    Allerdings bekomme ich bei der Zeile "printf(output") folgende Meldung:

    type error in argument 1 to 'printf'; found 'char' expected 'pointer to Char'

    MfG
    Juergen B.
    😕



  • probier mal printf("%c", output);



  • Nimm

    putchar(output);
    

    Und 2x

    SetConsoleTextAttribute(handle, color);
    

    aufzurufen, ist wahrscheinlich auch falsch, oder? Du möchtest evtl. die Farbe wieder auf den vorherigen Wert zurücksetzen, also so etwas wie GetConsoleTextAttribute (was es direkt nicht gibt), aber schau mal in How to get current console background and text colors?

    Edit: Und wenn 'ilen' noch benutzt werden soll, dann noch eine Schleife um die Ausgabe bauen.



  • Fwrite_str_to_disp() ist eine irreführender Name für eine Funktion, die nur ein Zeichen ausgibt.



  • Fwrite_str_to_disp() ist eine irreführender Name für eine Funktion, die nur ein Zeichen ausgibt.

    das sollte sie nicht

    das ist die BIOS-Funktion die er ersetzen will

    http://www.ctyme.com/intr/rb-0099.htm
    schreibt n mal das gleiche Zeichen mit Farbe



  • Gast3 schrieb:

    schreibt n mal das gleiche Zeichen mit Farbe

    Das ist aber kein String im Sinne von C.
    Da hätte ich ein char* als Parameter erwartet.



  • Vermute mal mit der Funktion sollen Menüs auf dem Bildschirm dargestellt werden 😕

    Hier mal ein Entwurf, der sicher noch besser geht:

    #include <windows.h>
    #include <iostream>
    
    void setcurs(int izeile, int ispalte)
    {
        COORD coord;
        coord.X = ispalte;
        coord.Y = izeile;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    }
    
    void Fwrite_str_to_disp(int iy, int ix, char output, int ilen, int color)
    {
        setcurs(iy, ix);
        HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(handle, color);
    	for(int countchar = 0; countchar < ilen; countchar++)
    	{
    		setcurs(iy, ix++);
    		HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
    		putchar(output);	
    	}
    }
    
    int main()
    {
    	Fwrite_str_to_disp(20, 10, 'A', 5, 4);
    	Fwrite_str_to_disp(10, 8, 'Z', 3, 6);
    	std::cin.get();
    }
    

    Die 2,5 Zeilen C++ bekommt ihr auch noch zu C. 😃



  • DirkB schrieb:

    Gast3 schrieb:

    schreibt n mal das gleiche Zeichen mit Farbe

    Das ist aber kein String im Sinne von C.
    Da hätte ich ein char* als Parameter erwartet.

    ja der 28 Jahre alte Name ist schlecht und seine neue Implementierung ist bisher auch noch falsch



  • jbaben schrieb:

    Kann mir dazu jemand einen Tipp geben wie ich ein Zeichen an einer bestimmten Cursor-Position ausgeben kann?

    Alles, was des Windows-Konsole-Programmierers Herz begehrt, findest Du hier:
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682073(v=vs.85).aspx



  • am Ende sollte man immer mal ein Feedback geben - wie sieht es denn aus - alles geklappt?


Anmelden zum Antworten