Forum: Compiler & IDEs Call by Referenz - Unter unter Funktion


von Peeword (Gast)


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
}

von engelmarkus (Gast)


Lesenswert?

sizeof() gibt dir nie die Größe eines Arrays. In deinem Fall gibt es dir 
die Anzahl der Bytes, die der Zeiger "pool" belegt, das sollten 2 
sein...

von Peeword (Gast)


Lesenswert?

Danke habe sizeof() also falsch verstanden.

Habe es weggelassen und nun funktioniert das Programm.

von Philip (Gast)


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.

von Andreas B. (Gast)


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.

von Ste N. (steno)


Lesenswert?

Hallo Peeword,

wenn die Größe fix ist, kann man es aber auch so machen...
1
#define ANZAHL 30
2
3
uint8_t pool[ANZAHL];
4
5
// ...
6
// ...
7
// ...
8
for(i=0; i<ANZAHL; i++)
9
// ...
10
// ...
11
// ...

von Oliver (Gast)


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

von Peeword (Gast)


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.

von engelmarkus (Gast)


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.

von Peeword (Gast)


Lesenswert?

ok d.h. die init() könnte ich mir also sparen

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.