funkcja typu strukturalnego, zwracanie wartosci const

Odpowiedz Nowy wątek
2019-05-14 13:10
0

Mam taki oto kod:

struct file_t* find_min(const struct file_t* files, int size)
{
    if (files == NULL ) return NULL;
    for (int i = 0; i<size; i++)
    {
        if (files+i<files+i+1)
            files = files+i+1;
    }

    return files;
}

i mój problem polega na tym że nie wiem jak zwrócić wartość tej funkcji.
Oto polecenie:
Funkcja ma odnaleźć pierwszy plik w tablicy files o size elementach który posiada najmniejszą ilość zapisanych danych.

Wartość zwracana:

Jeśli znaleziono, to funkcja powinna zwrócić wskaźnik do struktury file_t opisującej taki plik.
W przypadku podania błędnych danych funkcja powinna zwrócić wartość NULL.
Zwróć uwagę na modyfikator const.
nagłówek: struct file_t find_min(const struct file_t files, int size);

naglowek nie pasuje, brak wskaznika - daniel1302 2019-05-14 13:30

Pozostało 580 znaków

2019-05-14 13:41

1) Deklarujesz wskaźnik do miejsca w pamięci, gdzie będziesz przechowywał strukturę.
struct file_t *wskaznik;

2) Przydzielasz pamięć dla struktury.

wskaznik = (struct file_t *) malloc(sizeof(struct file_t));

3) Sprawdzasz czy się udało ( wskaznik != NULL)

4) Wypelniasz strukturę danymi.
wskaznik->costam = 3;

5) Zwracasz wskaźnik do struktury:
return wskaznik;

edytowany 2x, ostatnio: yarel, 2019-05-14 13:41
Tylko pozniej trzeba pamietac, zeby to usunac :) W innym miejscu, takie podejscie to latwa droga do wycieku pamieci :) - daniel1302 2019-05-16 10:04
Tak, w C sam zarządzasz pamięcią. W tym przypadku, skoro w argumencie akceptujesz const *, to dane mogą być umieszczone w segmencie read-only (nie muszą, ale mogą), więc jak zwracasz coś co nie jest const, to późniejsza próba nadpisania tego może skończyć się źle (segmentation fault), w przypadku gdybyś zwracał coś z wejścia typu "const". Gdyby funkcja zwracała const *, to nie byłoby potrzeby alokacji wyniku, tylko można by zwrócić wskaźnik do elementu z tej wejściowej struktury. - yarel 2019-05-16 10:13

Pozostało 580 znaków

2019-05-14 13:42
1
struct test_t 
{
};

struct test_t* find_min(const struct test_t* files, int size)
{
    if (files == NULL ) return NULL;
    for (int i = 0; i<size; i++)
    {
        if (files+i<files+i+1)
            files = files+i+1;
    }

    return (struct test_t*)files;
}

poza tym, dlaczego przekazujesz const a zwracasz nie const? :) Jesli zwracasz nie const to nie powinienes zwracac consta bo wtedy pozbywasz sie ograniczenia ktore wczesniej sam sobie narzucasz :) Patrzac na deklaracje funkcji mozna odniesc wrazenie, ze zwracasz nie to samo co przekazujesz, tylko jakas inna strukture utworzona na podstawie tej przekazanej.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0