Feld über ein Feld legen

Gast #215127
Lesenswert?
• ▲
▼
Hi Leute,

ich würde gerne ein Feld über ein Feld legen (um Speicherplatz zu
sparen). Und zwar so...

Das Ursprungsfeld ist:

short Test[512];

und das kleinere Feld, welches ich 4 mal darüberlegen will ist:

short TestSmall[128];

Ich möchte nämlich nur auf 128 Werte eine Operation ausführen.

Ein
TestSmall=&Test[0];
OperationOnTestSmall();
TestSmall=&Test[128];
usw.
funktioniert natürlich nicht.

Aber, so im Prinzip hätte ich es gerne, da ich dann ganz einfach auf
die Feldinhalte zugreifen und meiner OperationOnTestSmall schön
übergeben.

Wie macht man denn sowas?
Kann ich das nur mit nem Pointer machen?
Dadurch würde dann der schöne Zugriff über [x] wegfallen.
Ein Feld ist doch eigentlich auch nur ein Pointer...

Güße Andreas
Gast #215130
Lesenswert?
• ▲
▼
So richtig erschließt sich mir der Sinn auch nicht, aber so geht es:
1
union
2
{
3
  unsigned char test[512];
4
  unsigned char test1[128];
5
  unsigned char test2[128];
6
  unsigned char test3[128];
7
  unsigned char test4[128];
8
}
9
beispiel;

Hab ich eben kompiliert, 512 Byte RAM mehr.

MW
Gast #215131
Lesenswert?
• ▲
▼
@Michael,

nein, so geht das nicht ganz. Der Ansatz ist zwar gut, aber die
Umsetzung hat ein kleinen Fehler.

So wie ich Andreas verstanden habe, will er die vier kleineren Felder
unabhängig voneinander haben. Also so:
1
union
2
{
3
  short test[512]
4
  short small[4][128]
5
} 
6
beispiel;

Oder:
1
union
2
{
3
  short test[512];
4
  struct
5
  {
6
    short test1[128];
7
    short test2[128];
8
    short test3[128];
9
    short test4[128];
10
  } 
11
  small;
12
}
13
beispiel;

Oder, oder, oder... Möglichkeiten gibt's viele...
Gast #215132
Lesenswert?
• ▲
▼
Mhm, habs mir auch nochmal durch den Kopf durchgehen lassen.
Und mit der Union überlegt...

Wie lautet hier denn der code Tag im Forum?

union
{
  unsigned short gross[512];
  struct
  {
    short klein1[128]         : 16;
    short klein2[128]         : 16;
    short klein3[128]         : 16;
    short klein4[128]         : 16;
  } kleinzugriff;
}grosszugriff;


So wäre es möglich...
@Unbekannter
Muss ich nicht die Speicherbreite im struct angebn?

Nur brauch ich dafür viel Code.

Die Sache ist die, ich will ne FFT über 128 Werte laufen lassen.
Insgesamt habe ich aber 512 Werte.
Eigentlich könnte ich hergehen und die Werte aus dem 512er Feld
kopieren in ein 128er Feld. FFT machen und dann zurück in das 512er
Feld.
Das dauert länger (umkopieren) und braucht mehr Speicher. [128] Feld.
Wenn ich das Feld in 4 Teile aufteile, entfällt das ganze. Ich brauche
die Ursprungsdaten des A/D Wandlers nicht mehr.

Das isst der gedanke dahinter.

Nur ist es so dass mein Feld nicht 512 Werte hat sondern 6192 = 54 *
128 Werte. Müsste also viel Code schreiben um die jeweilige FFT auf das
jeweilge Feld ausführen zu lassen.
Gast #215133
Lesenswert?
• ▲
▼
> Mhm, habs mir auch nochmal durch den Kopf durchgehen lassen.
> Und mit der Union überlegt...
>
>
> Wie lautet hier denn der code Tag im Forum?

Klikce einfach bei meinem Posting auf des kleine Fragezeichen oben. Da
steht dann, wie's geht.

> union
> {
>   unsigned short gross[512];
>   struct
>   {
>     short klein1[128]         : 16;
>     short klein2[128]         : 16;
>     short klein3[128]         : 16;
>     short klein4[128]         : 16;
>   } kleinzugriff;
> }grosszugriff;

Wozu immer die Bitfelder? Der short ist doch schon 16bit groß. In C99
nimmt man übrigens am besten int16_t aus <stdint.h>.

> So wäre es möglich...
> @Unbekannter
> Muss ich nicht die Speicherbreite im struct angebn?

Was für eine Speicherbreite?

> Nur brauch ich dafür viel Code.

Wofür?

> Die Sache ist die, ich will ne FFT über 128 Werte laufen lassen.
> Insgesamt habe ich aber 512 Werte.
> Eigentlich könnte ich hergehen und die Werte aus dem 512er Feld
> kopieren in ein 128er Feld. FFT machen und dann zurück in das
> 512er Feld.
> Das dauert länger (umkopieren) und braucht mehr Speicher. [128]
> Feld.
> Wenn ich das Feld in 4 Teile aufteile, entfällt das ganze. Ich
> brauche die Ursprungsdaten des A/D Wandlers nicht mehr.
>
> Das isst der gedanke dahinter.

Dafür brauchst du das ganze aber doch gar nicht. Da reicht auch ein
Zeiger auf das erste Byte des 128er-Feldes. Also:
1
short* TestSmall;
2

3
TestSmall = Test + 128 * IndexKleinesFeld;
4
OperationOnTestSmall();

> Nur ist es so dass mein Feld nicht 512 Werte hat sondern 6192 = 54
> * 128 Werte. Müsste also viel Code schreiben um die jeweilige FFT
> auf das jeweilge Feld ausführen zu lassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren