Google

quarta-feira, 2 de abril de 2008

Retornando um vetor através de uma função

Parece ser bem fácil, mas visitando alguns fóruns de programação C percebi que várias pessoas tinham essa dúvida, de como retornar mais de um valor através de uma função. Para se retornar um único valor é bem simples:


double valor()
{
double x = 10;
return 10;
}

No programa principal lê-se o valor da seguinte maneira:

int main()
{
double y;
y = valor();
}

Agora se vc quiser retornar mais de um valor? parece complicado, mas com o tempo isto se tornará simples.
Programa principal: teste.c

#include <stdio.h>
#include "saida.h"

int main()
{
double *m;
m = saida();

printf("%lf M[0]\n", m[0]);
printf("%lf M[1]\n", m[1]);
}

Lib: saida.c

double *saida()
{
double *u;
u = (double*) malloc(2 * sizeof(double));
u[0] = 10;
u[1] = 20;

printf("%lf U[0]\n", u[0]);
printf("%lf U[1]\n", u[1]);

return u;
}

Include: saida.h

#ifndef SAIDA_H
#define SAIDA_H

extern double *saida();

#endif

download

para compilar no gcc:

gcc -o teste saida.c teste.c

depois executar da seguinte forma:

./teste

A mesma idéia é utilizada para fazer o mesmo utilizando matrizes.

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

float **Alocar_matriz_real (int m, int n)
{
float **v; /* ponteiro para a matriz */
int i; /* variavel auxiliar */
if (m
< 1 || n < 1) { /* verifica parametros recebidos */
printf ("** Erro: Parametro invalido **\n");

return (NULL);
}

/* aloca as linhas da matriz */
v = (float **) calloc (m, sizeof(float *));
if (v == NULL)
{
printf ("** Erro: Memoria Insuficiente **");

return (NULL);
}

/* aloca as colunas da matriz */
for ( i = 0; i
< m; i++ )
{
v[i] = (float*) calloc (n, sizeof(float));
if (v[i] == NULL)
{
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
}
return (v);

/* retorna o ponteiro para a matriz */ }

float **Liberar_matriz_real (int m, int n, float **v)
{
int i; /* variavel auxiliar */
if (v == NULL)
return (NULL);

if (m
< 1 || n < 1)
{
/* verifica parametros recebidos */
printf ("** Erro: Parametro invalido **\n");
return (v);
}

for (i=0; i<m; i++) free (v[i]); /* libera as linhas da matriz */
free (v); /* libera a matriz */

return (NULL); /* retorna um ponteiro nulo */
}

void main (void)
{
float **mat; /* matriz a ser alocada */
int l, c; /* numero de linhas e colunas da matriz */
... /* outros comandos, inclusive inicializacao para l e c */
mat = Alocar_matriz_real (l, c);
... /* outros comandos utilizando mat[][] normalmente */
mat = Liberar_matriz_real (l, c, mat);
...
}

5 comentários:

Anônimo disse...

Ótimo post Marcão,
pouca gente domina o uso de ponteiros em C, mas eles são 50% do poder da linguagem C.
Um abraco,
Alan

Andre disse...

Muito bom!
Isso me ajudou bastante, estava a bastante tempo com essa duvida.

Anônimo disse...

Optimo! Obrigadão ;)

Abraço

Night disse...

Brilhante kara,
Simplismente brilhante.

Estava bastante tempo tentando entender sobre isso.
Mas quanto bati o olho em seu código entendi na hora ^^

Vlw

Anônimo disse...

Gostei muuuito da sua postagem!
Por isso queria ver se vc pode me ajudar nessa questão:
A série de Fibonacci é composta por uma série de números inteiros. Os primeiros
números desta série são 0 e 1. Os próximos valores são obtidos pela soma dos
valores anteriores. Desta forma, o próximo elemento é 1 (0 + 1), o seguinte é 2
(1 + 1), etc. Por exemplo a série, até o décimo elemento (N=10), seria a seguinte
seqüência: 0 ; 1 ; 1 ; 2 ; 3 ; 5 ; 8 ; 13 ; 21 ; 34 . Implemente uma funcٓão que gere a série de
Fibonacci até o N termo e os armazene em um vetor. Uma outra que seja capaz de
somar o valor dos elementos da série e por último uma que seja capaz de mostrar
a série, a partir dos primeiros elementos. As funções deverão usar os seguintes
protótipos:
int* gera_fibonacci(int* valores,int N);
int soma_fibonacci (int* valores);
void lista_fibonacci(int* valores);

Não consigo fazer por causa dos ponteiros, da erro!

Postagens populares