gcc 2 programme verknüpfen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • ich hoffe ich habe meine Frage im richtigen Forum und und richtig gestellt.
    Das Problem ich bin c Neuling und habe es endlich geschafft von meinem Kompass HMC5883 die daten zu bekommen die ich wollte.
    1. Das c Programm (HMC5883) gibt mir einen Winkel aus.
    2. Jetzt möchte ich aus einem 2. Programm die Anwendung (HMC5883) aufrufen und den Winkel in meine 2.Anwendung übergeben.

    Leider habe ich keine Ahnung wie ich das einrichten kann, denn Header erlaubt ja nur eine main.
    Eine Anwendung aus einem c prog aufrufen, dafür habe ich kein TUT gefunden.
    DANKE für die HILFE.

    Einmal editiert, zuletzt von ich_probiers (20. Februar 2014 um 13:19)

  • 2x main geht natürlich nicht, aber wenn eine main heisst und eine tuwas -> das ginge, dann könnte main tuwas aufrufen.

    Entweder main in tuwas umbenennen und im code main einbauen oder die tuwas.c in main mit #include einbinden wie normale header Dateien.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (20. Februar 2014 um 13:41)

  • Hallo,

    es gibt mehrere Funktionen, mit denen Du andere Programme aufrufen kannst. Eine davon ist system().

    Was ich ganz raffiniert finde, ist die Realisierung über sog. Pipes. Dann kann das eine Programm die Ausgabe eines anderen Programmes auslesen. Das scheint das zu sein, was Du eigentlich machen möchtest.

    Ein schönes Beispiel findest Du unter

    http://www.raspberry-projects.com/pi/programming…-fifos#more-592

    Beste Grüße und gutes Gelingen

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • ....Du andere Programme aufrufen kannst. Eine davon ist system().

    Was ich ganz raffiniert finde, ist die Realisierung über sog. Pipes. Dann kann das eine Programm die Ausgabe eines anderen Programmes auslesen. Das scheint das zu sein, was Du eigentlich machen möchtest.
    Andreas

    ja klar, aber doofe Frage wenn er beide Sourcen hat, wäre es dann nicht sinnvoller das in ein Programm zu packen statt über System zu gehen ?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Die zu klärende Frage wäre erstmal um was für ein Programm es sich beim 2. handelt. Denn ob er auch vom 2.Programm die Source hat kann ich hier nirgends rauslesen :huh:

    Wenn er also von beiden Programmen die C Source hat (bevor diese kompiliert wird) kann er die auch problemlos zu einem Programm zusammenfügen und müsste nicht eine 'Handbremse aka system()' einbauen..

    Wenn er aber von dem 2.Programm keine Source vorliegen hat gäbe es mehrere Möglichkeiten.

    • Die erste wäre, wie von Andreas bereits erwähnt, eine PIPE zu nutzen. Dazu fürhst du dein 1.Programm aus und übergibst dessen Ausgabe an das 2.Programm. Das könnte zB so aussehen:

      Code
      /bin/ProgrammOne | /bin/ProgrammTwo

      das ' | ' symbolisiert hierbei die PIPE.
      Um das vielleicht besser zu verstehen kann man das auch anhand eines allgemeinen Beispiels verdeutlichen:

      Code
      ls -la / | grep etc


      Der Befehel ls -la / gibt alleinstehen alle Ordner vom Wurzelverzeichnis " / " aus, dessen Ausgabe übergibt man hierbei an grep welches alles ausser etc rausfilter und somit nur noch /etc anzeigen würde..

    • In dem 1.Programm ein system() Aufruf ausführen und den gewünschten Wert an das 2.Programm übergeben:

      Code
      char cmd[100];
      sprintf(cmd, "/bin/ProgrammTwo %s", deine_C_variable);
      system(cmd);
    • Ein Bash Script (oder python, php usw) verwenden welches die Ausgabe des 1.Programms in eine Variable schreibt und an das 2.Programm übergibt:

      Bash
      #!/bin/bash
      var=$(/bin/ProgrammOne)
      /bin/ProgrammTwo $var


      Oder:

      Bash
      #!/bin/bash
      /bin/ProgrammTwo $(/bin/ProgrammOne)


    Wenn du aber im 1.Programm auch noch eine mögliche Rückgabe vom 2.Programm weiterverarbeiten willst müsstest du anstatt system() -> popen() nutzen.. Am besten beschreibst du mal was du erreichen möchtest bzw poste mal den Source (bitte in Kode!)

  • Hallo Jar,

    es gibt keine doofen Fragen ;).

    Aber der Themenersteller wollte in Prunkt 2 auch wissen, wie er aus einem Programm ein anderes starten kann.

    Wie meistens gibt es mehrere Möglichkeiten. So wie es der Themenersteller es sich denkt (1:1 umgesetzt), und dann natürlich auch anders, eleganter, basierend auf einem alternativen Ansatz. Einer davon ist Deiner - der besonders dann gut funktioniert, wenn man den Quellcode (selber geschrieben) hat. Der andere geht über Pipes, der den Charme hat, dass man an keinem der betroffenen Programme sonderlich viel ändern und zu testen braucht.

    Da das Betriebssystem des Raspberry Pi Pipes erlaubt, stellt diese Vorgehensweise einen Weg dar, der immer dann beschritten werden sollte / muss, wenn der Quellcode nicht vorhanden ist - oder wenn man sich in den Quellcode nicht eindenken möchte.

    Egal, wie der Themenersteller seine Idee schließlich realisiert, auf beide Weisen lernt er was dazu. :s

    Und darum geht es schließlich auch!

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Die zu klärende Frage wäre erstmal um was für ein Programm es sich beim 2. handelt. Denn ob er auch vom 2.Programm die Source hat kann ich hier nirgends rauslesen :huh:

    ich konnte das aus dem hier rauslesen,


    ich hoffe ich habe meine Frage im richtigen Forum und und richtig gestellt.
    Das Problem ich bin c Neuling und habe es endlich geschafft von meinem Kompass HMC5883 die daten zu bekommen die ich wollte.
    1. Das c Programm (HMC5883) gibt mir einen Winkel aus.

    und mit dem hier,


    2. Jetzt möchte ich aus einem 2. Programm die Anwendung (HMC5883) aufrufen und den Winkel in meine 2.Anwendung übergeben.

    Leider habe ich keine Ahnung wie ich das einrichten kann, denn Header erlaubt ja nur eine main.

    frage ich mich, wie soll er 2x main haben ohne Sourcen ?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (20. Februar 2014 um 14:54)


  • dies Prog. möchte ich von meiner Anwendung aus starten

    na dann über System (wenn du das so möchtest), wie wurde ja schon beschrieben ;) aber da hast du ja nicht dein Problem der 2x main :s

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (20. Februar 2014 um 15:23)

  • das zweite Prog ist das was ich erstellen möchte mit dem ich den "HMC5883" aufrufe und dem ich den "angle" übergebe

    also
    #include <stdio.h>
    main()
    {
    // und hier sollte der Winkel ( also das c Programm) aufgerufen werden
    ?
    ?
    ?
    printf("Winkel = &1f\n",angle);
    return 0;
    }


    // dies als Beispiel, dieser aufruf würde dann mermals in diesem Prog vorkommen

    Einmal editiert, zuletzt von ich_probiers (20. Februar 2014 um 16:45)

  • Ich verstehe gerade nicht so recht wo eigentlich das Problem ist?
    Dieses rumgemurkse über ein anderes C Programm is völliger quatsch da dir ja der Source vom 1.Programm vorliegt

    Modifizier doch einfach den HMC5883L Source so das dir nur der Winkel ausgegeben wird :huh:

  • du hast ja soooooooo recht! "Hallo Welt" GPIO Ein Aus Abfragen habe ich geschafft, und jetzt eben das Projekt abhängig von Himmelsrichtung LED ein oder aus mit dem Schwierigkeitsgrad dass ich nicht am Ende der Bestehenden Anwendung weitermachen will, sondern ein Prog schreiben das sich die Daten im richtigen Moment holt. So habe ich mir mein Übungsprojekt vorgesteel:D

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!