Abstürze beim Senden und Empfangen von http.requestes

Hallo,
als Neuling auf dieser Plattform (in Python bin ich deutlich besser) versuche ich auf einem ESP 8266 D1 mini mittels http-request die Daten von meinem Raspberry auf den ESP zu bekommen.
Das Funtkioniert auch alles. Der Raspberry nimmt die Anfrage an und gibt die korrekten Antworten.
Es kommen die korrekten Antworten.

Nach einiger Zeit stürz der ESP allerdings ab. Was man schön am Seriellen Monitor erkennen kann.

Ich habe viel gelesen, dass Strings den Speicher schnell zum überlaufen und somit den ESP zum Abstürzen bringen. Nur komme ich an dieser Stelle nicht weiter. Hier mal mein Code:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
HTTPClient http;

#define ssid     "DGBHG"
#define password "********"

bool aktor(int mC, int aktor, int set) {
  bool value = false;
  if (WiFi.status() == WL_CONNECTED){
    String message ="<?xml version='1.0'?>\n<methodCall>\n<methodName>";
    if (set != -1) {
      message += "set_aktor";
    } else {
      message += "read_as";
    }
    message += "</methodName>\n<params>\n";
    message += "<param><value><int>";
    message += aktor;
    message += "</int></value></param>\n";
    message += "</params>\n</methodCall>\n";
    HTTPClient http;
    http.begin("http://DG-Home-"+String(mC)+":55072");
    int check = http.sendRequest(
      "POST",message     
      );
    if (check>0){
      const String httpCode = http.getString();
      int start_value = httpCode.indexOf("<int>")+5;
      if (start_value>5) {
        int stop_value = httpCode.indexOf("</int>");
        String value_str = httpCode.substring(start_value,stop_value);
        if (value_str.toInt()) {
          value = true;
        }
      }  
    }
    http.end();
  }
  return value;
}

void setup()
{
  Serial.begin(115200);
  Serial.println();
  WiFi.begin(ssid, password);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());  
}

void loop() {
  Serial.print("169: ");
  Serial.println(aktor (64,169,-1));
  Serial.print("170: ");
  Serial.println(aktor (64,170,-1));
  Serial.print("171: ");
  Serial.println(aktor (64,171,-1));
  Serial.print("175: ");
  Serial.println(aktor (60,175,-1));
  delay (1000);
  }

Die Antwort ist wie erwartet:

15:57:07.934 → Connecting.
15:57:08.450 → Connected, IP address: 192.168.172.127
15:57:08.450 → 169: 0
15:57:08.450 → 170: 0
15:57:08.497 → 171: 0
15:57:08.544 → 175: 1

und die Nummer mit dem boolWert wiederholen sich alle Sekunde bis er eben abstürze.

Wo ist hier mein Denkfehler, bzw. wie kann ich hier die Strings besser verarbeiten.

Vielen Dank für Eure Hilfe.

Gruß Dirk_GL

Mit dem ESP8266 kenne ich mich leider nicht aus, aber für die AVRs gibt es Funktionen, die den freien Speicher anzeigen. Mit so einer Funktion für den ESP8266 könntest Du überprüfen, ob Deine Vermutung zutrifft.

a) gibt dir in deine Funktion aktor ein paar debug print Ausgaben rein, damit du siehst wo das Ding verstirbt.

b) String am ESP ist nicht so das große Problem.
Dennoch könntest du mit String message.reserve(815); einfach ein fixe Buffergröße für dein Stringobjekt angeben.

https://www.arduino.cc/reference/de/language/variables/data-types/string/functions/reserve/

Auch wenn noiasca schneller war…
Ich würde die Funktion bool aktor umschreiben um zu sehen, was da passiert.

bool aktor(int mC, int aktor, int set) {
  bool value = false;
  if (WiFi.status() == WL_CONNECTED) {
    String message = "<?xml version='1.0'?>\n<methodCall>\n<methodName>";
    if (set != -1) {
      message += "set_aktor";
    } else {
      message += "read_as";
    }
    message += "</methodName>\n<params>\n";
    message += "<param><value><int>";
    message += aktor;
    message += "</int></value></param>\n";
    message += "</params>\n</methodCall>\n";
    HTTPClient http;
    http.begin("http://DG-Home-" + String(mC) + ":55072");
    int check = http.sendRequest(
                  "POST", message
                );
    if (check > 0) {
      const String httpCode = http.getString();
      Serial.print(F("httpcode: "));
      Serial.println(httpCode);
      int start_value = httpCode.indexOf("<int>") + 5;
      Serial.print(F("Start_Value: "));
      Serial.println(start_value);
      if (start_value > 5) {
        int stop_value = httpCode.indexOf("</int>");
        Serial.print(F("Stop_Value: "));
        Serial.println(stop_value);
        String value_str = httpCode.substring(start_value, stop_value);
        Serial.print(F("value_str: "));
        Serial.println(value_str):
          if (value_str.toInt()) {
          value = true;
        }
      }
    }
    http.end();
  }
  return value;
}

Das Sekundentiming kommt von Deinem delay(1000) im loop - das kannst da auch so lassen…

VIELEN DANK erstmal!!

Dein Code hat geholfen, den Fehler einzugrenzen. Also die Funktion aktor läuft durch aber das Ergebnis wird beim Abbruch nicht mehr ausgeführt.

Hier mal der “Absturz”:


169: httpcode: <?xml version='1.0'?>

0

Start_Value: 68
Stop_Value: 69
value_str: 0

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (9):
epc1=0x40207378 epc2=0x00000000 epc3=0x00000000 excvaddr=0x0268024f depc=0x00000000

stack>>>

ctx: cont
sp: 3ffffcf0 end: 3fffffc0 offset: 0190
3ffffe80: 00000044 00000000 3ffee4ec 4020ac48
3ffffe90: 00000044 00000001 3ffffec0 40202b48
3ffffea0: 00000044 00000000 3ffffec0 402038ec
3ffffeb0: 00000044 00000000 3ffee4ec 4020121f
3ffffec0: 00000000 00000000 3ffef8e4 482d4744
3ffffed0: 2d656d6f 8a003436 3f01d720 3f001388
3ffffee0: 40203d00 3ffee4ec 80ffff2f 70747468
3ffffef0: 40203d00 84fee4ec 3ffefdcc 0000001f
3fffff00: 00000030 3ffef8bc 0011001f 002041b5
3fffff10: 3ffe8700 00000000 800a0d03 00000000
3fffff20: 00000000 000000c8 00000079 40206300
3fffff30: 00000000 0000000a 203a3100 402063d5
3fffff40: 80fe8714 00000000 3ffefc34 6e690000
3fffff50: 40003e74 80fee4ec 3ffefe00 0079007f
3fffff60: 80203d18 3ffefb00 0017001f 80203d24
3fffff70: 3ffef954 0092009f 00fe870f 40203ff9
3fffff80: 3fffdad0 00000000 3ffee4ec 3ffee568
3fffff90: 3fffdad0 00000000 3ffee4ec 40201340
3fffffa0: feefeffe 00000000 3ffee528 402054bc
3fffffb0: feefeffe feefeffe 3ffe84e4 40100b81
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld

Connecting.

Na das ist ja was…
Da wird Dir der string vermutlich zum Verhängnis.
ABER: Das kannst Du selbst klären. Den Hinweis dazu liefert Dir das Protokoll mit:

Lade Dir das Teil

und rufe das gute Stück auf.

Ich hatte irgendwo mal ne Anleitung in Deutsch dazu gesehen…

Wieder vielen Dank! Habe alles gefunden, selbst die Deutsche Anleitung.

Aber der übersetzte Fehler zeigt nur was wir schon vermutet haben, einen Speicherüberlauf…

Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address
PC: 0x4020731c: HTTPClient::connected() at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp line 475
EXCVADDR: 0x025501e7
Decoding stack results
0x4020abe8: strtol at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdlib/strtol.c line 224
0x40202aec: HTTPClient::disconnect(bool) at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp line 434
0x40203890: HTTPClient::end() at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp line 425
0x402011cd: aktor(int, int, int) at /Volumes/DGBHG/EDV/06_ESP-8266/wifi/wifi.ino line 46
0x40203f9d: Print::write(char const)* at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/cores/esp8266/Print.h line 62
0x402012cd: loop() at /Volumes/DGBHG/EDV/06_ESP-8266/wifi/wifi.ino line 71
0x40205460: loop_wrapper() at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/cores/esp8266/core_esp8266_main.cpp line 197

Bringt mich an der Stelle leider immer noch nicht weiter…

Verblüffend für mich vor allem, dass es 10 - 50 mal durchläuft, und dann abstürzt,

Für mich nicht.
Er braucht für einen String einen zusammenhängenden freien Speicherplatz.
Nehmen wir an, das die Anforderung des Speicherplatzes einen Umlauf später kommt, dann ist die Adresse wo es losgeht wo ganz anders. Wird der Speicher nicht mehr freigegeben, bleibt da totes Material liegen.
Das nennt sich dann “Fragmentierung”
Und so ist das wohl auch in Deinem Fall.
Ich hatte und habe keinen ESP und bin da auch vollkommen raus, was die inneren Werte angeht.

Tja, jetzt ist guter Rat gefragt.
Die User noiasca und fips sind was esp angeht gut bei; agmue hat sich auch darauf eingeschossen - vielleicht hilft ja dieser “Anruf” das da ggfls Hilfe kommt…

Das habe ich verstanden. Versuche gerade, die Strings vorab zu definieren und im void setup habe ich reserve() feste Größe zugewiesen. Leider funktioniert es noch nicht…

Trotzdem erstmal vielen Dank! Ihr habt mir nicht nur beim Programm sondern beim Verständnis sehr viel weitergeholfen!!!

dann hab ich mal noch nachgelesen…
Also Du verbrauchst allein für “message” einen zusammenhängenden Bereich von ca. 170 bytes. das könnte klappen, wenn der immer wieder frei wird.
Aber ich denke, hier:

      const String httpCode = http.getString();

könnte ein Haken liegen.
Nimm mal das const da raus.

Hallo noiasca,
erstmal vielen Dank für Deine Tips, die ich jetzt auch alle durchgegangen bin.
Mein aktueller Status ist, dass ich alle (aus meiner Sicht) notwendigen Strings definiert habe und Ihnen Speicherplatz im setup zugewiesen habe. Auch die print Ausgaben habe ich durchgeführt. Es bleibt bei den Abstürzen. Habe im hier geposteten Skript die prints rausgenommen. So lange das Programm läuft kommen die richtigen Daten. Ich habe auch mit length() die Stringlängen ausgeben lassen. Die kommen nicht annähern an die reservierten Plätze hin. Auch vor dem Absturz sind die Datenlängen “normal”.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#define ssid     "*****"
#define password "******"

String message; 
String httpCode; 
String value_str;
String http_adress;

bool aktor(int mC, int aktor, int set) {
  bool value = false;
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    message = "<?xml version='1.0'?>\n<methodCall>\n<methodName>";
    if (set != -1) {
      message += "set_aktor";
    } else {
      message += "read_as";
    }
    message += "</methodName>\n<params>\n";
    message += "<param><value><int>";
    message += aktor;
    message += "</int></value></param>\n";
    message += "</params>\n</methodCall>\n";
    //HTTPClient http;
    http_adress = "http://DG-Home-" + String(mC) + ":55072";
    http.begin(http_adress);
    int check = http.sendRequest("POST", message);
    if (check > 0) {
      httpCode = http.getString();
      int start_value = httpCode.indexOf("<int>") + 5;
      if (start_value > 5) {
        int stop_value = httpCode.indexOf("</int>");
        value_str = httpCode.substring(start_value, stop_value);
        if (value_str.toInt()) {
          value = true;
        }
      }
    }
    http.end();
  }
  return value;
}

void setup() {
  message.reserve(300);
  httpCode.reserve(300); 
  value_str.reserve(50);
  http_adress.reserve(30);
  Serial.begin(115200);
  Serial.println();
  WiFi.begin(ssid, password);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());  
}

void loop() {
  bool a = aktor (64,169,-1);
  bool b = aktor (64,170,-1);
  bool c = aktor (64,171,-1);
  bool d = aktor (60,175,-1);
  Serial.println(a+b+c+d);
  delay (1000);
  }

Und hier die Antwort aus dem Exception Decoder
(mal nach 2 Programm-Durchläufen, mal nach 20) völlig willkürlich.
Vielleicht kannst Du da mehr rauslesen als ich als Newbie…

Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address
PC: 0x402072ba: ClientContext::state() const at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266WiFi/src/include/ClientContext.h line 364
EXCVADDR: 0x00000245 *

Decoding stack results*
0x40203cf4: HardwareSerial::write(unsigned char const, unsigned int)* at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/cores/esp8266/HardwareSerial.h line 164
0x4020735a: HTTPClient::connected() at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp line 475
0x40202b24: HTTPClient::disconnect(bool) at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp line 434
0x402038c8: HTTPClient::end() at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp line 425
0x40201200: aktor(int, int, int) at /Volumes/DGBHG/EDV/06_ESP-8266/wifi/wifi.ino line 53 0x40203d00: HardwareSerial::write(unsigned char const, unsigned int)* at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/cores/esp8266/HardwareSerial.h line 165
0x40203fd5: Print::write(char const)* at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/cores/esp8266/Print.h line 62 0
x402012dd: loop() at /Volumes/DGBHG/EDV/06_ESP-8266/wifi/wifi.ino line 73 0x40205498: loop_wrapper() at /Volumes/Extern-256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/cores/esp8266/core_esp8266_main.cpp line 197

Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address

256GB/User/Dirk/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/cores/esp8266/Print.h line 62 0
x402012dd: loop() at /Volumes/DGBHG/EDV/06_ESP-8266/wifi/wifi.ino line 73 0x40205498:

Vielleicht kannst Du da mehr rauslesen als ich als Newbie…

Welches ist denn Zeile 73 in deiner wifi.ino …
Da geht ja wohl ein simples print schief …

@TO: ich habe dir empfohlen, deine Funktion mit Serial Ausgaben auszustatten damit du siehst wo genau dein Code abstürzt. Ich sehe wieder keine Serial prints.

Ohne der konkreten Zeile im Code,
Und die Inhalte aller Variablen die in der Zeile verwendet werden wirds schwierig.

(die Zeile 73 ist die schließende Klammer von loop, die Zeile 62 wäre ein print im Setup, das sind alles Nebelbomben…)

Hallo noiasca,

ich hatte Deine Empfehlung durchgespielt. Die Serial.prints in alle möglichen Bereiche eingebaut.
Ich habe mir sogar die Längen der Strings ausgeben lassen. Waren selbst zum Zeitpunkt des Absturzes weit unter der reservierten Länge. Die Strings hatte die gewünschten Texte. Alle Variablen haben das ausgegeben was sie sollten. Selbst das Ergebnis. Welche Serialprints sind denn noch interessant?

Hier der Code mit Serial.prints:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#define ssid     "****"
#define password "*****!"

String message; 
String httpCode; 
String value_str;
String http_adress;

bool aktor(int mC, int aktor, int set) {
  Serial.print("mC=");
  Serial.println(mC);
  Serial.print("aktor=");
  Serial.println(aktor);
  bool value = false;
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    message = "<?xml version='1.0'?>\n<methodCall>\n<methodName>";
    if (set != -1) {
      message += "set_aktor";
    } else {
      message += "read_as";
    }
    message += "</methodName>\n<params>\n";
    message += "<param><value><int>";
    message += aktor;
    message += "</int></value></param>\n";
    message += "</params>\n</methodCall>\n";
    Serial.print("Message:");
    Serial.println(message.length());
    Serial.println(message);
    //HTTPClient http;
    http_adress = "http://DG-Home-" + String(mC) + ":55072";
    Serial.print("http_adress:");
    Serial.println(http_adress.length());
    Serial.println(http_adress);
    http.begin(http_adress);
    int check = http.sendRequest("POST", message);
    Serial.print("check=");
    Serial.println(check);
    if (check > 0) {
      httpCode = http.getString();
      Serial.print("httpCode:");
      Serial.println(httpCode.length());
      Serial.println(httpCode);
      int start_value = httpCode.indexOf("<int>") + 5;
      if (start_value > 5) {
        int stop_value = httpCode.indexOf("</int>");
        Serial.print("start_value=");
        Serial.println(start_value);
        Serial.print("stop_value=");
        Serial.println(stop_value);
        value_str = httpCode.substring(start_value, stop_value);
        Serial.print("value_str:");
        Serial.println(value_str.length());
        Serial.println(value_str);
        if (value_str.toInt()) {
          value = true;
        }
      }
    }
    http.end();
  }
  return value;
}

void setup() {
  message.reserve(300);
  httpCode.reserve(300); 
  value_str.reserve(50);
  http_adress.reserve(30);
  Serial.begin(115200);
  Serial.println();
  WiFi.begin(ssid, password);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());  
}

void loop() {
  bool a = aktor (64,169,-1);
  bool b = aktor (64,170,-1);
  bool c = aktor (64,171,-1);
  bool d = aktor (60,175,-1);
  Serial.println(a+b+c+d);
  delay (1000);
  }

Und hier die letzten Zeilen vor dem Absturz:
http_adress:23
http://DG-Home-64:55072
check=200
httpCode:121

<?xml version='1.0'?> 0

start_value=68
stop_value=69
value_str:1
0
mC=64
aktor=170
Message:146

<?xml version='1.0'?> read_as 170

http_adress:23
http://DG-Home-64:55072
check=200
httpCode:121

<?xml version='1.0'?> 0

start_value=68
stop_value=69
value_str:1
0

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (9):
epc1=0x4020744c epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000251 depc=0x00000000

Die letzte Null ist das Ergebnis aus der Zeile 58:
value_str = httpCode.substring(start_value, stop_value);
Serial.print(“value_str:”);
Serial.println(value_str.length());
==> Serial.println(value_str);

Da ich das hier noch auf dem Tisch habe:
Nein, das print ist es an der Stelle nicht.
Zeile 68-75 ist sein loop:

  Serial.print("169: ");
  Serial.println(aktor (64,169,-1));
  Serial.print("170: ");
  Serial.println(aktor (64,170,-1));
  Serial.print("171: ");
  Serial.println(aktor (64,171,-1));
  Serial.print("175: ");
  Serial.println(aktor (60,175,-1));

aktor ist eine Funktion mit bool als Rückgabe.

bool aktor(int mC, int aktor, int set) {

Der kommt auch zurück.
(siehe dazu oben #5)
Und da klemmt es mit dem value_str. Der Serialprint lautet:

        String value_str = httpCode.substring(start_value, stop_value);
        Serial.print(F("value_str: "));
        Serial.println(value_str):

Da kommt 0 zurück: (Kopiert von oben:

Und dann soll der Code ausgeführt werden:

          if (value_str.toInt()) {
          value = true;

value soll dann der Rückgabewert werden.
Und da ist dann Schluß.
Danach kommt nur noch

        }
      }
    }
    http.end();
  }
  return value;
}

Im meinem eigentlichen Programm hatte ich sämtliche prints rausgelöscht, weil das auch mal eine meiner Vermutungen war. Ich habe da ein OLED-angeschlossen. Hier war es genauso. Ich habe im Setup einen “Anmeldebildschirm”. Der bei einem Absturz natürlich wieder angezeigt wurde. Ist lästig wenn sonst alle klappt.

Ja, und der loop läuft mal 2x mal 20x völlig problemlos durch. Die Abstürze sind also nicht wirklich “logisch”.

Hier ein fehlerfreier Durchlauf. Die aller letzte Null ist der Print aus dem loop:

Connected, IP address: 192.168.172.127
mC=64
aktor=169
Message:146

<?xml version='1.0'?> read_as 169

http_adress:23
http://DG-Home-64:55072
check=200
httpCode:121

<?xml version='1.0'?> 0

start_value=68
stop_value=69
value_str:1
0
mC=64
aktor=170
Message:146

<?xml version='1.0'?> read_as 170

http_adress:23
http://DG-Home-64:55072
check=200
httpCode:121

<?xml version='1.0'?> 0

start_value=68
stop_value=69
value_str:1
0
mC=64
aktor=171
Message:146

<?xml version='1.0'?> read_as 171

http_adress:23
http://DG-Home-64:55072
check=200
httpCode:121

<?xml version='1.0'?> 0

start_value=68
stop_value=69
value_str:1
0
mC=60
aktor=175
Message:146

<?xml version='1.0'?> read_as 175

http_adress:23
http://DG-Home-60:55072
check=200
httpCode:121

<?xml version='1.0'?> 0

start_value=68
stop_value=69
value_str:1
0
0

dann würde ich hier weitere checkpoints einbauen, wenn es sein muss, jede zweite Zeile.

Aktuell weist du nur dass value_str 0 noch ausgegeben wird, und dann?

       Serial.println(value_str.length());
        Serial.println(value_str);
        if (value_str.toInt()) {
          value = true;
        }
      }
    }
    http.end();
  }
  return value;

Wo genau kommt es zum Fehler?