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

Sprawdzenie poprawności kodu źródłowego

Object Storage Arubacloud
0 głosów
328 wizyt
pytanie zadane 20 listopada 2017 w C i C++ przez kamil98u Nowicjusz (220 p.)
edycja 20 listopada 2017 przez kamil98u

Witam, czy mógłby ktoś sprawdzić poprawność kodu źródłowego? Celem programu były wygenerowanie wybranej ilości liczb, następnie posortowanie ich przez wybór, na koniec program miał wyświetlić czas, jaki był potrzebny do posortowania liczb.
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int main()
{
    int ilosc_liczb, max, i, j, pomoc;
    clock_t start, stop;
    printf("Podaj ilosc liczb do posortowania: \n");
    scanf("%d", &ilosc_liczb);
    srand(time(0));
    int *tablica= (int*)malloc(ilosc_liczb*ilosc_liczb);
    for (i=0; i<ilosc_liczb; i++)
    {
        tablica[i]=rand()%1000;
    }
    start=clock();
    for(i=0; i<ilosc_liczb; i++)
    {
        max=i;
        for (j=i+1; j<ilosc_liczb; j++)
        {
            if (tablica[j]<tablica[max])
                max=j;
        }
        pomoc=tablica[max];
        tablica[max]=tablica[i];
        tablica[i]=pomoc;
    }
    stop=clock();
    printf("Czas sortowania: %.1f \n", (((float)(stop-start)/1000000.0F)*1000));
    free(tablica);
    getch();
    return 0;
}

 

komentarz 20 listopada 2017 przez RAD Obywatel (1,810 p.)
Czy kolego nie mogłeś tego kodu wkleić do takiego magicznego "pojemnika" który jest na tej stronie. (code snippet) Proszę popraw to.
komentarz 20 listopada 2017 przez kamil98u Nowicjusz (220 p.)
Przepraszam, nie wiedziałem o tym ;)
komentarz 20 listopada 2017 przez RAD Obywatel (1,810 p.)
No i od razu lepiej :-)

3 odpowiedzi

+2 głosów
odpowiedź 20 listopada 2017 przez draghan VIP (106,230 p.)

Masz bład w obliczaniu ilości alokowanej pamięci:

malloc(ilosc_liczb*ilosc_liczb)

Ale poza tym jest w porządku.

komentarz 20 listopada 2017 przez kamil98u Nowicjusz (220 p.)
A jak to poprawić? Pierwszy raz wykorzystywałem, tę funkcję i miałem z nią "małe" problemy
komentarz 20 listopada 2017 przez draghan VIP (106,230 p.)

Musisz jej podać liczbę bajtów, które ma Ci zarezerwować. Ty chcesz mieć tablicę intów o liczbie elementów równej ilosc_liczb. A liczba bajtów, potrzebna na taką tablicę, to:

sizeof(int) * ilosc_liczb

 

+1 głos
odpowiedź 20 listopada 2017 przez mokrowski Mędrzec (155,460 p.)

Oprócz tego co napisali koledzy, już naprawdę szczegóły i po użyciu narzędzi sprawdzających dodatkowo kod:

  1. Sygnatura main jedna z dopuszczalnych: int main(void) lub int main(int argc, char ** argv). Ta druga może zawierać tablicę argv ale sygnatura int main() jest niedopuszczalna.
  2. Linia z malloc(...), nie może zawierać w standardzie c89 jednocześnie deklaracji tablicy i przypisania malloc(...) a jak wnoszę z deklarowania wcześniej wszystkich zmiennych, tego standardu się trzymałeś.
  3. scanf(...) w narzędziach lint, zgłasza konieczność umieszczenia: (void) scanf(...)
  4. srand(...) przyjmuje typ unsigned tak więc: srand((unsigned)time(0));
  5. Jeśli już wczytałeś <stdlib.h>, zwróć z main EXIT_SUCCESS czyli: return EXIT_SUCCESS;
  6. <conio.h> i getch() są funkcjami nieprzenośnymi. Lepiej uruchamiać w VS w trybie debug (<ctrl + F5> (albo F9) )
  7. Przyzwyczajenie deklarowania zmiennych "hurtem" w 1 linii, to złe przyzwyczajenie. Będziesz miał kiedyś wskaźnik i się zdziwisz.
  8. Preferuj pre-inkrementację gdzie to możliwe. W przypadku for(...) to jest obojętne (z punktu widzenia działania) a w większości asemblerów (nie tylko x86), generuje wydajniejszy kod.

Jeszcze raz, uwagi traktuj jako "upierdliwe szczególarstwo". No ale chciałeś wiedzieć :-)

0 głosów
odpowiedź 20 listopada 2017 przez obl Maniak (51,280 p.)

malloc przyjmuje rozmiar alokowanej pamięci w bajtach, więc zakładając, że chcesz alokować pamięć  dla ilosc_liczb typu int to powinieneś to zrobić tak:

malloc( sizeof(*tablica) * ilosc_liczb);

gdzie sizeof zwraca rozmiar zmiennej w bajtach.

Poza tym powinieneś sprawdzić najpierw czy użytkownik nie wpisał liczby zerowej lub ujemnej.

komentarz 20 listopada 2017 przez kamil98u Nowicjusz (220 p.)
Dziękuję bardzo ;)

Podobne pytania

0 głosów
2 odpowiedzi 569 wizyt
pytanie zadane 13 listopada 2017 w C i C++ przez artur96 Początkujący (250 p.)
+2 głosów
1 odpowiedź 360 wizyt
+1 głos
1 odpowiedź 1,497 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...