Pointerübertragung wird nicht realisiert

Gast #4020347
Lesenswert?

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.
#4020386
Lesenswert?

Anfänger schrieb:
> Torsten Robitzki schrieb:
>> Pointer immer initialisieren. Wahrscheinlich soll der auf counter
>> zeigen:
>>     uint16_t *elem = &counter;
>
> Was meinst Du mit Initialisieren - einen Wert zuweisen - oder eine
> Variable zuweisen?
>
> Würde das hier nicht klappen?
>
> int *number;
> *number = 10;

Nein das wuerde nicht klappen.
Nur weil du einen Pointer hast, hast du noch lange nicht den Speicher, 
in dem du den int speichern koenntest.
#4020392
Lesenswert?

Und gonso hat recht. Du bist an einem Punkt angelangt, an dem man nicht 
mehr einfach so rummachen kann.

Das hier
1
printf ("\n\r Get: %d", *(buffer_ptr+(sizeof(uint16_t)*read)) );
ist das deutlichste Zeichen, dass dir viele Grundlagen fehlen. Das ist 
grundlegend falsch.

Machs dir wenigstens nicht so kompliziert. Du kannst hier ruhig Array 
Syntax benutzen (und auch an allen anderen Stellen)
1
  printf ("\n\r Get: %d", buffer_ptr[read] );

Warum das funktioniert - tja. Genau das wären die fehlenden Grundlagen.
#4020398
Lesenswert?

Karl Heinz schrieb:
> Anfänger schrieb:
>> Torsten Robitzki schrieb:
>>> Pointer immer initialisieren. Wahrscheinlich soll der auf counter
>>> zeigen:
>>>     uint16_t *elem = &counter;
>>
>> Was meinst Du mit Initialisieren - einen Wert zuweisen - oder eine
>> Variable zuweisen?
>>
>> Würde das hier nicht klappen?
>>
>> int *number;
>> *number = 10;
>
> Nein das wuerde nicht klappen.
> Nur weil du einen Pointer hast, hast du noch lange nicht den Speicher,
> in dem du den int speichern koenntest.

Ein Pointer ist das PostIt an deiner Pinwand, auf dem steht: Der Brief 
liegt im Postkasten Nummer 4.

Du hast bis jetzt nur das PostIt. Du hast aber noch nicht den Postkasten 
und dessen Nummer aufs PostIt geschrieben.

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