Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit Array und Zeigern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
24.09.2007, 08:12 Uhr
Batti81



Hi Leute,

ich bin neu hier. Ich hoffe, dass ich das richtige Unterforum erwischt habe. Nun zu meiner Frage, und zwar artbeite ich mich gerade durch ein C-Programm und bleibe an den folgenden zwei Zeilen stecken


C++:
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.09.2007, 13:43 Uhr
Kest
saint


Hi!

Das ist eigentlich 'n falscher Versuch zu casten. Richtig wäre eigentlich so was

C++:
double (*mdct_enc)[32][18]=(double (*)[32][18])mdct_freq;

So was lässt sich machen, weil es in C nur eindimensionale Arrays gibt.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 24.09.2007 um 13:46 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.09.2007, 18:13 Uhr
0xdeadbeef
Gott
(Operator)


Falsch ist das nicht, nur ungewöhnlich. Es ist wichtig zu verstehen, dass Arrays in dieser Form flach auf dem Heap liegen - ein double[10][10] unterscheidet sich nur in der Adressierung von einem double[100].

Was der Cast macht, ist, mdct_freq von einem Feld von double[2][576] in ein Feld - in Form eines Zeigers - auf double[2][32][18] umzudeuten. Mit 32 * 18 = 576 kommt das in der Größenordnung auch wieder hin.

Die Syntax ist, zugegeben etwas unintuitiv - besonders häufig kommt so etwas nicht vor - wichtig ist zu sehen:

C++:
double *mdct_enc[2][32][18]; /* 2 * 32 * 18-Feld von double-Zeigern */
double (*mdct_enc)[2][32][18]; /* Zeiger auf Felder von 2 * 32 * 18 doubles */


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.09.2007, 13:27 Uhr
Batti81



Hallo,

erstmal danke für die Antworten. Aber es ist ja nun so, dass das Array mdct_freq 2*2*576 = 2304 Elemente hat, also quasi doppelt so groß ist, wie mdct_enc mit 2*32*18 = 1152 Elementen. Wie ist denn das vereinbar? Gehen dabei dann Elemente verloren?

MfG,

Mathias
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.09.2007, 15:00 Uhr
0xdeadbeef
Gott
(Operator)


Nein, mdct_enc zeigt auf das erste Element von mdct_freq, und lässt sich selbst wie ein Array benutzen. Es ist im Grunde das selbe wie bei

C++:
int a[2];
int *p = a;


...nur halt mit mehr Indices.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.11.2007, 17:48 Uhr
Batti81



Hallo,

ich war jetzt in letzter Zeit etwas beschäftigt, so dass ich mich mit dem Problem gar nicht mehr beschäftigt habe. Ich muß aber gestehn, dass ich es leider immer noch nich ganz verstehe. Ich habe mal versucht nachzuvollziehen, wie die Werte im neuen Array dann aussehn. Ich befürchte, da is aber denk ich mal ein Riesendenkfehler drin...


C++:
int x = 0;

double mdct_freq[2][2][576] = {0};

for (int i = 0; i  <= 1; i++) {
    for (int j = 0; j <= 575; j++) {
        mdct_freq[0][i][j] = x;
        x++;
    }
}

double (*mdct_enc)[2][32][18] = (double (*)[2][32][18])mdct_freq;
printf("sizeof(mdct_freq): %d\n", sizeof(mdct_freq));
printf("sizeof(mdct_enc): %d\n", sizeof(*mdct_enc));
    
for (int i = 0; i <= 31; i++) {
    for (int j = 0; j <= 17; j++) {
        printf("[%d][%d]: %.0lf\n", i, j, *mdct_enc[0][i][j]);
    }
}

getchar();
return 0;



Ich hoffe ihr habt die Geduld mir zu helfen.

Danke schön!!

MfG,

Mathias
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.11.2007, 18:48 Uhr
0xdeadbeef
Gott
(Operator)


Du kannst es dir im Grunde so vorstellen, als hätte jemand

C++:
double mdct_freq[2][2][576];
double mdct_enc[2][2][32][18];

memcpy(mdct_enc, mdct_freq, sizeof(mdct_freq));


geschrieben, nur dass halt nicht kopiert, sondern ein Zeiger angelegt wird. Es geht darum, die double[576] auf der untersten Ebene von mdct_freq als double[32][18] zu interpretieren. Den selben Effekt hätte es, statt

C++:
mdct_enc[v][w][x][y]



C++:
mdct_freq[v][w][x * 18 + y]


zu schreiben, ersteres sieht aber schöner aus - daher das Rumgecaste.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.11.2007, 18:54 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


zu:


C++:
mdct_freq[v][w][x * 18 + y]



muss es nicht y*18 + x heißen?
--
class God : public ChuckNorris { };

Dieser Post wurde am 20.11.2007 um 18:54 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.11.2007, 18:57 Uhr
0xdeadbeef
Gott
(Operator)


Ich bin mir ziemlich sicher, dass es sorum richtig ist, werde das aber nachher nachprüfen. So oder so, das Prinzip sollte klar sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.11.2007, 19:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja wenn man ein

foo[x][y] feld hat mit z.b bar[14 * 13]

greift man ja über y * "height" + x zu, also y * 13 + x
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: