Hallo Leute! Ich programmiere unter C und habe folgendes Problem: Ich lade ein binäres File in ein char Feld. Es handelt sich aber um 32-Bit-Werte, was bedeuetet, dass ich später mit einem 32-Bit-Pointer darauf zugreifen muss. Vorher habe ich es folgendermaßen gelöst: union uniontyp{ unsigned long lbuffer[1000]; unsigned char abuffer[4000]; }u; In den u.abuffer habe ich das File reingeladen und greife später mit u.lbuffer[zeiger]; darauf zu. Das Problem ist jetzt, dass die Größe von 1000 und 4000 fix sind und ich beim Compilieren wissen muss, wie groß das File maximal ist. Diese Lösung ist meiner Meinung nach sehr unschön und unflexibel. Danach hätte ich es mit malloc versucht: union uniontyp{ unsigned long *lbuffer unsigned char *abuffer }u; u.(*lbuffer)=(void*)malloc(samples); Der Compiler meldet mir einen Fehler. Geht das überhaupt in einem Union ein malloc zu verwenden? - Bzw, wie könnte ich das Problem auf elegante Weise lösen. Vielen Dank im Voraus. Schöne Grüße Martin
Versuchs mal so: typedef union { unsigned long ul; unsigned char uc[4]; }u; u *buffer; buffer = (u*)malloc(samples*sizeof(u)); buffer[n].ul = 1234; buffer[n].uc[0] .. buffer[n].uc[3] Gruss Helmi
Und warum um alles in der Welt soll man dafür eine union benötigen?
1 | uint8_t *buffer; |
2 | uint32_t *pointer; |
3 | |
4 | // angenommen, daß "samples" die Anzahl der 32-Bit-Werte ist
|
5 | |
6 | buffer = malloc(samples * sizeof (uint32_t)); |
7 | |
8 | // buffer füllen
|
9 | //
|
10 | |
11 | |
12 | pointer = (uint32_t *) buffer; |
13 | |
14 | // und pointer nutzen
|
15 | |
16 | for (i = 0; i < samples; i++) |
17 | {
|
18 | pointer[i] = irgendwas; |
19 | }
|
Hallo Helumt! Vielen Dank für deine Antwort. Diese Möglichkeit hätte ich auch schon versucht, aber das Problem dabei ist, dass man jetzt ein Union-Feld hat mit je 4 Bytes pro Union-Element. Ich möchte aber ein einziges Union-Element mit einem frei definierbaren Feld drinnen. Ich habe auch schon überlegt, ob es nicht möglich ist einen Long-Zeiger und einen Character-Zeiger auf dieselbe Adresse zu biegen. Geht das? Dann fiele das mit dem Union weg und ich kann Speicher für die zwei verschiedenen Zeiger, die auf denselben Speicherbereich zeigen, reservieren wie ich möchte. Danke im Voraus. Schöne Grüße Martin
Hallo Rufus! Vielen Dank für deine Antwort. Ich versuche das mal. Schöne Grüße Martin
Schau mal nach, ob bei Dir nicht mmap() unterstuetzt wird. Das ist schneller und es muss kein Speicher explizit allokiert werden.
> Ich habe auch schon überlegt, ob es nicht möglich ist einen > Long-Zeiger und einen Character-Zeiger auf dieselbe Adresse > zu biegen. > Geht das? Selbstverständlich, s.o.
Hallo Leute! Nein, mmap wird nicht unterstützt, aber die Lösung von Rufus hat voll hingehauen. Danke. Schöne Grüße Martin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.