PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vektoren zusammenfügen



Maverick83
23.01.2007, 20: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

bL1nK
23.01.2007, 20:41
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?

izaseba
23.01.2007, 20:49
vielleicht mit strcat ?

Gruß Sebastian

Maverick83
23.01.2007, 21: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, 22: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, 22:53
Wie kommen die Werte denn in stringxxxx rein? Stattdessen kannst du die werte doch direkt in buf[] schreiben?

izaseba
23.01.2007, 23:08
@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, 09: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, 10: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, 10:39
danke ich werds mal so probieren.

bL1nK
24.01.2007, 13:28
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, 14: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, 21: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?

bL1nK
24.01.2007, 21:56
%5.2f = 00123.45

du brauchst wahrscheinlich %2d

SprinterSB
25.01.2007, 08: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
);

bL1nK
25.01.2007, 09:46
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, 11:25
Nein. \ brauch der Präprozessor bei mehrzeiligen Makros.
Für den Compiler sind SPACE, TAB, NEWLINE, ... white space.

Maverick83
25.01.2007, 12: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, 12: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/...