Forum: Mikrocontroller und Digitale Elektronik Funktion funktioniert nur einmal


von NurEinmal (Gast)


Lesenswert?

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!

von Gast (Gast)


Lesenswert?

42!

von Hugo Ratlos (Gast)


Lesenswert?

Gast hat recht. Schick' uns einfach den Code und Du wirst aus dem 
Staunen nicht mehr herauskommen.

von NurEinmal (Gast)


Angehängte Dateien:

Lesenswert?

Hier der Code:

von Peter (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

Schon mal die Software mit einem Debugger ausprobiert?

von NurEinmal (Gast)


Lesenswert?

Ok,geht klar.

Hab ich mir fast gedacht.

Danke, ich werds probieren und mich gegebenfalls wieder melden.

von NurEinmal (Gast)


Lesenswert?

@Martin:

Die einzige Debugging Möglichkeit ist die serielle Schnittstelle.

von Hugo Ratlos (Gast)


Lesenswert?

Welcher Teil spinnt denn Deiner Meinung nach?

von NurEinmal (Gast)


Lesenswert?

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.

von Skua C. (skua)


Lesenswert?

Die Beteiligten Variablen vor jedem Funktionsaufruf richtig 
vorbereiten und nicht nur einmal.

von NurEinmal (Gast)


Lesenswert?

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?

von NurEinmal (Gast)


Lesenswert?

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!

von spess53 (Gast)


Lesenswert?

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

von Boris Bukowski (Gast)


Lesenswert?

string[0] = '\0';
sollte reichen.

Boris

von Frank S. (fs0001)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Skua C. (skua)


Lesenswert?

@Spess53

Das kann man so generell nicht sagen das macht jeder Compiler anders.
Es gibt sogar nullterminierte mit Vorangestelltem Integer.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.