|
| sscanf Fra : Kåre |
Dato : 12-04-06 16:36 |
|
Hej
Jeg er lige ved at eksplodere...
Hvorfor dur det her ikke i f.eks. AVR studio med GNU gcc compiler:
sscanf("12\r\n", "%d", a);
Det jeg vil er at pille en håndfuld data u af en ASCII streng, i stil med:
sscanf("12 23 34 45\r\n", "%d%d%d%d", a, b, c, d);
Please help!!!!
Kåre
| |
Bertel Lund Hansen (12-04-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 12-04-06 18:28 |
| | |
Kåre (12-04-2006)
| Kommentar Fra : Kåre |
Dato : 12-04-06 18:40 |
|
"Bertel Lund Hansen" <nospamfilius@lundhansen.dk> skrev i en meddelelse
news:443d381f$0$11696$ba624c82@nntp02.dk.telia.net...
> Kåre skrev:
>
>> Hvorfor dur det her ikke i f.eks. AVR studio med GNU gcc compiler:
>
>> sscanf("12\r\n", "%d", a);
>
> Er a en pointer? Af den rigtige type?
>
Arrrrrhhhhhhhhhhggggggg!!!!
Stupid. Ja ikke dig, men mig.
Takker for hintet, nu ser det ud til at fungere.
Den skal jo have en pointer til variablen:
sscanf("12\r\n", "%d", &a);
Kåre
| |
Kåre (12-04-2006)
| Kommentar Fra : Kåre |
Dato : 12-04-06 23:53 |
|
>>
>>> sscanf("12\r\n", "%d", a);
>>
>> Er a en pointer? Af den rigtige type?
>>
>
> Arrrrrhhhhhhhhhhggggggg!!!!
> Stupid. Ja ikke dig, men mig.
> Takker for hintet, nu ser det ud til at fungere.
>
> Den skal jo have en pointer til variablen:
> sscanf("12\r\n", "%d", &a);
>
> Kåre
>
Og så har jeg så alligevel et lille problem.
Den første af de to sscanf dur OK, men den anden gør ikke. Hvorfor kan jeg
ikke formattere en streng med et float tal i?
char a = 0;
char b = 0;
char c = 0;
float f = 0.0;
sscanf("12 34 56\r\n", "%d%d%d", &a, &b, &c); OK
sscanf("7.8\r\n", "%f", &f); FEJL
pft
Kåre
| |
Bertel Brander (13-04-2006)
| Kommentar Fra : Bertel Brander |
Dato : 13-04-06 00:39 |
|
Kåre wrote:
> Den første af de to sscanf dur OK, men den anden gør ikke. Hvorfor kan jeg
> ikke formattere en streng med et float tal i?
>
[snip]
> float f = 0.0;
>
> sscanf("12 34 56\r\n", "%d%d%d", &a, &b, &c); OK
> sscanf("7.8\r\n", "%f", &f); FEJL
Jeg kan ikke se at der er noget galt med koden.
Du skrev at du bruger AVG, som jeg ikke kender,
men så vidt jeg ved er det en lille embedded platform?
Du skal måske enable support for floating point
i compileren og/eller i de biblioteker du
linker med, det er måske ikke standard.
Du kunne også prøve med strtod i stedet for sscanf
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Arne Vajhøj (13-04-2006)
| Kommentar Fra : Arne Vajhøj |
Dato : 13-04-06 00:57 |
|
Kåre wrote:
> Og så har jeg så alligevel et lille problem.
> Den første af de to sscanf dur OK, men den anden gør ikke. Hvorfor kan jeg
> ikke formattere en streng med et float tal i?
>
> char a = 0;
> char b = 0;
> char c = 0;
> float f = 0.0;
>
> sscanf("12 34 56\r\n", "%d%d%d", &a, &b, &c); OK
> sscanf("7.8\r\n", "%f", &f); FEJL
Jeg synes også at din anden sscanf virker OK.
Men jeg undrer mig lidt over den første.
Virker %d med & of char ?
Arne
| |
Bertel Brander (13-04-2006)
| Kommentar Fra : Bertel Brander |
Dato : 13-04-06 01:33 |
|
Arne Vajhøj wrote:
> Virker %d med & of char ?
Det kommer nok an på hvordan man definerer "virker".
Men nej, %d virker ikke med char, sscanf vil forvente at
den får adressen på en int, hvilket kan betyde at den
skriver på andre adresser end den skulle.
Et eksempel:
#include <stdio.h>
char a = 1, b = 2;
int main()
{
sscanf("11111", "%d", &a);
printf("%d %d\n", a, b);
}
Med de compilere jeg har ved hånden skriver det:
103 43
43*256 + 103 = 11111
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Arne Vajhøj (13-04-2006)
| Kommentar Fra : Arne Vajhøj |
Dato : 13-04-06 03:40 |
|
Bertel Brander wrote:
> Arne Vajhøj wrote:
>> Virker %d med & of char ?
>
> Det kommer nok an på hvordan man definerer "virker".
>
> Men nej, %d virker ikke med char, sscanf vil forvente at
> den får adressen på en int, hvilket kan betyde at den
> skriver på andre adresser end den skulle.
Nu synes jeg umiddelbart jo ikke at det skulle betyde noget
for spørgers problem da de char indlæses førend den float der
læses forkert.
Men det var da stadigvæk interessant at prøve at ændre
de 3 til int og se om det ændrede på noget.
Arne
| |
Kåre (13-04-2006)
| Kommentar Fra : Kåre |
Dato : 13-04-06 06:55 |
|
"Arne Vajhøj" <arne@vajhoej.dk> skrev i en meddelelse
news:URi%f.7093$EA3.949@dukeread10...
> Bertel Brander wrote:
>> Arne Vajhøj wrote:
>>> Virker %d med & of char ?
>>
>> Det kommer nok an på hvordan man definerer "virker".
>>
>> Men nej, %d virker ikke med char, sscanf vil forvente at
>> den får adressen på en int, hvilket kan betyde at den
>> skriver på andre adresser end den skulle.
>
> Nu synes jeg umiddelbart jo ikke at det skulle betyde noget
> for spørgers problem da de char indlæses førend den float der
> læses forkert.
>
> Men det var da stadigvæk interessant at prøve at ændre
> de 3 til int og se om det ændrede på noget.
>
> Arne
Har prøvet at fjerne alle chars'ene, uden ændringer.
Da mine værdier heler ikke overskrider en char, så mener jeg ikke det giver
problemer.
Men min float dur stadig ikke...
Kåre
| |
Bertel Lund Hansen (13-04-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 13-04-06 11:55 |
|
Kåre skrev:
> Da mine værdier heler ikke overskrider en char, så mener jeg
> ikke det giver problemer.
En int fylder hvad den fylder uanset om værdien er lille. På mit
system er det 4 byte.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Mogens Hansen (13-04-2006)
| Kommentar Fra : Mogens Hansen |
Dato : 13-04-06 07:18 |
|
"Kåre" <kaare@raffish.dk> wrote in message
news:443d84be$0$846$edfadb0f@dread14.news.tele.dk...
[8<8<8<]
> Den første af de to sscanf dur OK, men den anden gør ikke. Hvorfor kan jeg
> ikke formattere en streng med et float tal i?
Hvilket tegn er decimal tegn ?
Det kan ændres med locale opsætning.
Hvad returnerer sscanf ?
Understøttes float af scanf i dit system ?
Prøv eventuelt at se hvad sprintf gør hvis du konverterer en float til
tekst, og tilbage igen
Venlig hilsen
Mogens Hansen
| |
Kåre (13-04-2006)
| Kommentar Fra : Kåre |
Dato : 13-04-06 07:40 |
|
>
> Hvilket tegn er decimal tegn ?
> Det kan ændres med locale opsætning.
>
> Hvad returnerer sscanf ?
>
> Understøttes float af scanf i dit system ?
> Prøv eventuelt at se hvad sprintf gør hvis du konverterer en float til
> tekst, og tilbage igen
>
> Venlig hilsen
>
> Mogens Hansen
printf dur heller ikke. Det er som om den slet ikke kan håndtere floats i
printf og sscanf.
Har prøvet at include <float.h> uden held.
Det er som sagt WinAVR GNU gcc compileren jeg bruger.
Kåre
| |
Kåre (13-04-2006)
| Kommentar Fra : Kåre |
Dato : 13-04-06 07:31 |
|
Det her virker man er ikke så elegant:
Konvertering til enkelte strenge, og bagefter til de enkelte værdier.
int a, b, c;
float f = 0.0;
unsigned char str1[20] = "";
unsigned char str2[20] = "";
unsigned char str3[20] = "";
sscanf("11 22 4.5\r\n", "%s%s%s", &str1[0], &str2[0], str3);
a = atoi(str1);
b = atoi(str1);
f = atof(str3);
| |
Jesper Wolf Jesperse~ (16-04-2006)
| Kommentar Fra : Jesper Wolf Jesperse~ |
Dato : 16-04-06 13:26 |
|
Hej Kåre.
> char a = 0;
> char b = 0;
> char c = 0;
> float f = 0.0;
>
> sscanf("12 34 56\r\n", "%d%d%d", &a, &b, &c); OK
> sscanf("7.8\r\n", "%f", &f);
> FEJL
Det er nok en god ide at læse om sccanf funktionen og dens argumenter. Det
er en meget kraftfuld rutine, men der er rigeligt muligheder for at skyde
sig selv i foden
Du angiver decimalt format for de tre første parametre, de skal altså havne
i int variable for at det skal virke. Når jeg prøver at køre din kode siger
visual studio 2005 at der er stack corruption omkring variablen c.
Prøv med nedenstående kode:
/* -------- */
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int a = 0;
int b = 0;
int c = 0;
int res1=0;
int res2=0;
float f = 0.0;
res1=sscanf("12 34 56", "%d%d%d", &a, &b, &c);
res2=sscanf("7.8", "%f", &f);
printf("tal 1=%d, tal2=%d, tal3=%d, tal4=%f\n", a,b,c,f);
printf("konverteringsresultat 1=%d 2=%d\n", res1,res2);
return 0;
}
/* -------- */
Hvis du helst vil have compileren til at håndtere typecheck og al den slags
så var C++ I/O funktionerne måske ikke så tossede ?
Med venlig hilsen
Jesper Wolf Jespersen
| |
Kåre (16-04-2006)
| Kommentar Fra : Kåre |
Dato : 16-04-06 16:21 |
|
> Det er nok en god ide at læse om sccanf funktionen og dens argumenter. Det
> er en meget kraftfuld rutine, men der er rigeligt muligheder for at skyde
> sig selv i foden
>
> Du angiver decimalt format for de tre første parametre, de skal altså
> havne i int variable for at det skal virke. Når jeg prøver at køre din
> kode siger visual studio 2005 at der er stack corruption omkring variablen
> c.
>
> Prøv med nedenstående kode:
>
>
> /* -------- */
>
> #include <string.h>
> #include <stdio.h>
> int main(int argc, char* argv[])
> {
> int a = 0;
> int b = 0;
> int c = 0;
> int res1=0;
> int res2=0;
> float f = 0.0;
> res1=sscanf("12 34 56", "%d%d%d", &a, &b, &c);
> res2=sscanf("7.8", "%f", &f);
> printf("tal 1=%d, tal2=%d, tal3=%d, tal4=%f\n", a,b,c,f);
> printf("konverteringsresultat 1=%d 2=%d\n", res1,res2);
> return 0;
> }
>
> /* -------- */
>
Jeg kender skam godt sscanf funktionen. Jeg har bare ikke brugt den længe,
og glemte at overføre adressen på variablen i første omgang.
Men mit problem er stadig %f. Det dur altså ikke i den compiler jeg prøver
af lige nu (GNU gcc).
Heller ikke sådan som du skriver i dit eksempel. Det var også sådan jeg
forventede det bare skulle virke, men f forbliver 0.
Er der nogen der kender til dette problem med GNU compileren?
Jeg kører med WinAVR i AVR studio IDE.
mvh
Kåre
| |
Jesper Wolf Jesperse~ (16-04-2006)
| Kommentar Fra : Jesper Wolf Jesperse~ |
Dato : 16-04-06 16:39 |
|
Hej Kåre.
> Jeg kender skam godt sscanf funktionen. Jeg har bare ikke brugt den længe,
> og glemte at overføre adressen på variablen i første omgang.
Ja det er en klassisk fejl, det kan have sjove konsekvenser
> Men mit problem er stadig %f. Det dur altså ikke i den compiler jeg prøver
> af lige nu (GNU gcc).
> Heller ikke sådan som du skriver i dit eksempel. Det var også sådan jeg
> forventede det bare skulle virke, men f forbliver 0.
> Er der nogen der kender til dette problem med GNU compileren?
> Jeg kører med WinAVR i AVR studio IDE.
Jeg har ikke lige den version af miljøet, men jeg har prøvet under cygwin og
gcc 3.4.4 med den kode jeg sendte. Det virker ligesom det gør i Visual
Studio.
Hvad siger returværdien fra sccanf ?
Den fortæller hvor mange tildelinger den har foretaget.
Jeg mente at kunne huske at sccanf med "%f" argumentet arbejdede på doubles,
men det ser ud til at være floats. Jeg kan ikke finde min gamle K&R, den er
nok ude på arbejde, så jeg kan ikke cheke om det har været anderledes.
Her er det komplete output fra en afprøvning, prøv at vise os hvad du får:
$ cat testit.c
/* ---- */
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int a = 0;
int b = 0;
int c = 0;
int res1 = 0;
int res2 = 0;
float f = 0.0;
res1 = sscanf("12 34 56", "%d%d%d", &a, &b, &c);
printf("sscanf konverterede %d værdier\n" , res1);
res2 = sscanf("7.8", "%f", &f);
printf("sscanf konverterede %d værdier\n" , res2);
printf("resultatet er a='%d' b='%d', c='%d', f='%f'\n", a,b,c,f);
return 0;
}
/* ------ */
$ gcc --version
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -o testit.exe testit.c
$ testit
sscanf konverterede 3 værdier
sscanf konverterede 1 værdier
resultatet er a='12' b='34', c='56', f='7.800000'
med venlig hilsen
Jesper Wolf Jespersen
| |
Kent Friis (16-04-2006)
| Kommentar Fra : Kent Friis |
Dato : 16-04-06 17:25 |
|
Den Sun, 16 Apr 2006 17:21:23 +0200 skrev Kåre:
> Jeg kender skam godt sscanf funktionen. Jeg har bare ikke brugt den længe,
> og glemte at overføre adressen på variablen i første omgang.
>
> Men mit problem er stadig %f. Det dur altså ikke i den compiler jeg prøver
> af lige nu (GNU gcc).
Prøv med en double i stedet for float.
Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.
| |
Kåre (16-04-2006)
| Kommentar Fra : Kåre |
Dato : 16-04-06 20:52 |
|
"Kent Friis" <nospam@nospam.invalid> skrev i en meddelelse
news:44426fe3$0$15782$14726298@news.sunsite.dk...
> Den Sun, 16 Apr 2006 17:21:23 +0200 skrev Kåre:
>> Jeg kender skam godt sscanf funktionen. Jeg har bare ikke brugt den
>> længe,
>> og glemte at overføre adressen på variablen i første omgang.
>>
>> Men mit problem er stadig %f. Det dur altså ikke i den compiler jeg
>> prøver
>> af lige nu (GNU gcc).
>
> Prøv med en double i stedet for float.
>
Tadaaaa!
Så åd den den squ alligevel.
Når man så tænker over det er det nok også logisk nok: Største mulige type
til integer, og største mulige type til floats.
Så spiller det. Tak for hjælpen alle mand!
Nu kan jeg lave pæn kode og ikke spaghetti.
Og så alligevel synes jeg det er træls at skulle svine med RAM...
Kåre
| |
Kent Friis (16-04-2006)
| Kommentar Fra : Kent Friis |
Dato : 16-04-06 21:06 |
|
Den Sun, 16 Apr 2006 21:52:22 +0200 skrev Kåre:
>
> "Kent Friis" <nospam@nospam.invalid> skrev i en meddelelse
> news:44426fe3$0$15782$14726298@news.sunsite.dk...
>> Den Sun, 16 Apr 2006 17:21:23 +0200 skrev Kåre:
>>> Jeg kender skam godt sscanf funktionen. Jeg har bare ikke brugt den
>>> længe,
>>> og glemte at overføre adressen på variablen i første omgang.
>>>
>>> Men mit problem er stadig %f. Det dur altså ikke i den compiler jeg
>>> prøver
>>> af lige nu (GNU gcc).
>>
>> Prøv med en double i stedet for float.
>>
> Tadaaaa!
> Så åd den den squ alligevel.
> Når man så tænker over det er det nok også logisk nok: Største mulige type
> til integer, og største mulige type til floats.
Det er nu ikke den største muligt type der bruges ved integers. Den
hedder "long long" og er 64 bits.
> Og så alligevel synes jeg det er træls at skulle svine med RAM...
Hvis det er at double fylder mere end en integer du mener, så
laver du da bare en funktion der kalder sscanf med nogle lokale
variable, og returnerer ints (eller mindre). Så bruger du jo kun
de floats der er på en linie, og kun i de 0.001 sekund funktionen
kører.
Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.
| |
|
|