www.mikrocontroller.net

Forum: PC-Programmierung for Schleife


Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein kleines Verständnisproblem bei einer for Schleife.
*key ist ein Zeiger auf ein 10Stelliges Char Array
Die Funktion berechnet einen Hashwert, und funktioniert prinzipiell 
auch(ist aber nicht auf meinem Mist gewachsen)

Ich untersuche das ganze nun mit Valgrind, da das Programm manchmal bei 
eben dieser for Schleife mit einem "Invalid read of size 1" crasht.
Ich sehe da eigentlich nicht wirklich eine typische 
for-Abbruchbedingung, aber es funktioniert ja(meistens)

Generiert das *ptr++ irgendeinen Rückgabewert der die for-Schleife 
weiterlaufen/abbrechen lässt, wenn man am Ende des Arrays angekommen 
ist?
hash_t CDB::_db_hash(CONST char *key) {
    hash_t hval;
    char   *ptr;
    char   c;
    int     i;

    hval = 0;
    for (ptr = (char *)key, i = 1; c = *ptr++; i++) {
        hval += c * i;  // ascii char times its 1-based index
    }
    return(hval % DB_NHASH_DEF);  
} 

Ich frage mich nun, was der Grund dafür sein kann, das es manchmal 
funktioniert und manchmal nicht.

Danke schon mal, falls mir jemand den genauen Ablauf der Schleife 
verklickern kann

funky

Autor: sdg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funky schrieb:
> Ich sehe da eigentlich nicht wirklich eine typische
> for-Abbruchbedingung

Hier:
c = *ptr++
 entspricht (im Kontext)
(c = *ptr++)!=0
, da hast du deine Bedingung...

Wichtig: Der String MUSS NULLTERMINIERT sein, sonst wird das nichts.

Autor: Andreas Schweigstill (Firma: Schweigstill IT) (schweigstill) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und weiterhin darf auch kein Nullwert im String enthalten sein, da 
die Schleife sonst vorzeitig abbricht.

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, das macht schonmal mehr Sinn, als ich mir bisher zusammenreimen 
konnte ;)
Dann muss ich mal schauen was da im Fehlerfall genau in meinem Array 
enthalten ist

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.