Forum: Compiler & IDEs Pointer nur einmal übergeben


von Andi79 (Gast)


Lesenswert?

Hallo ich habe folgende Funktionen geschrieben.Jetzt möchte mein 
Ausbilder das ich den Pointer auf die PicData nur einmal übergebe und 
dann immer in Pic.c verwenden kann. Wie mache ich das wenn die der Type 
in Main.c definiert ist.In der Funktion setPicData soll der Pointer 
nicht mehr auftauchen. Innerhalb der Funktion in Pic.c soll ich aber die 
Werte verändern können und später soll ich mit den veränderten Werten in 
der Main weiter arbeiten können.
Main.c
1
Main()
2
{
3
struct  PIC_DATA PIC_DATA[MAX_SLAVE];
4
5
SetPicFirstData(PIC_DATA);
6
7
setPicData(PIC_DATA,LoadVoltage,LoadCurrent,activeBattCharger); 
8
}
1
Pic.c
2
void setPicData(PicData *pPicData,Uint16 voltage,Uint16 current,Uint8 activeBattCharger)
3
{
4
  Uint8 Count =0;
5
  
6
  for(; Count < activeBattCharger; Count++)
7
  {
8
    pPicData[Count].config  =  0x00;
9
    pPicData[Count].Usoll_2 =  voltage / 100; 
10
    pPicData[Count].Usoll_1 =  (((voltage % 100) *10) /4);             pPicData[Count].Isoll_2 =  current / 1000;
11
    pPicData[Count].Isoll_1 =  ((current % 1000) / 4);    pPicData[Count].NewData ++;
12
  }
13
}
14
15
void SetPicFirstData(PicData *pPicData)
16
{  
17
   
18
  Uint8 Count =0;
19
20
  for(; Count < MAX_SLAVE; Count++)
21
  {
22
    pPicData[Count].config   =  0x00;  
23
    pPicData[Count].Usoll_1  =  0x00;
24
     pPicData[Count].Usoll_2  =  0x00;
25
    pPicData[Count].Isoll_1  =  0x00;
26
    pPicData[Count].Isoll_2  =  0x00;
27
    pPicData[Count].Psoll_1  =  0x08;
28
    pPicData[Count].Psoll_2  =  0x07;
29
    pPicData[Count].TempKor  =  0x00;    
30
                  pPicData[Count].BatTemp  =  0x14;    
31
                  pPicData[Count].LSKor    =  0x00;
32
    pPicData[Count].UsollRed =  0x00;
33
    pPicData[Count].NewData  =  0x00;
34
  }
35
}

von NurEinGast (Gast)


Lesenswert?

Er will sicher etwas in der Richtung ( siehe unten ) sehen.

Würde ich mir aber nochmal überlegen.
Du kannst dann die Funktion setPicData nur noch für genau das eine 
PicData array benutzen, dass Du in SetPicFirstData angibst.
Sollte es später mal eine weiteres Array mit anderen PicData's geben, 
dann kannst Du je kein Ptr auf das andere Array mehr übergeben und somit 
nicht mit dem anderen Array arbeiten.

Ausserdem könntest Du nocht eine Fehlerbehandlung einbauen, wenn 
setPicData aufgerufen wird,SetPicFirstData aber nocht nicht aufgerufen 
wurde.


----   pic.c

static PicData *picDataPtr;


void setPicData(Uint16 voltage,Uint16 current,Uint8 activeBattCharger)
{
  Uint8 Count =0;

  for(; Count < activeBattCharger; Count++)
  {
    picDataPtr[Count].config  =  0x00;
    picDataPtr[Count].Usoll_2 =  voltage / 100;
    picDataPtr[Count].Usoll_1 =  (((voltage % 100) *10) /4);
    picDataPtr[Count].Isoll_2 =  current / 1000;
    picDataPtr[Count].Isoll_1 =  ((current % 1000) / 4);
    picDataPtr[Count].NewData ++;
  }
}





void SetPicFirstData(PicData *pPicData)
{

  Uint8 Count =0;
  picDataPtr = pPicData;  // Statischen Datenpointer belegen.

 for(; Count < MAX_SLAVE; Count++)
  {
    picDataPtr [Count].config   =  0x00;
    picDataPtr [Count].Usoll_1  =  0x00;
    picDataPtr [Count].Usoll_2  =  0x00;
    picDataPtr [Count].Isoll_1  =  0x00;
    picDataPtr [Count].Isoll_2  =  0x00;
    picDataPtr [Count].Psoll_1  =  0x08;
    picDataPtr [Count].Psoll_2  =  0x07;
    picDataPtr [Count].TempKor  =  0x00;
    picDataPtr [Count].BatTemp  =  0x14;
    picDataPtr [Count].LSKor    =  0x00;
    picDataPtr [Count].UsollRed =  0x00;
    picDataPtr [Count].NewData  =  0x00;
  }
}

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.