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

Tablice ze wskaźnikami

0 głosów
72 wizyt
pytanie zadane 5 stycznia 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 przez Hiskiel Pasjonat (22,990 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 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 przez mokrowski VIP (107,720 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 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 przez mokrowski VIP (107,720 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 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 przez mokrowski VIP (107,720 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
1 odpowiedź 93 wizyt
+1 głos
0 odpowiedzi 407 wizyt
0 głosów
1 odpowiedź 33 wizyt
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

64,868 zapytań

111,331 odpowiedzi

234,217 komentarzy

46,733 pasjonatów

Przeglądających: 222
Pasjonatów: 5 Gości: 217

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...