/ 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
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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 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?

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

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.

Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste