|
| Opdeling af string Fra : Lars |
Dato : 06-03-07 12:36 |
|
Hej
Jeg er ved at arbejde med serial input på AVR-board. Der modtager
jeg en string, som jeg har brug for at få delt op. Hvilket også
lykkes, men med brug af pointers.
Jeg har et minimum 6 karakters input, som skal opdels i 2x 3 og Så
resten skal smides ud. Problemet er at det som beskærer tempDay,
ødelæger tempNight. Og efterlader mig mere forviret.
strncpy(tempNight,Input,3);
strncpy(tempDay,&Input[3],3);
Jeg har ellers også forsøgt at dele direkte ved inputet. Det
nedenstående virker fint indtil at if-sætningen kommer ind. Så
kommer der indhold i tempNight, men ikke i tempDay. tempDay tæller
godt nok 3 gange, men indeholder kun det sidste tegn fra tempNight.
Er der nogen bud hvorfor?
/Lars
while(inSerial!=0x03)
{
inSerial=getchar();
if(x<=2)
{
printf("TempNight\r\n");
tempNight[x]=inSerial;
}
if(x>2||x<6)
{
printf("TempDay \r\n");
tempDay[x]=inSerial;
}
x++;
}
}
| |
Bertel Lund Hansen (06-03-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 06-03-07 13:50 |
|
Lars skrev:
> Jeg har ellers også forsøgt at dele direkte ved inputet. Det
> nedenstående virker fint indtil at if-sætningen kommer ind. Så
> kommer der indhold i tempNight, men ikke i tempDay. tempDay tæller
> godt nok 3 gange, men indeholder kun det sidste tegn fra tempNight.
> Er der nogen bud hvorfor?
x er mindst 3 når du begynder på at fylde tempDay op, så
tempDay[0..2] er udefinerede. printf-udskriften giver måske noget
garbage fordi du ikke kan være sikker på hvor der er en
terminering (en 0-byte).
for (x=0; x<3; ++x) {
inSerial=getchar();
printf ("TempNight\r\n");
tempNight[x]=inSerial;
if (inSerial==0x03) break;
}
// Hvis strengen skal nultermineres:
tempNight[x+1]=0;
for (x=0; x<3; ++x) {
inSerial=getchar();
printf ("TempDay \r\n");
tempDay[x]=inSerial;
if (inSerial==0x03) break;
}
// Hvis strengen skal nultermineres:
tempDay[x+1]=0;
Hvis du foretrækker det, kan break-fidusen fjernes hvis man laver
for-løkken således:
for (x=0; x<3 && inSerial!=0x03; ++x) {
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Lars (06-03-2007)
| Kommentar Fra : Lars |
Dato : 06-03-07 15:42 |
|
Bertel Lund Hansen wrote:
> x er mindst 3 når du begynder på at fylde tempDay op, så
> tempDay[0..2] er udefinerede. printf-udskriften giver måske noget
> garbage fordi du ikke kan være sikker på hvor der er en
> terminering (en 0-byte).
Ja, selvfølgelig. Jeg har siddet og stirret mig blind på skidtet,
Jeg har set som om jeg bare har skiftet "beholder", men der mangler
de tomme pladser forinden.
Jeg har prøvet at sætte dit ind, men det underlige er at TempNight
eller TempDay, alt efter hvad der står først, indeholder for meget.
Hvis jeg indtaster 1,3,5,6,7,9 så indeholder tempNight 1,3,6,7,9.
Og hvis jeg bytter rundt og sætter tempDay først er det samme
tilfælde.
Jeg har siddet og barberet min kode ned til et minimum for at sikre
mig at det ikke er andre rester, for det virker mærkeligt.
/Lars
| |
Bertel Lund Hansen (06-03-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 06-03-07 17:18 |
|
Lars skrev:
> Jeg har prøvet at sætte dit ind, men det underlige er at TempNight
> eller TempDay, alt efter hvad der står først, indeholder for meget.
> Hvis jeg indtaster 1,3,5,6,7,9 så indeholder tempNight 1,3,6,7,9.
> Og hvis jeg bytter rundt og sætter tempDay først er det samme
> tilfælde.
[bande ... svovle]
Du har taget den reviderede for-løkke, og det skulle have været
|| og ikke && - altså:
for (x=0; x<3 || inSerial!=0x03; ++x) { ...
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Lars (08-03-2007)
| Kommentar Fra : Lars |
Dato : 08-03-07 22:45 |
|
Bertel Lund Hansen wrote:
> Du har taget den reviderede for-løkke, og det skulle have været
> || og ikke && - altså:
>
> for (x=0; x<3 || inSerial!=0x03; ++x) { ...
Hey
Beklager, min manglende udmelding. Nu har jeg siddet med det og det
virker stadig noget spøjst. Jeg har barberet koden ned til et
minimum for at sikre mig at det ikke er andet der påvirker
resultatet. Men når jeg bruger de første du skrev og jeg sender
1,4,6,7,8,2 via serial får tempNight 1,4,7,8,2 og tempDay 7,8,2.
Hvis jeg bytter rundt på de to næsten ens for-løkker sender de samme
tal får tempNight kun tre tal som den skal 1,4,6, men tempDay får
kun et 7.
Jeg undrer mig meget hvordan det kan have så stor påvirkning at
bytte to næsten ens løkker. Hvor logisk er dette?
Når jeg brugte dit revideret bud fik jeg "støj" (|||) med. Jeg ved
ikke hvad de lodrette streger er, men de kommer frem når jeg test
udskriver på lcd-displayet.
/Lars
| |
dusted (22-03-2007)
| Kommentar Fra : dusted |
Dato : 22-03-07 18:24 |
|
Lars wrote:
> Hej
>
> Jeg er ved at arbejde med serial input på AVR-board. Der modtager
> jeg en string, som jeg har brug for at få delt op. Hvilket også
> lykkes, men med brug af pointers.
> Jeg har et minimum 6 karakters input, som skal opdels i 2x 3 og Så
> resten skal smides ud. Problemet er at det som beskærer tempDay,
> ødelæger tempNight. Og efterlader mig mere forviret.
> strncpy(tempNight,Input,3);
>
> strncpy(tempDay,&Input[3],3);
>
> Jeg har ellers også forsøgt at dele direkte ved inputet. Det
> nedenstående virker fint indtil at if-sætningen kommer ind. Så
> kommer der indhold i tempNight, men ikke i tempDay. tempDay tæller
> godt nok 3 gange, men indeholder kun det sidste tegn fra tempNight.
> Er der nogen bud hvorfor?
>
> /Lars
>
> while(inSerial!=0x03)
> {
> inSerial=getchar();
> if(x<=2)
> {
> printf("TempNight\r\n");
> tempNight[x]=inSerial;
>
>
> }
> if(x>2||x<6)
> {
>
> printf("TempDay \r\n");
> tempDay[x]=inSerial;
>
>
> }
> x++;
> }
> }
Hvor er det bare snyd! Du sidder der og leger med kode, imens jeg stener
rundt og smækker lorte cisco op i racks...
Hehe :D
Har noget kode til at ligge, snak med kim, tror nok han har det, kig i
den del hvor jeg er ved at implementere protokollen :)
Mvh
Jimmy
| |
|
|