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

Tablice ze wskaźnikami

Object Storage Arubacloud
0 głosów
158 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez MS Początkujący (430 p.)

Nie wiem w jaki sposób zamienić kod, tak żeby używał wyłącznie wskaźników. 

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define ROWS 4
#define COLUMNS 10
#define CLASS_SIZE 40
 
char compare(const void *a, const void *b)
{
    return(*(int*)a - *(int*)b);
}
int main(int argc, char const *argv[])
{
    int counter, i;
    char array[ROWS][COLUMNS];
    if(argc > 5)
    {
        printf("Too many arguments. 2 max\n(Hit any character to exit)");
        getchar();
        return 0;
    }
 
    for(counter = 0; counter < argc-1; counter++)
    {
        strncpy(array[counter], argv[counter+1], COLUMNS-1);
        array[counter][COLUMNS-1] = 0;
        for(i = 0; i < COLUMNS-1; i++)
        {
            if((isspace(array[counter][i])) || array[counter][i] == NULL)
            {
                array[counter][i] = '$';
            }
        }
    }
    printf("Command line includes %d parameters:\n", argc - 1);
    for(counter = 0; counter < argc - 1; counter++)
    {
        printf("%d: %s\n", counter + 1, array[counter]);
    }
    printf("\n");
    qsort(array, ROWS, COLUMNS, compare);
    for(i = 0; i < argc - 1 ; i++)
    {
        printf("%d: %s\n", i + 1, array[i]);
    }
    return 0;
}

 

komentarz 5 stycznia 2019 przez Hiskiel Pasjonat (22,830 p.)
Gdybyś używał tylko i wyłącznie wskaźników, to byś tylko miał wskaźniki i nic więcej. Wyjaśnij o co Ci chodzi
komentarz 5 stycznia 2019 przez MS Początkujący (430 p.)
Chodzi o to żeby użyc wskaźników tam gdzie tylko możliwe, nie zmieniając funkcjonowania kodu.
komentarz 5 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
Ok, spoko.. tylko jeszcze napisz z jakim standardem C ma to być zgodne (C90 - C18) i czy to nie przypadkiem cel "kazał/a to zrobić aby były wszędzie wskaźniki'. To ostatnie łamie wszelkie reguły zdrowego rozsądku i lepiej wiedzieć czy staczać się poza krawędź szaleństwa :)
komentarz 5 stycznia 2019 przez MS Początkujący (430 p.)
Co do standardu to najlepiej jak najwcześniejszy(do C99). A co do wskaźników to nie mogę używać indeksów, tylko wskaźniki.
komentarz 5 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)

W programie masz szereg ostrzeżeń. Myślę że warto najpierw zadbać by kompilował się bez nich:

https://godbolt.org/z/rfrYQF

Przełączniki użyte do kompilacji:

-std=c99 -Wall -Wextra -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual  -Wstrict-prototypes -Wmissing-prototypes

Same ostrzeżenia:

<source>:9:6: warning: no previous prototype for 'compare' [-Wmissing-prototypes]

 char compare(const void *a, const void *b)

      ^~~~~~~

<source>: In function 'compare':

<source>:11:13: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]

     return(*(int*)a - *(int*)b);

             ^

<source>:11:24: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]

     return(*(int*)a - *(int*)b);

                        ^

<source>: In function 'main':

<source>:30:66: warning: comparison between pointer and integer

             if((isspace(array[counter][i])) || array[counter][i] == NULL)

                                                                  ^~

<source>:42:33: warning: passing argument 4 of 'qsort' from incompatible pointer type [-Wincompatible-pointer-types]

     qsort(array, ROWS, COLUMNS, compare);

                                 ^~~~~~~

In file included from <source>:4:

/usr/include/stdlib.h:828:20: note: expected '__compar_fn_t' {aka 'int (*)(const void *, const void *)'} but argument is of type 'char (*)(const void *, const void *)'

      __compar_fn_t __compar) __nonnull ((1, 4));

      ~~~~~~~~~~~~~~^~~~~~~~

Compiler returned: 0

 

komentarz 5 stycznia 2019 przez MS Początkujący (430 p.)
Microsoft Visual Code wyświetla 2 ostrzeżenia dotyczące compare i użycia NULLA
komentarz 5 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
No i dlatego podałem Ci link do strony.. ale chwila. Jeśli kompilujesz VS to wiedz że MS do dziś (2019) nie ma kompilatora C w pełni zgodnego z C90. Stąd pomysł by to był jakiś nowszy standard jeśli masz to kompilować pod MS dopada.

Dodatkowo zwróć uwagę na błąd logiczny nadużywana argc - 1 (lina 24 i dalsze). Tam wystarcza samo ROW. Po pierwszym sprawdzeniu nie ma potrzeby sprawdzania argc.

Popraw ostrzeżenia, wklej i zobaczymy co dalej... a godbolt warto zapamiętać bo to dobre narzędzie nie tylko do takich przypadków.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 315 wizyt
pytanie zadane 20 stycznia 2022 w C i C++ przez wyntia Nowicjusz (120 p.)
0 głosów
1 odpowiedź 145 wizyt
0 głosów
1 odpowiedź 161 wizyt
pytanie zadane 30 kwietnia 2020 w C i C++ przez Dolfro Nowicjusz (160 p.)

92,552 zapytań

141,399 odpowiedzi

319,532 komentarzy

61,938 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!

...