[#1] Nowe MOS SDK i kropka/przecinek
Chyba trafiłem na przyczynę moich problemów z nowym SDK. Na starym wszystko było normalnie (tak jak pod Windows, MacOSX i iOS). No a z nowym mam takie przeboje...

Czytam sobie plik tekstowy przy pomocy funkcji fscanf(). No i fajnie. Tylko, że w pewnym przypadku jest coś takiego, że po przeczytaniu jakiejś porcji danych w ten sposób:

FILE* file = fopen(...)
float value1, value2, value3;
fscanf(file, "%f %f %f", &value1, &value2, &value3);


następne czytanie zaczyna się znów od miejsca gdy zakończyło się ostatnie. Czyli gdybym miał taki plik tekstowy:

1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 9.0000


To przy pierwszym czytaniu odczytam sobie wartości:
1.0000 2.0000 3.0000

przy drugim znów:
1.0000 2.0000 3.0000

przy trzecim znów:
1.0000 2.0000 3.0000


Po prostu użycie funkcji fscanf() nie powoduje przesunięcia kursora w pliku (zwanego position indicator). I faktycznie tak jest, bo jak sobie sprawdzę tak:

FILE* file = fopen(...)
float value1, value2, value3;
printf("before: %dn", ftell(file));
fscanf(file, "%f %f %f", &value1, &value2, &value3);
printf("after: %dn", ftell(file));


To w logu dostanę np. coś takiego:

before: 154
after: 154


Zauważyłem, że jak drukuję na standardowe wyjście jakąś wartość float, np.:

float test = 1.23f;
printf("test = %fn", test);


to dostaję coś takiego:

test = 1,23

Jakby ktoś nie zauważył to tu jest PRZECINEK zamiast KROPKI.

No to spróbowałem w pliku tekstowym zamienić kropki na przecinki:

1,0000 2,0000 3,0000
4,0000 5,0000 6,0000
7,0000 8,0000 9,0000


No i teraz wszystko jest tak jak powinno i jak jest na innych platformach i starym MOS SDK!

Sprawdzałem zarówno na GCC 2.95.3 jak i GCC 4.4.4 (oba z nowego SDK).

O co tu chodzi? To jakiś błąd w nowym MorphOS SDK? To jest jakoś powiązane z Localami? Bez sensu, bo ANSI C jasno opisuje, że ułamki są z kropkami. Locale chyba nie mają tu nic do tego. Poza tym ja i tak używam angielskich locali. W starym MorphOS SDK wszystko było normalnie.
Kurcze, co mogę z tym zrobić?



Ostatnia modyfikacja: 19.05.2011 22:52:14
[#2] Re: Nowe MOS SDK i kropka/przecinek

@MDW, post #1

Podobny problem miałem na Symbianie - tam bieżący język decyduje o znaku jaki jarzą funkcje stdio do oddzielania części całkowitej od ułamkowej.
Radzę zapoznać się z następującą dokumentacją. Niestety w przypadku Symbiana setlocale nic nie dało i trzeba było robić własne work-aroundy, ale może na MOS-ie zadziała...



Ostatnia modyfikacja: 19.05.2011 23:47:36
[#3] Re: Nowe MOS SDK i kropka/przecinek

@Masta Krishna, post #2

Dzięki za maksymalnie cenną informację. Pojęcia nie miałem o tym, że w takim hardcorowym ANSI C istnieje coś takiego jak locale. :) Po powrocie do domu od razu sprawdzę setlocale("C", LC_ALL). Myślę, że to w MorphOSie zadziała. Skoro stare SDK miało to w nosie, a nowe zaczęło być na to wrażliwe to pewnie właśnie wprowadzono wsparcie tej funkcji więc jest obsługiwana.

No ale kurcze... locale w ANSI C? Świat się kończy... ;) Ile jeszcze tajemnic kryje ten kilkudziesięcioletni hardcorowy standard? :)

Raz jeszcze bardzo dziękuję za pomoc.

[#4] Re: Nowe MOS SDK i kropka/przecinek

@MDW, post #3

kompilujesz z -noixemul ?

[#5] Re: Nowe MOS SDK i kropka/przecinek

@rzookol, post #4

Tak, mam ten parametr w makefile.

[#6] Re: Nowe MOS SDK i kropka/przecinek

@Masta Krishna, post #2

Spieszę poinformować, że faktycznie problemem były te dziwne locale z ANSI C o których istnieniu nie miałem cienia pojęcia. :) Wystarczyło ustawić:
setlocale(LC_ALL, "C");
i Fortis skompilowane pod nowym MorphOS SDK działa i wygląda tak samo jak pod starym. I to niezależnie od tego czy skompiluję GCC 2.95.3 czy GCC 4.4.4. Uffff...

Masta Krishna - stukrotne dzięki! Nie wyobrażasz sobie jak bardzo mi pomogłeś tym jednym komentarzem. :)



Ostatnia modyfikacja: 20.05.2011 22:20:07
[#7] Re: Nowe MOS SDK i kropka/przecinek

@MDW, post #6

Masta to dobry chłopak jest, wiem co mówię. Propsy dla niego!

[#8] Re: Nowe MOS SDK i kropka/przecinek

@skipp, post #7

True

[#9] Re: Nowe MOS SDK i kropka/przecinek

@skipp, post #7

Łer iz widio?

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem