Forum: Compiler & IDEs Pointer Problem


von Andi79 (Gast)


Lesenswert?

Hallo habe ein kleines Problem was mein leider recht dürftiges 
Verständnis von Pointern überschreitet.Ich habe folgenden Code 
geschrieben der auch soweit funktioniert.
1
int WritePICData(Uint8 *pData, Uint8 len, Uint8 SlaveAddr )
2
{
3
4
   Uint8 Res =0;
5
   Uint8 i = 0;
6
7
   struct I2CMSG SerMes;  
8
 
9
   GI2CMsgStatus = I2C_MSGSTAT_SEND_NOSTOP;
10
11
12
   SerMes.SlaveAddress = SlaveAddr<<1;
13
   SerMes.MasterAddress = I2C_MASTER_ADDR;
14
   SerMes.Offset= 0x80;
15
   SerMes.NumOfRcvBytes = 2;
16
   SerMes.NumOfSendBytes = 0x0B;
17
   
18
   for (i =0; i <len ;i++)
19
   {
20
      SerMes.MsgSendBuffer[i] = *(pData++);
21
   }
22
   
23
   SerMes.MsgSendBuffer[len]  = Checksum( (Uint8*)&SerMes, 15 );
24
25
   Res = I2CMTransceive( SlaveAddr, SerMes.NumOfSendBytes+DEFAULT_MESS_BYTES, (Uint8*)&SerMes.MasterAddress,
26
         SerMes.NumOfRcvBytes, (Uint8*)&SerMes.MsgRcvBuffer );  
27
           
28
   if (Res == I2C_NO_SLAVE)
29
   {
30
      return PCK_WRITE_DATA_ERROR;
31
   }
32
          
33
   return PCK_WRITE_DATA_OK;      
34
}
So jetzt soll ich aber meinen Pointer nicht dirket im Funktionsaufruf 
übergeben. Sondern der Pointer soll erst später übergeben werden.Dies 
soll über einen funktion geschehen. Weis nur nicht wie ich das nun 
realisieren soll?
Soetwas habe ich noch nicht gemacht. Hab die Pointer bisher immer direkt 
übergeben.

von Albert .. (albert-k)


Lesenswert?

Andi79 schrieb:
> So jetzt soll ich aber meinen Pointer nicht dirket im Funktionsaufruf
> übergeben. Sondern der Pointer soll erst später übergeben werden.Dies
> soll über einen funktion geschehen. Weis nur nicht wie ich das nun
> realisieren soll?
Was heißt "später"? Meinst du das du WritePICData() aufrufst und die 
Funktion dann solange mit dem Daten versenden wartet bis über eine 
andere Funktion der Pointer geladen wurde?

Oder soll es die ganze Zeit senden und du aktualisierst halt irgendwann 
mal den Pointer?

Oder soll die Funktion selbst nach einem pointer fragen?

Es ist aus deiner Fragestellung nicht ganz klar was du willst.

von Andi79 (Gast)


Lesenswert?

Sorry wenn ich micht ungeschickt ausgedrückt habe. Die Funktion selbst 
soll nach dem Pointer fragen.

von Albert .. (albert-k)


Lesenswert?

Ok, nur damit ich es richtig verstanden habe:
- Du rufst WritePICData() auf, aber ohne einen pointer zu übergeben.
- Innerhalb von WritePICData() rufst du dann eine Funktion (ich nenne 
sie mal GetPointer) auf, die dir einen Pointer zurückliefert.
- Nach erhalt dieses Pointers läuft WritePICData weiter

Habe ich deinen Plan so richtig verstanden? Dann wäre der einfachste Weg 
den Pointer in einer static/globalen Variable zu speichern die nur 
GetPointer() kennt. Zusätzlich noch ein Flag dazu um festzustellen ob 
der Pointer den GetPointer() kennt auch gültig ist.
Durch irgendeine andere Funktion wird dann dieser Pointer geladen. Oder 
GetPointer selbst frägt woanders nach einem gültigen Pointer und dient 
somit nur als Interface.

von Andi79 (Gast)


Lesenswert?

Ja ich denke das trifft es ganz genau nur wie würde meine Funktion 
GetPointer() den dann aussehen?

von Albert .. (albert-k)


Lesenswert?

Könnte bsw. so aussehen:

MyCode.h
1
#ifndef _MY_CODE_H
2
#define _MY_CODE_H
3
4
extern Uint8* GetPointer(void);
5
extern void SetPointer(Uint8* pPointer);
6
7
#endif

MyCode.c
1
#include "MyCode.h"
2
3
Uint8* pData=NULL;  //pointer for Data
4
5
//Funktion die Pointer auf Daten ausliest
6
Uint8* GetPointer(void){
7
   
8
  return pData;
9
}
10
11
void SetPointer(Uint8* pPointer){
12
    pData = pPointer;
13
}

Das wäre die eifnachste Variante für das ganze. In WritePICData() musst 
du dann nur noch prüfen ob der zurückgegebene pointer ungleich NULL ist.

von Andi79 (Gast)


Lesenswert?

Würde das dann für meine code z.B. so aussehen?

for (i =0; i <len ;i++)
   {
      SerMes.MsgSendBuffer[i] = Uint8* GetPointer(void){

                                                        return pData++;
                                                        }

  }

von Mark B. (markbrandis)


Lesenswert?

Eher so in der Art:
1
uint8_t* ptr = NULL;
2
ptr = GetPointer();
3
if(ptr != NULL)
4
{
5
  //mach was mit dem Pointer
6
}
7
else
8
{
9
  //eventuell hier Fehlerbehandlung
10
}

Und nein, Du hast den Code im ersten Posting oben nicht selbst 
geschrieben, stimmt's? ;-)

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.