Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Funkcja zwaracająca wartość: wskaźnik do x int - jak zapisać?

Jakub17 01 Cze 2017 19:24 789 6
  • #1 01 Cze 2017 19:24
    Jakub17
    Poziom 6  

    Witam

    Mam pewien problem z poprawnym zapisem deklaracji funkcji zwracajacej wskaznik do typu 3 int. Kompilator ciągle wyrzuca mi błąd, a już mi się pomysły kończą. W sieci nie mogę znaleźć żadnych przykładów.

    Przekazuje do funkcji podtablice 3 int i chce taki sam typ zwrocic czyli wskaznik do 3 int. Jest w ogole mozliwe cos takiego? No bo zapis int** powoduje ze zwracam wskaznik do wskaznika na typ int a ja chce na typ 3 int, czyli tablice.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 6
  • #2 01 Cze 2017 21:48
    Lech24
    Poziom 13  

    Nie wiem czy dobrze rozumiem do czego dążysz ale możesz napisać coś takiego

    int funkcja(char *wsk)
    {
    *(wsk+3) = 2;
    return (int)*(wsk+3);
    }

    wywołanie

    char data[10];
    funkcja(&data);

    tylko nie wiem poco. Jak używasz wskaźnika to pracujesz bezpośrednio na danych a nie na lokalnych kopiach.

    Jak chcesz się dowołać do x pola tablicy przekazanej przez pointer używasz *(wsk+x)

    0
  • Pomocny post
    #3 01 Cze 2017 22:59
    2675900
    Użytkownik usunął konto  
  • #4 02 Cze 2017 07:15
    Jakub17
    Poziom 6  

    Lech24 napisał:
    Nie wiem czy dobrze rozumiem do czego dążysz ale możesz napisać coś takiego

    int funkcja(char *wsk)
    {
    *(wsk+3) = 2;
    return (int)*(wsk+3);
    }

    wywołanie

    char data[10];
    funkcja(&data);

    tylko nie wiem poco. Jak używasz wskaźnika to pracujesz bezpośrednio na danych a nie na lokalnych kopiach.

    Jak chcesz się dowołać do x pola tablicy przekazanej przez pointer używasz *(wsk+x)


    Nie, nie o to mi chodziło. Tutaj odwołujesz się tylko do 4 elementu tablicy.

    Dodano po 1 [godziny] 25 [minuty]:

    Czyli to:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jest rownoważne temu:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Piotrus_999 napisał:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tym zapisem zwiększasz wartość elementów tablicy tak? A nie można było zapisać tego tak *wsk[i]++ ? wsk+1 powinno mi przeskoczyć z adresem o 3 typy int prawda?
    W moim przedostatnim temacie dotyczącym kwalifikatora restrict pojawiła się dyskusja na temat malloc(). malloc() zwracał wskaźnik void który można było rzutować na dowolny typ poprzez zapis np. (int(*)[3]). Więc zamiast używać typdef można zapisać funkcję zwracającą wskaźnik na typ void a później odpowiednio rzutować by uzyskać taką wartość zwracaną jaką się chce?
    Np.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak by to można było zrobić? Niby się kompiluje poprawnie...

    Chyba już trochę udziwniam...

    0
  • #5 02 Cze 2017 10:05
    2675900
    Użytkownik usunął konto  
  • #6 03 Cze 2017 13:04
    Jakub17
    Poziom 6  

    Piotrus_999 napisał:
    Jakub17 napisał:
    (void*)wsk;
    To nie robi nic
    możesz return (void*)wsk;

    Co jest złego w typedef? Zwiększa czytelność kodu.

    jeżeli już przekazywać takie parametry to właśnie przez zdefiniowanie typów albo po prostu przez wskaznik albo wskaznik na wskaznik.

    Myślę że trochę się tutaj zaplątałeś w czymś co nie jest praktycznie używane. Dlatego nic w sieci nie znalazłeś.


    Nie było mnie troche, byłem zajęty, przepraszam. (void*)wsk; nic nie robi? Ale wyrażenie zostaje obliczone więc jak zwracam wsk to on jest już chyba void?
    Przyznam się, że jeszcze nie doszedłem do typdef. Niby znam składnie ale się jeszcze z tym nie zdążyłem dobrze obcykać.
    Ten zapis jest dla mnie trochę nieczytelny:typedef int int3[3]; Bardziej przemawiałby do mnie typedef int[3] int3 ale jest nie poprawny. Czyli twierdzisz, że moja propozycja ze wskaźnikiem void będzie działać tak samo jak Twoja z użyciem typdef tylko, że moja wersja jest mało praktyczna, tak? Ale skutek działania obu tych form zapisu będzie taki sam?

    0
  • #7 03 Cze 2017 15:54
    2675900
    Użytkownik usunął konto