mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktion funktioniert nur einmal


Autor: NurEinmal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
42!

Autor: Hugo Ratlos (Gast)
Datum:

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

Autor: NurEinmal (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Code:

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal die Software mit einem Debugger ausprobiert?

Autor: NurEinmal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,geht klar.

Hab ich mir fast gedacht.

Danke, ich werds probieren und mich gegebenfalls wieder melden.

Autor: NurEinmal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin:

Die einzige Debugging Möglichkeit ist die serielle Schnittstelle.

Autor: Hugo Ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Teil spinnt denn Deiner Meinung nach?

Autor: NurEinmal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Skua C:\> (skua)
Datum:

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

Autor: NurEinmal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: NurEinmal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab eine Lösung gefunden:

Ich dachte immer, dass ich mit dem Befehl:
strcpy(string,"");

den String leere. Aber anscheinend hat das bei mir nicht geklappt.
Jetzt hab ich folgendes gemacht:
laenge = strlen(string);
for(i=0;i<=laenge;i++)
{
string[i] = '\0';
}

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!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Boris Bukowski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
string[0] = '\0';
sollte reichen.

Boris

Autor: Frank Schuessler (fs0001)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Skua C:\> (skua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Spess53

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber der Code is ne Katastrophe. Und von Schleifen scheinst auch 
noch nichts gehoert haben, oder warum das unrolling ueberall?

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.