Frage zu Pointern

OP #704899
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
#704927
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.
#704986
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
}
Gast #705018
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.
Gast #705031
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
}

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