Call by Referenz - Unter unter Funktion

Gast #2112170
Lesenswert?

Abend,

ich habe ein Problem in meinem Code. Der Compiler wirft mir kein Fehler 
aber das Programm hängt sich nach einer Zeit auf. Bin nun auf der Suche 
nachdem Fehler und beginne mit der Suche dort, wo ich mir garnicht so 
sicher bin ob es richtig ist. Ist der nachfolger Code soweit richtig 
oder mache ich fehler?
1
uint8_t pool[30];
2

3
int main(void) {
4
   
5
   init(pool);
6
   regD(pool);
7
}
8

9
void init(uint8_t *pool) {
10
   uint8_t i;
11
   for(i=0; i<sizeof(pool); i++)
12
      pool[i] = 0;
13
}
14

15
void regD(uint8_t *pool) {
16
   uint8_t index = freeSlotIndex(pool);
17
   if(index != 255) {
18
      pool[index] = 10;
19
   }
20
}
21

22
uint8_t freeSlotIndex(uint8_t *pool) {
23
   uint8_t i;
24
   for(i=0; i<sizeof(pool); i++) {
25
      if(pool[i] == 0)
26
         return i;
27
   }
28
   return 255;
29
}
Gast #2112202
Lesenswert?

"When sizeof is applied to an array, the result is the size in bytes of 
the array in memory."

In deinem Fall verdeckt die variable pool des lokalen namespaces jedoch 
die globale variable pool. Sprich, du bekommst sizeof(uint8_t*) statt 
sizeof(uint8_t[30]) zurück.
Gast #2112213
Lesenswert?

engelmarkus schrieb:
> sizeof() gibt dir nie die Größe eines Arrays.

Natürlich tut es das wenn man es denn tatsächlich auf ein Array 
ausführen würde und nicht auf einem Pointer. Das andere Problem wäre 
aber, dass es die Größe und nicht die Zahl der Elemente ergibt, also 
müsste man das erst durch die Größe eines einzelnen Elements dividieren.
Gast #2112331
Lesenswert?

Peeword schrieb:
> Habe es weggelassen und nun funktioniert das Programm.

Was aber daran nicht liegen kann.
Zwar initialisiert
> for(i=0; i<sizeof(pool); i++)
nur die ersten beiden Elemente des Arrays mit 0, das macht aber nichts, 
denn pool als globales Feld wird sowieso beim Programmstart mit 0 
initialisiert.

Das Problem liegt also woanders.

Oliver
Gast #2112399
Lesenswert?

Also ich weiß nur, dass es vorher nur für 2 Werte funktioniert hat. Wenn 
ich einen dritten Wert hatte, lief das Programm nicht ordnungsgemäß. 
Jetzt läuft das.

> pool als globales Feld wird sowieso beim Programmstart mit 0
> initialisiert.
In Java würde ich dir zustimmen, bei C bin ich mir nicht sicher.

@Steffen N.
Habs ähnlich wie du gelöst, nur das ich die ANZAHL über ein Attribut 
übergebe.
Gast #2112774
Lesenswert?

@Andreas B.: Ich hab mit Größe eigentlich die Element-Anzahl gemeint ;) 
. Vielleicht etwas unglücklich formuliert...

@Peeword: Globale Felder werden beim Start auf 0 gesetzt, das stimmt 
schon.

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