Ir ao conteúdo

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


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

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
Postado
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
  • Solução
Postado

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
Postado

@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;
}

 

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

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!