2016-05-19 13 views
1

Ich habe Funktion folgendeC# Variable scheint out of scope nach Funktionsaufruf zu gehen

public int[] PollAllDevices() 
    { 
     /* Polling commands */ 
     const byte POLL_FRONT_RADAR = 0x00; 
     const byte POLL_REAR_RADAR = 0x01; 
     const byte POLL_DISP  = 0x02; 
     const byte POLL_CTRL  = 0x03; 
     const byte POLL_EXP1  = 0x04; 
     const byte POLL_EXP2  = 0x05; 

     byte[] buff = new byte[32]; 
     int[] _ret = new int[32];// { 23, 24, 25, 26, 27, 28, 29, 30 }; 
     int i = 0; 

     if(API.uart_write(devPtr, new byte[1] { POLL_FRONT_RADAR }, 0, 1)) 
     { 
      if (API.uart_read(devPtr, buff, 0, 1, 1000) != 0) 
      { 
       _ret[i++] = (int)buff[1]; 
      } 
     } 
     if (API.uart_write(devPtr, new byte[1] { POLL_REAR_RADAR }, 0, 1)) 
     { 
      if (API.uart_read(devPtr, buff, 0, 1, 1000) != 0) 
      { 
       _ret[i++] = (int)buff[1]; 
      } 
     } 

     return _ret; 

    } 

ich im Überwachungsfenster _ret haben. Ich kann es sehen, bis der Punkt existiert bis ich API.uart_read anrufen und dann stellt sich grau im Überwachungsfenster, und ich sehe

_ret nicht Wert der lokalen oder Argument ‚_ret‘ erhalten, wie es auf diese nicht verfügbar ist Befehlszeiger, möglicherweise weil er weg optimiert wurde. int []

(nur werfen, dass es in als zusätzliche Informationen. Es ist nicht meine Frage ist also bin ich nicht sicher, warum dies als Duplikat markiert wurde. Alle Lösungen zu diesem Fehler scheinen um Optimierung zu drehen und ich habe keine Optimierung eingeschaltet.)

Wenn ich versuche, es zu schreiben, erhalte ich eine Array außerhalb der Grenzen Ausnahme. i = 0 an diesem Punkt, aber nur für Grins habe ich es auf _ret [0] festgeschrieben und ich bekomme immer noch die Ausnahme. Wenn ich _ret zu einem int ändere, kann ich wieder darauf schreiben.

Ich habe die Optimierung ausgeschaltet. Kann mir jemand sagen, was ich hier falsch mache?

+0

Mögliche Duplikate von [Der Wert von local oder argument kann nicht abgerufen werden, da er an diesem Befehlszeiger nicht verfügbar ist, möglicherweise weil er optimiert wurde] (http://stackoverflow.com/questions/8311303/cannot-obtain-value -of-local-or-argument-wie-es-ist-nicht-verfügbar-bei-diesem-instruct) – Sinatr

+0

@BackDoorNoBaby, ich denke, das OP sagt, dass '_ret' scheint zu verschwinden (vom Debugger) * innerhalb * 'PollAllDevices', nach dem' API.uart_read' Aufruf. – adv12

Antwort

0

Es ist möglich, dass (int)buff[1] die Ursache für die Ausnahme außerhalb der Grenzen ist. Versuchen Aufspaltung _ret[i++] = (int)buff[1]; in

int tempVar = (int)buff[1]; 
_ret[i++] = tempVar; 

und sehen, was passiert.

+0

Ich hatte das schon probiert. Es ist die _ret, die die Ausnahme wirft. – lusher00

0

kann nicht wirklich sehen, warum Ihr Array aus Rahmen aus irgendeinem Grund fallen würde, aber ich habe eine workaound im Falle keine andere Lösung kommt:

Sie Methode Make public void PollAllDevices(out _ref){...}, und verwenden Sie es wie

int[] _ref; 
PollAllDevies(out _ref); 

Und ändern Sie die int[] _ret = new int[32]; innen zu sagen _ref = new int[32].

Natürlich könnte man nun auch einen bool als Rückgabewert (oder einige andere Metadaten) setzen, wenn man dafür eine Verwendung hat.

0

Ein paar Gedanken ...

ich Zugriff auf Ihre API nicht so nahm ich den Code, und es wie folgt geändert:

byte[] buff = new byte[32]; 
int[] _ret = new int[32];// { 23, 24, 25, 26, 27, 28, 29, 30 }; 
int i = 0; 

if (true) 
{ 
    if (true) 
    { 
     _ret[i++] = (int)buff[1]; 
    } 
} 
if (true) 
{ 
    if (true) 
    { 
     _ret[i++] = (int)buff[1]; 
    } 
} 

Das ist natürlich ganz gut funktioniert. Wenn ich es wäre würde ich die Anrufe wieder an API.uart_write eingeben und sehen was passiert. Ich würde dann diese Anrufe wieder entfernen und die Anrufe erneut an API.uart_read eingeben. Dies stellt sicher, dass es nicht mit der Interaktion dieser beiden Aufrufe zusammenhängt.

Der von Ihnen gepostete Code scheint nicht vollständig zu sein, da ich nirgendwo sehen kann, wie devPtr deklariert ist. Ist es eine zweite Referenz auf _ret oder eine der _ret Werte zufällig?

Es macht nicht einmal Sinn, dass es weg optimiert worden wäre, weil Sie es am Ende des Methodenaufrufs zurückgeben. Der Compiler wird den Rückgabewert einer Methode nicht optimieren.

+0

Ich habe versucht, den Anruf über uart_read direkt nach dem Aufruf von uart_write auf seinen Anruf zu verschieben, und die Dinge sind in Ordnung. Dinge funktionieren auch, wenn ich den Anruf zu uart_write entferne und nur uart_read anrufe. Ich bin mir allerdings nicht sicher, was ich damit anfangen soll. Ich kann wirklich nicht sehen, was es bedeutet, diese Funktionen aus meiner DLL aufzurufen, verursacht, dass Dinge auseinander fallen. – lusher00

0

Meine C++ - Funktion API.uart_read() versuchte 64 Bytes in Buff zu setzen und es ging auf _ret.

Ich denke. Ich weiß, dass du es in C beschreiben würdest. Als ich Buff gemacht habe, groß genug, um alle 64 Bytes zu halten, funktionierten die Dinge wie erwartet.