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"
