Błąd w programie z wskaźnikami

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* zapisz(int vliczba, char vnapis[50]);
void wyswietl(struct struktura *wp);


int liczba;
char napis[50];
struct struktura *wsk = NULL;

struct struktura
{
    int sliczba;
    char snapis[50];
};


void* zapisz(int vliczba, char vnapis[50])
{
    struct struktura *p = (struct struktura*)malloc(sizeof(struct struktura));

    p->sliczba = vliczba;
    strcpy(p->snapis,vnapis);

    return p;
};



void wyswietl(struct struktura *wp)
{
    printf("Liczba: %d\n", (*wp).sliczba);
    printf("Napis: %s\n", (*wp).snapis);

    free(wp);
    wp = NULL;
};

//===============================

int main()
{
    system("clear"); // system("cls/clear"); windows/ubuntu

    printf("Podaj liczbe: ");
    scanf("%d",&liczba);
    printf("Podaj napis: ");
    scanf("%s",napis);

    wsk = zapisz(liczba,napis);

    wyswietl(wsk);

    return(0);
}
 

Tak wygląda mój program. Nie mogę dojść co jest źle dlatego zwracam się do was o pomoc. Problem jaki wywala kompilator:
[Error] invalid conversion from 'void*' to 'struktura*' [-fpermissive]

devc++

Proszę o pomoc

2

:-|

Przecież w komunikacie jest wszystko napisane: Nieprawidłowa konwersja z void * do struktura *. Funkcja zapisz wg deklaracji i definicji zwraca void * a robisz return p;, gdzie p jest typu struktura *. Zmień typ zwracany na struktura * - z kodu wynika, że o to Ci chodziło.

1

Czego w nagłówku funkcji chcesz zwracać void* a w środku funkcji zwracasz p, które jest struktura*?

0

Nie rozumiem skoro :

struct struktura *p

To przecież return p powinno działać więc nie wiem na co podmienić? Nakieruje ktoś, dopiero się uczę programować także proszę o wyrozumiałość ;D

1

OMG problem nie jest w tym co zwracasz, a w tym gdzie to przypisujesz. Funkcja zwraca void* a ty tego void* chcesz przypisać do struct struktura wsk
To nie ma znaczenia że ten wskaźnik wskazuje faktycznie na struct struktura
bo ta informacja jes tracona kiedy rzutujesz to do void*.

1

w funkcji deklaracji funkcji zaznaczasz, że typem zwracanym jest

void*

, natomiast faktycznie zwracasz struct struktura *

. Jeżeli chcesz to tak robić, to użyj konwersji <code class="cpp">(void *) (struct struktura *)

. Będzie to wyglądać tak: return (void*)p;


Natomiast z drugiej strony dlaczego po prostu zamiast 
```cpp
void* zapisz(int vliczba, char vnapis[50]) 

nie dasz struct struktura* zapisz(int vliczba, char vnapis[50])

. Wtedy nie musisz przy zwracaniu wartości fukcji konwertować, gdyż typem wartości zwracanej jest twoja struktura.
0

No i bardzo konkretna podpowiedź teraz rozumiem, kombinowałem nie potrzebnie ale ten void od razu mi nie pasował.

Jeszcze takie pytanie, dlaczego program przy wyświetlaniu zamiast moich wpisanych danych wyświetla jakieś przypadkowe wartości z pamięci?

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