Bevor ich wieder eine Panikattacke auslöse weil ich das Wort Pascal benutze
würde ich mich über sinnvolle Äußerungen zu meinem C Problem freuen
Ich hab grad ein Modülchen von Pascal nach C umgeschrieben für ein LCD Display.
Nix aufregendes, aber erstaunt war ich doch, als die Texte nicht komplett ausgegeben wurden.
Immer nur die vordere Hälfte.
Der Fehler war mir erstmal völlig rätselhaft.
StrLen liefert das richtige Ergebnis nämlich 4
es wurden aber nur 2 Zeichen ausgegeben.
Code:
/*----------------------------------------------*/
int StrLen(const char *p)
{ int len = 0;
while (*p++) len++;
return len;
}
/*----------------------------------------------*/
void LcdWriteChar(const char c)
{
/*... gib Zeichen auf dem LCD aus ...*/
}
/*----------------------------------------------*/
void LcdWriteStr(const char* s)
{ int i;
for (i=0; i<StrLen(s); i++)
{
LcdWriteChar(*s++);
}
}
/*----------------------------------------------*/
int main(void)
{
LcdWriteStr("ABCD");
}
Dann hab ich die Funktion umgeschrieben und siehe da es funktioniert
Code:
void LcdWriteStr(const char* s)
{ int i,len;
len = StrLen(s);
for (i=0; i<len; i++)
{
LcdWriteChar(*s++);
}
}
Als ich mir den Assemblercode ansah, wurde der Fehler klar.
Er ruft bei jedem Durchlauf, also für jedes Zeichen die Funktion StrLen auf,
aber jedesmal mit dem incrementierten Pointer
Wie kommt das denn ? Das ist doch eine Konstante und die StrLen braucht er doch nur
einmal aufrufen. Da kann sich doch nichts ändern.
Und es Ist auch egal ob ich da Const benutze oder nicht, der Code bleibt exakt identisch.
Eigentlich sind das ja schon 2 Fragen. Wozu das Const in der Funktion. Ich hätt gedacht daurch kann der Compiler eventuelle Optimierungen vornehmen.
Danke Euch im Voraus für Infos
Lesezeichen