Am 13.12.2014 23:09, schrieb Hartwig Atrops:
Hallo.
On Saturday 13 December 2014 18:59:11 Jürgen Hochwald wrote:
Hallo,
ich habe momentan ein Problem mit einem selbst erstellen C++-Programm, wo ich momentan nicht richtig weiter komme ().
Es geht um den system()-Aufruf, um aus dem Programm heraus eine anderen Befehl auszuführen. Das ganze passiert in einer Schleife, wo mehrere Aufrufe nacheinander erfolgen.
sprintf(Cmd,"echo \"convert %s_.ppm %s.jpg\" >>
test",BaseFileName,BaseFileName);
system(Cmd);
Das Problem ist, daß der Aufruf genau 8 mal korrekt gemacht wird (Rückgabe 0), und alle weitere Aufrufe schlagen fehl (Rückgabe -1).
Das schreit doch geradezu nach einem Debugger - stimmen die spaeteren Kommandozeilen, die du an system() uebergibst, ueberhaupt noch?
Das Ganze passiert nur in der Komplexität des gesamten Programms (wo ich nicht näher 'dauf eingehen will, da zu kompliziert. Grob geht es um eine Mandelbrot-Bildergallerie, wo auch die Bildparameter per GMP rekursiv verarbeitet werden, um einen klickbaren Zoom zu bekommen).
Bildverarbeitung rekursiv??? Da laeuten bei mir die Alarmglocken. Stack overflow?
Mach ich eine einfache for()-Schleife funktioniert das problemlos. Das Problem muß also mit dem Geraffel darum zusammen hängen.
Um überhaupt einen Ansatzpunkt zu bekommen, versuche ich heraus zu bekommen, welcher Fehler bei dem system()-Aufruf passiert. Die Auswertung von 'errno' liefert -12, was 'out of memory' bedeutet, sofern errno überhaupt durch system() gesetzt wird. Kann ich mir aber nicht vorstellen, die Kiste hat 8Gb und es läuft nichts speicherfressendes (kinfocenter zeigt 73% freier physischer Speicher an).
system ist Suse 13.1/64, letztes Onlineupdate eben gerade, g++ ist
g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
Was kann ich machen, um dem Fehler aus die Spur zu kommen ?
Viel Spass beim Debuggen und Gruss,
Hartwig
Hi, convert kann je nach Bildgröße schon ganz schön was an RAM schlucken... AFAIK versucht es, die gesamte Operation im RAM zu erledigen. Ich würde eine Zwangspause zwischen die einzelnen Systemrufe legen, evt. gibt der Kernel einfach nur den Speicher nicht schnell genug wieder frei. sleep(1) wäre eine Möglichkeit, für kürzere Zeiten irgendeine sinnfreie Schleife oder was mit time()... cu jth -- www.teddylinx.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org