Ir ao conteúdo
  • Cadastre-se

C codigo com erro, 3 warnings que não consigo identificar


Arthur Portella
Ir à solução Resolvido por arfneto,

Posts recomendados

Boa noite

 

Eu preciso fazer um código com o objetivo, implementar uma função que receba como parâmetro um vetor de números inteiros (vet) de tamanho n e retorne quantos números pares estão armazenados no vetor. Essa função deve obedecer ao protótipo: int pares (int n, int *vet).

 

Este é meu código por enquanto, estou com 3 warnings que não estou conseguindo entender o que é. 


    "message": "return makes pointer from integer without a cast [-Wint-conversion]",


    "message": "assignment makes integer from pointer without a cast [-Wint-conversion]",


    "message": "passing argument 2 of 'pares' makes pointer from integer without a cast [-Wint-conversion]",
 
Em compiladores online, o código até executa e funciona as vezes, mas no compilador, Visual Studio Code / Dev C++, ele nem executa.
   

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

int *pares (int n, int *vet){

    int x, par = 0;

    for(x = 0; x < n; x++){

        if(vet[x] % 2 == 0){
            par++;
        }
    }

    return par;

}

int main(){

    int TAM;
    int vet[TAM];
    int par;
    int i;

    printf("Digite o tamanho do vetor");
    scanf("%d", &TAM);

    for(i = 0; i < TAM; i++){
        scanf("%d", &vet[i]);
    }

    par = pares(TAM, vet);

    printf("A quantidade de numeros pares no vetor eh %d", par);

    return 0;
}

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, devair1010 disse:

Seu vetor Vet foi criado com sucesso e também com um tamanho desconhecido, pois você não inicializou a variável TAM .

 

Mas a variável TAM não esta inicializada por que logo embaixo tem um scanf, onde digo o valor dessa variável 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Solução

Não consigo entender porque escreveu assim.

 

Há muitos problemas em seu código. A maioria bem comum a ponto de eu ter uma lista para copiar dela.

 

De todo modo:

 

1 hora atrás, Arthur Portella disse:

Essa função deve obedecer ao protótipo: int pares (int n, int *vet)

 

Imagino que deva levar o enunciado a sério. Porque então declarou isso como está abaixo?

 

int* pares(int n, int* vet)
{
    int x, par = 0;

    for (x = 0; x < n; x++)
    {
        if (vet[x] % 2 == 0) { par++; }
    }

    return par;
}

 

Está

escrito aí que a função retorna int* um ponteiro para int. Só que você escreveu

 

    int par = 0;

 

e

 

    return par;

 

É claro que está errado.  Continuaria errado mas iria compilar se escrevesse return &par que claro é do tipo int*.  E seu programa ia cancelar em seguida.

 

    int vet[TAM];

 

Isso está também errado. TAM deve ser conhecido em tempo de compilação. 

 

E aqui é o mesmo caso:

 

    int par;
    int i;

    printf("Digite o tamanho do vetor");
    scanf("%d", &TAM);

    for (i = 0; i < TAM; i++) { scanf("%d", &vet[i]); }

    par = pares(TAM, vet);

 

par é int e pares() retorna int*. Está errado.

 

Outras coisas pra pensar:

 

  • scanf() retorna um int. TESTE. Leia o manual. É ingênuo seguir sem estar.
  • não declare mais que uma variável por linha
  • deixe main() sempre como a primeira função do programa, se possível em um programa separado
  • nunca use nada global. Declare variáveis de controle DENTRO do for
  • inicialize TODAS as variáveis.

 

int pares(int n, int* vet)
{
    int par = 0;
    for (int x = 0; x < n; x++)
        if (vet[x] % 2 == 0) par++;
    return par;
}

 

Assim por exemplo estaria certo e mais simples de ler.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Arthur Portella     talvez você ainda não sabe que o compilador executa os comando , começando de cima para baixo e da esquerda para a direita , dentro  de cada função , e ao passar a executar outra função ele armazena o endereço do local onde estava e ao retornar prossegue desse mesmo local em diante até o final da função Main , que geralmente termina com um return 0 , ou encontrar algum comando que termine a execução , como por exemplo um exit ,   e você pode criar o vetor com um tamanho grande e depois pegar a quantidade de posições que vai usar ,  e fazer um código parecido com esse aqui :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int pares(int n, int* vet)                // funCAo recurssiva recebe um int e um vetor 
{                                         // vet ponteiro aponta para o local
    if (n == 0)return 0;                  // da memO_ria onde comeCa o vetor
    if (vet[n] % 2 == 0)vet[0]++;
    pares(n-1,vet);
}                                         
int main()
{
    int TAM = 10000;                      // variAvel criada e inicializada
    int vet[100] = { 0 };                 // cria o vetor com muitas posiCiOnes e
    printf("Quantidade de nUmeros ");     // inicializa todas com valor zero
    int ret = scanf("%d", &TAM);          // determina a quantidade que vai ser usada
    for (int i = 1; i <= TAM; i++)        // reserva a primeira posiCAo para a quantidade de par
    {
        printf("Digite o %3d%c nUmero do vetor ", i + 1, 167);
        int ret = scanf("%d", &vet[i]);   // ret recebe a quantidade de dados lidos
        if (ret != 1)i--;                 // scanf falhou ?  repita
    }
    pares(TAM, vet);                      // vet[0] tem a quantidade de nUmeros pares no vetor
    printf("\nA quantidade de numeros pares no vetor eh %3d\n\n\n", vet[0]);
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

8 horas atrás, arfneto disse:

Não consigo entender porque escreveu assim.

 

Há muitos problemas em seu código. A maioria bem comum a ponto de eu ter uma lista para copiar dela.

 

De todo modo:

 

 

Imagino que deva levar o enunciado a sério. Porque então declarou isso como está abaixo?

 

int* pares(int n, int* vet)
{
    int x, par = 0;

    for (x = 0; x < n; x++)
    {
        if (vet[x] % 2 == 0) { par++; }
    }

    return par;
}

 

Está

escrito aí que a função retorna int* um ponteiro para int. Só que você escreveu

 

    int par = 0;

 

e

 

    return par;

 

É claro que está errado.  Continuaria errado mas iria compilar se escrevesse return &par que claro é do tipo int*.  E seu programa ia cancelar em seguida.

 

    int vet[TAM];

 

Isso está também errado. TAM deve ser conhecido em tempo de compilação. 

 

E aqui é o mesmo caso:

 

    int par;
    int i;

    printf("Digite o tamanho do vetor");
    scanf("%d", &TAM);

    for (i = 0; i < TAM; i++) { scanf("%d", &vet[i]); }

    par = pares(TAM, vet);

 

par é int e pares() retorna int*. Está errado.

 

Outras coisas pra pensar:

 

  • scanf() retorna um int. TESTE. Leia o manual. É ingênuo seguir sem estar.
  • não declare mais que uma variável por linha
  • deixe main() sempre como a primeira função do programa, se possível em um programa separado
  • nunca use nada global. Declare variáveis de controle DENTRO do for
  • inicialize TODAS as variáveis.

 

int pares(int n, int* vet)
{
    int par = 0;
    for (int x = 0; x < n; x++)
        if (vet[x] % 2 == 0) par++;
    return par;
}

 

Assim por exemplo estaria certo e mais simples de ler.

 

Muito obrigado pelo esclarecimento, já sabia que o programa começava de cima para baixo, mas pensava que não haveria problema em passar o valor de TAM depois, também a outra mudança que fiz e deu certo foi declarar o x dentro do for, está mudança foi a que fez o programa funcionar corretamente, mas não entendi por que.

Obrigado @devair1010 e @arfneto

O código ficou assim, precisa de mais algum ajuste, ele está funcionando normalmente.

 

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

int pares(int n, int* vet)
{
    int par = 0;
    for (int x = 0; x < n; x++)
        if (vet[x] % 2 == 0) 
        par++;
    return par;
}

int main(){

    int TAM;
    printf("Digite o tamanho do vetor");
    scanf("%d", &TAM);

    int vet[TAM];
    int x = 0;
    int i;

    for(i = 0; i < TAM; i++){
        scanf("%d", &vet[i]);
    }

    x = pares(TAM, vet);

    printf("A quantidade de numeros pares no vetor eh %d", x);

    return 0;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, Arthur Portella disse:

que fiz e deu certo foi declarar o x dentro do for, está mudança foi a que fez o programa funcionar corretamente, mas não entendi por que

 

Não, não foi. Você tirou o asterisco da declaração de pares(), que foi o que eu te disse que estava errado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!