/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
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

Søg
Reklame
Statistik
Spørgsmål : 177420
Tips : 31962
Nyheder : 719565
Indlæg : 6407873
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste