Blödes Probleme mit char und Paketen

Attila3

Grünschnabel
Hallo,

ich habe ein sonderbares Problem mit dem Erstellen von Packeten.

Wenn ich die Variable über:

unsigned char *Var = new unsigned char (sizeofVar);

definiere kann ich die Variable in einem IP-Paket verwenden. D. h. der Werte wird übernommen. Normalerweise wird allerdings die reservierte Größe des Speicherplatzes in [] Klammern gesetzt. Deshalb stürzt des Programm dann auch wenig später ab. Der Speicher ist anscheind auch nicht mit:

delete var; oder

delte[] var;

frei zu bekommen. free() scheidet aus bzw. funktioniert auch nicht, da esw für malloc() gedacht ist. Bei der Verwendung von malloc() sehen die Probleme ähnlich aus. Setzt man die VariabelenGröße in [] tritt zwar dieses Problem nicht auf, jedoch verändert die Variable ihren Wert, wenn sie in das Paket mit varbind übernommen wird.

Meine Frage(n);

Gibt es für das Einfügen der Variablen über unsigned char() eine speziellen Löschbefehl?

Gibt es verschiedene Packet.h, die es vielleicht erlauben, auch Variable, die mit unsigned char [] definiert worden sind, mit dem richtigen Wert zu übernehmen?

Vielen Dank vorab für eine Antwort und ein schönes Wochenende
Attila3
 
Wenn das Programm abstürzt, dann hast du mehr hineingeschreiben als du dürftest.

Da du deine Variable sizeofVar nennst.. benutzt du sizeof, umd die Größe zu ermitteln?
Bei einem Zeiger hätte es fatale Folgen, weil du immer nur die Größe einer Speicheradresse wiederbekommst, und die ist i.d.R., oder genauer: immer, 4 Bytes groß.

Geb nicht die Funktionen schuld, das ist Quatsch hoch drei.
Wenn printf mir Müll ausgibt, dann bin ich daran schuld ;).
 
Blödes Probleme mit char und Paketen-->weitere Details

Hallo,

vielen Dank erst einmal für die Antwort. Gemeint war mit sizeof the Reservierung des Speicherplatzes für die Variable. Vielleicht etwas unschön ausgedrückt. Also etwa so:

unsigned char *Data = new unsigned char[9]; bzw.

unsigned char *Data = new unsigned char(9);

Welche Möglichkeiten gibt es den Speicherplatz im zweiten Falle wieder frei zu machen bzw. im 1. Falle die Daten in gescheide IP-Pakete (z. B. verschiedene Version der Packet.h) zu verpacken.

Vielen Dank für einen Tipp.
Attila3
 
Ich würde auch vermuten, dass dein Programm abstürzt, weil du zu wenig Speicher für Var reserviert hast.

Wie kommst du darauf, dass der Absturz durch das delete hervorgerufen wird?

Für unsigned char kannst du das delete bzw. delete[] genauso verwenden wie für jeden anderen Datentyp/Objekt auch. Folgendes Beispiel funktioniert jedenfalls :) :
Code:
#include <iostream>

using namespace std;

int main()
{	
	const int anzahl = 9;

	unsigned char *test = new unsigned char[ anzahl ];
	
	for (int i=0; i<anzahl; i++)		//werte zuweisen
		*(test+i) = 0xFF;
	
	for (int i=0; i<anzahl; i++)		//ausgeben
		cout << (int)*(test+i) << endl;

	delete[] test;

	getchar();
	return 0;
}

Deine entsprechende Codepassage würde mir vielleicht auch weiterhelfen zu verstehen, wo genau das Problem ist. Zumindest mir ist noch nicht ganz klar für welche Funktion du einen dynamischen erzeugten byte-Buffer brauchst. Vielleicht genügt auch ein normaler byte-Array?!
 
Hallo GeHo,

vielen Dank erst einmal für die Antwort und den Code. In Abwandlung Deines Codes habe ich meine Version unten angeheftet.
Code:
#include <iostream>
#include.......
# include........

using namespace std;

int main()
{

	unsigned char *test = new unsigned char[ 9];
	
	for (int i=0; i<anzahl; i++)		//werte zuweisen
		test[i] = 0xFF;                     //<-- Achtung weicht ab
	
                Packet ps15(V1SETCOMMAND);                //<-- Ausgabe erfolgt über           
               ps15.Community(WriteCommunity.c_str());      // die EthernetSchnittstelle 
               ps15.RequestId(226);                                           //IP-Paket
              stroid = AnsiString(AndereVariable+ irgendeinProfName);
              OidVarbind* oidSet32 = new OidVarbind(stroid.c_str());
              StringVarbind* stringVarbind32 = new StringVarbind(test);  //<-- Beim Überneh-
              VbPair* vbpset32 = new VbPair(oidSet32, stringVarbind32); //men verändert sich 
              ps15.Add(vbpset32);                                                         // der Wert von test
              UdpClient udpset15(161, IPAdress.c_str());
              udpset15.Send(&ps15); 
                	

	delete[] test;

	getchar();
	return 0;
}


Zurzeit kann ich leider nicht prüfen, ob Dein Vorschlag funktioniert. Dazu ist ein umfangreicher Testaufbau notwendig. Werte mich morgen gleich darum kümmern. Du weist der Variablen auf einem anderen Weg die Werte zu. Vielleicht liegt darin die Lösung.

Einen schönen Sontag
Attila3
 
Help! Blödes Probleme mit char und Paketen

Hallo,

ich kann definitiv die Definition der Anzahl meiner Variablen nur in runde Klammern setzen. Ansonsten werden die Werte zur Bildung von IP-Paketen (siehe oben) nicht übernommen:

Code:
#include <iostream>

using namespace std;

int main()
{
       const int anzahl = 9;
      
      unsigned char *test = new unsigned char(anzahl );  //<--entspricht nicht den Regeln
	
............
}

Dies hat aber zur Folge, dass das Programm abstürzt, weil der Speicherbereich in dem die Variablen stehen, nicht richtig definiert ist. Gibt es einen Befehl mit dem man trotz runder Klammer den Speicherbereich wieder freigeben kann? free() habe ich schon probiert. Das kommt allerdings nur in Verbindung mit malloc() in Frage, was nicht funktioniert.

Hilfe!
Besten Dank vorab!
Attila3
 
Zuletzt bearbeitet:
Hi.
Hallo,

ich kann definitiv die Definition der Anzahl meiner Variablen nur in runde Klammern setzen. Ansonsten werden die Werte zur Bildung von IP-Paketen (siehe oben) nicht übernommen:
Was meinst du damit? Was wird denn stattdessen übernommen?

Mit den runden Klammern wird aber nur 1 unsigned char auf dem Freispeicher angelegt, dessen Wert dann mit 9 initialisiert wird. Du mußt die eckigen Klammern verwenden um ein Array dynamisch anzulegen.

Variablen, die nur auf eine einzelne Entität zeigen, kannst du ganz normal mit delete wieder freigeben.

Gruß
 
Zuletzt bearbeitet:
Hallo deppthroat,

vielen Dank für die Antwort.

Hi.
Was meinst du damit? Was wird denn stattdessen übernommen?

Wenn diese Zeile zur Bildung der IP-Pakete aufgerufen wird, dann verändert die Variable ihren Wert (siehe auch oben):

"StringVarbind* stringVarbind = new StringVarbind(test);"

Es entsteht eine willkürliche Zahl. Zudem muß das Ganze als Hex-Wert übernommen werden. Auch gibt es auch ein Problem den Hex-Wert 0x00 abzubilden. Der ist nähmlich auch '\0' und das bedeutet Zeichenende. Sonst könnte man die Variable bis an diese Stelle auslesen. Durch die Definition der Länge in den runden Klammern, werden auch nur soviel Stellen berücksichtigt und es ändert sich der Werte der Variablen beim Aufruf der o. a. Programierzeile nicht. Durch den Einsatz der runden Klammern für die Stellenzahl der Variablen stürzt das Programm dann aber ab. Habe es auch schon mit der Methode von GeHo "*(Var+i) = 0x00" (siehe oben) versucht.

Einen schönen Tag deepthroat
 
Zurück