Debuggen von picoC-Skript irrigration

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Davejje
    Extension Master
    • 24.11.2017
    • 173

    #1

    Debuggen von picoC-Skript irrigration

    Hallo allerseits,

    Eine Weile war ich damit beschäftigt, ein Pico-C-Skript zu erstellen, um anhand der Wetterinformationen zu berechnen, wie viel Wasser im Garten abgegeben werden sollte. Dieses Skript funktioniert recht gut, steckt aber immer noch in einem Speicherproblem.

    Jetzt möchte ich aus meinen Fehlern lernen und bin gespannt, wo der Fehler noch liegt.

    Der letzte Fehler war in Zeile 201.

    char * PrecipHxml = getvalue (xmlfileH, 0, "totalprecip_mm); 201: 51 out of memory (Alloc)


    Es handelt sich immer um eine vergleichbare Meldung in Form von Nicht genügend Arbeitsspeicher (Alloc), die jedoch in mehreren Zeilen auftritt.
    Zuletzt geändert von Davejje; 03.10.2019, 12:52.
  • romildo
    Lebende Foren Legende
    • 25.08.2015
    • 5161

    #2
    Hallo,
    Du setzt in 201 den Pointer PrecipHxml, gibst danach in 202 aber precipHxml wieder frei.
    Versuchs mit free(PrecipHxml);
    lg Romildo

    Kommentar


    • Davejje
      Davejje kommentierte
      Kommentar bearbeiten
      Ich habe das freie in 202 entfernt. Ich gebe alles auf einmal in den Zeilen 242 bis 247.
      Es war da, um etwas zu testen. Wenn es nicht aufgeführt ist, tritt das Problem weiterhin auf
  • Davejje
    Extension Master
    • 24.11.2017
    • 173

    #3
    heute ist es auf der Linie 195 schiefgegangen.
    wieder ein "Out of memory Alloc"

    Kommentar


    • romildo
      romildo kommentierte
      Kommentar bearbeiten
      Zeile 196 char* SubPageH = PageH;
      Habe nirgendwo gesehen, dass char* SubPageH wieder freigegeben wird.
  • Labmaster
    Lox Guru
    • 20.01.2017
    • 2592

    #4
    Da ich nicht glaube, daß PicoC eine wirklich gute Optimierung machen kann (nicht wie eine GCC ...) sollte man C Code für ihn möglichst selbst schon optimieren.

    Was ich z.B. wenn möglich nicht machen würde, sind Variabeln Definitionen innerhalb einer Schleife in main().
    Da könnte es durchaus sein, daß bei jedem Schleifendurchlauf immer wieder neuer Speicher belegt wird.

    So sachen wie z.B. :
    float TotalF3d, PrecipH3d, PermitTemp, PermitHumi, PermitUv, PermitWind, UnixAct, TimeAct;
    float TemperatureC, HumitidyC, PressureC, WindSpC, PrecipitationC, UvIndexC, CloudC, Unix1d, Unix3d, Time1d, Time3d;
    ...

    Würde ich ausserhalb der While(True); machen.

    Auch werden z.B.
    ... free(TempC); free(HumiC); free(PresC); free(WindsC); free(PrecC); free(UvC); free(UnixC); free(TimeC) ...

    doppelt freigegeben, einmal oben direkt nach Verwendung und dann noch mal gesammelt weiter unten.
    Keine Ahnung was sowas alles an internen Problemen bei einem so kleinen Interpretter verursachen kann.
    Zuletzt geändert von Labmaster; 03.10.2019, 09:41.

    Kommentar


    • Davejje
      Davejje kommentierte
      Kommentar bearbeiten
      Danke für deine antwort. Es lohnt sich natürlich zu versuchen, diese Erklärungen außerhalb der Hauptsache zu platzieren.
      Die float und ähnliche Funktionen außerhalb der Hauptleitung zu platzieren und dies zu testen.
  • Davejje
    Extension Master
    • 24.11.2017
    • 173

    #5
    Es scheint, dass das Skript jetzt etwas besser läuft. Er stürzt nicht mehr in der Umgebung der URLs ab, aber jetzt bekomme ich eine Speicherzuordnung in der Umgebung der Berechnungen

    TimeMinZoneOne = TimeTotalZoneOne - floor(TimeTotalZoneOne/60)*60; ziele 246:68 out of memory (alloc)

    Kommentar

    • Davejje
      Extension Master
      • 24.11.2017
      • 173

      #6
      Niemand eine Idee?

      Kommentar

      Lädt...