Hi, ich hab wieder mal ein Problem, bei dem ich nicht so recht weiter weiß... Und zwar hab ich eine Funktion, die verschiedene Rotieroperationen durchführt und dann anschließend den fertigen String über die serielle rausschickt. Die Funktion funktioniert soweit, aber nur das erste Mal. Wenn ich die Funktion in einer Endlosschleife ausgebe, dann stimmt immer nur der erste berechnete String - alles was danach kommt stimmt nicht mehr(ein paar Bits sind falsch). Wenn ich den µC resete, dann ist das Programm noch im Flash und ich bekomm wieder beim ersten Mal den richtigen Wert - alles was danach kommt ist wieder falsch. Ich würde ja gerne den Code posten, aber der ist ziemlich lang(einige Seiten) und ich möchte keinen zumuten den Code zu durchforsten. Einzelne Teile daraus zu posten halte ich irgendwie auch nicht für zweckmäßig, da die Funktion ja prinzipiell funktioniert - jedoch nur 1x. Meine Vermutung ist folgende: In dem Programm werden viele Variablen und Strings verwendet(teils lokal, teils global). Die lokalen Variablen sollten ja eigentlich kein Problem darstellen, da diese ja nur innerhalb eines Unterprogramms gültig sind, oder? Meiner Meinung nach problematischer dürften die globalen Variablen(im speziellen Strings) sein. Könnte es sein, dass da vielleicht noch irgendetwas drinnen steht, dass dann beim zweiten Ausführen des Programms eine falsche Berechnung durchführt? Und das obwohl ich am Ende die globalen Strings mit strcpy(string,""); leere? Ich bin jetzt nicht so firm in der C-Programmierung, aber gibt es vielleicht eine Funktion die es mir erlaubt auf dem µC(übrigens ein 8051 Derivat) den Speicher von globalen Variablen freizugeben? Oder würdet ihr mir dazu raten, komplett auf globale Variablen zu verzichten bzw wie wahrscheinlich haltet ihr es das dies das Problem sein könnte? Danke im Voraus!
Gast hat recht. Schick' uns einfach den Code und Du wirst aus dem Staunen nicht mehr herauskommen.
Ich habe den code jetzt nicht vollständig gelesen, aber du solltest dich eventuell erstmal mit C beschäftigen. Die Funktionen haben alle überhaupt keine Parameter, alle Variablen sind global - das macht die sache sehr unüberschaubar. Schreibe doch erstmal "richtige" funktionen wie void verwurschtlestring( char* s ) { mache was mit s } char s = "asldfkjasdl"; verwurschtlestring( s ); Das sollte sich dann besser lesen lassen und vermutlich ist der fehler dann auch schon weg.
Ok,geht klar. Hab ich mir fast gedacht. Danke, ich werds probieren und mich gegebenfalls wieder melden.
@Martin: Die einzige Debugging Möglichkeit ist die serielle Schnittstelle.
Meiner Meinung nach hats da irgendwas mit den globalen Variablen / Funktionen, die auch Peter schon angesprochen hat. Etwas anderes kann ich mir mit meinem bescheidenen C-Wissen nicht vorstellen.
Die Beteiligten Variablen vor jedem Funktionsaufruf richtig vorbereiten und nicht nur einmal.
Hallo, ich habe die Änderungen, wie ihr sie vorgeschlagen habt, übernommen. Doch da bin ich auf ein Problem gestoßen, mit dem ich so nicht gerechnet habe. Da ich ziemlich große Strings zwischen den einzelnen Fkt übergeben muss, geht mir der Speicher auf dem µC aus. Eine Möglichkeit wäre noch alle Funktionen in eine Fkt zu schmeißen und dort nur lokale Variablen verwenden? @skua: Könntest du bitte erläutern wie du das genau meinst?
Ich hab eine Lösung gefunden: Ich dachte immer, dass ich mit dem Befehl:
1 | strcpy(string,""); |
den String leere. Aber anscheinend hat das bei mir nicht geklappt. Jetzt hab ich folgendes gemacht:
1 | laenge = strlen(string); |
2 | for(i=0;i<=laenge;i++) |
3 | {
|
4 | string[i] = '\0'; |
5 | }
|
Und damit funktioniert das Clearen der Strings. Vielleicht hat ja hier nochmal einer das Problem. Ich danke allen die sich an dem Thread beteiligt haben! Schönen Abend!
Hi Ich bin zwar kein C-Programmierer, aber das ist wohl 'von Hinten durch die Brust ins Auge'. In Pascal schreibe ich "String:='';" und fertig. Wetten, das das in C ähnlich geht. Ich denke du solltest dich wirklich erstmal mit den Grundlagen beschäftigen, bevor du weitermachst. Dein Programm kommt selbst mir sehr mystisch vor. MfG Spess
also, wenn Du sicher sein willst dass Dein ganzes String Array genullt ist dann solltest Du das immer mit einem memset machen (memset(string, 0, sizeof(string)) ... ist lesbarer als Deine for() Schleife. Achja, es gibt auch noch strncpy bei dem Du die zu schreibende Anzahl von Bytes mit angibst; hat den Vorteil dass Du beim Kopieren des Strings nicht versehentlich wild über den allozierten Speicherbereich hinausschreiben kannst. Gruss Frank
@NurEinmal die Frage ist wie leer soll denn der STring sein mit string[0] = '\0'; sagt man das das erste Zeichen eines String 0 ist und damit das ende makiert. Aber der Restliche speicher von string ist immer noch mit den original daten gefüllt. memset(string,0, sizeof(string)) dauert etwas länger und schreibt über die komplette länge ein 0 rein. Ein String in C ist nicht wie in Pascal definiert. In C endet der String wenn eine 0 kommt, in Pascal wird die länge extra verwaltet was den vorteil hat das man auch eine 0 im String speichern kann und die längen abfrage etwas schneller ist - string Funktionen in Pascal sind schon immer etwas schöner gewesen. Zum schluss ist entscheident wie du auf den String zugreifst, im µC ist es nicht unsinnig die länge des Strings in einer eigende Variable zu speichern damit weiss man sie gleich und muss nicht erst die 0 suchen.
Hi >Ein String in C ist nicht wie in Pascal definiert. In C endet der String >wenn eine 0 kommt, in Pascal wird die länge extra verwaltet was den... Das gilt unter Pascal nur für Short-Strings. ANSI- und Wide-Strings werden, ähnlich wie in C, über Zeiger verwaltet. MfG Spess
@Spess53 Das kann man so generell nicht sagen das macht jeder Compiler anders. Es gibt sogar nullterminierte mit Vorangestelltem Integer.
Sorry, aber der Code is ne Katastrophe. Und von Schleifen scheinst auch noch nichts gehoert haben, oder warum das unrolling ueberall?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.