Pico C -char-Array

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Gast

    #1

    Pico C -char-Array

    Willkommen,

    ich habe so ein problem:
    Ich bekomme ein Zeichenarray in Pico C.
    Ich muss eine bestimmte Anzahl von Zeichen auf der rechten Seite abschneiden.
    Übergeben Sie die Tabelle und entfernen Sie z.B. 10 Zeichen von rechts.
    Ich habe eine solche Funktion ausprobiert:

    // iMode 0:ALL, 1:Left, 2:Right*/
    char* Trim(char* szStr,const char ch, int iMode)
    {
    if (szStr == NULL)
    return NULL;
    char szTmp[1024*10] = { 0x00 };
    strcpy(szTmp, szStr);
    int iLen = strlen(szTmp);
    char* pStart = szTmp;
    char* pEnd = szTmp+iLen;
    int i;
    for(i = 0;i < iLen;i++){
    if (szTmp[i] == ch && pStart == szTmp+i && iMode != 2)
    ++pStart;
    if (szTmp[iLen-i-1] == ch && pEnd == szTmp+iLen-i && iMode != 1)
    *(--pEnd) = '\0';
    }
    strcpy(szStr, pStart);
    return szStr;
    }

    Loxone gibt mir "Fehlerhafte Typdeklaration" zurück
  • Gast

    #2
    In Pico C ist es nicht möglich, Folgendes aufzunehmen:

    #include <stdio.h>
    #include <string.h>

    Kommentar

    • Labmaster
      Lox Guru
      • 20.01.2017
      • 2574

      #3
      Du musst/kannst in PicoC keine extra Library includieren, da alle verfügbaren Funktionen bereits fix eingebunden sind.

      Die von dir verwendeten String Funktionen strcpy und strlen kann PicoC im Loxone Programmbaustein sowieso.

      siehe hier:
      Online-Dokumentation LoxoneConfig Programm: Erfahren Sie, wie Sie Skripte und Programme mit der Loxone Konfigurationssoftware erstellen können!


      Etwas aufpassen mußt du bei deinem Konzept mit der Gültigkeit der char Speicherräume, wenn du in Subroutinen wie deiner "Trim" auf ein String zugreifen möchtest (szStr) welcher nicht global deklariert wurde, sondern z.b. nur in der Main dann gibts ein Speicherproblem.

      Überhaupt musst du in PicoC des Loxone Programmbausteins sehr diszipliniert mit dem Speicher umgehen, jeder noch so kleiner Fehler kann auf Dauer zur Instabilität des kompletten Miniservers führen. Oft ließt man hier im Forum, dass der Programmbaustein nicht stabil zu verwenden ist, ich sehe das anders, man muss sich einfach nur wirklich gut mit C auskennen und vor allem immer die darunter liegenden physikalische Hardware (im Sinne von Speicherstellen) im Kopf haben. Jeder Pointer, jede indirekte Speicherbelegung welche nicht wieder 100% sauber freigegeben wird kann zur Falle werden.





      Kommentar

      • Gast

        #4
        Ich danke Ihnen sehr für Ihre Antwort.

        Ich habe und es funktioniert gut, aber nur einmal.
        Das Programm wird später nicht mehr ausgeführt
        Vielleicht wissen Sie, was ich falsch mache.

        #define BUFF_SIZE 80001
        #define RD_BLOCK_SIZE 128
        char szBuffer[BUFF_SIZE];
        char szBufferNew[959];


        strncpy(szBufferNew,szBuffer,958);

        Ich gebe beide Variablen am Ende frei:

        free(szBuffer);
        free(szBufferNew);

        Kommentar

        • romildo
          Lebende Foren Legende
          • 25.08.2015
          • 5144

          #5
          Du musst den Code in eine Schleife legen.
          Beispiel:
          while (TRUE)
          {
          Code
          ...
          sleep(100);
          }

          Wenn Du ihn über einen Eingang triggern möchtest auch noch den Eingang abfragen.
          lg Romildo

          Kommentar

          • Gast

            #6
            Die Aufrufmethode hat keinen Einfluss auf diesen Fehler. Es funktioniert immer einmal richtig. Gibt die entsprechenden Werte zurück. Und dann kommt eine Meldung, dass das Programm gestoppt wurde
            Ich habe sleep() hinzugefügt

            Kommentar

            • romildo
              Lebende Foren Legende
              • 25.08.2015
              • 5144

              #7
              Was wird denn am Ausgang TeQ ausgegeben?
              lg Romildo

              Kommentar

              • Gast

                #8
                TeQ = Start
                Es gibt keinen Fehler zurück. Das Programm stoppt einfach und es kommt eine Simulationsmeldung.

                Kommentar

                • Gast

                  #9
                  Programm deaktiviert

                  Kommentar

                  • romildo
                    Lebende Foren Legende
                    • 25.08.2015
                    • 5144

                    #10
                    In welchem Abschnitt des Codes befinden sich denn die Variablendeklarationen.
                    Du solltest den ganzen Code posten, vielleicht kann man dann was sehen.
                    lg Romildo

                    Kommentar

                    • romildo
                      Lebende Foren Legende
                      • 25.08.2015
                      • 5144

                      #11
                      Hier mal ein einfaches Beispiel welches funktionieren sollte.

                      Klicke auf die Grafik für eine vergrößerte Ansicht

Name: ProgrammTeiltext.png
Ansichten: 854
Größe: 120,4 KB
ID: 313327
                      Code:
                      #define BUFF_SIZE 80001
                      #define RD_BLOCK_SIZE 128
                      char szBuffer[BUFF_SIZE];
                      char szBufferNew[959];
                      
                      int nEvents;
                      int iLen;
                      int iLenNeu;
                      int i;
                      
                      while(TRUE)
                      {
                      nEvents = getinputevent();
                      if (nEvents & 0xe && getinput(0)>0)
                      {
                      strcpy(szBuffer, getinputtext(0));
                      iLen = strlen(szBuffer);
                      strncpy(szBufferNew,szBuffer,iLen-10);
                      iLenNeu = strlen(szBufferNew);
                      setoutputtext(0,szBuffer);
                      setoutputtext(1,szBufferNew);
                      i++;
                      setoutput(0,i);
                      setoutput(1,iLen);
                      setoutput(2,iLenNeu);
                      }
                      sleep(100);
                      }
                      lg Romildo

                      Kommentar

                      • Gast

                        #12
                        Vielen Dank für Ihre professionelle Herangehensweise. Ich bin sehr dankbar.

                        Die Probleme stellten sich als MiniServer heraus.
                        Die Lösung bestand darin, sich von der Sohle zu lösen. Nach dem Einschalten stürzte das Programm nie wieder ab. Vielleicht früher, als ihn seine Erinnerung mit einem Versuch neuer Lösungen erfüllte. Jetzt funktioniert das Programm stabil

                        Vielen Dank für die Vorschau, die wir zum Debuggen bestellt haben

                        Zuletzt geändert von Gast; 03.08.2021, 00:37.

                        Kommentar


                        • romildo
                          romildo kommentierte
                          Kommentar bearbeiten
                          Bitte gerne. Schön wenn Du wenn es jetzt funktioniert, hoffen wir es bleibt so
                      Lädt...