Forum: Mikrocontroller und Digitale Elektronik Frage zu Pointern


von Matthias W. (macho2000)


Lesenswert?

Hallo,

ich stehe gerade etwas auf dem Schlauch und hoffe jemand kann mir 
weiterhelfen.

In meinem aktuellem Projekt gemöchte ich verschiedene Werte auf einem 
Grafikdisplay in einem Schreiber (oder auch Vorhangdiagramm) darstellen. 
Mit einem Menü kann ich dann einen Wert auswählen, welcher im Schreiber 
erscheint!

Mein Problem:

der Schreiber läuft in einer 100ms Schleife und stellt immer den Wert
1
uintTmp
 dar. Wird das Menü aufgerufen, so wird die Schleife unterbrochen und in 
einen Pointer
1
ptrDia = &uintSpeed;
die Adresse der neu darzustellenden Messgröße abgelegt. Am anfang der 
100ms Schleife mache ich dann
1
uintTmp = *ptrDia

Das funktioniert soweit, aber was mache ich wenn ich einen Char-Wert 
übergeben möchte, denn ptrDia ist ja ein Pointer auf einen Integer Wert? 
Ich kann auch nicht den Char Wert erst wandeln in Integer, da die 
Menüschleife nicht immer durchlaufen wird.

Hat jemand ne Idee wie ich das anders lösen kann, oder gibt es eine 
Möglichkeit im einem Poiter auf unterschiedliche Datentypen zu zeigen?

Gruß

Matthias

von Karl H. (kbuchegg)


Lesenswert?

Matthias Werner wrote:

> Möglichkeit im einem Poiter auf unterschiedliche Datentypen zu zeigen?

Nein. Gibt es nicht. Ein Pointer hat einen spezifischen Datentyp.

Aber du könntest mehrere Pointer installieren, zusammen mit
einer Variablen, die angibt welcher Pointer denn jetzt die
anzuzeigenden Daten referenziert.

von Matthias W. (macho2000)


Lesenswert?

Danke für den Tip!

Das stellt sich mir als recht praktikabel dar.

Gruß

Matthias

von Niels H. (monarch35)


Lesenswert?

Ein Pointer ist zunächst mal nur eine Adresse. Und diese angabe ist für 
jeden Datentypen gleich. Eine Möglichkeit wäre die Adresse eines 
Pointers an den fremddatentypen zu übergeben.

z.b.
1
void ichmachwas (void *abc,int typ)
2
{
3
    uint8_t *p1;
4
    uint16_t *p2;
5
    uint16_t wert;
6
    switch (typ)
7
    {
8
       case 0:
9
         p1=abc;
10
         wert=(uint16_t)(*p1);
11
       case 1:
12
         p2=abc;
13
         wert=(uint16_t)(*p2);
14
       default:
15
         wert=0;
16
      }
17
}

von Simon K. (simon) Benutzerseite


Lesenswert?

Ein void-Pointer ist zu allen Pointertypen zuweisungskompatibel. 
Allerdings kann man diesen natürlich nicht wieder dereferenzieren, ohne 
vorher zu casten.

von sniper (Gast)


Lesenswert?

Du könntest auch verschiedene Datenstrukturen machen, die alle einen
gemeinsamen Nenner (nämlich Typinformation) haben.

Dein Zeiger würde dann immer auf den Basistyp zeigen. Der Schreiber 
würde
nachsehen, auf welchen Typ der Zeiger zeigt.

Bsp:
1
typedef enum eWriterTypeInfo
2
{
3
   WRITER_TYP_UINT8 = 0,
4
   WRITER_TYP_UINT16,
5
   WRITER_TYP_ANSISTRING
6
   //usw...
7
}WRITER_TYPE_INFO;
8
9
typedef struct _tagUint8Type
10
{
11
  WRITER_TYPE_INFO    type;
12
  unsigned char       value;
13
}tWriterUint8;
14
15
typedef struct _tagUint16Type
16
{
17
  WRITER_TYPE_INFO    type;
18
  unsigned int        value;  //falls int 16Bit breit ist!
19
}tWriterUint16;

Das lohnt sich aber erst, wenn die Datenstrukturen etwas komplexer 
werden.

von sniper (Gast)


Lesenswert?

hmm, schwacher Tag... zur Vollständigkeit:
1
//poiner anlegen  - globaler Code
2
WRITER_TYPE_INFO *  pMyDataPointer;
3
tWriterUint8 myUint8DisplayData;
4
5
6
7
//der Code, der die Daten erfasst
8
myUint8DisplayData.value = 23;
9
pMyDataPointer = (WRITER_TYPE_INFO*)&myUint8DisplayData;
10
11
12
13
//der Code, der die Daten ausgibt (100ms Schreiber Thread)
14
switch ( *pMyDataPointer )
15
{
16
  case WRITER_TYP_UINT8:
17
  {
18
    unsigned char displayData;
19
    tWriterUint8* p = (tWriterUint8*)*pMyDataPointer;
20
    displayData = p->value;  
21
    //displayData ausgeben (== 23)
22
  }
23
  break;
24
25
  case WRITER_TYP_UINT16:
26
  {
27
    unsigned char displayData;
28
    tWriterUint16* p;
29
    //usw...
30
  }
31
  break;
32
33
  //weitere nach Schema f 
34
35
  default:
36
    //error unknown data type
37
    break;
38
}

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.