ATMega8: Pointer auf int32_t Array

Gast #3211400
Lesenswert?

Hallo,

ich möchte in einer Unterfunktion ein Array aus 32 Bit Integer Werten 
verarbeiten.

In 8 Bit würde ich das ja wie folgt machen:
1
void funktion(int8_t* tmpwert){
2
   (int8_t)*(tmpwert)++;     //für tmpwert[0]
3
   (int8_t)*(tmpwert+1)++;   //für tmpwert[1]
4
   (int8_t)*(tmpwert+2)++;   //für tmpwert[2]
5
}
6

7

8
//Aufruf mit
9

10
int8_t wert[3]={0,0,0};
11

12
//...
13

14
funktion(&wert);

Muss ich beim Zugriff auf einen 32 bit Integer die Pointer für tmpwert 
um eins oder um vier erhöhen um auf tmpwert[1] zu kommen?


Danke & Gruß

Frank
Persönliche Seite #3211410
Lesenswert?

Frank schrieb:
> In 8 Bit würde ich das ja wie folgt machen:void funktion(int8_t*
> tmpwert){
>    (int8_t)*(tmpwert)++;     //für tmpwert[0]
>    (int8_t)*(tmpwert+1)++;   //für tmpwert[1]
>    (int8_t)*(tmpwert+2)++;   //für tmpwert[2]
> }

Und warum so ... überaus umständlich?

Warum nicht ganz einfach so?
1
void funktion(int8_t* tmpwert){
2
  tmpwert[0]++;
3
  tmpwert[1]++;
4
  tmpwert[2]++;
5
}

Dann sollte auch klarwerden, wie das ganze aussieht, wenn das Array 
einen anderen Datentyp hat. Nämlich ... genauso.
Gast #3211422
Lesenswert?

Sorry, dass ich mich schlecht ausgedrückt habe...

in 32 bit wäre der Code dann so
1
void funktion(int32_t* tmpwert){
2
   (int32_t)*(tmpwert)++;     //für tmpwert[0]
3
   (int32_t)*(tmpwert+1)++;   //für tmpwert[1]   oder +4?
4
   (int32_t)*(tmpwert+2)++;   //für tmpwert[2]   oder +8?
5
}
6

7

8
//Aufruf mit
9

10
int32_t wert[3]={0,0,0};
11

12
//...
13

14
funktion(&wert);

Ich kann nciht direkt drauf zugreifen, weil ich je nach Fall auf 
unterschiedliche arrays zugreifen möchte...

Insgesamt wird das ganze ein IIR Filter für mehrere Kanäle...
Gast #3211430
Lesenswert?

sollte doch einfach so gehen:
1
void funktion(int32_t* tmpwert){
2
   tmpwert[0]++;     //für tmpwert[0]
3
   tmpwert[1]++;   //für tmpwert[1]   oder +4?
4
   tmpwert[2]++;   //für tmpwert[2]   oder +8?
5
}

oder habe ich was übersehen?
#3211437
Lesenswert?

Frank schrieb:

>
1
> void funktion(int32_t* tmpwert){
2
>    (int32_t)*(tmpwert)++;     //für tmpwert[0]
3
>    (int32_t)*(tmpwert+1)++;   //für tmpwert[1]   oder +4?
4
>    (int32_t)*(tmpwert+2)++;   //für tmpwert[2]   oder +8?
5
> }
6
> 
7
> 
8
> //Aufruf mit
9
> 
10
> int32_t wert[3]={0,0,0};
11
> 
12
> //...
13
> 
14
> funktion(&wert);
15
>


Und warum so kompliziert?
tmpwert ist doch schon ein POinter auf eine 32-Bit Einheit. Wozu da noch 
lange rumcasten?

Schreibs einfach so wie vorgeschlagen
1
void funktion(int32_t* tmpwert){
2
   tmpwert[0]++;
3
   tmpwert[1]++;
4
   tmpwert[2]++;
5
}
und guts ists?

AUf der einen Seite wird immer geschrieen, dass C so kompliziert wäre. 
Dann gibt es mal eine einfache Schreibweise und keiner will sie 
benutzen.

> Ich kann nciht direkt drauf zugreifen, weil ich je nach Fall auf
> unterschiedliche arrays zugreifen möchte...

Und?
Was hat das damit zu tun.
Du übergibst ja die Adresse des Arrays an die Funktion. Passt doch!


Du brauchst ganz dringend ein C-Buch und solltest so ungefähr die erste 
Hälfte durcharbeiten, ehe du dich an reale Programme wagst. Das hat doch 
keinen Sinn, wenn du von deinem 'Werkzeug' 60% nicht verstehst wie das 
funktioniert.
#3211449
Lesenswert?

@ Frank (Gast)

>in 32 bit wäre der Code dann so

>void funktion(int32_t* tmpwert){
>   (int32_t)*(tmpwert)++;     //für tmpwert[0]
>   (int32_t)*(tmpwert+1)++;   //für tmpwert[1]   oder +4?
>   (int32_t)*(tmpwert+2)++;   //für tmpwert[2]   oder +8?
>}

+1 stimmt schon, denn der Compiler rechnet immer vom Pointer zur 
physikalischen Adresse um. Wenn du aus int32 zeigst, witrd er immer 
+X*sizefo(int32) rechnen.


>Ich kann nciht direkt drauf zugreifen, weil ich je nach Fall auf
>unterschiedliche arrays zugreifen möchte...

Die aber alle von gleichen Typ sein müssen, sonst wird es umständlich, 
da müsste man sizof(type) als Parameter übergeben.

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