Hallo,
ich möchte eine Datenübertragung mit einem Pointer von Funktion A nach
Funktion b realisieren - leider geht das schief :-(
Erzeuger:
1 | uint8_t Fifo::Get(uint16_t *element) {
|
2 | if (read == write)
|
3 | {
|
4 | printf ("\n\r in get_false");
|
5 | return false;
|
6 | }
|
7 | printf ("\n\r Get: %d", *(buffer_ptr+(sizeof(uint16_t)*read)) );
|
8 | *element = *(buffer_ptr+(sizeof(uint16_t)*read));
|
9 | printf ("\n\r element in get: %d", *element);
|
10 | read = (read+1) & buffer_mask;
|
11 | return true;
|
12 | }
|
Bekommer:
1 | int main() {
|
2 |
|
3 | uint16_t counter;
|
4 | uint16_t *elem;
|
5 |
|
6 |
|
7 | printf ("\n\r Test ");
|
8 |
|
9 | for (counter=0; counter<10; counter++)
|
10 | {
|
11 | myfifo1.Put(counter);
|
12 | printf ("\n\r %d", counter);
|
13 | }
|
14 |
|
15 | printf ("\n\n\r Anz. Elemente in fifo: %d", myfifo1.Anzahl() );
|
16 |
|
17 | for (counter=0; counter<5; counter++)
|
18 | {
|
19 | myfifo1.Get(elem);
|
20 | printf ("\n\r %d", *elem );
|
21 | printf ("\n\n\r Anz. Elemente in fifo: %d", myfifo1.Anzahl() );
|
22 | }
|
23 | }
|
Dieser Bekommer mit *elem in "printf ("\n\r %d", *elem );" liefert Müll
- ich verstehe nicht, warum das so ist.
Mach ich das so:
1 | int main() {
|
2 |
|
3 | uint16_t counter;
|
4 | uint16_t elem;
|
5 |
|
6 |
|
7 | printf ("\n\r Test ");
|
8 |
|
9 | for (counter=0; counter<10; counter++)
|
10 | {
|
11 | myfifo1.Put(counter);
|
12 | printf ("\n\r %d", counter);
|
13 | }
|
14 |
|
15 | printf ("\n\n\r Anz. Elemente in fifo: %d", myfifo1.Anzahl() );
|
16 |
|
17 | for (counter=0; counter<5; counter++)
|
18 | {
|
19 | myfifo1.Get(&elem);
|
20 | printf ("\n\r %d", elem );
|
21 | printf ("\n\n\r Anz. Elemente in fifo: %d", myfifo1.Anzahl() );
|
22 | }
|
23 | }
|
dann klappt es auf einmal - aber ich kapiere nicht, warum das so ist.
Das hier müsste doch eigentlich das gleiche sein:
1 | int var;
|
2 | int *var_ptr;
|
3 |
|
4 | var = 10;
|
5 | *var_ptr = 10;
|
6 |
|
7 | var_ptr = &var;
|
8 | var = *var_ptr;
|
Wo ist mein Denkfehler? Die Funktion Get benötigt einen Pointer, weil
das Herauslesenergebnis aus dem Fifo an der Pointerspeicherstelle
aufbewahrt werden soll. Wenn ich nun in der Mainfunktion einen Pointer
dahin übergebe, der dann die Speicherstelle definiert, dann müsste doch
der Wert an diese Speicherstelle geschrieben werden. Und mit *var_ptr
bzw. in der Mainfunktion *elem greife ich doch dann auf den Inhalt der
Speicherstelle zu. Genauso mache ich es ja bei der Übergabe, wo ich in
der Mainfunktionsvariante 2 reinschreibe:
myfifo1.Get(&elem), dass vorher wie var nicht als Pointer definiert
wurde.
Ich hab da irgendwo einen Denkfehler bzw. etwas mit den Pointern noch
nicht kapiert, komme da aber nicht drauf, was es sein könnte.