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!
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.
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.
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