Problem mit einer Funktion in .NET C++

Andrej85

Mitglied
Hallo,

habe mit folgendem Source Code ein Problem:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) //Event for Click Button1
{

this->send("sende\n"); //send String to get answer

//for Array
String^ addr;
String^ data;
String^ rcvbuffer;
String^ buf_bin;
int dec, SPALTE=0, ZEILE=0;

while( Socket_class::rcv_line(rcvbuffer, 10, 40, "\n") > 0 )
{

addr = rcvbuffer->Substring(rcvbuffer->IndexOf(' ', 0 ), ( rcvbuffer->IndexOf(' ', 5) - rcvbuffer->IndexOf(' ', 0)));
data = rcvbuffer->Substring(rcvbuffer->IndexOf(' ', 12 ), (( rcvbuffer->Length ) - rcvbuffer->IndexOf(' ', 12)));

addr = addr->Remove(0, 1);
data = data->Remove(0, 1);

dec = Convert::ToInt32(data, 16);
buf_bin = Convert::ToString(dec,2);
data = buf_bin->PadLeft(21, L'0');

for(SPALTE=0; SPALTE<=20; SPALTE++)
{
feld[ZEILE, SPALTE] = data[SPALTE];
}


ZEILE++;

}

grafik_on=true;
this->pictureBox1->Invalidate();

}

Und zwar habe ich folgendes:

Ich habe ein zweidimensionales Array feld[672, 21].

Die Socket_class funktion schickt mir mehrere Strings hintereinander und legt diese in rcvbuffer ab. Als Beispiel hat rcvbuffer nach dem ersten durchlauf folgenden Inhalt:
rcvbuffer = "addr: 1703 data: 1fffff ".

dann wandele ich das "1fffff" in den String data = "111111111111111111111"

nun soll der String data in dieses zweidimensionale Array feld[] hinterlegt werden. Das passiert in der for- Schleife.

Mein Problem ist jetzt dass er in die while-schleife reinspringt und sie durchläuft und nach dem Durchlauf zu grafik_on=true springt (obwohl da noch 8 andere Strings gesendet werden).
Demnach sieht das feld-Array wie folgt aus: feld[0, x]=beschrieben und der rest ist leer.

Wenn ich aber debugge (in der while-schleife) dann füllt er das feld-Array so wie es sein soll:
feld[0, x]=beschrieben
feld[1, x]=beschrieben
feld[2, x]=beschrieben
feld[3, x]=beschrieben
feld[4, x]=beschrieben
feld[5, x]=beschrieben
feld[6, x]=beschrieben
feld[7, x]=beschrieben
und der Rest bleibt leer (so wäre es auch richtig).

Also Zusammengefasst:
Wenn ich das Programm ausführe wird das feld[] teilweise gefüllt und wenn ich im Debug-Mode durchgehe dann füllt er das feld[] so wie es sein soll.

Was mache ich falsch?


Danke fürs durchlesen dieses langen Beitrags.:)

MfG
Andreas
 
Hallo,

das scheint an Socket_class::rcv_line() zu liegen, das offensichtlich nicht so schnell den nächsten String liefert. Beim Debuggen fällt es nicht auf, da du dann immer ein Päuschen machst. Wenn du weisst, das 8 Strings kommen müssen, dann kannst du auch warten bis tatsächlich alle 8 Strings gelesen wurden:
C++:
while( ZEILE < 8  )
{
    if( Socket_class::rcv_line(rcvbuffer, 10, 40, "\n") > 0 ) 
    {
        // ...
        
        ZEILE++;
    }
}
Ich muss allerdings noch anmerken, dass diese Lösung nicht ideal ist. Es besteht die Gefahr, dass die GUI blockiert, weil der Socket ein Problem hat oder mal weniger als 8 Strings geliefert werden. Hier sollt noch eine entsprechende Fehlerbehandlung ergänzt werden.

Noch ein Tipp: C++ - Sourcecode sollte zwischen den Tags [code=cpp] ... [/code] im Forumbeitrag eingefügt werden.

Gruß
MCoder
 

Neue Beiträge

Zurück