Ir ao conteúdo
  • Cadastre-se
Josesousa

C Fazer função com FLOAT em C

Recommended Posts

Boa madrugada!

Sera que vocês podem me tirar uma duvida.

Eu estava criando uma funcao para encontrar o delta e a equacao do segundo grau, mas quando eu clico para rodar nao vai. 

Mostra>>> 

=== Build file: "no target" in "no project" (compiler: unknown) ===|
error: conflicting types for 'calculo'|
note: an argument type that has a default promotion can't match an empty parameter name list declaration|
previous declaration of 'calculo' was here|

 

MAS QUANDO EU COLOCA EM CIMA DO CORPO PRINCIPAL DA CERTO. (acabei de perceber que nem colocando em cima resolve, quando nao retorna nada resolve, mas quando tem que retorna da B.O...........)

 

Porque isso acontece?
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste também a função calculo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

    float calculo();
    calculo(a,b,c);

}
float calculo(float a, float b, int c){
    float delta;// res, x,x2;
    delta=b*b-4*a*c;

   
    return delta;
}

 

Nao retorna

 

Eu e um colego discutimos uma questao parecida, mas não dava certo. E quando ele colocou em cima do main deu certo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

No cabeçalho da função a terceiro parâmetro (c) está com tipo int.

E colocar a função antes do main é preferível mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick  mesmo assim amigo.

o do meu colega não deu certo, e não tinha esse erro.

Acho que não tinha, pois era diferente a questão

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Ontem acabei nao resfazendo o programa a noite por sono , mas agora eu concertando o parametro do tipo int para float acabou que nao fez diferenca, a funcao da errado da mesma forma. Apenas da certo se eu coloca-la em cima do corpo principal (main) , você sabe me dizer porque isso ocorre apenas com o float.?

 

Desde de já grato pelo ajuda.:D

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

1#
Sobre:

9 minutos atrás, Josesousa disse:

você sabe me dizer porque isso ocorre apenas com o float.?

 

Isso o quê? por favor, tente explicar melhor o que aconteceu.

 

Mas em relação à necessidade do float, é porque TODOS os coeficientes são float (no caso, são números reais), logo não faz sentido ter um float, e a função receber um int.

 

 

 

2#

Eu já estava respondendo... então vai:

 

@Josesousa, sobre:

8 horas atrás, Josesousa disse:

    float calculo();
    calculo(a,b,c);

}
float calculo(float a, float b, int c){
    float delta;// res, x,x2;
    delta=b*b-4*a*c;

 

Você declarou a função embaixo. OK. Ai, para o main() reconhecer, fez necessário "declarar a assinatura antes de usar a função", mas acontece que a assinatura no main() está diferente da assinatura da função em si. Resumindo:
 

    float calculo(float a, float b, int c); //tem que ficar igual
    calculo(a,b,c);
}

float calculo(float a, float b, int c) {
    float delta;// res, x,x2;
    delta=b*b-4*a*c;
    return delta;
}

 

 

 

3#

Sobre:

7 horas atrás, isrnick disse:

No cabeçalho da função a terceiro parâmetro (c) está com tipo int.

 

Então, @Josesousa, porquê o preconceito com o c? ou seja, os 3 parâmetros são do tipo float. (já comentei sobre isso no 1#)

 

 

 

4#

Você definiu a função para retornar um float. E dentro no da função, usou return delta;, mas no main() não está coletando essa resposta.

 

Daí entra uma pré verificação: o que o método calculo() faz? pelo nome das variáveis está retornando um Delta. Logo, a função está apenas retornando o valor do discriminante, correto? mas isso é apenas um componente da Fórmula de Baskara... falta mais coisa ai.

 

 

 

5#

Sugiro implementar algo assim:

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


//retorna as raizes no próprio parâmetro / e 1 se tem 2 raizes
//reais distintas, 2 se só tem só uma raiz real ou 3 se não tem
//raizes reais
int raizDaEquacao(float* x1, float* x2);

//retona o valor da descriminante 
float delta(float a, float b, float c);

main () {    
    float a,b,c,  //coeficientes da equação
          x1, x2; //possíveis raizes da equação
    
    //coleta os coeficientes
    do {
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    } while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    
    //invoca a função que calcula as raizes da equação  
    

    //imprime as raizes


}

//implemente a função raizDaEquacao()

//implemente a função delta()

 

 

***

 

Então, primeiro poste o que ocorreu no 1#. Depois, tente implementar o código acima, se tiver dúvidas sobre alguma parte, é só postar.

 

No aguardo.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas Siga os codigos abaixo.

Nesse codigo agora se voce roda-lo nao vai da certo.

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

main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

    float calculo();
    //calculo(a,b,c);
    printf("DElta %f.\n", calculo(a,b,c));

}
float calculo(float a, float b, float c){
    float delta;// res, x,x2;
    delta=b*b-4*a*c;

   
    return delta;
}

porém se voce rodar esse codigo agora vai da certo.

segue o codigo.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
float calculo(float a, float b, float c){
    float delta;// res, x,x2;
    delta=b*b-4*a*c;

   
    return delta;
}
main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

    //float calculo();
    //calculo(a,b,c);
    printf("DElta %f.\n", calculo(a,b,c));

}

 

 

É isso que eu gostaria de entender. Qual a diferenca entre os dois para so na segunda opcao da certo (quando a funcao fica em cima).

E porque so ocorre com o float. (porque o float so funciona em cima da funcao main)?

adicionado 4 minutos depois

 

-----------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------

 

 

Resolvendo a equacao do segundo grau: 

 

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

float calculo(float a, float b, int c){
    float delta, res, x,x2;
    delta=b*b-4*a*c;

    if (delta==0){
        x = ((b*-1) - sqrt(delta))/2*a;
        printf("Delta e 0 (ZERO).\n");
        printf("O valor de x e x2 e %f.\n", x);
    }

    else if(delta>0){
        x= ((b*-1) + sqrt(delta))/2*a;
        x2= ((b*-1) - sqrt(delta))/2*a;
        printf("Delta e %f.\n", delta);
        printf("O valor de x e %f.\n", x);
        printf("O valor de x2 e %f.\n", x2);
    }
    else{
        printf("Delta e igual a %f.\n");
        printf("Nao exsite raiz real.\n");
    }
    //return res;
}
main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

   // float calculo();
    calculo(a,b,c);

}

Esta correto? Acho que so devo mudar o tipo da funao de float para void , ja que nao esta retornando nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1#

Sobre:

30 minutos atrás, Josesousa disse:

porém se voce rodar esse codigo agora vai da certo.

 

Vide o que postei no 2# da minha postagem anterior.

 

Sobre:

31 minutos atrás, Josesousa disse:

E porque so ocorre com o float. (porque o float so funciona em cima da funcao main)?

adicionado 4 minutos depois

 

Não, de onde tirou esse "só float"? Fez funcionar com algum outro por exemplo? ou seja, não tem nada a ver uma coisa com a outra.

 

Resumindo:

O problema é que o C aprende de cima para baixo. Logo, ou define a função em cima, ou define a assinatura da função antes de usar ela... acontece que você definiu uma função no main(), mas definiu outra embaixo. As assinaturas devem ser iguais (mesmo nome e mesmo parâmetros).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

  • A segunda opção está conforme as regras da linguagem C.
    37 minutos atrás, Josesousa disse:

    Qual a diferenca entre os dois para so na segunda opcao da certo (quando a funcao fica em cima).

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi agora. 

Valeu, deu certo aqui.

Estranho que com int/char  da certo. Estava seguindo a mesma forma que o professor fez e colocou no slide dele. :(

No slide dele ele chama a funcao normal, so que nao coloca os parametros ainda.

Dessa forma:

int calculo ();

calculo(int a, int b); // So aqui que ele coloca o que a funcao recebe.

Obrigado!!!

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

É serio. Ta desse jeito no slide. Estou ate com o slide aqui kkkk

mas bom que vcs me ajudaram... thanks.

adicionado 24 minutos depois

Tem como eu retornar os valores de um vetor? sem ser void.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa, por favor, poste o seu código atual para revisarmos... pode ter alguns detalhes que precisam corrigir, por exemplo:

 

3 horas atrás, Josesousa disse:

float calculo(float a, float b, int c){

 

Ai tem pelo menos 2 erros:

- o c é float;

- a função está configurada para retornar um float, mas no código não está retornando algo, logo, o método deveria ser void.

 

 

No aguardo.

adicionado 2 minutos depois

PS:

Sobre:

2 horas atrás, Josesousa disse:

Dessa forma:


int calculo ();

calculo(int a, int b); // So aqui que ele coloca o que a funcao recebe.

Obrigado!!!

 

Poste também esse código completo...

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas  Acho que eu ja postei o codigo final ai em cima.

 


Nesse codigo agora se voce roda-lo nao vai da certo.

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

main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

    float calculo();
    //calculo(a,b,c);
    printf("DElta %f.\n", calculo(a,b,c));

}
float calculo(float a, float b, float c){
    float delta;// res, x,x2;
    delta=b*b-4*a*c;

   
    return delta;
}

 

E com a equacao

 

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

void calculo(float a, float b, float c){
    float delta, res, x,x2;
    delta=b*b-4*a*c;

    if (delta==0){
        x = ((b*-1) - sqrt(delta))/2*a;
        printf("Delta e 0 (ZERO).\n");
        printf("O valor de x e x2 e %f.\n", x);
    }

    else if(delta>0){
        x= ((b*-1) + sqrt(delta))/2*a;
        x2= ((b*-1) - sqrt(delta))/2*a;
        printf("Delta e %f.\n", delta);
        printf("O valor de x e %f.\n", x);
        printf("O valor de x2 e %f.\n", x2);
    }
    else{
        printf("Delta e igual a %f.\n");
        printf("Nao exsite raiz real.\n");
    }
    //return res;
}
main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

   // void calculo();
    calculo(a,b,c);

}

 

 

Tem como eu retornar um vetor, sem ser com void, ou seja sem printf.

tem que usar algum parametro.? ponteiro? esse ultimo nao aprendi ainda, conheco pouco

Compartilhar este post


Link para o post
Compartilhar em outros sites

1#
Sobre o primeiro código:

13 minutos atrás, Josesousa disse:

@Simon Viegas  Acho que eu ja postei o codigo final ai em cima.

 

"La vamos nos" - ***** Pau

Spoiler


	
Denunciar post  #8  
Postado 3 horas (editado)
@Simon Viegas Siga os codigos abaixo.

Nesse codigo agora se voce roda-lo nao vai da certo.

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

main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

    float calculo();
    //calculo(a,b,c);
    printf("DElta %f.\n", calculo(a,b,c));

}
float calculo(float a, float b, float c){
    float delta;// res, x,x2;
    delta=b*b-4*a*c;

   
    return delta;
}

 

Esse código está funcionando ai? aqui dá erro. Justamente devido a diferença entre as assinaturas, ou seja, os parâmetros estão diferentes.

 

Esse é o código do slide?

 

 

 

2#

Sobre o segundo código:

16 minutos atrás, Josesousa disse:

E com a equacao

 

La vamos nos 

Spoiler


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

void calculo(float a, float b, float c){
    float delta, res, x,x2;
    delta=b*b-4*a*c;

    if (delta==0){
        x = ((b*-1) - sqrt(delta))/2*a;
        printf("Delta e 0 (ZERO).\n");
        printf("O valor de x e x2 e %f.\n", x);
    }

    else if(delta>0){
        x= ((b*-1) + sqrt(delta))/2*a;
        x2= ((b*-1) - sqrt(delta))/2*a;
        printf("Delta e %f.\n", delta);
        printf("O valor de x e %f.\n", x);
        printf("O valor de x2 e %f.\n", x2);
    }
    else{
        printf("Delta e igual a %f.\n");
        printf("Nao exsite raiz real.\n");
    }
    //return res;
}
main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

   // void calculo();
    calculo(a,b,c);

}

 

Faltou pelo menos corrigir a impressão do Delta quando este é negativo (lá no segundo else).

 

 

 

3#

Sobre:

18 minutos atrás, Josesousa disse:

Tem como eu retornar um vetor, sem ser com void, ou seja sem printf.

tem que usar algum parametro.? ponteiro? esse ultimo nao aprendi ainda, conheco pouco

 

Vamos lá... existem pelo menos 3 tipos de retornos:

- pela própria função: utilizando o return. A própria função traz o resultado, algo como:

resultado=calculo(a,b,c);

A função meio que funciona como uma variável. Quando ela não retorna algo, ele é void. Quando retorna, será o que ela retorna, como int, float, double etc.

 

- pelos parâmetros: quando a variável que foi enviada por parâmetro é alterada dentro da função, e esse valor é persistido após a função terminar, ou seja, a função estará retornando um valor pela própria variável do parâmetro. Verás isso quando estudar sobre "passagem de parâmetro por valor" e "passagem de parâmetro por referência". No primeiro, só valor da variável é passado. A variável da função recebe uma cópia do valor da variável que foi enviada. No segundo, é passado a referência da variável em si, ou seja, é como se estivesse usando a própria variável.

 

- por variáveis globais: como as variável é global, ela será enxergada tanto pelo método main(), tanto pelo método calculo(), ai, o método calculo() poderia retornar um valor usando uma variável desta. Geralmente essa é a opção menos elegante.

 

obs.: entenda como global as variável que estão no espoco "maior", por exemplo, a função calculo() e a função main() são globais, pois todo o código os enxerga. Da mesma forma os include estão no escopo global, ou seja, todo o código enxerga as consequência desses include. Experimente por exemplo deixar o #include <math.h>  apenas dentro do calculo() (vai compilar e funcionar), e depois experimente deixar dentro do main() (não vai compilar), pois dentro de calculo() precisa dessa "biblioteca", mas como ela não foi declarada dentro da função e nem foi declarada num "escopo maior" a função sqrt() não vai ser reconhecida. Entende?  Da mesma forma existe o "escopo maior" e o "interno a este maior", existe a questão da ordem de aprendizagem... veja:

 

Se eu declarar assim:

    ...
    calculo(a,b,c);
}

void calculo(float a, float b, float c){   

Não vai funcionar, pois apesar de void calculo() está num escopo global, o computador ainda não aprendeu ele, pois está em baixo. Por isso que se faz necessário declarar a assinatura antes, algo assim:
 

    void calculo(float a, float b, float c);
    calculo(a,b,c);
}

void calculo(float a, float b, float c){   

Dessa forma, o computador sabe que existe um método com essas características, e faz funcionar. Por isso que quando não colocar a quantidade de parâmetros iguais e com os mesmo tipos, não vai funcionar. Tipo, se eu colocar assim:

void calculo(float x, float y, float z);

vai funcionar também, pois o que importa é ter "void calculo(float, float, float)". :)

 

Para exemplificar mais:

    void calculo(float,float,float); //declarei assim e funcionou també (não sabia, apenas testei)
    calculo(a,b,c);
}

void exemplo (){
    float a,b,c;
    void calculo(float xxx, float yyy, float zzdadas); //aqui também precisa ensinar o computador que existe um método com essas características (void calculo(float,float,float))
    calculo(a,b,c);
}

void calculo(float a, float b, float c){   

Ai, se declarar método calculo()  (o completo) em cima, todos os outros métodos passaram a enxergar sem precisar usar desse recurso de "ensinar com uma assinatura".

 

Da mesma forma, se colocar o exempo() após o calculo(), a função main() vai continuar precisando "aprender", mas o exemplo() não, pois o computador já conhece o calculo() nele momento.

 

Por ai vai.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops, foi mal. Peguei o codigo errado kkk

segue ele

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
float calculo(float a, float b, float c){
    float delta;// res, x,x2;
    delta=b*b-4*a*c;

   
    return delta;
}
main (){
    float a,b,c, x,x2,y;
    do{
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    }while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");

    //float calculo();
    //calculo(a,b,c);
    printf("DElta %f.\n", calculo(a,b,c));

}

E sobre o  #2, corrigir o que?  o printf?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com relação ao esquema proposto pelo professor:

E um caso específico.

 

int func();

Nessa situação se omitirmos a lista de parâmetros a linguagem assume indefinidos parâmetros do tipo int. Ou seja, assumisse que exista uma lista de tamanho indefinido de valores do tipo inteiro, permitindo se quisesse faze-lo assim:

int main( void )
{
  int func();
  func(0);
  
  return 0;
}
int func( int a, int b, int c )
{
  return a + c;
}

 

  •  No máximo vai receber um aviso informando que escreveu parâmetros e funções implícitas ou se tentasse modificar o valor padrão da declaração na definição.
19 horas atrás, Josesousa disse:

note: an argument type that has a default promotion can't match an empty parameter name list declaration|

Essa mensagem surgiu porque na definição você colocou dois float. Quando na declaração todos são int por padrão é isso que significa deixa em branco a lista de argumentos.

 

EDIT:

Daí o código abaixo vai funcionar que se fosse a maneira correta, porém não é assim, pois é um caso apenas específico.

#include <stdio.h>  /* incluir: printf(); */

int main( void )
{
  float delta_de( );
  printf( "delta: = %g\n",delta_de(4,-4,1) );
  return 0;
}
float delta_de(int a, int b, int c)
{
  printf( "a: %3d\n",a );
  printf( "b: %3d\n",b );
  printf( "c: %3d\n",c );
  return ((b * b) - (4 * a * c));
  /* Retona delta */
}

 

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, AnsiC disse:

Nessa situação se omitirmos a lista de parâmetros, a linguagem assume indefinidos parâmetros do tipo int.

 

Resumindo: Não é o int antes no "nome do método" que faz funcionar, mas sim que os parâmetros dentro dele sejam int. Ex.:

#include <stdio.h>  /* incluir: printf(); */

 main( void )
{
  float func();
  func(0);
  
  return 0;
}
float func( int a, int b, int c ) //<-- funciona pois aqui só estou usando int nos parâmetros
{
  return a + c;
}

Vai funcionar também.

 

Acertei?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Sim
2 minutos atrás, Simon Viegas disse:

Acertei?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para exemplificar, fiz um código com método local (deixei os principais comentários dentro):

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

void calculo(float a, float b, float c) {
    
    //método local (só enxergado dentro do escopo do calulo())
    float getDelta(float a, float b, int c) {
        return b*b-4*a*c;        
    }
    
    float delta=getDelta(a,b,c),  //aqui já cria a variável com o se valor
          //res,  NÃO ESTÁ SENDO USADA
          x1, x2;
    
    if (delta==0) {
        //x1 = ((b*-1)-sqrt(delta))/2*a;  RAOZ DE 0 NÃO É NECESSÁRIO
        x1 = (b*-1)/2*a;
        printf("Delta e 0 (ZERO).\n");
        printf("O valor de x1 e x2 e %f.\n", x1);
    } else if(delta>0) {
        x1 = ((b*-1) + sqrt(delta))/2*a;
        x2 = ((b*-1) - sqrt(delta))/2*a;
        printf("Delta e %f.\n", delta);
        printf("O valor de x1 e %f.\n", x1);
        printf("O valor de x2 e %f.\n", x2);
    } else {
        printf("Delta e igual a %f.\n",delta); //faltou imprimir Delta aqui
        printf("Nao exsite raiz real.\n");
    }
}
    
main () {
    //float a,b,c, x1,x2,y; TEM VARIÁVEIS DE MAIS AI!
    float a,b,c;
    do {
        printf("Informe o valor de 'A': ");
        scanf("%f", &a);
    } while(a==0);
    printf("Informe o valor de 'B': ");
    scanf("%f", &b);
    printf("Informe o valor de 'C': ");
    scanf("%f", &c);
    printf("\n\nO resultado.\n");
    calculo(a,b,c);
}

 

obs.: acho que o nome calculo() poderia ser alterado, pois este não está só "calculando", está também exibindo o resultado.

 

@AnsiC, aqui rodou, mas esse código tem algum conceito que precisaria ser corrigido ou melhorado?

 

@Josesousa, por favor, poste o enunciado completo, pois a estruturas do código depende do que foi pedido.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Simon Viegas disse:

 

Resumindo: Não é o int antes no "nome do método" que faz funcionar, mas sim que os parâmetros dentro dele sejam int.

 

Acertei?

 

 

Na verdade é uma questão de incompatibilidade entre os tipos dos parâmetros do protótipo declarado e os parâmetros da função:

#include <stdio.h>

int main( void )
{
  float func(); //<-- não foi especificado o tipo, logo entende-se que seja int,
                //    pois int é o tipo padrão da linguagem C.
  func(0, 0, 0);
  
  return 0;
}
float func( float a, float b, float c ) //<-- mas na verdade os parâmetros são do tipo float
{
  return a + b + c;
}

 

Então no protótipo da função, como não foi especificado nenhum tipo, ele entende que os parâmetros sejam do tipo int, mas aí não bate com os tipos dos parâmetros no cabeçalho da função e dá erro.

 

 

 

Seria similar a fazer isso:

#include <stdio.h>

int main( void )
{
  float func( int a, int b, int c ); //<-- no protótipo está com tipo int
  func(0, 0, 0);
  
  return 0;
}
float func( float a, float b, float c ) //<-- mas na função os parâmetros são do tipo float
{
  return a + b + c;
}

Que obviamente está errado.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick, sobre:

2 horas atrás, isrnick disse:

  float func(); //<-- não foi especificado o tipo, logo entende-se que seja int,
                //    pois int é o tipo padrão da linguagem C.

 

Acho que o bagulho vai mais além... não é "só" que os parâmetros são int, seria algo como "você pode passar quantos* int você quiser que vai rodar! " (compila e roda), ou seja, o que pode ser feito com esses int vai depender da função em si. Por exemplo, se fizer a função com 3 variáveis no parâmetro, e passar 4, apenas terá acesso a 3, a quarta vai parar na Matrix. Se passar menos de 3, a quarta não terá um valor especificado... (ficará com por exemplo o valor do "lixo" da memória... não sei exatamente, mas o bagulho roda!).

 

Ou seja, não definir uma quantidade, quer dizer que pode passar quantos quiser.

 

obs.: quantos quiser ",". Claro que deve ter um limite... mais no sentido que pode passar mais do que a função supostamente comportaria.

 

RESUMINDO:

Mesmo sendo int, seria recomendado especificar a quantidade.

  • Curtir 1

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

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

×