PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Ich hab nen Hänger


Gast
2009-12-14, 16:47:37
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) ? :)

Gast
2009-12-14, 16:48:43
Bevor ihr euch wundert, wieso ich da ein struct verwende...es steht noch mehr außer bla drin ^^

pest
2009-12-14, 16:51:02
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.

pest
2009-12-14, 17:19:51
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?

samm
2009-12-14, 18:14:50
Jup, string würde ich sogar empfehlen, hatte gerade mit lustigen Artefakten zu tun, die mit const char* in einem struct zusammenhingen.

Coda
2009-12-14, 19:20:40
Es ist eigentlich kein Problem einen Pointer in einer Struktur zu speichern ;)

Aber dennoch würde ich bei sowas auch std::string empfehlen.

samm
2009-12-14, 21:00:43
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:

Gast
2009-12-15, 10:59:57
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");

Gast
2009-12-15, 11:54:34
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 ?

Gast
2009-12-15, 12:06:36
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;

Gast
2009-12-15, 12:10:55
Oder noch einfacher TEST x = {"12345",
... // <-- hier die Initialisierung der übrigen struct-members>
};

Gast
2009-12-15, 12:57:08
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 ?

RLZ
2009-12-15, 13:44:16
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...

Gast
2009-12-15, 15:27:45
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...

Gast
2009-12-18, 08:20:46
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);

Gast
2009-12-18, 08:21:50
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);