Forum: Mikrocontroller und Digitale Elektronik Pointerübertragung wird nicht realisiert


von Anfänger (Gast)


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.

von gonso (Gast)


Lesenswert?

Ich empfehle Dir, erstmal C-Grundlagen zu lernen, bevor Du Dich mit so 
komplexen Dingen befasst. Dir fehlt elementares Grundwissen, dass wir 
Dir hier nicht liefern können.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Pointer immer initialisieren. Wahrscheinlich soll der auf counter 
zeigen:
1
    uint16_t *elem = &counter;

von Anfänger (Gast)


Lesenswert?

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;

von Karl H. (kbuchegg)


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.

von Mitlesa (Gast)


Lesenswert?

Anfänger schrieb:
> Würde das hier nicht klappen?
>
> int *number;
> *number = 10;

Nur sehr vielleicht.

Dein Pointer muss irgendwo hinzeigen.
Das tut er (noch) nicht.

Erst wenn du schreibst:

number = &irgendwas_auf_was_du_zeigenwillst;

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

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.