Ir ao conteúdo
  • Cadastre-se

Erro no codigo.


Luis_1987
Ir à solução Resolvido por Isis Binder,

Posts recomendados

Assim, eu quero fazer uma função que elimina numeros repetidos de um vetor, como faço para ele retornar o vetor?


#include <stdlib.h>

#include <stdio.h>

 

int elimina(int n, int vetox[])

{

     int i, j, vetor2 [n];

     for (i=0; i<n; i++)

     {

            for (j=0; j<n; j++)

            {

                    if (vetox!=vetox[j])

                    {

                           vetor2=vetox[j];

                    }

            }

     }

     return (vetor2);

}

 

int main()

{

     int t, i, res;

     int  *vetor;

 

     printf ("Digite o tamanho do vetor: ");

     scanf ("%d", &t);

     vetor=(int *) calloc (t, sizeof (int));

 

     for (i=0; i<t; i++)

     {

          printf ("Vetor[%d]: ", i);

          scanf ("%d", &vetor);

     }

     res=elimina(t, vetor);

 

      for (i=0; i<t; i++)

      {

           printf ("%d", res);

      }

 

 

 

      system ("pause");

      return 0;    

}

Link para o comentário
Compartilhar em outros sites

  • Solução

 

 

Com tudo sua implementação vai retorna um vetor não dinâmico, e por isso com resultados inesperados. 

Isso seria "facilmente resolvido" declarando-se o array com static dentro da função, mas arrays de tamanho variável são obrigados a ter duração automática. Ou seja, nada de static.

 

Mas vamos à saída do compilador:

 

 

duplicado.c: In function ‘elimina’:
duplicado.c:18:13: warning: return makes integer from pointer without a cast [-Wint-conversion]
      return (vetor2);
             ^
duplicado.c:18:13: warning: function returns address of local variable [-Wreturn-local-addr]
duplicado.c: In function ‘main’:
duplicado.c:39:29: error: subscripted value is neither array nor pointer nor vector
            printf ("%d", res);
                             ^
duplicado.c:23:16: warning: variable ‘res’ set but not used [-Wunused-but-set-variable]
      int t, i, res;
                ^

 

Coisas que você não está fazendo no código e deveria:

1- Verificar o retorno de calloc. Caso a função retorne NULL você terá um SIGSEGV.

2- Dar free nos ponteiros que alocou (o programa tem vazamento de memória).

#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h> int * elimina(int * vetor, int tamanho, int * novo_tamanho) {     int * non_dup = malloc(1 * sizeof(int)); // haverá pelo menos 1 número a ser inserido nesse array.     if (!non_dup) {        printf("[ERRO] @%d: %s\n", __LINE__-3, strerror(errno));        free(vetor);        return EXIT_FAILURE;     }     int i;     int j, tamanho_non_dup = 1;     int * tmp_non_dup = NULL;     non_dup[0] = vetor[0];     for (i = 1; i < tamanho; i++) {        // Verifica se o array de não duplicatas contém o elemento visitado no array original.        for(j=0; j < tamanho_non_dup && vetor[i] != non_dup[j]; j++);        if (j >= tamanho_non_dup) {          // Nunca atribua diretamente à variável que deve ser realocada, pois é possível gerar NULL          // como retorno e os dados seriam perdidos na atribuição.          tmp_non_dup = realloc(non_dup, (tamanho_non_dup+1) * sizeof(int));          if (!tmp_non_dup) {            printf("[ERRO] @%d: %s\n", __LINE__-3, strerror(errno));          } else {            non_dup = tmp_non_dup;            non_dup[tamanho_non_dup] = vetor[i];            tamanho_non_dup++;          }        }     }     (*novo_tamanho) = tamanho_non_dup;     return non_dup;} int main(void) {     int tamanho;     int * vetor;      printf("Digite o tamanho do vetor: ");     scanf("%d%*c", &tamanho);    if (tamanho < 1) {      puts("O tamanho não pode ser menor que 1.");      return EXIT_FAILURE;    }     vetor = calloc (tamanho, sizeof (int));     if (!vetor) {        printf("[ERRO] @%d: %s\n", __LINE__-3, strerror(errno));        return EXIT_FAILURE;     }       int i;     for (i=0; i<tamanho; i++) {          printf("Vetor[%d]: ", i);          scanf("%d%*c", &vetor[i]);     }     int * resultado;     int tamanho_non_dup;     resultado = elimina(vetor, tamanho, &tamanho_non_dup);           for (i=0; i<tamanho_non_dup; i++)           printf ("%d ", resultado[i]);            free(resultado);      free(vetor);      return 0;}
Link para o comentário
Compartilhar em outros sites


int* EliminarRepetidos(int* vetor, int tamanhoVetor, int* novoTamanhoVetor)

{

int* novoVetor = NULL;

int id = -1;

for (int i = tamanhoVetor; i >= 0; i--)

{

for (int j = i - 1; j >= 0; j--)

{

if (vetor == vetor[j])

{

for (int w = i + 1; w < tamanhoVetor; w++)

vetor = vetor[w];

tamanhoVetor--;

}

}

}

novoVetor = (int*)malloc(sizeof(int) * tamanhoVetor);

for (int i = 0; i < tamanhoVetor; i++)

novoVetor = vetor;

*novoTamanhoVetor = tamanhoVetor;

return novoVetor;

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...