Hallo,
Ich möchte immoment mehrere Strings zu einem zusammenfügen also ungefähr
so:
1
unsignedcharEnddaten[40];
2
for(n=0;n<4;n++)
3
{
4
dtostrf(Daten[n],2,4,data);
5
/*hier soll mit jedem durchlauf der Schleife "data" den "Enddaten" angehangen werden so das am ende alle 4 Werte darin gespeichert sind*/
6
}
leider hab ich nich die geringste ahnung wie ich das anstellen soll!
Hab nach etwas googlen zwar einige Funktionen hierfür gefunden,
allerdings nie wirklich gut erklärt.
Hoffe ihr könnt mir hier etwas weiterhelfen.
Gruß T.M.
Eingentlich nichts - in den vorhandenen Zeilen. Warum du die
Zeichenfelder als unsigned anlegst, verstehe ich zwar nicht, aber das
ist hier jetzt egal.
Hast du mal überprüft, ob die Einzelstrings in data in jedem
Schleifendurchlauf richtig sind?
Oliver
data hat nur 6 Elemente. Bist Du ganz sicher, dass Dein mit dtostrf
erzeugter String da überhaupt reinpasst? Du gibst zwei Nachkommastellen
an. Mit dem Dezimaltrennzeichen und einem eventuellen Vorzeichen sind
das schon vier Stellen, da bleibt nur noch eine einzige für den
Vorkommaanteil...
Einen Fehler hab ich schon gefunden die und zwar liegt der Programmcode
in einer while Schleife und dadurch wurden der Endwertstring immer
wieder neu beschrieben. das hab ich allerdings mit gets(Enddata);
gelöst!
seh ich doch richtig das dies den String auf "\0"setzt oder ?
Ich habe das Problem des Teilweisen Zahlensalates immernoch.
Hier nochmal der ganze Programmcode:
T.M. wrote:
> Ich habe das Problem des Teilweisen Zahlensalates immernoch.
Du hast die Doku zu dtostrf nicht gelesen oder nicht verstanden.
dotostrf will 2 Zahlen haben, die festlegen wie es den String
formatieren soll.
Die erste der beiden Zahlen legt die Feldbreite fest. Feldbreite
bezeichnet die komplette Anzahl an zu generierenden Zeichen.
Die zweite der beiden Zahlen legt fest wieviele Nachkommastellen erzeugt
werden sollen.
Du hast
> dtostrf(Daten[n],2,4,data);
D.h.
du willst deine Ausgabe in einem Feld der Breite 2 haben.
Und in diesem Feld sollen 4 Stellen nach dem Komma aufscheinen.
Das wird schon mal nicht gehen!
Beachte: Die Feldbreite beinhaltet auch den Dezimalpunkt und ein ev.
Vorzeichen
Und mach data ein wenig größer.
In einem char Array der Länge 6 bringst du maximal einen String mit 5
nutzbaren Zeichen unter!
Mach das ruhig mal 10 oder 20 groß!
> // senden des Endstrings> rf12_txdata(Enddata,40);
Ach so? Dein String hat also eine Länge von 40. Das glaub ich nicht!
Dein Array ist mit 40 Einträgen dimensioniert. Das heisst aber nicht,
dass der String der drinnen steht auch 40 Zeichen lang ist.
Du solltest auch Enddata mit einem leeren String initialisieren, ehe du
anfängst an den leeren String Teile anzuhängen
Enddata[0] = '\0';
while(1)
{
// 4 ADC's auslesen
for (n=0;n<4;n++)
{
http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F
Und gewöhn dir von Anfang an an, deinen Code korrekt einzurücken!
>Du solltest auch Enddata mit einem leeren String initialisieren, ehe du>anfängst an den leeren String Teile anzuhängen
Und das dann IN die Schleife legen könnte helfen ;)
while(1)
{
Enddata[0] = '\0';
// 4 ADC's auslesen
for (n=0;n<4;n++)
{
holger wrote:
>>Du solltest auch Enddata mit einem leeren String initialisieren, ehe du>>anfängst an den leeren String Teile anzuhängen>> Und das dann IN die Schleife legen könnte helfen ;)>> while(1)> {> Enddata[0] = '\0';> // 4 ADC's auslesen> for (n=0;n<4;n++)> {
Ah ja.
Durch die nicht vorhendene Einrückung ist mir völlig entgangen, dass er
ja tatsächlich eine Hauptschleife hat.
Warum ichs allerdings nicht gemerkt habe, als ich den Einfügepunkt für
das Leersetzen des Strings gesucht habe, ist mir rätselhaft. Hab wohl
wieder mal mit dem Weißen geschaut.
Danke muss mir wohl noch einiges zum Thema Strings durchlesen...
Naja aus Fehlern lernt man.
Danke für die konstruktiven Antworten ;) ist ja leider nicht immer
Selbstverständlich das sich Leute Zeit für Anfänger nehmen.
Werde meine Programm morgen oder am Samstag fertigstellen!
Wie gesagt jede Kritik am Programm sind willkommen sollte gegen Ende ja
möglichst Perfekt sein!
Hab nach langen ausprobieren gemerkt das es wohl an der strncat funktion
liegt habe versucht dort auch andere Stringsanzuhängen dies funktioniert
allerdings nicht.
Hab ich an der Funktion irgendetwas falsch verstanden?
oder einen anderen Fehler gemacht ?
>Hab nach langen ausprobieren gemerkt das es wohl an der strncat funktion>liegt
Heißt das, du kannst:
- ein einzelnes Byte
- einen konstanten string
- einen einzelnen dtostrf()-gewandelten Wert
senden (und empfangen)?
Vielleicht fügst du einfach mal ein Trennzeichen in den String ein:
>Heißt das, du kannst:> - ein einzelnes Byte> - einen konstanten string> - einen einzelnen dtostrf()-gewandelten Wert>senden (und empfangen)?
Kann eine Dtostrf()-gewandelten Wert empfangen werde deine
Verbesserungsvorschläge mal einbringen und dann nocheinmal melden!
T.M. wrote:
> Hab nach langen ausprobieren gemerkt das es wohl an der strncat funktion> liegt
strncat(Enddata,data,7);
In der Tat hast du da was missverstanden.
Was wird wohl die 7 da hinten angeben?
Die Länge von data? Wozu soll das gut sein? Wie lang der String in data
ist, interessiert nun wirklich niemanden. Am allerwenigsten strcat oder
strncat. Beide Funktionen nehmen einfach was da ist, solange bis sie im
Quellstring auf ein '\0' Byte treffer.
Also wozu wird diese Längenangabe gut sein?
Um zu bezeichnen wieviel Platz im Zielarray zur Verfügung steht!
Genau das ist doch das grosse Problem von strcat, strcpy und wie sie
alle heissen! Keine dieser Funktionen weiss wie gross das Zielarray ist
und kann sich daher dagegen schützen, dass es versucht mehr Daten in das
Ziel zu stopfen als dort überhaupt Platz hat.
Also wird dieses Argument mit Sicherheit NICHT die Größe des
Quellstrings sein. Wenn die Funktion diesen Wert brauchen würde, könnte
sie ihn ganz leicht selbst mit strlen ermitteln. Das ist die Größe des
Zielarrays! In deinem Fall also:
strncat( Enddata, data, sizeof(Enddata) );
Und warum kriegst du dann Zeichensalat?
Ganz einfach: Was macht strncat, wenn der Platz im Zielarray nicht
reicht? Simpel: es hört auf umzukopieren. Aber gemeinerweise schliesst
strncat in Falle, dass der Platz nicht ausreicht, den Zielstring dann
nicht mehr mit einem '\0' Byte ab! Falls also der Zielplatz nicht
ausreicht, dann hast du einen ungültigen String in der Zielvariablen! Du
hast also jetzt einen ArrayOverflow durch einen ungültigen String
eingewechselt. Sorry, aber String Verarbeitung in C ist nicht so
einfach. Da ist Sorgfalt angesagt!
Das andere, du kannst bei der Ausgabe nicht eine fixe ANzahl an Bytes
angeben. DU weisst ja nicht wie lang der String wirklich ist! ALso musst
du das ermitteln. Oder aber du baust dir endlich eine Ausgabefunktion,
die diese Anzahl nicht braucht (weil sie ausgibt, bis das abschliessende
'\0' Zeichen auftaucht)
@ Karl heinz
Die AVR-Libc-docu liest sich aber so:
>Concatenate two strings.>>The strncat() function is similar to strcat(), except that only the first> n characters of src are appended to dest.
(http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#gfa4a8701698b766f40180c735726cfe7)
>>dt.:" Verbind zwei strings.>> die Funktion strncat() ähnelt strcat(), bis auf dass nur die ersten n>> char's von src an dest gehängt werden
(Übersetzung von mir ;))
Das klingt auf jeden Fall so, als ob die Angabe "strlen(final_string)"
ziemlich in die Hose gehen kann.
hth, Jörg
Jörg G. wrote:
> @ Karl heinz> Die AVR-Libc-docu liest sich aber so:>>Concatenate two strings.>>>>The strncat() function is similar to strcat(), except that only the first>> n characters of src are appended to dest.>
(http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#gfa4a8701698b766f40180c735726cfe7)
>>>dt.:" Verbind zwei strings.>>> die Funktion strncat() ähnelt strcat(), bis auf dass nur die ersten n>>> char's von src an dest gehängt werden> (Übersetzung von mir ;))> Das klingt auf jeden Fall so, als ob die Angabe "strlen(final_string)"> ziemlich in die Hose gehen kann.
Du hast recht.
(Und ich hab mich vertan. strncpy kann man so benutzen, dass man sich
gegenüber Array Overflow absichern kann. Bei strncat geht das so einfach
nicht)
Allerdings: Damit gibt es in obigem Code überhaupt keinen Grund mehr
strncat zu benutzen.
Weil sich bei der Delay-Funktion
1. ein schlauer Mensch unter Kenntnis des Compilers mal Gedanken gemacht
hat, wie man möglichst exakt die angegebene Verzögerung hinbekommt
2. weil sich so dein Code auch noch in einem anderen Projekt verwenden
läßt, was z.B. mit ner anderen Taktfrequenz läuft