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

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.