levu: C / C++: Verständnissprobleme system() und varianten davon

Hallo,

wenn ich ein externes Programm ausführen möchte, was nutze ich dann? system(), oder das in anderen Foren am Rand erwähnte exec(), bzw. wie genau funktionieren die, kann ich einfach schreiben:
system("prg2.exe /a /b /c");
oder wie geht das?

gibt es vielleicht ein gutes Tutorial, was auf fortgeschrittene Programmierung (Funktionspointer, eingebettetes ASM, Netzwerk, IPC, ...) mit C/C++ eingeht? So die Grundlagen sind mir aus anderen Sprachen bekannt und mit Qt hatte ich auch schon einige Erfahrung, aber jetzt ist QT einfach zu langsam, ich möchte ein Programm schreiben, dass sich selbst in der Algorithmik immer wieder den Bedürfnissen anpasst, was sehr rechenintensiv ist (Primzahlenberechnung mit exakt dem gleichen Algorithmus mit Qt ca. 10 - 20 mal langsamer...)

schon mal danke!!

mfg, Flo

--
sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
  1. hallo flo

    also nach 2 sec googeln hab ich das hier gefunden:
    WinExec("exe.exe -m 31304",SW_SHOW);

    ich hab persönlich keine ahnung davon, aber vielleicht hilfts ja trotzdem ;)

    mfg der mech

    1. Hallo SorgenkindMech,

      also nach 2 sec googeln hab ich das hier gefunden:
      WinExec("exe.exe -m 31304",SW_SHOW);

      ich hab persönlich keine ahnung davon, aber vielleicht hilfts ja trotzdem ;)

      Juchuu, und dieses Programm ist schon nicht mehr plattformunabhängig. Oft ist es besser, auf proprietären Kram wie diesen zu verzichten und sich an Standards zu halten. :)

      Grüße

      Marc Reichelt || http://www.marcreichelt.de/

      --
      DPRINTK("Last time you were disconnected, how about now?");
              linux-2.6.6/drivers/net/tokenring/ibmtr.c
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      1. Hallo SorgenkindMech,

        »» also nach 2 sec googeln hab ich das hier gefunden:
        »» WinExec("exe.exe -m 31304",SW_SHOW);
        »»
        »» ich hab persönlich keine ahnung davon, aber vielleicht hilfts ja trotzdem ;)

        Juchuu, und dieses Programm ist schon nicht mehr plattformunabhängig. Oft ist es besser, auf proprietären Kram wie diesen zu verzichten und sich an Standards zu halten. :)

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        joa das war mir klar, aber er wollt ne exe aufrufen, also bin ich mal von win ausgegangen ;)

        ich hab ja bei geschrieben, dass ich davon kein plan hab

        ich bitte dennoch für meine unqualifizierte aussage um verzeihung ;)

  2. Hallo levu,

    wenn ich ein externes Programm ausführen möchte, was nutze ich dann? system(), oder das in anderen Foren am Rand erwähnte exec(), bzw. wie genau funktionieren die, kann ich einfach schreiben:
    system("prg2.exe /a /b /c");
    oder wie geht das?

    Laut C++ Referenz der Methode system(): Ja.

    Das ".exe" kannst du übrigens weglassen - dann klappt das Programm auch unter Linux, wenn es ein entsprechendes Programm gibt und im PATH zu finden ist.

    gibt es vielleicht ein gutes Tutorial, was auf fortgeschrittene Programmierung (Funktionspointer, eingebettetes ASM, Netzwerk, IPC, ...) mit C/C++ eingeht? So die Grundlagen sind mir aus anderen Sprachen bekannt und mit Qt hatte ich auch schon einige Erfahrung, aber jetzt ist QT einfach zu langsam, ich möchte ein Programm schreiben, dass sich selbst in der Algorithmik immer wieder den Bedürfnissen anpasst, was sehr rechenintensiv ist (Primzahlenberechnung mit exakt dem gleichen Algorithmus mit Qt ca. 10 - 20 mal langsamer...)

    Zum Tutorial hoffe ich, dass Andere dir hier gute Vorschläge machen können.

    Jedoch möchte ich bekräftigen, dass sicher nicht Qt für eine langsame Primzahlenberechnung verantwortlich ist. Das ist zu 99% kein Problem von Qt, sondern rührt sicher daher dass du die Ausgabe der Primzahlenberechnung stetig mit Qt realisierst, statt die Primzahlenberechnung in einen eigenen Thread auszulagern und die Werte dann asynchron durch einen anderen Thread auszulesen.

    Wenn du mit fortgeschrittener Programmierung beginnst, sollten Threads (siehe: Threads in Qt 4.4) und Gedanken zur Laufzeit deiner Algorithmen also definitiv dazugehören.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    DPRINTK("Last time you were disconnected, how about now?");
            linux-2.6.6/drivers/net/tokenring/ibmtr.c
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    1. Hallo,

      | wenn ich ein externes Programm ausführen möchte, was nutze ich dann? system(), oder das in anderen Foren am Rand erwähnte exec(), bzw. wie genau funktionieren die, kann ich einfach schreiben:
      | system("prg2.exe /a /b /c");
      | oder wie geht das?

      Laut C++ Referenz der Methode system(): Ja.

      Ah, diese Referenz ist sicher das eine oder andere Mal hilfrreich :)

      Das ".exe" kannst du übrigens weglassen - dann klappt das Programm auch unter Linux, wenn es ein entsprechendes Programm gibt und im PATH zu finden ist.

      Und wie bekomme ich (ohne Qt) den Pfad des aktuellen Programmes? Da hat mir googlen nicht viel weitergeholfen...

      Jedoch möchte ich bekräftigen, dass sicher nicht Qt für eine langsame Primzahlenberechnung verantwortlich ist.

      Es erzeugt aber schonmal einen gewissen Overhead (QApplication, ...) und dann hab ich QInt stat int zu nehmen, wodurch ich die Plattformunabhängigkeit gewährleisten wollte (32 Bit vs. 64 Bit etc.)

      Das ist zu 99% kein Problem von Qt, sondern rührt sicher daher dass du die Ausgabe der Primzahlenberechnung stetig mit Qt realisierst,

      In ein QList ...

      statt die Primzahlenberechnung in einen eigenen Thread auszulagern und die Werte dann asynchron durch einen anderen Thread auszulesen.

      ... und nach dem Stoppen der Zeitmessung ausgegeben

      Wenn du mit fortgeschrittener Programmierung beginnst, sollten Threads (siehe: Threads in Qt 4.4)

      Danke, aber in meinem Buch (Qt 4, Jürgen Wolf) ist das auch erklärt :)

      und Gedanken zur Laufzeit deiner Algorithmen also definitiv dazugehören.

      Interessant :)

      Danke!!

      mfg, Flo

      --
      sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
      1. Hallo levu,

        »» Das ".exe" kannst du übrigens weglassen - dann klappt das Programm auch unter Linux, wenn es ein entsprechendes Programm gibt und im PATH zu finden ist.
        Und wie bekomme ich (ohne Qt) den Pfad des aktuellen Programmes? Da hat mir googlen nicht viel weitergeholfen...

        Wozu brauchst du denn den Pfad des aktuellen Programmes?
        Ohne Qt müsstest du vermutlich auf bestimmte Systembibliotheken zurückgreifen (das wird Qt letztendlich auch machen). Es gibt beispielsweise die Bibliothek <unistd.h> unter Linux, da bekommt man über die Funktion getcwd() immerhin das aktuelle Arbeitsverzeichnis.

        »» Jedoch möchte ich bekräftigen, dass sicher nicht Qt für eine langsame Primzahlenberechnung verantwortlich ist.
        Es erzeugt aber schonmal einen gewissen Overhead (QApplication, ...) und dann hab ich QInt stat int zu nehmen, wodurch ich die Plattformunabhängigkeit gewährleisten wollte (32 Bit vs. 64 Bit etc.)

        Du meinst sicher die Datentypen qint8, quint8, quint16 etc.
        Die sollten aber keinesfalls für Geschwindigkeitseinbußen sorgen - denn das sind typedefs.

        »» Das ist zu 99% kein Problem von Qt, sondern rührt sicher daher dass du die Ausgabe der Primzahlenberechnung stetig mit Qt realisierst,
        In ein QList ...

        Hmm, du solltest mal deine beiden Programme auf das Wesentlichste (wenige Zeilen) kürzen und hier posten. Ich glaube nicht, dass die Verwendung von Qt die von dir genannten drastischen Geschwindigkeitseinbußen bringt.

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        DPRINTK("Last time you were disconnected, how about now?");
                linux-2.6.6/drivers/net/tokenring/ibmtr.c
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        1. Hallo,

          Wozu brauchst du denn den Pfad des aktuellen Programmes?

          um ein Programm im gleichen Verzeichniss zu staren

          | »» Jedoch möchte ich bekräftigen, dass sicher nicht Qt für eine langsame Primzahlenberechnung verantwortlich ist.
          | Es erzeugt aber schonmal einen gewissen Overhead (QApplication, ...) und dann hab ich QInt stat int zu nehmen, wodurch ich die Plattformunabhängigkeit gewährleisten wollte (32 Bit vs. 64 Bit etc.)

          Du meinst sicher die Datentypen qint8, quint8, quint16 etc.
          Die sollten aber keinesfalls für Geschwindigkeitseinbußen sorgen - denn das sind typedefs.

          stimmt :)

          Hmm, du solltest mal deine beiden Programme auf das Wesentlichste (wenige Zeilen) kürzen und hier posten. Ich glaube nicht, dass die Verwendung von Qt die von dir genannten drastischen Geschwindigkeitseinbußen bringt.

          nich mehr notwendig, ich hatte außversehen die Ausgabe praktisch schon mit drin ich habs nämlich als formatierten QString gespeichert :| das führte zu Geschwindigkeitseinbußen, wobei die kleiner wurden, wenn ich mehr berechnen ließ, die lagen dann nur noch bei ca. 10% statt 20 fach :) (das war bei 1 bis 100)

          mfg, Flo

          --
          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
      2. 你好 levu,

        Und wie bekomme ich (ohne Qt) den Pfad des aktuellen Programmes? Da hat mir googlen nicht viel weitergeholfen...

          
        int main(int argc,char *argv[]) {  
          printf("%s\n",argv[0]);  
          return 0;  
        }  
        
        

        In argv[0] steht das Programm auf, wie es aufgerufen wurde. Also z. B. /bin/blub, oder aber auch einfach blub. Auseinander nehmen, bei relativen/absoluten Pfadangaben Pfad rekonstruieren und ohne Angabe von Pfad die Umgebungsvariable PATH durchgehen und prüfen, wo da drin das Programm liegt.

        再见,
         克里斯蒂安

        --
        http://wwwtech.de/
        IRC-Clients und Irssi-Scripting | Flyspray
        Swen Wacker: Denn wer 'ne Blacklist hat, muss halt daran denken, dass er manches nicht sieht... und vor dem posten die Realitaet einschalten