fgetws

Michal Grunt michal.grunt na gmail.com
Úterý Srpen 30 10:09:26 CEST 2022


Tak jsem to rozlousknul. Ale stejně v tom mám zmatek snad ještě větší
než před tím...

Problém byl v tom, že se program spouštěl po bootu jako služba
(znakový výstup na konzoli - malý grafický LCD) a asi neměl k
dispozici správné systémové proměnné "locale" (a vůbec nemělo vliv co
jsem nastavoval přímo v programu příkazem setlocale() ). Locale jsem
samozřejmě nastavené měl, když jsem byl přihlášený. Program spuštěný
jako služba toto asi neměl k dispozici (nejspíš je nutné locale
nastavit nějak globálně). Když jsem v nastavení služby upravil
spouštění na "ExecStart=env LANG=cs_CZ.UTF-8 /home/pi/mujprogram" tak
už to šlape, čeština se zobrazuje a to i bez wchar_t prostě jenom s
normálním char přes to, že jsou české znaky dvoubajtové což samozřejmě
dělá bordel třeba u strlen... Ideální by to asi bylo vyřešit pomocí
wchar, ale na tom mi havaroval fgetws. Zkusím si ještě pohrát s
fshort-wchar a mrknu na tu dělitelnost délky bufferu. Ale co když zase
bude něco co bude zobrazovat východní jazyky, které jsou snad 4
bajtové...

"C" jsem zvolil kvůli rychlosti (běží to na RPi Zero 1, které není
zrovna nejrychlejší nehledě na to, že to běží na baterii kde minimální
zátěž CPU = delší výdrž, Python byl v tomto tragický) i když jsou s
tím spojeny některé obtíže.

po 29. 8. 2022 v 21:58 odesílatel Michal Vanka <junk.mv na gmail.com> napsal:

>
> Jestli to neni tim, ze kodovani UTF-8 neni 16 bitove...
> Viz:
> https://en.wikipedia.org/wiki/UTF-8
>
>
> On Mon, Aug 29, 2022 at 9:31 PM <spam na nagano.cz> wrote:
>>
>> Pripadne mi podezrela kombinace wchar_t a utf8. Zkuste vyhodit vse 16bitove.
>> L.
>>
>> Sent from MailDroid
>>
>> -----Original Message-----
>> From: Michal Grunt <michal.grunt na gmail.com>
>> To: HW-news <hw-list na list.hw.cz>
>> Sent: po, 29 srp 2022 20:27
>> Subject: fgetws
>>
>> Jsem v koncích. Lámu si s tím hlavu už několik hodin. Po překladu (gcc
>> na RPi) a spuštění to hlásí chybu: Neoprávněný přístup do paměti
>> (SIGSEGV)
>>
>> Havaruje to na fgetws...
>>
>> Příkaz "mpc status | head -n 1" vrátí název stanice nebo interpreta a
>> to v UTF 8 formátu (diakritika).
>>
>> Co dělám špatně? Zkoušel jsem nad tím i usilovně přemýšlet :-), ale
>> ani to nepomohlo. Metoda pokus omyl (co najdu po internetu) je také
>> selhala. Níže je uveden jeden z mnoha pokusů.
>>
>> Blbý je, že se to ani nedá nějak pořádně debugovat nebo to neumím (na
>> RPi a přístup přes SSH na konzoli).
>>
>> Děkuji
>> MG
>>
>> #define BUF_LEN 255
>> static wchar_t szwBuffer[BUF_LEN];
>>
>> setlocale(LC_CTYPE, "en.UTF-8");
>>
>> fp = popen( "mpc status | head -n 1", "r");
>> if (fp == NULL) {
>>    printf("Failed to run command\n" );
>>    exit(1);
>> }
>>
>> fwide(fp,1);
>> while (fgetws(szwBuffer, sizeof(szwBuffer)/sizeof(wchar_t), fp) !=
>> (wchar_t *)NULL);
>>
>> wprintf( L"%s\n", szwBuffer);
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list