www.mikrocontroller.net

Forum: PC-Programmierung Verschiedene Zeiger auf dieselbe Adresse


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und warum um alles in der Welt soll man dafür eine union benötigen?
uint8_t *buffer;
uint32_t *pointer;

// angenommen, daß "samples" die Anzahl der 32-Bit-Werte ist

buffer = malloc(samples * sizeof (uint32_t));

// buffer füllen
//


pointer = (uint32_t *) buffer;

// und pointer nutzen

for (i = 0; i < samples; i++)
{
  pointer[i] = irgendwas;
}


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rufus!

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

Schöne Grüße

Martin

Autor: Gast (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die moeglichkeit von Rufus geht natuerlich auch.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Nein, mmap wird nicht unterstützt, aber die Lösung von Rufus hat voll 
hingehauen.

Danke.

Schöne Grüße

Martin

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.