Problem mit Array und Zeigern
-
Hi Leute,
ich bin neu hier. Ich hoffe, dass ich das richtige Unterforum erwischt habe. Nun zu meiner Frage, und zwar arbeite ich mich gerade durch ein C-Programm und bleibe an den folgenden zwei Zeilen stecken
double mdct_freq[2][2][576]; double (*mdct_enc)[2][32][18] = (double (*)[2][32][18])mdct_freq;
Also Zeile 1 versteh ich ja noch ohne Probleme (da gibts ja auch nicht soo viel zu kapieren).
Aber was da genau in Zeile 2 passiert und was dann in mdct_enc genau drinsteht, das ist mir ein Rätsel. Ich hoffe jemand von euch kann mir da weiterhelfen, was Zeile 2 genau bedeutet, bzw. was dort genau passiert?MfG,
Mathias
-
Batti81 schrieb:
Aber was da genau in Zeile 2 passiert und was dann in mdct_enc genau drinsteht, das ist mir ein Rätsel.
mdct_enc ist ein pointer auf ein 2*32*18 elemente grosses array aus doubles und wird mit der adresse des ersten elements von mdct_freq initialisiert. warum jemand sowas hirnrissiges gecodet hat, weiss ich nicht. wahrscheinlich gibt es eine funktion, die genau diesen typ haben will.
-
Hallo,
erstmal danke schön für die Antwort! Ich bin ehrlich gesagt nicht so bewandert im Umgang mit Zeigern. Vielleicht habe ich auch noch ein Denkproblem, aber prinzipiell ist mdct_enc ja nur halb so groß wie mdc_freq oder? Gehen dann dabei nicht Werte verloren? Wie würde ich das ganze eigentlich ohne Zeiger abbilden, wenn ich sie nicht zur Verfügung hätte?
MfG,
Mathias
-
Batti81 schrieb:
Vielleicht habe ich auch noch ein Denkproblem, aber prinzipiell ist mdct_enc ja nur halb so groß wie mdc_freq oder?
Gehen dann dabei nicht Werte verloren?ne, verloren geht nix. wenn man mdct_enc eins hochzählt, dann zielt er in die mitte von mdc_freq und man kann auf den rest zugreifen.
Batti81 schrieb:
Wie würde ich das ganze eigentlich ohne Zeiger abbilden, wenn ich sie nicht zur Verfügung hätte?
ich glaube ohne zeiger geht sowas nicht. vielleicht kann man was mit unions tricksen, aber das wäre mindestens so ein übler hack wie jetzt auch schon.
warum überhaupt ein [2][2][576]-array in [2][32][18]-arrays aufteilen?
-
Hallo,
also das ganze stammt aus einer Implementation eines MP3-Encoders.
Ich will ja jetzt auch nich aufdränglich sein, aber wie meinst du:
wenn man mdct_enc eins hochzählt, dann zielt er in die mitte von mdc_freq und man kann auf den rest zugreifen.
Wenn es nicht zuviel verlangt ist, könntest du mir da ein kleines Beispiel geben? Ich freue mich auf eine Antwort.
MfG,
Mathias
-
double mdct_freq[2][2][576]; double (*mdct_enc)[2][32][18] = (double (*)[2][32][18])mdct_freq; printf ("arraystart: %u arrayend: %u\nanfang:%u mitte:%u ende:%u\n", mdct_freq, // anfangsadresse des arrays ((char*)mdct_freq)+2*2*576*sizeof(double), // letzte adresse-1 des arrays mdct_enc, // pointer zeigt auf beginn des arrays mdct_enc+1, // pointer + 1 zeigt in die mitte des arrays mdct_enc+2); // pointer + 2 zeigt auf letzte adresse-1 des arrays