• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kompilacja i uruchamianie programów w C pod Linuksem a Windowsem

VPS Starter Arubacloud
0 głosów
234 wizyt
pytanie zadane 6 grudnia 2015 w C i C++ przez Moose Nowicjusz (120 p.)

Witam, spotykam się ostatnio z problemem niepoprawnego działania programu pod linuxem (debian), który to program pisany był w codeblocksie pod windowsem. Oczywiście skompilowany ponownie pod linuxem korzystając z notatnika i terminala. Podam tu przykładową funkcję (jest to metoda sortowania wyrazów w tablicy poprzez proste wybieranie), która działa pod windowsem prawidłowo (czyli tak jak ja sobie życzę), a pod linuxem nie bardzo, coś tam co prawda robi, ale ani to poprawne ani nie bardzo mam jak sprawdzić co dokładnie.

Jeśli byłby ktoś tak miły i mi pomógł, byłbym zobowiązany.
 

void selection_sort(void)
{
    char temp[sMAX];
    int i, j, min;

    for ( i = 0; i < k - 1 ; ++i ){
        min = i;
        for ( j = i + 1; j < k; ++j ){
            if ( strcmp( tab[j], tab[min] ) == -1 ) min = j;
        }
        if (min != i) {
            strcpy( temp    , tab[i]   );
            strcpy( tab[i]  , tab[min] );
            strcpy( tab[min], temp     );
        }
    }
}

tab jest dwuwymiarową tablicą tablic typ char, k to licznik linii, na których program operuje

1 odpowiedź

0 głosów
odpowiedź 6 grudnia 2015 przez draghan VIP (106,230 p.)
Nie ma czarów, jeśli funkcja korzysta w poprawny sposób ze standardu (i kompilator wspiera ten standard), musi działać jednakowo na obu platformach. A to, czy wyniki jej działania będą poprawne, to już zależy od zaimplementowanego algorytmu.

Teraz jest już późno, a ja zbyt zmęczony żeby analizować cokolwiek. Jeśli nikt Ci nie pomoże do jutra, postaram się rzucić na to okiem.
komentarz 6 grudnia 2015 przez Moose Nowicjusz (120 p.)
Dodam, że owy debian prawdopodobnie korzysta z innej wersji języka C (tzn. starszej) więc jeśli to jest powodem nieprawidłowości to także prosiłbym o wskazanie, w którym miejscu.
komentarz 6 grudnia 2015 przez draghan VIP (106,230 p.)

Jedyne, co wyłapałem, to warunek. Standard określa, że funkcja strcmp() zwraca wartości relatywne do zera, lecz nie definiuje konkretnych wartości. Zgodnie ze standardem, warunek powinien  wygladać tak:

if ( strcmp( tab[j], tab[min] ) < 0 )

Program działa poprawnie na Linuksie, kompilowany gcc 4.8.5 i gcc 5.2, z opcjami wyłączenia rozszerzeń GCC oraz w standardzie C89. Identyczne wyniki daje dla Windows, kompilowany gcc 4.9 oraz MinGW z gcc 4.7.

komentarz 6 grudnia 2015 przez Moose Nowicjusz (120 p.)
Dziękuję serdecznie, miałbym jeszcze pytanie czy zamiast funkcji strcpy lepiej użyć memcpy? No i czy nie prowadzi to do jakichś komplikacji?
komentarz 6 grudnia 2015 przez draghan VIP (106,230 p.)

Dla operacji na łańcuchach znaków lepiej używać strcpy(). Zgodnie z logiką działań na łańcuchach, kończy ona swoje działanie w momencie napotkania znaku zerowego, co daje jej przewagę nad memcpy(), szczególnie w przypadku gdy masz duży bufor a string w nim zawarty jest krótki.
Podsumowując:
strcpy() kopiuje tylko tyle, ile trzeba, a memcpy() kopiuje zawsze cały fragment pamięci.

komentarz 6 grudnia 2015 przez Moose Nowicjusz (120 p.)
Dziękuję jeszcze raz. Temat uważam za zamknięty, a problem za prawdopodobnie rozwiązany (na widowsie przy mojej konfiguracji strcmp zwracał jedynie -1 0 albo 1, zaś jak Pan zauważył, w standardzie nie jest zdefiniowane jakie to wartości, jest jedynie ich znak lub 0)

Podobne pytania

+1 głos
2 odpowiedzi 335 wizyt
0 głosów
4 odpowiedzi 606 wizyt
+1 głos
4 odpowiedzi 629 wizyt
pytanie zadane 29 marca 2016 w C i C++ przez Eliro Stary wyjadacz (12,160 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...