For-Schleife läuft ohne printf nicht durch...



  • Hallo,
    ich bin neu ind er Welt von C++ und habe auch gleich schon mein erstes Problem.

    if (i == 0)
      {
      messwerte[i][pet] = neuwert;
    //  printf("Frame: %.0lf\t", messwerte[i][pet]);
      }
    
      if (i == 1)
      {
      messwerte[i][pet] = neuwert;
    //  printf("Acc: %.0lf\t", messwerte[i][pet]);
      }
    
      if (i == 2)
      {
      messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    //  printf("Zen: %.2lf\t", messwerte[i][pet]);
        printf(" \n", messwerte[i][pet]);
    //  printf("Messwert: %d / %d\t",i, pet);
      }
    
      if (i == 3)
      {
      messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    //  printf("Azi: %.2lf\t\n", messwerte[i][pet]);
      }
    
    				// Zählvariable zurücksetzen und Array auswerten
      if (pet == ARRAYSIZE)
      {
        pet = 0;
    
        for (int i=0; i<devInfo.numberOfChannels-3; i++)
        {
    
          printf("check!");
    
        }
    
      }
    

    Wenn ich in der Print-Anweisung in Zeile 17 einen Zeilenumbruch ausgebe, läuft meine Funktion problemlos bis zur Ausgabe von "check" durch (Zeile 37).
    Lasst ich den Zeilenumbruch in der Ausgabe in Zeile 17 weg, so komme ich nie bei Zeile 37 an.

    Eigentlich dürfte sich doch durch eine Ausgabe ohne sonstige Veränderungen nichts verändern und ich erwarte, dass der Code ohne Probleme weiter durchlaufen kann.

    Als IDE kommt bei mir kdevelop zum Einsatz und der Code basiert auf http://files.toradex.com/Oak/Linux/OakLinux_0081.tar.bz2 .

    Ich hoffe, dass ihr mir auf die Sprünge helfen könnt, denn ich habe wirklich keine Ahnung, warum die printf-Ausgabe das Vollenden des Zyklusses behindern kann.
    Vielleicht habt ihr auch ein paar Suchbegriffe für mich, die mich tiefer in die Materie rein bringen 😉



  • printf("%f\n", messwerte[i][pet]);
    

    Erstens ist das kein C++ sondern nur C und zweitens fehlen dir in der printf-Anweisung noch die Formatierungsvariablen. Da du einen Wert übergibst weiss die Funktion nicht, wie sie damit umgehen soll -> irgendwas passiert



  • Und zu guter Letzt: Es gibt keine If-Schleife!



  • Skym0sh0 schrieb:

    Erstens ist das kein C++ sondern nur C und zweitens fehlen dir in der printf-Anweisung noch die Formatierungsvariablen. Da du einen Wert übergibst weiss die Funktion nicht, wie sie damit umgehen soll -> irgendwas passiert

    Nein, das Verhalten ist definiert. Die überschüssigen Argumente werden einfach ignoriert. Das ist zwar von der Semantik her klar, steht aber nochmal explizit in 7.19.6p2 (C99).



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Skym0sh0 schrieb:

    printf("%f\n", messwerte[i][pet]);
    

    Erstens ist das kein C++ sondern nur C und zweitens fehlen dir in der printf-Anweisung noch die Formatierungsvariablen. Da du einen Wert übergibst weiss die Funktion nicht, wie sie damit umgehen soll -> irgendwas passiert

    Dachte ich auch zuerst, das extra Argument wird aber nur ausgewertet und im weiteren ignoriert.

    @TE: in dem Ausschnitt sehe ich keinen Fehler, und ob da printf() ist wirklich egal.
    Vermutlich hast Du woanders einen Fehler, oder stdout wird nicht geflusht und Du siehst nur nix, obwohl das Programm sich genau gleich verhält.

    wie ist denn das Array messwerte definiert und wie laufen die Zählvariablen i und pet ?
    Abgesehen davon bin ich mir sicher, dass der Codeteil zu kompliziert geworden ist.



  • *hust* Ja, du hast recht. Es ist eine For-Schleife.

    Ich möchte der printf-Anweisung keine Wert übergeben. Ich möchte die printf-Anweisung rausschmeißen. Allerdings funktioniert dann die Ausgabe weiter unten nicht mehr.
    Ich habe die Zeile Stück für Stück reduziert (also die Formatierungsvriabel entfernt), um rauszufinden, ab wo der Code streikt.
    Sobald ich den Zeilenumbruch (\n) rausnehme, bekomme ich die Ausgabe aus Zeile 37 nicht mehr.

    Das problem ist dabei, dass die OakLib, auf der das basiert, in C++ geschrieben ist, ich jedoch nur C-Grundlagen kenne.
    Ich habe mir zwar inzwischen ein C++-Buch zugelegt, jedoch ist das nicht mal eben so gelesen. Von daher hoffe ich, dass mir hier auf die Sprünge geholfen werden kann.



  • Der gesamte Code lautet:

    for (;;)			// Starten des Auslesens
    {
    
      usleep(SLEEPVALUE);
      std::vector<int> values;
      CHECK_OAK_CALL(readInterruptReport(deviceHandle, values));
    
      net++;	// Gesamtdurchläufe
      pet++;	// Arraysize
    
    //  printf ("\nn: %d\t", net);
    
    				// Auslesen aller Kanäle
      for (int i = 0; i < devInfo.numberOfChannels; i++) // i=0 wenn man den Sekundenwert anzeigen möchte...
      {
        j++;
        double neuwert;
        double multiplikator;
        ChannelInfo& chanInfo = channelInfos[i];
        if (chanInfo.isSigned)
        {
    	neuwert = values[i];
        }
        else
        {
    	neuwert = values[i];
        }
        if (0 != chanInfo.unitExponent)
        {
    	multiplikator = pow(10.00, chanInfo.unitExponent);
        }
    
    				// Messwerte umrechnen und in Array speichern
      if (i == 0)
      {
      messwerte[i][pet] = neuwert;
    //  printf("Frame: %.0lf\t", messwerte[i][pet]);
      }
    
      if (i == 1)
      {
      messwerte[i][pet] = neuwert;
    //  printf("Acc: %.0lf\t", messwerte[i][pet]);
      }
    
      if (i == 2)
      {
      messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    //  printf("Zen: %.2lf\t", messwerte[i][pet]);
        printf(" \n", messwerte[i][pet]);
    //  printf("Messwert: %d / %d\t",i, pet);
      }
    
      if (i == 3)
      {
      messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    //  printf("Azi: %.2lf\t\n", messwerte[i][pet]);
      }
    
    				// Zählvariable zurücksetzen und Array auswerten
      if (pet == ARRAYSIZE)
      {
        pet = 0;
    
        for (int i=0; i<devInfo.numberOfChannels-3; i++)
        {
    
          printf("check!");
    
        }
    
      }
    
      }
    }
    

    Das Array scheint problemlos die Werte aufzunehmen.
    Die Auswertung des Arrays soll ab Zeile 37 erfolgen, aber bis dahin komme ich ohne meine Testausgaben eben nicht.



  • Kann es sein, dass du irgendwo ein Semikolon oder eine geschweifte Klammer falsch gesetzt hast?

    Stichwort Dangling-Else oder sowas



  • Dann würde der Kompiler meckern.
    Aber kompilieren kann ich ja problemlos.
    Die Identifikation des Sensors funktioniert problemlos. Nur an dem Punkt, wo ich das "check" bekommen sollte, passiert nichts mehr.


  • Mod

    Woah! entscheide dich mal, ob du C oder C++ machst. Kein Wunder, dass du da irgendwo undefiniertes Verhalten bekommst, denn Mischung von C und C++ geht praktisch immer schief.

    Das ist immer noch kein vollständiges Programm. Lies dir mal den dritten Link in meiner Signatur durch und halte dich da dran.

    Verdächtig sind hier die Zeilen -50 bis 80, ganz besonders stechen folgende heraus:
    80: Irgendwo fehlt eine Klammer
    6: Höchst ungewöhnlicher Umgang mit einem vector
    9: Häh?
    15: Merkwürdiger Kommentar
    17: Sinn?
    21-28: sinnlos?
    29: Sinn?
    31: Mathematisch korrekt?
    36-60: Oh, ein for-switch Idiom als if getarnt!
    64-69: Richtig geklammert?
    69-75: sinnlos?



  • pet wird am anfang inkrementiert.
    Rhetorische Frage:
    messwerte ist also ein double messwerte[devInfo.numberOfChannels][ARRAYSIZE+1] ?

    Und ich hatte recht: der Code wurde superverkompliziert. Versuch da nochmal ein paar logische Umformungen zur Vereinfachung durchzuführen.



  • SeppJ schrieb:

    Woah! entscheide dich mal, ob du C oder C++ machst. Kein Wunder, dass du da irgendwo undefiniertes Verhalten bekommst, denn Mischung von C und C++ geht praktisch immer schief.

    Das ist immer noch kein vollständiges Programm. Lies dir mal den dritten Link in meiner Signatur durch und halte dich da dran.

    Verdächtig sind hier die Zeilen -50 bis 80, ganz besonders stechen folgende heraus:
    80: Irgendwo fehlt eine Klammer
    6: Höchst ungewöhnlicher Umgang mit einem vector
    9: Häh?
    15: Merkwürdiger Kommentar
    17: Sinn?
    21-28: sinnlos?
    29: Sinn?
    31: Mathematisch korrekt?
    36-60: Oh, ein for-switch Idiom als if getarnt!
    64-69: Richtig geklammert?
    69-75: sinnlos?

    Okay, legen wir mal los:
    80 - Nein, es wirkt vielleicht so, weil es unkonsistent eingerückt war. Ich hab das mal in meinem Code verbessert. Mit kdevelop sehe ich beim anklicken eienr Klammer immer farblich zwischen den Bereich zwischen den Klammern hervorgehoben. Von daher kann ich sehr schnell und genau sehn, wozu jede Klammer gehört.
    6 - Das entspringt dem Beispielcode des Sensorherstellers aus der OakLib.
    9 - net = Anzahl der Gesamtmesswerte, damit ich prüfen kann, ob nach evtl. 30000 Messungen der Code abricht. Ist mehr ne Hilfestellung. pet = heir triffts die Bezeichnung Arrayposition eher. Die Größe ist als Preprozessor-Definition festgelegt. pet durchwandert das Array zur Auffüllung des Arrays.
    15 - naja, hier gehts um die Channels des Sensors. Channel 0 = frame in Sekunden. sollte hier i=1 sein, wird die erste Spalte des Arrays nicht gefüllt. Ich habe mich inzwischen entschieden, alle Spalten zu füllen und lediglich die Sekunden nicht auszuwerten.
    17 - Ich habs nicht geschafft, das i der For-Schleife, in der wir uns befinden, auszulesen. Statt dessen bekomme ich als i immer den chanInfo.channelName.c_str() ausgegeben. Den Grund konnte ich nicht finden.
    21-28 - stimmt, hab ich gelöscht. Stammte noch aus dem Beispielcode, sonstige Codefragmente darin hatte ich wegrationalisiert, daher nun kein Sinn mehr.
    29 - auch hier muss ich dir Recht geben. Hab die Abfrage gelöscht.
    31 - japp, hab ich extra getestet, da ich hiermit unlesbare Sensorwerte in verständliche Werte konvertiere.
    36-60 - hast ja wieder mal recht. Das war mir zwischendrin auch aufgefallen, aber ich hielt es vorläufig nicht relevant genug, es zu ändern, da ich noch nicht sicher war, ob der Code bestehen bleibt.
    69-75 - Warum sinnlos? Ich möchte ja wissen, ob der Code hier ankommt. Das diente der Fehlersuche. die Auswertungs des Arrays habe ich wieder gelöscht, weil sie nicht funktioneirte - wie ich hiermit rausgefunden habe, liegt das daran, dass ich hier gar nicht erst ankomme, wenn ich den Zeilenumbruch in der printf-Anweisung lösche.

    So viel Mühe du dir bei der Suche nach potentiellen Fehlern gemacht hast...besteht das Problem leider immer noch. Ich schreib mal grade die If-Abfragen zum Switch um und dann poste ich den bereinigten Code.

    Die Entscheidung, ob ich C oder C++ schreibe, liegt nicht bei mir. Ich kann kein C++...und kenne nur Basics in C. Aber die OakLib mit dem Beispielcode basiert auf C++. Da C wohl vollständig kompatibel zu C++ sein soll, müsste es also eigentlich keine Probleme geben - zumindest nich bei so 'einfachen' Anwendungsfällen.



  • So, hier der etwas sauberere Code, der jedoch noch immer noch den selben Fehler enthält:

    for (;;)			// Starten des Auslesens
    {
    
      usleep(SLEEPVALUE);
      std::vector<int> values;
      CHECK_OAK_CALL(readInterruptReport(deviceHandle, values));
    
      net++;	// Gesamtdurchläufe
      pet++;	// Arrayposition
    
    //  printf ("\nn: %d\t", net);
    
    				// Auslesen aller Kanäle
      for (int i = 0; i < devInfo.numberOfChannels; i++) // i=0 wenn man den Sekundenwert anzeigen möchte...
      {
        j++;
        double neuwert;
        double multiplikator;
        ChannelInfo& chanInfo = channelInfos[i];
        neuwert = values[i];
        multiplikator = pow(10.00, chanInfo.unitExponent);
    
    				// Umrechnung der Werte und Abspeichern im Array
    switch (i)
    {
            case 0:
                messwerte[i][pet] = neuwert;
                break;
            case 1:
                messwerte[i][pet] = neuwert;
                break;
    	case 2:
                messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    //	    printf(" \n", messwerte[i][pet]);
                break;
            case 3:
                messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
                break;
            default:
                printf("Fehler beim Switch");
                break;
    }
    
    				  // Zählvariable zurücksetzen und Array auswerten
        if (pet == ARRAYSIZE)
        {
          pet = 0;
          for (int i=0; i<devInfo.numberOfChannels-3; i++)
          {
    	printf("check!");
          }
        }
      }
    }
    

    Wenn ich die Werte im Switch direkt ausgebe, funktionierts:

    switch (i)
    {
            case 0:
                messwerte[i][pet] = neuwert;
    	    printf("0: %lf\t", messwerte[i][pet]);
                break;
            case 1:
                messwerte[i][pet] = neuwert;
    	    printf("1: %lf\t", messwerte[i][pet]);
                break;
    	case 2:
                messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    	    printf("2: %lf\t", messwerte[i][pet]);
    //	    printf(" \n", messwerte[i][pet]);
                break;
            case 3:
                messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    	    printf("3: %lf\n", messwerte[i][pet]);
                break;
            default:
                printf("Fehler beim Switch");
                break;
    }
    
    0: 133.000000	1: 9856.000000	2: 89.570492	3: 179.834263
    0: 470.000000	1: 9746.000000	2: 89.610599	3: 179.679565
    0: 490.000000	1: 9790.000000	2: 89.513196	3: 180.097824
    0: 510.000000	1: 9746.000000	2: 89.513196	3: 179.943125
    0: 530.000000	1: 9842.000000	2: 89.570492	3: 180.097824
    0: 550.000000	1: 9746.000000	2: 89.438712	3: 179.903018
    0: 570.000000	1: 9834.000000	2: 89.347039	3: 180.000421
    

    usw.

    In diesem Fall kann ich den Zeilenumbruch auch weglassen und ich bekomme problemlos eine Ausgabe.

    Was mich jedoch verwirrt ist die Tatsache, dass in den ersten beiden Spalten des Arrays Werte gespeichert sind, die länger als 8 Zeichen sind. Der Dateityp double sollte doch 8 Stellen lang wein, oder?!

    double messwerte[4][ARRAYSIZE];
    

  • Mod

    Cysign schrieb:

    80 - Nein, es wirkt vielleicht so, weil es unkonsistent eingerückt war. Ich hab das mal in meinem Code verbessert. Mit kdevelop sehe ich beim anklicken eienr Klammer immer farblich zwischen den Bereich zwischen den Klammern hervorgehoben. Von daher kann ich sehr schnell und genau sehn, wozu jede Klammer gehört.

    Das habe ich doch nicht von Hand gezählt, sondern ebenfalls von meiner IDE machen lassen. Folglich hast du einen anderen Code vorliegen als du uns gezeigt hast. Ich wiederhole noch einmal meinen dringenden Verweis auf den dritten Link in meiner Signatur. Ohne ausführbaren Code können wir dir nicht helfen, Fehler zu finden, die erst bei der Ausführung auftreten.
    Noch drei Bemerkungen:
    1. Da du eine exotische Bibliothek benutzt, wäre es gut, wenn du für uns die Aufrufe an diese Bibliothek ersetzt, z.B. den vector mit irgendwelchen Dummywerten füllst.
    2. Höchstwahrscheinlich liegt der Fehler sowieso ganz woanders. Was du beschreibst ist ein lupenreiner Fall von undefiniertem Programmverhalten. Es kann gut sein, dass die eigentliche Ursache lange vor dem gezeigten Codeabschnitt liegt. Daher ist es hochgradig wichtig, dass du bei der Erstellung eines ausführbaren Beispiels darauf achtest, dass der Fehler nach jeder Kürzung des Codes tatsächlich noch auftritt.
    3. Mit dem Code den du gezeigt hast, kann ich auch nicht mehr machen, als die verdächtigen Stellen zu markieren. Insgesamt habe ich mir schon Mühe dabei gegeben, kann aber aufgrund des fehlenden Kontextes nicht absolut sicher sein, ob es wirklich echte Fehler sind. Du solltest dir jedoch wirklich absolut sicher sein, dass es wirklich richtig ist, wenn du eine der von mir genannten Stellen für richtig erklärst. Deine Antwort kam dann doch ein bisschen schnell, ich denke, bei einigen Stellen hast du nicht ganz verstanden, was mich störte:

    80: Siehe oben
    6: Sicher? Ganz sicher? Es ist höchst ungewöhnlich und wäre kein gutes Zeichen für die Bibliothek. Wobei es durchaus viele schlechte Bibliotheken gibt, daher nicht ausgeschlossen, dass es so sein soll.
    9: Eine sich verändernde Arraygröße macht keinen Sinn. Die Beschreibung ist mindestens schlecht. Oder du hast etwas an deinem eigenen Code nicht verstanden. Außerdem: Ist net nicht gleich pet?
    15: Was ist denn die semantische Bedeutung von dem i? Diese scheint wild zu wechseln. Nenn die Variable mal nicht i, sondern gib ihr einen beschreibenden Namen. Dann wird entweder dem Leser klar, was du meinst, oder du merkst, dass da selber etwas nicht stimmt. Je nachdem, was richtig ist.
    17: Noch ein weitere Hinweis für undefiniertes Verhalten, wenn du dieses sinnlose j als Ersatz für i brauchst.
    31: Ok, glaube ich dir mal. Ich hoffe, du bist wirklich sicher, dass es richtig ist.
    64-69: Also soll die check-Schleife wirklich in dem Block zum if (pet == ARRAYSIZE) stehen?
    69: Wozu überhaupt die Schleife?

    P.S.: Bezüglich deines neuen Codes, habe ich nur kurz überflogen: Ich glaube du hast das mit dem for-switch nicht verstanden. Das war Sarkasmus. Ohne Sarkasmus gesagt: Das ist kompletter Unsinn, egal ob mit switch oder if.



  • Hmm...okay, vielleicht ist der komplette Code aussagekräftiger:

    /// \file  
    /// \date 2008-10-10
    /// \author Xavier Michelon, Toradex SA 
    ///  
    /// \brief Sample program for using Oak device in Linux
    
    #include "OakHidBase.h"
    #include "OakFeatureReports.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include <math.h>
    #include <unistd.h>
    
    #define SAMPLEDELAY 20		// Set Report- und Sample-Rate - 20 
    #define ARRAYSIZE 50		// Anzahl der Werte
    #define SLEEPVALUE 23000	// Sleeptime zwischen Messwerten - 25000 evtl. 	2300
    
    using namespace std;
    using namespace Toradex::Oak;
    int net = 0;			// Anzahl der Gesamtmessungen im kompletten Programmverlauf
    int pet = 0;			// Array-Position
    int arraysize = 0;
    
    // Number of Samples
    double messwerte[4][ARRAYSIZE]; // 0: Framenumber [s]	1: Acceleration [m/m²] 2: Zenith [grad] 3: Azimuth [grad]
    
    // define some local constants
    namespace {
       string const& kDefaultDevice("/dev/usb/hiddev0"); ///< Default device, if not specified as an argument
    }
    
    /// \brief wrapper function for error report that add file, line and function in which an error occured
    #define CHECK_OAK_CALL(status) checkOakCall(status, __FILE__, __LINE__, __FUNCTION__)
    
    //************************************************************************************************* 
    /// \brief Check the status code of a Oak library call. 
    ///
    /// If the status is not OK, this function display an error message to the standard error output
    /// then quit the application
    ///
    /// Note This function is not to be called directly, but via the CHECK_OAK_CALL macro that
    /// insert the line, file and function where the error occured
    ///
    /// \param[in] status the status code to check
    /// \param[in] file The file where the error occured
    /// \param[in] line The line number where the error occured
    /// \param[in] function The name of the function where the error occured
    //************************************************************************************************* 
    void checkOakCall(EOakStatus status, const char *file, int line, const char* function)
    {
       if (eOakStatusOK != status)
       {
          fprintf(stderr, "Error: %s in function %s (file %s, line %d)\n", getStatusString(status).c_str(), 
                  function, file, line);
          exit(1);
       }
    }
    
    //************************************************************************************************* 
    /// \brief The program entry point
    ///
    /// \param[in] argc The number of arguments of the program
    /// \param[in] argv The argument list of the program
    //************************************************************************************************* 
    int main(int argc, char **argv)
    {
      printf("\n \n \n");
      // if the device file is not provided as an argument, we use a default value
       std::string device(argc >= 2 ? argv[1] : kDefaultDevice);
    
       int deviceHandle;
       CHECK_OAK_CALL(openDevice(device, deviceHandle));
    
       // get the device informations
       DeviceInfo devInfo;
       CHECK_OAK_CALL(getDeviceInfo(deviceHandle, devInfo));
    
       // Set the report Mode
       CHECK_OAK_CALL(setReportMode(deviceHandle, eReportModeAfterSampling, true));
       EOakReportMode reportMode;
       CHECK_OAK_CALL(getReportMode(deviceHandle, reportMode, true));
    
       // Set the LED Mode
       CHECK_OAK_CALL(setLedMode(deviceHandle, eLedModeOff, true));
       EOakLedMode ledMode;
       CHECK_OAK_CALL(getLedMode(deviceHandle, ledMode, true));
    
       // Set the report rate
       CHECK_OAK_CALL(setReportRate(deviceHandle, SAMPLEDELAY, true));
       unsigned int reportRate;
       CHECK_OAK_CALL(getReportRate(deviceHandle, reportRate, true));
       printf("Report rate: %u\n", reportRate);
    
       // Set the sample rate
       CHECK_OAK_CALL(setSampleRate(deviceHandle, SAMPLEDELAY, true));
       unsigned int sampleRate;
       CHECK_OAK_CALL(getSampleRate(deviceHandle, sampleRate, true));
       printf("Sample rate: %u\n", sampleRate);
    
       // Retrieve Channel infos
       std::vector<ChannelInfo> channelInfos(devInfo.numberOfChannels);
       for (int i = 0; i < devInfo.numberOfChannels; i++)
       {
          ChannelInfo& chanInfo = channelInfos[i]; 
          CHECK_OAK_CALL(getChannelInfo(deviceHandle, i, chanInfo));
          printf("   Name: %s\n", chanInfo.channelName.c_str());
       }
    
    for (;;)			// Starten des Auslesens
    {
      usleep(SLEEPVALUE);
      std::vector<int> values;
      CHECK_OAK_CALL(readInterruptReport(deviceHandle, values));
    
      net++;	// Gesamtdurchläufe
      pet++;	// Arrayposition
    
    //  printf("Anzahl der Messungen: %d\t", net);
    
    				// Auslesen aller Kanäle
      for (int i = 0; i < devInfo.numberOfChannels; i++)
      {
        double neuwert;
        double multiplikator;
        ChannelInfo& chanInfo = channelInfos[i];
        neuwert = values[i];
        multiplikator = pow(10.00, chanInfo.unitExponent);
    
    				// Umrechnung der Werte und Abspeichern im Array
        switch (i)
        {
    	case 0:
    	      messwerte[i][pet] = neuwert;
    //	      printf("Ch0: %.0lf\t", messwerte[i][pet]);
    	      printf("%lf\t", neuwert);
    	      break;
    	case 1:
    	      messwerte[i][pet] = neuwert;
    //	      printf("Ch1: %.0lf\t", messwerte[i][pet]);
    	      printf("%lf\t", neuwert);
    	      break;
    	  case 2:
    	      printf("%lf\t", neuwert);
    	      messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    //	      printf("Ch2: %.2lf\t", messwerte[i][pet]);
    //	    printf(" \n", messwerte[i][pet]);
    	      break;
    	  case 3:
    	      printf("%lf \n", neuwert);
    	      messwerte[i][pet] = neuwert/M_PI * 180 * multiplikator;
    //	      printf("Ch3: %.2lf\n", messwerte[i][pet]);
    	      break;
    	  default:
    	      printf("Fehler beim Switch");
    	      break;
        }
    
    				  // Zählvariable zurücksetzen und Array auswerten
        if (pet == ARRAYSIZE)
        {
          pet = 0;
          for (int kanal=0; kanal<devInfo.numberOfChannels-3; kanal++)
          {
    	printf("\n	check!	\n\n");
          }
        }
      }
    }
    
        // Cleanup
      CHECK_OAK_CALL(closeDevice(deviceHandle));
      return 0;
    }
    

    Hierzu mal die Ausgabe beim Aufruf der makefile:

    cysign@hp-lubuntu:~/Dropbox/aeros/oak/kdevelop/src$ make
    g++ -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT oaklinux.o -MD -MP -MF .deps/oaklinux.Tpo -c -o oaklinux.o oaklinux.cpp
    mv -f .deps/oaklinux.Tpo .deps/oaklinux.Po
    /bin/bash ../libtool --tag=CXX   --mode=link g++  -g -O2    -o oaklinux OakFeatureReports.o OakHidBase.o oaklinux.o  
    g++ -g -O2 -o oaklinux OakFeatureReports.o OakHidBase.o oaklinux.o
    

    Die Ausgabe lautet nun (Unveränderte Wiedergabewerte des Lib) :

    cysign@hp-lubuntu:~/Dropbox/aeros/oak/kdevelop/src$ ./oaklinux
    
    Report rate: 20
    Sample rate: 20
       Name: Frame Number [s]
       Name: Acceleration [m/s2]
       Name: Zenith [rad]
       Name: Azimuth [rad]
    664.000000	9768.000000	12559.000000	31399.000000 
    983.000000	9717.000000	12549.000000	31389.000000 
    1023.000000	9797.000000	12556.000000	31416.000000 
    1043.000000	9709.000000	12575.000000	31423.000000 
    1063.000000	9753.000000	12556.000000	31433.000000 
    1083.000000	9746.000000	12546.000000	31377.000000 
    1103.000000	9731.000000	12578.000000	31406.000000 
    1123.000000	9761.000000	12566.000000	31389.000000 
    1163.000000	9775.000000	12598.000000	31380.000000 
    1183.000000	9753.000000	12595.000000	31380.000000 
    1203.000000	9761.000000	12536.000000	31389.000000 
    1223.000000	9731.000000	12549.000000	31367.000000 
    1243.000000	9731.000000	12578.000000	31377.000000 
    1263.000000	9717.000000	12588.000000	31399.000000 
    1283.000000	9724.000000	12585.000000	31341.000000 
    1323.000000	9783.000000	12549.000000	31433.000000 
    1343.000000	9753.000000	12566.000000	31341.000000 
    1363.000000	9753.000000	12546.000000	31416.000000 
    1383.000000	9775.000000	12529.000000	31389.000000 
    1403.000000	9753.000000	12546.000000	31380.000000 
    1423.000000	9797.000000	12520.000000	31416.000000 
    1463.000000	9753.000000	12556.000000	31380.000000 
    1483.000000	9761.000000	12578.000000	31389.000000 
    1503.000000	9724.000000	12598.000000	31399.000000 
    1523.000000	9753.000000	12546.000000	31416.000000 
    1543.000000	9775.000000	12578.000000	31380.000000 
    1563.000000	9797.000000	12556.000000	31399.000000 
    1603.000000	9746.000000	12578.000000	31399.000000 
    1623.000000	9753.000000	12566.000000	31399.000000 
    1643.000000	9717.000000	12549.000000	31389.000000 
    1663.000000	9717.000000	12539.000000	31399.000000 
    1683.000000	9753.000000	12529.000000	31389.000000 
    1703.000000	9724.000000	12546.000000	31380.000000 
    1723.000000	9746.000000	12559.000000	31389.000000 
    1763.000000	9797.000000	12556.000000	31416.000000 
    1783.000000	9709.000000	12529.000000	31399.000000 
    1803.000000	9753.000000	12556.000000	31389.000000 
    1823.000000	9739.000000	12559.000000	31389.000000 
    1843.000000	9775.000000	12556.000000	31389.000000 
    1863.000000	9731.000000	12566.000000	31377.000000 
    1903.000000	9746.000000	12568.000000	31399.000000 
    1923.000000	9775.000000	12595.000000	31406.000000 
    1943.000000	9717.000000	12559.000000	31389.000000 
    1963.000000	9731.000000	12556.000000	31377.000000 
    1983.000000	9739.000000	12588.000000	31406.000000 
    2003.000000	9761.000000	12588.000000	31416.000000 
    2023.000000	9694.000000	12614.000000	31399.000000 
    15.000000	9797.000000	12568.000000	31446.000000 
    35.000000	9768.000000	12510.000000	31406.000000 
    55.000000	
    	check!	
    
    9746.000000	12585.000000	31377.000000 
    75.000000	9775.000000	12566.000000	31377.000000 
    95.000000	9775.000000	12566.000000	31380.000000 
    115.000000	9724.000000	12546.000000	31423.000000 
    155.000000	9761.000000	12566.000000	31380.000000 
    175.000000	9783.000000	12559.000000	31399.000000 
    195.000000	9761.000000	12559.000000	31406.000000 
    215.000000	9724.000000	12585.000000	31367.000000 
    235.000000	9761.000000	12536.000000	31367.000000 
    255.000000	9717.000000	12588.000000	31406.000000 
    295.000000	9739.000000	12566.000000	31399.000000 
    315.000000	9797.000000	12529.000000	31446.000000 
    335.000000	9739.000000	12595.000000	31341.000000 
    355.000000	9702.000000	12568.000000	31380.000000 
    375.000000	9768.000000	12536.000000	31377.000000 
    395.000000	9694.000000	12549.000000	31399.000000 
    415.000000	9761.000000	12539.000000	31389.000000 
    455.000000	9709.000000	12595.000000	31399.000000 
    475.000000	9709.000000	12539.000000	31389.000000 
    495.000000	9731.000000	12595.000000	31360.000000 
    515.000000	9775.000000	12539.000000	31433.000000 
    535.000000	9694.000000	12588.000000	31380.000000 
    555.000000	9739.000000	12575.000000	31416.000000 
    594.000000	9775.000000	12529.000000	31423.000000 
    615.000000	9709.000000	12549.000000	31399.000000 
    635.000000	9709.000000	12595.000000	31406.000000 
    655.000000	9775.000000	12546.000000	31389.000000 
    675.000000	9731.000000	12566.000000	31399.000000 
    695.000000	9702.000000	12595.000000	31367.000000 
    715.000000	9731.000000	12588.000000	31406.000000 
    755.000000	9790.000000	12527.000000	31433.000000 
    775.000000	9746.000000	12529.000000	31389.000000 
    795.000000	9753.000000	12529.000000	31399.000000 
    815.000000	9775.000000	12520.000000	31389.000000 
    835.000000	9768.000000	12536.000000	31399.000000 
    855.000000	9753.000000	12578.000000	31389.000000 
    895.000000	9739.000000	12566.000000	31380.000000 
    915.000000	9820.000000	12556.000000	31399.000000 
    935.000000	9731.000000	12529.000000	31350.000000 
    955.000000	9775.000000	12546.000000	31380.000000 
    975.000000	9753.000000	12595.000000	31416.000000 
    995.000000	9761.000000	12549.000000	31446.000000 
    1035.000000	9724.000000	12578.000000	31357.000000 
    1055.000000	9731.000000	12556.000000	31423.000000 
    1075.000000	9805.000000	12539.000000	31389.000000 
    1095.000000	9724.000000	12529.000000	31377.000000 
    1115.000000	9709.000000	12500.000000	31380.000000 
    1135.000000	9746.000000	12585.000000	31399.000000 
    1155.000000	9672.000000	12627.000000	31399.000000 
    1195.000000	9753.000000	12578.000000	31406.000000 
    1215.000000	
    	check!
    

    Welche IDE nutzt du denn, die dir die Klammerfehler anzeigt?
    Ich vermute, dass der Wurm im Datentyp steckt.
    Sollte ich das Array vielleicht mit "long double" erstellen?

    Die Arraygröße verändert sich nicht. Sie wird vom Preprozessor mit dem Wert von

    #devine ARRAYSIZE
    

    festgelegt. Sollte ich später feststellen, dass diese Anzahl an Messwerten nicht ausreicht, brauche ich so nur diesen Definewert zu verändern.

    Ich hab j mal rausgeschmissen (wieder auch ein altes Codefragment...).

    Bzgl. 31: Ja, da bin ich mir sicher. Wie du an diesen Rohwerten sehen kannst, wird da kein Mensch schlau. Wenn ich durch Pi teile und mit 180° Multipliziere, erhalte ich Kugelkoordinaten von 0-360° bzw. von 0-180° als Rückgabewert. Beim Drehen des Sensors sehe ich, dass das mit wen Werten passt.

    Die Schleife im Block, in dem bisher "check" steht, dient der Auswertung des Arrays.

    Warum soll Switch oder die If-Abfrage hier Schwachsinn sein? Ich muss doch die jeweiligen Daten dem Array richtig zuordnen und umrechnen.
    Dies würde ich gerbe beim Eintragen ins Array machen.

    Da die Werte, die ich ins Array schreibe scheinbar länger sind als double, könnte dies den Fehler verursachen. Ich versuche es mal durch ein long double zu ersetzen.
    Oder gibt es eine Möglichkeit, den genauen Datentyp herauszufinden?
    Um ehrlich zu sein blicke ich bei der Lib selbst nicht durch...ich steh halt noch am Anfang meiner...langen Lernkurve 😉



  • Ah, es lag tatsächlich am long double.
    Jetzt funktionierts.
    Danke, dass ihr euch die Mühe gemacht habt um mir auf die Sprünge zu helfen 🙂
    Ich verzweifelte hier schon seit Stunden 👍



  • Schau dir dein switch nochmal an stichwort dry (don't repeat yourself)


  • Mod

    Vereinfache mal folgenden Code:

    for (int i = 0; i < 2; ++i)
    {
      switch (i)
      {
        case 0: puts("Hello"); break;
        case 1: puts("World"); break;
      }
    }
    

    P.S.: Dein Problem liegt übrigens so gut wie sicher nicht an dem Datentyp. Du schreibst irgendwo über Arraygrenzen oder ähnliches. Ohne ausführbaren Code ist das Programm jedoch zu lang, um das nachzuvollziehen. Da du geschrieben hast, dass du kdevelop benutzt, nehme ich mal an, dass du unter einem Linux mit GCC als Compiler entwickelst.

    - Compiliere dein Programm mit den Compilerschaltern:

    -O0 -g -D_GLIBCXX_DEBUG -Wall -Wextra
    

    Jede Warnung des Compilers ist als Fehler anzusehen und zu beheben.
    - Wenn dies geschehen ist: Lasse das Programm laufen. Wahrscheinlich bekommst du Fehlermeldungen. Vielleicht reichen diese schon zur Behebung des Problems.
    - Falls keine Fehler auftraten oder du die Ursache nicht finden konntest, dann installiere das Programm valgrind (ist möglciherweise schon installiert). Starte dein Programm mit:

    valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes dein_programm
    

    Behebe alle gemeldeten Fehler (nicht die unterdrückten). Falls Fehler bezüglich uninitialisierter Werte auftreten, deren Ursache du nicht finden kannst, dann starte das Programm mit

    valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --track-origins=yes dein_programm
    

    (ist sehr langsam, daher nur bei Bedarf. Verringere eventuell die Anzahl der Berechnungen, falls es zu langsam ist.)
    Behebe alle gemeldeten Fehler.
    - Falls keine Fehler mehr gefunden werden, aber das Programm immer noch falsch läuft, kannst du noch die valgrind-Option --tool=exp-sgcheck ausprobieren.



  • puts("Hello World"); 😃

    Ich weiß ehrlich nicht, wie ihr das meint.
    Es gibt da bestimmt ne Möglichkeit, das kompakter darzustellen.
    Aber ich wüsste nicht, wie das diesen Switch vereinahen soll.


Anmelden zum Antworten