ATMega8: Pointer auf int32_t Array

Gast #3211400
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
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
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
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
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
@ 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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.