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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.