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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.