Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
lucasoad399

Curiosidade com retorno de array

Recommended Posts

Caras, nem tenho exemplos práticos pra falar disso, foi só uma curiosidade que me veio à mente. Estudo java e c++, mas em java sempre retornei vetores em funções. Entretanto, li num livro aqui que c não retorna array. Achei estranho, tentei e vi que é verdade. Pesquisei na net e vi uma solução no GUJ. O cara usava uma função que retorna um ponteiro para um array.

 

O problema disso era que o array era local, ou seja, quando a função encerrar a execução o ponteiro apontará pra um endereçamento problemático. Era algo mais ou menos assim:
 

int *retornaVetor(int x){

  int vetor[x];
  
  return *vetor;  

}

Enfim, se eu quiser retornar um vetor, como faço? Uso struct? Torno o vetor local da função static? Eu testei o código acima e sei que nem compila. Foi só um exemplo de idéias que li.

 

Valeu.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opção 1:

 

Passa o vetor como parâmetro para a função, e a função apenas trabalha sobre ele:

void funcao (int n, int vetor[n]){
    int i;
    for (i = 0; i < n; i++){
        vetor[i] = i;
    }
}

 

 

Opção 2:

 

Aloca memória dinamicamente para o vetor dentro da função, e retorna um ponteiro para o vetor (precisa lembrar de liberar a memória quando não precisar mais do vetor):

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

int * funcao (int n){
   int i;
    int *vetor = (int *)malloc(n * sizeof(int));
    if (!vetor)
        return NULL;
    for (i=0; i < n; i++)
        vetor[i] = i;
    return vetor;
}

int main(){
    int i;
    int *vet = funcao(10);
    if (vet) {
        for (i = 0; i < 10; i++)
            printf("%d\n", *(vet + i));
        free(vet); //Libera a memória reservada para o vetor
    }
    return 0;
}

 

 

As outras opções são as que você mencionou, usar static, ou fazer uma struct contendo o vetor com tamanho predefinido e retornar a struct.

 

 

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Para C++ além dessas tem outras opções...

 

Esse seria o equivalente em C++ para alocação dinâmica de memória:

#include <iostream>

using namespace std;

int * funcao (int n){
    int i;
    int *vetor = new int[n];
    for (i=0; i < n; i++)
        vetor[i] = i;
    return vetor;
}

int main(){
    int i;
    int *vet = funcao(10);
    for (i = 0; i < 10; i++)
        cout << vet[i] << endl;
    delete[] vet; //Libera a memória reservada para o vetor
    return 0;
}

 

Mas nesse caso um acredito que usar "vector" seria a melhor solução:

#include <iostream>
#include <vector>

using namespace std;

vector<int> funcao (int n){
    int i;
    vector<int> vetor;
    vetor.resize(n);
    for (i=0; i < n; i++)
        vetor[i] = i;
    return vetor;
}

int main(){
    int i;
    vector<int> vet = funcao(10);
    for (i = 0; i < 10; i++)
        cout << vet[i] << endl;
    return 0;
}

 

Editado por isrnick

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×