Nie gniewajcie się koledzy, ale trochę mi to przypomina wykłady profesora "mniemanologii stosowanej"
Trudno jest rozważać błędy w kodzie, którego się nie widziało na oczy. Ja rozumiem, że przedstawienie do analizy na forum kodu zawierającego tysiące linii nie jest dobrą praktyką, ale zawsze można wydzielić problem do osobnego projektu, ograniczając kod do minimum, przy którym jeszcze błąd występuje.
Skoro już jednak próbujemy zgadnąć przyczynę problemu, to chciałbym zwrócić uwagę na pewien fakt. Standard C definiuje różne podstawowe typy danych:
- char
- signed char
- unsigned char
To czy liczba jest ze znakiem, czy bez znaku, ma dla kompilatora kluczowe znaczenie przy doborze odpowiednich instrukcji asm.
To czy typ
char zostanie potraktowany jako
signed czy
unsigned jest
"machine dependent", ale może też być wymuszone przez opcje kompilatora
-fsigned-char i
-funsigned-char. Dobrą praktyką, szczególnie w przypadku pisania kodu, który ma być przenośny, jest jawne oreślenie
"signedness" typu
char, czyli deklarowanie zmiennych zawsze jako
signed char lub jako
unsigned char.
Bez kodu nie wiadomo, jakie operacje są wykonywane na elementach tablicy, więc to tylko zgadywanka, ale spróbowałbym zadeklarować jawnie typ
char jako
signed lub
unsigned.
Sądząc po tej wypowiedzi:
Palvanen napisał(a):
...przyszedł mi do głowy pewien pomysł.
Polegał on na tym, aby zamiast od razu ładować chary do tablicy, zmienić typy tablic na int i do tablic pakować faktycznie przeliczone dane liczbowe odpowiadające znakom tablicy ASCII. I dopiero to przerabiać w drugiej kolejności na char.
Napisałem taką protezę do funkcji, która oprócz przeliczania do dwóch tablic powołuje jeszcze jedną tablicę (dodatkowa tablica, bo powstała proteza) gdzie przekształca to co przeliczyła z intów na chary. I dopiero to wypluwane jest na ekran.
No i noga chudego bociana, jak ręką odjął.
coś może "być na rzeczy"
EDIT:
To jeszcze bardziej przemawia za moją teorią:
Palvanen napisał(a):
z ciekawości chciałem wykonać kompilację na innej platformie systemowej.
Ponieważ nie mam aktualnie dostępu do własnego komputera, do takich celów mam w swoim telefonie zainstalowany emulator z Arch Linux for amr i zainstalowanym gcc. Wykonałem kompilację i uwaga... Działa...
W kodzie dla x86 typ
char jest zwykle traktowany jako
signed char, a na platformę ARM - jako
unsigned char.