static oder nicht?

Thomasio

Erfahrenes Mitglied
Wenn ich mit WinInet Daten an ein PHP Script auf meiner HP senden will, dann erwartet WinInet den zu sendenden String als

static TCHAR

Wenn ich den Sinn von "static" nachlese, steht da, die werden nur einmal definiert und behalten ihren Wert bis Programmende.
Nun macht es aber herzlich wenig Sinn, immer die gleichen Daten zu senden, merkwürdigerweise kann ich sogar immer andere Daten senden, und ich verstehe nicht warum.

Code:
void connect(std::string tosend)
{

static TCHAR frmdata[1000];
std::copy(tosend.begin(),tosend.end(),frmdata);
frmdata[tosend.length()] = '\0';

// HINTERNET .... usw

return;

}

Ganz offensichtlich kann ich mit std::copy den Inhalt der static Variable ändern und die Sache funktioniert auf den ersten Blick genau wie gewünscht.

Was ich dabei nicht verstehe ist:

1) Wie lange lebt frmdata? Wird bei mehrfachem Aufruf der Funktion jedesmal 1K Speicher belegt, sprich der läuft irgendwann voll, oder wird immer der selbe Speicherbereich verwendet, oder wird frmdata am Ende der Funktion gelöscht?
2) Was passiert, wenn die Funktion 2 mal gleichzeitig mit verschiedenen Daten ausgeführt wird?

Gibt es vielleicht eine elegantere Möglichkeit für das Ganze?
 
Hallo,

wo hast du das mit dem static her? WinINet beeinhaltet ja einen ganzen Satz von Funktionen; um welche genau geht es denn?
Zu deinen Fragen:

1) frmdata lebt, solange das Programm läuft. Die Speichergröße ist fix, es wird immer derselbe Speicher verwendet. Die in der Funktion zuletzt zugewiesenen Daten bleiben nach Verlassen der Funktion erhalten und sind damit logischerweise beim erneuten Funktionsaufruf immer noch verfügbar.

2) Das gibt dann ein Datenkuddelmuddel, weil ja jedesmal der gleiche Speicherbereich beackert wird. Ohne weitere Maßnahmen ist ein solches Konstrukt nicht threadsicher.

Gruß
MCoder
 
Es geht um HttpSendRequest() wo frmdata effektiv gesendet wird,
aber wenn immer der gleiche Speicher verwendet wird und nichts voll läuft ist mir schon geholfen.
Solange mein std::copy den Inhalt "sauber" verändert, sprich dies dem Sinn von "static" nicht widerspricht habe ich kein Problem, ich setze mir einfach ein Flag plus Warteschleife, so dass die Funktion nie doppelt ausgeführt wird.

Irgendwie bin ich im Moment in einer Phase, wo ich alles unglaublich genau verstehen will um selbst kleinste Fehler zu vermeiden, wobei ich immer wieder feststelle, dass eine mögliche Fehlerquelle gar keine ist, weil ich es von Anfang an eh richtig hatte.

Aber wenn wir grad dabei sind, auch wenn ich im Moment nicht wüsste wozu ich es brauchen könnte, Zusatzfrage:
Gibt es eine Möglichkeit statische Variablen innerhalb vom Programm zu löschen und neu zu erstellen?
 
Einfach nur so zum Verständnis von static:
eine Static-Variable behält ihre Gültigkeit über die Dauer des Funktionsaufrufes hinaus. Statics werden meistens aus den 2 folgenden Gründen benutzt:
-Deine Funktion braucht ein "Gedächtnis"
-Du gibst einen Pointer auf eine In der Funktion erzeugte Variable zurück, denn wenn diese Variable auf die der Pointer zeigt nicht static ist wird sie nach dem Ende der Funktion gelöscht, und der Zeiger zeigt ins Nichts, durch static jedoch bleibt die Variable erhalten
 
Das heisst für mich zweierlei,

Ich habe den Sinn von "static" durchaus verstanden, aber in meiner Function macht es wenig Sinn die Variable frmdata als static zu definieren, denn der Inhalt muss mit jedem neuen Aufruf der Funktion auf jeden Fall geändert werden, es wäre also weit sinnvoller, sie jedesmal neu zu definieren.

Nur WinInet erwartet die Daten in Form von

static TCHAR

und darum muss ich mich damit herum ärgern, dass ich
- die Funktion nicht mehrfach gleichzeitig benutzen kann
- std::copy machen muss, statt einfach meinen tosend string zu nehmen
- die Länge von frmdata grösser sein muss als der Inhalt jemals werden kann, selbst dann wenn ich nur 1 byte Daten senden will

Alles in Allem ein Umstand, der gar nicht sein müsste.
 
Nein WinINet erwartet niemals eine Form von static TCHAR ;) Noch nicht einmal TCHAR wird verlangt.

TCHAR wird, wenn UNICODE gewünscht, nach wchar_t aufgelöst, sonst ist es nichts anderes als ein char.

D.h. ist dein Teil hier auch gefährlich:
C++:
typedef std::basic_string<TCHAR> tstring;

void connect(std::string const& data)
{
    static tstring framedata;
    framedata = data;
    
    // HINTERNET .... usw
}
... was passiert wenn du UNICODE aktiviert hast? Es klappt nichtmehr! Also leg dich fest. UNICODE, dann wchar_t oder nicht, dann char. Oder einheitlichTCHAR, bzw. ein std::basic_string<TCHAR>.
 
Jetzt wo ihr das sagt fallen mir alle Jugendsünden wieder ein ....

Ich hatte bei meinen allerersten Versuchen mit WinInet eine Compiler-Meldung
cannot convert char to static TCHAR oder sowas ähnliches.
Damals war mir das nicht so wichtig, also habe ich kurzerhand static TCHAR verwendet und für einen ersten Test war alles in Butter.
Ich habe mir noch gedacht, das muss ich mir später noch genauer anschauen, aber später habe ich diesen Punkt nie wieder angeschaut, weil es ja immer funktioniert hat.

Jetzt wo ich mich etwas näher mit WinInet beschäftige hatte ich das schon völlig vergessen.

Ich sag mal danke fürs Augen öffnen und verbuche das unter "wieder was gelernt".
 
Zurück