Forum: PC-Programmierung array pointer an funktion problem


von Jan (Gast)


Lesenswert?

Ich habe ein array, welches an einer Funktion übergeben wird.
Dort sollen die Werte bearbeitet werden und nach dem Funktionsaufruf die 
neuen werte zur Verfügung sein.
Dies funktioniert bei mir aber irgendwie nicht
1
void funktion1(uint16_t* arr1, uint16_t* arr2, uint8_t length);
2
{
3
  for(uint8_t x=0; x<length; x++)
4
  {
5
    arr2[x] = arr1[x] / 2;
6
    printf("arr1[%d]: %d     arr2[%d]: %d\r\n", x, arr1[x], x, arr2[x]);
7
  }
8
}

Die Ausgabe ist dann
1
arr1[0]: 100    arr2[0]: 50
2
arr1[1]: 100    arr2[1]: 50
3
arr1[2]: 100    arr2[2]: 50
4
... ... ...

Die Funktion rufe ich wie folgt auf
1
void funktion(void)
2
{
3
  uint16_t arr1[10] = {0};
4
  uint16_t arr2[10] = {0};
5
  for(uint8_t x=0; x<10; x++)
6
  {
7
    arr1[x] = 100;
8
  }
9
  funktion1(&arr1[0], &arr2[0], 10);
10
11
  for(uint8_t x=0; x<10; x++)
12
  {
13
    printf("arr1[%d]: %d     arr2[%d]: %d\r\n", x, arr1[x], x, arr2[x]);
14
  }
15
}

Die Ausgabe ist dann
1
arr1[0]: 100    arr2[0]: 0
2
arr1[1]: 100    arr2[1]: 0
3
arr1[2]: 100    arr2[2]: 0
4
... ... ...

warum ist arr2 immernoch 0? es wird doch eigentlich in funktion1 
geändert?

von Klaus W. (mfgkw)


Lesenswert?

Wie groß ist eine int bei dir?

%d ist die Formatierung, um eine int dezimal auszugeben.
Du versuchst es aber mit uint8_t und uint16_t, dann findet printf() 
nicht die Werte auf dem Stack.

Die richtige Formatierung wäre:
1
#include <inttypes.h>
2
#include <stdint.h>
3
...
4
  printf( "arr1[%"PRIu8"]: %"PRIu16"     arr2[%"PRIu8"]: %"PRIu16"\r\n", x, arr1[x], x, arr2[x] );

: Bearbeitet durch User
von gamp (Gast)


Lesenswert?

Hallo,

ist das C? Ich wusste garnicht, dass man die Definition des Iterators so 
in die for-Schleife einbringen kann -- Naja.
Ich habe leider keinen Fehler gefunden, nur eine Anmerkungen

Jan schrieb:
1
>   uint16_t arr1[10] = {0};
2
>   uint16_t arr2[10] = {0};
Du initialisierst nur das erste Feld des Arrays? Wozu ist ist das gut?

von Klaus W. (mfgkw)


Lesenswert?

gamp schrieb:
> Du initialisierst nur das erste Feld des Arrays? Wozu ist ist das gut?

Der Rest wird automatisch mit 0 aufgefüllt.

gamp schrieb:
> ist das C? Ich wusste garnicht, dass man die Definition des Iterators so
> in die for-Schleife einbringen kann

Das geht schon seit dem letzten Jahrtausend so :-)

von Dirk B. (dirkb2)


Lesenswert?

Klaus W. schrieb:
> Wie groß ist eine int bei dir?

Mindestens 16 Bit.

Bei Funktionen mit variabler Parameterliste (so wie printf)
werden Ganzahlen auf mindestens int aufgewertet.
Fließkommazahlen auf double.
Darum gibt es eigentlich auch kein %lf, da %f schon alles macht.

von Mikro 7. (mikro77)


Angehängte Dateien:

Lesenswert?

Funktioniert bei mir.

Zeit doch mal das Programm was bei dir tatsächlich compiliert und 
ausgeführt wird.
1
> gcc -o test test.c
2
> ./test
3
arr1[0]: 100     arr2[0]: 50
4
arr1[1]: 100     arr2[1]: 50
5
arr1[2]: 100     arr2[2]: 50
6
arr1[3]: 100     arr2[3]: 50
7
arr1[4]: 100     arr2[4]: 50
8
arr1[5]: 100     arr2[5]: 50
9
arr1[6]: 100     arr2[6]: 50
10
arr1[7]: 100     arr2[7]: 50
11
arr1[8]: 100     arr2[8]: 50
12
arr1[9]: 100     arr2[9]: 50
13
arr1[0]: 100     arr2[0]: 50
14
arr1[1]: 100     arr2[1]: 50
15
arr1[2]: 100     arr2[2]: 50
16
arr1[3]: 100     arr2[3]: 50
17
arr1[4]: 100     arr2[4]: 50
18
arr1[5]: 100     arr2[5]: 50
19
arr1[6]: 100     arr2[6]: 50
20
arr1[7]: 100     arr2[7]: 50
21
arr1[8]: 100     arr2[8]: 50
22
arr1[9]: 100     arr2[9]: 50

von XYZ (Gast)


Lesenswert?

Hi,
Dein Funktionsheader ist fehlerhaft:
1
void funktion1(uint16_t* arr1, uint16_t* arr2, uint8_t length);
Das Semikolon am Ende muss weg, dann sollte es gehen.

VG
XYZ

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.