Archiv verlassen und diese Seite im Standarddesign anzeigen : Vektoren zusammenfügen
Maverick83
23.01.2007, 21:36
Hallo Zusammen
Ich habe 5 verschiedene Vektoren mit Strings.
In den Vektoren stehen Minuten,Stunden,Tage,Monate,Jahre.
Damit ich diese in einem *.txt file speichern kann müssen diese 5 Strings in einen Grossen kopiert werden.
Wie mache ich so etwas?
char stringMin[3],stringHour[3],stringDay[3],stringMonth[3],stringYear[5];
char buffer[512];
sprintf(stringMin,"%d",min);
sprintf(stringHour,"%d",hour);
sprintf(stringDay,"%d",day);
sprintf(stringMonth,"%d",month);
sprintf(stringYear,"%d",year);
Vielen Dank für die Hilfe
mh, was willst du?
ich würd nen struktur-vektor nehmen ;) klopfst in ne struct deine minuten stunden ... rein und machst nen vektor draus ;)
oder willst du alles hintereinander in einem normalen vektor haben?
vielleicht mit strcat ?
Gruß Sebastian
Maverick83
23.01.2007, 22:51
ich habs ziemlich umständlich gelöst.
Hat jemand eine bessere Idee?
...
sprintf(stringTempT5,"%d",tempT5);
sprintf(stringTempT5Dec,"%d",(tempT5-floor(tempT5))*100);
...
buf[0]=stringHour[0];
buf[1]=stringHour[1];
buf[2]='.';
buf[3]=stringMin[0];
buf[4]=stringMin[1];
buf[5]=',';
buf[6]=stringDay[0];
buf[7]=stringDay[1];
buf[8]='.';
buf[9]=stringMonth[0];
buf[10]=stringMonth[1];
buf[11]='.';
buf[12]=stringYear[0];
buf[13]=stringYear[1];
buf[14]=',';
buf[15]=stringTempT5[0];
buf[16]=stringTempT5[2];
buf[17]='.';
buf[18]=stringTempT5Dec[0];
buf[19]=stringTempT5Dec[1];
buf[20]=',';
buf[21]=0x0D; //carriage return
buf[22]=0x0A; //line feed
Dies ist ziemlich mühsam, schlussendlich sollte es dann auch ein timestamp + 16 Temperaturwerte sein.
bin um jeden Gedankenanstoss dankbar
Maverick83
23.01.2007, 23:01
@izaseba
strcat geht nur mit strings, ich habe aber ein char vektor
@bL1nK
kannst du mir ein Beispiel geben?
ich hoffe deine Frage hat sich mit dem zusätzlich geposteten Code beantwortet.
SprinterSB
23.01.2007, 23:53
Wie kommen die Werte denn in stringxxxx rein? Stattdessen kannst du die werte doch direkt in buf[] schreiben?
@izaseba
strcat geht nur mit strings, ich habe aber ein char vektor
String ist doch ein nullterminierter char Vektor, aber Du hast recht, für das, was Du vor hast ist strcat keine gute Wahl, vor allem, wenn Deine Vektoren nicht Nullterminiert sind.
Maverick83
24.01.2007, 10:44
@SprinterSB:
der buf[] ist ein char vektor und die min,hour,etc sind alles int.
den stringxxxx fülle ich z.b. so:
sprintf(stringMin,"%d",min);
SprinterSB
24.01.2007, 11:12
-1- Wenn du die Strings via sprintf bekommst, dann sind sie nullterminiert, also könntest du sie mit strcat aneinander hängen wie schon izaseba sagte.
-2- Anstatt x sprintf-Aufrufe geht natürlich auch
#define CR_LF "\r\n"
char buf[30];
sprintf (buf, "%d:%d:%d %d-%d-20%d %d %c%c" CR_LF, hour, min, sec, day, month, year, t5, t5_string[0], t5_string[2]);
Maverick83
24.01.2007, 11:39
danke ich werds mal so probieren.
jetzt frag ich mal ganz blöd was machst sprintf()?
edit:
ich würd sowas machen ;) aber ich weiß ja net genau was du machen willst :)
#define MAX 12
typedef enum { eJan = 1, eFeb, eMar, eApr, eMai, eJun, eJul, eAug, eSep, eOkt, eNov, eDez} month_t
typdef struct{
uint8_t hours;
uint8_t minutes;
uint8_t seconds;
uint8_t day;
month_t month;
uint16_t year;
} dates_t
dates_t datesString[MAX]
void InitDateString(dates_t *buf) // 14:33:59 - 24.01.2007
{
buf->hours = 14;
buf->minutes = 33;
buf->secondes = 59;
buf->day = 24;
buf->month = eJan;
buf->year = 2007;
}
ps: keine gewähr auf richtigkeit :D hab das grad so ausm ärmel geschüttelt
SprinterSB
24.01.2007, 15:12
Nein das geht nicht.
datesString[] ist kein String, sondern ein Array von dates_t.
sprintf schreibt die Ausgabe nicht in ein FILE* wie fprintf oder stdout wie printf, sondern in einen String, bzw. es bekommt einen char*, also die Adresse des Anfangs.
Maverick83
24.01.2007, 22:06
Danke Sprinter, mit sprintf funktioniert es gut. es gibt nur eine ewig lange codezeile ;-)
eine andere Frage zu sprintf:
ich weis man muss irgendwo ein "0" einfügen wenn mann möchte, dass "01" ausgegeben wird anstelle von "1".
Wo muss ich das "0" einfügen? irgendwo um das "%" herum aber wo?
%5.2f = 00123.45
du brauchst wahrscheinlich %2d
SprinterSB
25.01.2007, 09:27
Führende 0 mit %02d oder %2d. Wenn die Codezeile zu lange ist, kannst die auch umbrechen.
sprintf (buf, "%d:%d:%d %d-%d-20%d %d %c%c" CR_LF,
hour, min, sec, // Zeit
day, month, year, // Datum
t5, t5_string[0], t5_string[2] // Zeugs
);
musst du nicht beiner unterbrechung der zeile einen '\' backslash machen?
sprintf (buf, "%d:%d:%d %d-%d-20%d %d %c%c" CR_LF, \
hour, min, sec, \ // Zeit
day, month, year, \ // Datum
t5, t5_string[0], t5_string[2] \ // Zeugs
);
SprinterSB
25.01.2007, 12:25
Nein. \ brauch der Präprozessor bei mehrzeiligen Makros.
Für den Compiler sind SPACE, TAB, NEWLINE, ... white space.
Maverick83
25.01.2007, 13:25
so ich hab das mal ausprobiert und was in meinem txt file steht ist folgendes:
15:70:79,25.15.20124, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
Wieso das Jahr falsch ist ist ein anderes Problem -> Kleinigkeit.
Aber wieso bekomme ich "?" ?
Mein Code:
sprintf(buf,"%2d:%2d:%2d,%2d.%2d.20%2d,%2.2f,%2.2f,%2.2f,%2.2f, %2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2 .2f,%2.2f,%2.2f,%2.2f%c%c",timeStamp.hour,timeStamp.min,timeStamp.sec,timeSt amp.day,timeStamp.month,timeStamp.year,tempT5,temp T6,tempT8,tempT9,tempT10,tempT11,tempT12,tempT13,t empT15,tempT16,tempB,tempR,tempOut,tempSouth,tempW est,tempRunBackT40,0x0D,0x0A);
alle Temperaturen sind double Werte die möchte ich auf Hundertstel genau abspeichern.
SprinterSB
25.01.2007, 13:52
sprintf aud der avr-libc unterstützt nicht den vollen Funktionsumfang. %f würde float-Arithmetik und malloc und... nach sich ziehen.
Schau mal in die Doku zur avr-libc. bei WinAVR unter ./doc/...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.