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

Z void * na struct *

42 Warsaw Coding Academy
0 głosów
222 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

Hej

Powiedzmy, że mam taką funkcję (zwracającą 0 w przypadku sukcesu i 1 w przeciwnym wypadku).

int read_complex(void *a, void *b)
{
    if( a == NULL || b == NULL )
    {
        return 1;
    }
    float re1,im1;
    char znak_operatora;
    char znak_i;
    if(scanf("%f%c%c%f",&re1,&znak_operatora,&znak_i,&im1)!=4)
    {
        return 1;
    }
    if( im1 < 0)
    {
        return 1;
    }
    switch(znak_operatora)
    {
            case '-':
                im1 *= -1;
                break;
            case '+':
                break;
            default:
                return 1;

    }
    switch(znak_i)
    {
            case 'i':
                break;
            default:
                return 1;

    }
    float re2,im2;
    if(scanf(" %f%c%c%f",&re2,&znak_operatora,&znak_i,&im2)!=4)
    {
        return 1;
    }
    if( im2 < 0)
    {
        return 1;
    }
     switch(znak_operatora)
    {
            case '-':
                im2 *= -1;
                break;
            case '+':
                break;
            default:
                return 1;
    }
     switch(znak_i)
    {
            case 'i':
                break;
            default:
                return 1;
    }
    return 0;
}

Ma ona za zadanie wprowadzić dwie liczby zespolone. Kod jest prawie gotowy dla tej funkcji oprócz jednej rzeczy. Zadanie, dla którego go rozpisuję wymaga, aby w ramach ujednolicenia zrobić parametry dla funkcji typu void *. Oczywiście to a i b w samym main to będą odpowiednio wskaźniki na dwie struktury tego samego typu. Pojawia się jednak pytanie jak mogę ot choćby w scanf-ach zamienić &re1 i &im1 tak, by odpowiednio wskazywać na &(a->re) i &(a->im)?

1 odpowiedź

+1 głos
odpowiedź 28 kwietnia 2020 przez mokrowski Mędrzec (158,440 p.)
wybrane 28 kwietnia 2020 przez Hubertius
 
Najlepsza

Po prostu rzutuj wskaźnik na typ docelowy:

#include <stdio.h>

struct MyComplex {
    float real;
    float imag;
};

void setValue(void * value) {
    struct MyComplex * ptr_cplx = value;
    ptr_cplx->real = 42.3;
    ptr_cplx->imag = 33.3;
}

int main(void) {
    struct MyComplex cplx;
    setValue(&cplx);
    printf("Real: %f, Imag: %f\n", cplx.real, cplx.imag);
    return 0;
}

BTW.... wiesz że typ zespolony jest obecny w C w nagłówku <complex.h> ?

komentarz 28 kwietnia 2020 przez Hubertius Bywalec (2,970 p.)
Wiem, ale w zadaniu jest wymagane, abym samemu to robił bez korzystania choćby z pomocy pod postacią powyższego nagłówka.

Podobne pytania

0 głosów
3 odpowiedzi 3,678 wizyt
pytanie zadane 2 kwietnia 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
+1 głos
1 odpowiedź 338 wizyt
pytanie zadane 20 stycznia 2022 w C i C++ przez Krzysztofs1234 Użytkownik (890 p.)
0 głosów
0 odpowiedzi 213 wizyt
pytanie zadane 29 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

93,382 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,739 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...