Forum: PC-Programmierung Verschiedene Zeiger auf dieselbe Adresse


von Martin (Gast)


Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
}

von Martin (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Hallo Rufus!

Vielen Dank für deine Antwort. Ich versuche das mal.

Schöne Grüße

Martin

von Gast (Gast)


Lesenswert?

Schau mal nach, ob bei Dir nicht mmap() unterstuetzt wird. Das ist 
schneller und es muss kein Speicher explizit allokiert werden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Helmut L. (helmi1)


Lesenswert?

Die moeglichkeit von Rufus geht natuerlich auch.

von Martin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.