Funkcja zwracająca kilka wartości jak to zrobić ???

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
StaryAnoda

Funkcja zwracająca kilka wartości jak to zrobić ???

Postautor: StaryAnoda » wtorek 25 kwie 2017, 16:07

Hej

Może mi ktoś powiedzieć w jaki sposób dokonać zwrócenia przez funkcję kilku wartości ?
Czy jest możliwość aby nie był to sposób przekazywania argumentu funkcji jakiegoś wskaźnika ?

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: Funkcja zwracająca kilka wartości jak to zrobić ???

Postautor: dambo » wtorek 25 kwie 2017, 16:31

jeśli nie wskaźnik to nie wiem :p
możesz dać globalną zmienną z wynikami tej funkcji i w funkcji do nich zapisywać, i w innych miejscach czytać. Ale to średnio eleganckie
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: Funkcja zwracająca kilka wartości jak to zrobić ???

Postautor: tasza » wtorek 25 kwie 2017, 16:42

no da się, ale brzydkie to jakieś, znacznie lepiej na wskaźnikach operować, niżej masz na dwa sposoby

Kod: Zaznacz cały

#include <stdio.h>
 
typedef struct {
    float im;
    float re;
} TComplex;

TComplex doComplex(float i, float r) {
  TComplex c;
  c.im = i;
  c.re = r;
  return c;
}

void setComplex( TComplex *pc, float i, float r) {
  pc->im = i;
  pc->re = r;
}

int main( void ) {
 
    TComplex a = doComplex( 1.23 , 4.56 );

    printf("do = %f:%f \n", a.im,  a.re );   
   
    setComplex ( &a, 1.000, 2.000  );
   
    printf("set = %f:%f \n", a.im,  a.re );
       
    return 0;
}
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: Funkcja zwracająca kilka wartości jak to zrobić ???

Postautor: dambo » wtorek 25 kwie 2017, 23:38

Może trochę od innej strony zacznijmy - dlaczego nie przez wskaźnik?
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Funkcja zwracająca kilka wartości jak to zrobić ???

Postautor: Antystatyczny » wtorek 25 kwie 2017, 23:40

Drugi sposób jest przez wskaźnik.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: Funkcja zwracająca kilka wartości jak to zrobić ???

Postautor: dambo » środa 26 kwie 2017, 10:48

w sensie to miało być pytanie do autora, dlaczego nie chce przez wskaźnik :)
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
mokrowski
User
User
Posty: 190
Rejestracja: czwartek 08 paź 2015, 20:50
Lokalizacja: Tam gdzie Centymetro

Re: Funkcja zwracająca kilka wartości jak to zrobić ???

Postautor: mokrowski » czwartek 27 kwie 2017, 12:45

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    double doubleValue;
    double value;
} doubled_t;

typedef struct {
    double * values;
    size_t count;
} multivalue_t;

// Jakieś 2 wartości zwracane...
doubled_t calculate1(double value) {
    doubled_t answer = { .doubleValue = value * 2, .value = value };
    return answer;
}

// Zwracane wartości przez tworzoną dynamicznie tablicę
int * sequenceNumbers(int start, size_t count) {
    int * table = malloc(sizeof(int) * count);
    if(table == NULL) {
        fprintf(stderr, "Houston, we have a RAM problem :/");
        exit(EXIT_FAILURE);
    }
    for(size_t i = 0; i < count; ++i) {
        table[i] = start + i;
    }
    return table;
}

// A tu to możesz hoho zwrócić wartości w tablicy. I podać inny count
// niż ja to przekazałem.
multivalue_t makeSpace(size_t count) {
    multivalue_t answer = { .values = NULL, .count = count };
    double * space = calloc(sizeof(double), count);
    if( space == NULL) {
        fprintf(stderr, "Houston, we have a RAM problem :/");
        exit(EXIT_FAILURE);
    }
    answer.values = space;
    return answer;
}

// Czyszczenie pamięci alokowanej dynamicznie.
void cleanMultivalue(multivalue_t * value) {
    free(value->values);
}


int main(void) {
    doubled_t value1 = calculate1(42);
    printf("doubled_t doubleValue = %f\tvalue = %f\n",
        value1.doubleValue, value1.value);

    int * sequence = sequenceNumbers(42, 10);
    printf("sequenceNumbers[2] = %d\n", sequence[2]);
   
    // Obowiązkowe czyszczenie pamięci alkowanej dynamicznie.
    free(sequence);
   
    multivalue_t value2 = makeSpace(42);
    printf("multivalue_t values[10] = %f\tcount = %zu\n",
        value2.values[10], value2.count);

    cleanMultivalue(&value2);
   
    return EXIT_SUCCESS;       
}

C to "dość prymitywny język" :-)
,,Myślenie nie jest łatwe, ale można się do niego przyzwyczaić" - Alan Alexander Milne: Kubuś Puchatek


Wróć do „Pisanie programów w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości