Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Ich hab nen Hänger
Tach zusammen !
Irgendwie steh ich grad auf dem Schlauch:
typedef unsigned char BYTE;
typedef struct {
BYTE *bla;
} TEST;
Ursprünglich war "bla" kein Zeiger sondern ein Array fester Größe. Ich wollte das ganze aber lieber dynamisch haben.
Nun will ich damit auch was anstellen, und zwar möchte ich "bla" nen Wert verpassen, z.B. ne Zahlenfolge "12345".
Vorher hab ich das so gemacht:
typedef unsigned char BYTE;
typedef struct {
BYTE bla[40];
} TEST;
TEST test;
memcpy(test.bla, "12345", 5);
Wie mach ich das ganze jetzt dynamisch (mit Zeiger) ? :)
Bevor ihr euch wundert, wieso ich da ein struct verwende...es steht noch mehr außer bla drin ^^
typedef unsigned char BYTE;
typedef struct {
BYTE bla[40];
} TEST;
TEST test;
memcpy(test.bla, "12345", 5);
Wie mach ich das ganze jetzt dynamisch (mit Zeiger) ? :)
memcpy(test->bla, "12345", 5);
del_4901
2009-12-14, 16:55:12
memcpy(test->bla, "12345", 5);
Das ist natuerlich Quark. Der Zeiger muss einfach nur mit new initialisiert werden und gut ist.
sorry ich dachte test soll nen ptr werden
Nighthawk13
2009-12-14, 18:11:20
memcpy(test.bla, "12345", 5);
Und das terminating Null-byte? :rolleyes: Lieber strcpy/strncpy nehmen...
Was sprich gegen std::string an der Stelle, wenn dynamischer Speicher verwendet werden soll?
Jup, string würde ich sogar empfehlen, hatte gerade mit lustigen Artefakten zu tun, die mit const char* in einem struct zusammenhingen.
Es ist eigentlich kein Problem einen Pointer in einer Struktur zu speichern ;)
Aber dennoch würde ich bei sowas auch std::string empfehlen.
Es ist eigentlich kein Problem einen Pointer in einer Struktur zu speichern ;)Das Speichern nicht, wenn man aber darauf rumturnt ohne Möglichkeit zum boundary-check... Ne, es war kurz gesagt hässlich, und nach einem simplen refactoring zu string musste nur noch wenig geputzt werden, ohne dass Zustand hinzugefügt werden musste (ist im string inklusive). Und wenn das mal nicht OT ist... :tongue:
Auweiha, wie würde das dann mit str(n)cpy aussehen ?
typedef unsigned char BYTE;
typedef struct {
BYTE *bla;
} TEST;
TEST test;
strcpy(test.bla, "12345"); // Konvertierungsfehler BYTE* in char*
Zeiger bringen mich immer wieder durcheinander und auch sonst bin ich programmiertechnisch alles andere als fit. Also verzeiht mir etwaige dumme Fragen :D
fezie
2009-12-15, 11:04:26
Wenn du einen string in test.bla speichern willst, wozu dann überhaupt das typedef BYTE dafür?
Mach *bla einfach ein char * und gut ist.
Ansonsten braucht halt explizite Casts:
strcpy((char *)test.bla, "12345");
Ok, logisch :D
Wenn ich das mache, bekomme ich beim Kompilieren allerdings folgenden Fehler:
"The variable 'test' is being used without being initialized".
Einer hier meinte ja was von "new", allerdings bräuchte ich "new" doch nur dann, wenn ich
TEST *test;
anstelle von
TEST test;
verwenden würde ?
Nochmal: Warum nimmst du nicht einen std::string sondern programmierst in C-Style?
Ausserdem, wieso nicht
typedef struct {
const char* bla;
} TEST;
TEST x;
x.bla = "12345";Oder wenn "12345" bereits in nem const char*-Pointer blubb steht, dann x.bla = blubb;
Oder noch einfacher TEST x = {"12345",
... // <-- hier die Initialisierung der übrigen struct-members>
};
OK, ich versuche es dann mal mit char* bla. Mein Threadtitel war schlecht gewählt, eigentlich orientiere ich mich schon mehr an C als an C++. Das würde ich gerne auch so beibehalten.
Noch ne andere Sache:
Angenommen in bla steht nun "12345". Nun würde ich gerne an diesen String noch "0001" bzw. "0002" anhängen, also:
"123450001" und "123450002"
Hintergrund der Geschichte ist, dass aus einer Eingabe (12345) zwei Hash-Werte erstellt werden sollen, drum die 1 bzw. 2 am Ende, das Umkippen eines Bits reicht ja für zwei komplett unterschiedliche Ergebnisse.
Ich möchte also einen String "12345" einlesen und nachträglich noch 0001 bzw. 0002 an diesen String anhängen. Wie mach ich das am geschicktesten ?
Ich möchte also einen String "12345" einlesen und nachträglich noch 0001 bzw. 0002 an diesen String anhängen. Wie mach ich das am geschicktesten ?
strcat?
Ohne konkreten Grund ist es fast immer eine schlechte Idee sich an C statt C++ zu orientieren...
Noch ne andere Sache:
Angenommen in bla steht nun "12345". Nun würde ich gerne an diesen String noch "0001" bzw. "0002" anhängen, also:
"123450001" und "123450002"
Hintergrund der Geschichte ist, dass aus einer Eingabe (12345) zwei Hash-Werte erstellt werden sollen, drum die 1 bzw. 2 am Ende, das Umkippen eines Bits reicht ja für zwei komplett unterschiedliche Ergebnisse.
Und wieder eine Überlegung in eine andere Richtung: Gescheiten Hash-Algorithmus verwenden.
Beispiel: Entweder wird die zweite identische Eingabe in den gleichen Bucket geworfen / an den ersten dran gekettet. Oder die Funktion springt <Primzahl> weiter.
fezie
2009-12-15, 21:49:43
strcat?
Ohne konkreten Grund ist es fast immer eine schlechte Idee sich an C statt C++ zu orientieren...
Ja, weil man bei strcat nämlich auch drauf aufpassen muss wieviel Speicher man allokiert hat für den Pointer.
Also eventuell braucht man da noch ein realloc() vor dem strcat.
std::string wäre für den Gast so einfach, aber anscheinend will er ja überhaupt nicht das nutzen obwohl er C++ coded und nicht reines C...
Du solltest erstmal speicher für *bla reservieren und *bla darauf zeigen lassen.
Dann sollte es auch ohne Probleme mit strcpy(bla, "foobar"); funktionieren.
Das sollte funktionieren:
typedef struct {
char *mypointer;
char mymemory[40];
} TEST;
TEST test;
test.mypointer = test.mymemory;
memcpy(test.mypointer, "12345", 5);
Du solltest erstmal speicher für *bla reservieren und *bla darauf zeigen lassen.
Dann sollte es auch ohne Probleme mit strcpy(bla, "foobar"); funktionieren.
Das sollte funktionieren:
typedef struct {
char *mypointer;
char mymemory[40];
} TEST;
TEST test;
test.mypointer = test.mymemory;
memncpy(test.mypointer, "12345", 5);
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.