mikrocontroller.net

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


Autor: Peeword (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
uint8_t pool[30];

int main(void) {
   
   init(pool);
   regD(pool);
}

void init(uint8_t *pool) {
   uint8_t i;
   for(i=0; i<sizeof(pool); i++)
      pool[i] = 0;
}

void regD(uint8_t *pool) {
   uint8_t index = freeSlotIndex(pool);
   if(index != 255) {
      pool[index] = 10;
   }
}

uint8_t freeSlotIndex(uint8_t *pool) {
   uint8_t i;
   for(i=0; i<sizeof(pool); i++) {
      if(pool[i] == 0)
         return i;
   }
   return 255;
}


Autor: engelmarkus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peeword (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke habe sizeof() also falsch verstanden.

Habe es weggelassen und nun funktioniert das Programm.

Autor: Philip (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen N. (steno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peeword,

wenn die Größe fix ist, kann man es aber auch so machen...
#define ANZAHL 30

uint8_t pool[ANZAHL];

// ...
// ...
// ...
for(i=0; i<ANZAHL; i++)
// ...
// ...
// ...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peeword (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: engelmarkus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peeword (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok d.h. die init() könnte ich mir also sparen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.