amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > SystemTags Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

18.11.2006, 16:08 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Hallo!
Ich habe ein Problem mit diesem Code:
C++ code:
GCC_IN = (FileHandle*)Open("CON:////Command Output/CLOSE/AUTO/WAIT", MODE_OLDFILE);
GCC_OUT = (FileHandle*)Open("Ram:GCC_OUT", MODE_NEWFILE);
SystemTags(CompilerOptions.c_str(), SYS_Input, GCC_IN, SYS_Output, GCC_OUT, TAG_DONE, 0);
Close(GCC_IN);
Close(GCC_OUT);


Der Code funktioniert eigentlich perfekt (gcc kompiliert ein Projekt).
Wenn ich den code aber ein zweites mal aufrufe, kommt die Meldung "Aborted." und mein Programm hängt sich auf.

Das ganze passiert unter Aros.


--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

18.11.2006, 22:08 Uhr

Mazze
Posts: 263
Nutzer
@Kaesebroetchen:
Probiere mal folgendes:
Du solltest per SYS_Asynch festlegen, ob das gestartete Programm parallel zum Hauptprogramm läuft (TRUE), oder ob SystemTags wartet, bis das Programm beendet wird (FALSE). Im ersten Fall werden die In- und Out-Kanäle automatisch geschlossen.

--
AROS - Because every rose has its dorns.
Meine Homepage

[ - Antworten - Zitieren - Direktlink - ]

18.11.2006, 22:45 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@Mazze:
Danke für den Tip.
Ich habe den Fehler gerade gefunden,
es lag gar nicht an der SystemTags Funktion sondern an einem anderen Teile meines Programms.
Das einzige was mir jetzt noch Kopfschmerzen macht, ist wie ich die Fehlermeldungen des gcc in einen String bekomme und das entsprechende Workbenchausgabefenster unterdrücke.
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

18.11.2006, 23:48 Uhr

Mazze
Posts: 263
Nutzer
@Kaesebroetchen:

Unter AROS kannst Du auch den Fehlerkanal umleiten:

/* Aros specific */
/* (BPTR/struct FileHandle *) Output filehandle. This must be a different
filehandle from than supllied to SYS_Input. Default is Error() of the
current process. */
#define SYS_Error (SYS_Dummy + 10)
--
AROS - Because every rose has its dorns.
Meine Homepage

[ - Antworten - Zitieren - Direktlink - ]

19.11.2006, 01:10 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@Mazze:
Muss ich mir im einzelnen nochmal genauer ansehen.
Ich habe leider bisher noch kein Codebeispiel gefunden wo die Ausgaben eines Shell Befehls eingelesen werden.
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

19.11.2006, 01:38 Uhr

Mazze
Posts: 263
Nutzer
@Kaesebroetchen:

Wenn Du die Ausgabe in eine Datei umleitest, kannst Du diese Datei öffnen und einlesen.
--
AROS - Because every rose has its dorns.
Meine Homepage

[ - Antworten - Zitieren - Direktlink - ]

19.11.2006, 01:43 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@Mazze:
Soweit ich das überschaue öffne ich eine Datein über BPTR/FileHandle und übergebe den Zeige der SystemTags Fuktion. Bei mir kam wenn ich die Datei öffnen wollte dann immer "ungültiger Hunk" oder so ähnlich.
Wird das irgendwie binär codiert ? Eine Textdatei bekam ich da jedenfalls nicht raus..
--
http://amidevcpp.amiga-world.de/

[ - Antworten - Zitieren - Direktlink - ]

19.11.2006, 11:32 Uhr

Mazze
Posts: 263
Nutzer
@Kaesebroetchen:

So wird in WBInfo C:Version aufgerufen:
SYS_Asynch habe ich auf FALSE gesetzt, damit ich weiß, wann das aufgerufen Programm fertig ist. Ein großer Stack dürfte für den GCC auch wichtig sein. Eigentlich würde es genügen, den Lesezeiger mit 'Seek' auf den Dateianfang zu setzen. Da das nicht klappt, schließe ich die Datei und öffne sie erneut.

code:
output = Open(tmpfilename, MODE_OLDFILE);
    if (output == NULL)
    {
        D(bug("[WBInfo/Getversion] Can't create tmpfilen"));
        goto exit;
    }

    if (SystemTags(commandline,
                SYS_Asynch,          FALSE,
                SYS_Output,   (IPTR) output,
                //SYS_Error,    (IPTR) NULL,
                NP_StackSize,        16000,
                TAG_DONE) != 0)
    {
        D(bug("[WBInfo/Getversion] SystemTags failedn"));
        goto exit;
    }

    // Seek didn't work for me on RAM-Disk, so we reopen the file
    Close(output);
    output = Open(tmpfilename, MODE_OLDFILE);
    if (output == NULL)
    {
        D(bug("[WBInfo/GetVersion] Can't open tmpfilen"));
        goto exit;
    }
    // read result
    if (Read(output, result, sizeof(result) - 1) == -1)
    {
        D(bug("[WBInfo/GetVersion] Can't read from tmpfilen"));
        goto exit;
    }
    close(output)


--
AROS - Because every rose has its dorns.
Meine Homepage

[ - Antworten - Zitieren - Direktlink - ]

19.11.2006, 13:52 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Kaesebroetchen:
C++ code:
GCC_IN = (FileHandle*)Open("CON:////Command Output/CLOSE/AUTO/WAIT", MODE_OLDFILE);
GCC_OUT = (FileHandle*)Open("Ram:GCC_OUT", MODE_NEWFILE);


Open liefert BPTR zurück, und die auf (FileHandle*) oder auch auch nur irgendwas zu casten ist grundsätzlich falsch. BPTR ist kein Pointer!

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > SystemTags Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.