Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Wie behalte ich die Werte im Array wenn die Funktion endet?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.10.2006, 13:03 Uhr
www.pat



Hi!

Ich versuche gerade Werte aus meiner Klasse "ComPort" an Form1 zu übergeben.
Da ich mit Threats und Timeouts zu kämpfen habe will ich eine Variable haben, auf die meine komplette Klasse zugreifen kann (char MyData[1024]).
Leider werden die Werte in diesem Array "MyData[1024]" anscheinend zurrückgesetzt wenn eine Funktion wieder "geschlossen" wird (sry, ka wie ich das nennen soll...)

mein Header

C++:
#include <windows.h>

class ComPort
{    
    public: char MyData[1024]; //<- die Werte sollten immer erhalten bleiben
  
    public: HANDLE Open(const char*);
    public: int Einstellungen(HANDLE,int,int);
    public: void Timeouts(HANDLE,int,int);
    public: void Write(HANDLE,char*,int);
    public: int Read(HANDLE,char*,int);
    public: bool Close(HANDLE);
    public: char GetData(int);
    
    public :
            long StartScanner (void);
            static DWORD WINAPI GetIDs (LPVOID lpArg);
            DWORD GetIDs (void);
            HANDLE m_hThread;            
};




in Form1 passiert folgendes:


C++:
void Form1::Irgentwann vorher()
{            
     // bevor der Timer gestartet wird
     // wird Write() aus ComPort aufgerufen:
     // MyData[5 und 6] werden gesetzt, verschwinden aber wieder
     // wenn diese Funktion endet.

             ComPort Port;
             Port.Write( ... );                                
             this->timer1->Enabled = true;              
     //...              
}

void Form1::timer1_Tick(System::Object *  sender, System::EventArgs *  e)
{
     // Test ob der Timer läuft
     //  StartScanner aus ComPort wird
     //  aufgerufen: MyData[2 und 3] wird gesetzt

    char GotData[1024];
    this->listView1->Items->Add("Tick", 3);      
    ComPort Port;                                        
    Port.StartScanner();                              

     // hier hole ich einen char nach dem anderen.
     // die Quelle ist "MyData[1024]" aus ComPort

    GotData[0]=Port.GetData(0);                  
    GotData[1]=Port.GetData(1);                  
    GotData[2]=Port.GetData(2);                  
    GotData[3]=Port.GetData(3);                  
    GotData[4]=Port.GetData(4);
    GotData[5]=Port.GetData(5);
    
     // in ListView wird dann GotData angezeigt

   this->listView1->Items->Add(GotData, 3);                                                              
}




meine ComPort.cpp sieht folgendermaßen aus:


C++:
void ComPort::Write(HANDLE HandlePortW,char* Data,int sizew)
{    
    MyData[4]=0x35;           //diese beiden chars verschwinden :cry:
    MyData[5]=0x36;
    
            //....  
}

char ComPort::GetData(int x)
{
    MyData[0]=0x31;          // diese werden problemlos übergeben
    MyData[1]=0x32;

    return MyData[x];
}

bool ComPort::Close(HANDLE HandlePortC)
{          
    if (CloseHandle(HandlePortC)==0) return false;
    else {return true;};
}

long ComPort::StartScanner (void)
{
    MyData[2]=0x33;         // diese beiden werden auch übergeben
    MyData[3]=0x34;

//...
}



Zussammenfassung:

MyData[0]=0x31; // in GetData(): wird übergeben
MyData[1]=0x32;
MyData[2]=0x33; //in StartScanner: wird übergeben
MyData[3]=0x34;
MyData[4]=0x35; // in write(): diese Werte gelten nicht mehr
MyData[5]=0x36; // bei der Übergabe

ich bekomme am Ende also den String: "1234"
ich erwarte aber "123456"
Wo ist die 5 und die 6 geblieben???

Vielen Dank!

pAT

Dieser Post wurde am 18.10.2006 um 13:09 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.10.2006, 13:59 Uhr
ao

(Operator)


Die Methoden timer_Tick und IrgendwannVorher erzeugen voneinander unabhängige Instanzen von ComPort, und sie erzeugen bei jedem Eintritt eine neue Instanz, und beim Austritt vergessen sie sie wieder. Diese beiden ComPort-Instanzen sind wie lokale Variablen, die sind ja auch weder von einer anderen Funktion aus sichtbar noch überleben sie von einem Aufruf bis zum nächsten.


Übrigens, das Design ist merkwürdig. Eine Klasse, die ComPort heißt, sollte nur den Com-Port bedienen, aber nicht Daten speichern.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.10.2006, 14:03 Uhr
www.pat



Hi!

Vielen Dank für deine Antwort!
Gibt es eine Möglichkeit das Vergessen zu umgehen?

Ach ja, du hast natürlich recht mit deiner Anmerkung zum Design. Das hier ist nur provisorisch.

gruß

pAT
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.10.2006, 15:16 Uhr
www.pat



hi!

ich habe es jetzt mit static versucht:
meine Header:

C++:
class ComPort
{    
    public: static char MyData[1024];
             //...
}


Wenn ich versuche darauf zuzugreifen bekomm ich 2 Fehlermeldungen:

C++:
ComPort a;
a.MyData[0]=0x05;
// ...oder
this->listView1->Items->Add(a.MyData, 3);




Zitat von Microsoft:

ListViewDieZweite error LNK2020: Nicht aufgelöstes Token (0A000054) ?MyData@ComPort@@2PADA

ListViewDieZweite fatal error LNK1120: 1 unaufgelöste externe Verweise


Dieser Post wurde am 18.10.2006 um 15:17 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.10.2006, 15:29 Uhr
ao

(Operator)


Behalte doch mal im ganzen Programm dieselbe Instanz von ComPort und mach dir nicht immer wieder eine neue. Der echte Com-Port bleibt doch auch derselbe. Dann ergibt sich der Rest von selber.

Eine wichtige Regel beim OO-Entwurf heißt: Bilde die Wirklichkeit ab.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.10.2006, 16:14 Uhr
www.pat



Ich glaube das schaff ich nicht...
Ich muss nämlich einem zweiten Threat die Aufgabe geben, Daten aus der seriellen Schnittstelle auszulesen (wegen Timeouts von 200ms).

Dem Threat einen Zeiger mitzugeben hab ich nicht geschafft.

Darum dachte ich, ich könnte die eingelesenen Daten dann in MyData[1024] ablegen.
Einem Timer wollte ich dann die Aufgabe geben alle 200ms nachzuschaun.

Oder bin ich da total auf dem Holzweg?

Jedenfalls: Vielen Dank für dein Interese an meinem Probelm!

Dieser Post wurde am 18.10.2006 um 16:14 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: