Strona 1 z 1

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

: wtorek 25 kwie 2017, 16:07
autor: StaryAnoda
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 ?

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

: wtorek 25 kwie 2017, 16:31
autor: dambo
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

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

: wtorek 25 kwie 2017, 16:42
autor: tasza
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;
}

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

: wtorek 25 kwie 2017, 23:38
autor: dambo
Może trochę od innej strony zacznijmy - dlaczego nie przez wskaźnik?

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

: wtorek 25 kwie 2017, 23:40
autor: Antystatyczny
Drugi sposób jest przez wskaźnik.

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

: środa 26 kwie 2017, 10:48
autor: dambo
w sensie to miało być pytanie do autora, dlaczego nie chce przez wskaźnik :)

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

: czwartek 27 kwie 2017, 12:45
autor: mokrowski

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" :-)