Jump to content

error C2198 e C2082


ASHASHIN
 Share

Recommended Posts

Boas, estava a tentar fazer com que um programa imprimisse uma cadeia de chars quando o resultado de de uma soma fosse maior que outra soma e, imprimisse outra cadeia caso contrário (código abaixo). O que acontece é que o visual c++ express 2010 diz que eu estou a declarar mal as variáveis (erros C2198 e C2082)

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

char calcs (char*a, char*b, int c, int d, int e, int f);

int main (void)
{
calcs ();
return 0;
}

char calcs (char*a, char*b, int c, int d, int e, int f)
{
char a[1024];
char b[1024];
int c;
int d;
int e;
int f;

scanf_s ("%ca", &a);
scanf_s ("%ca", &b);
scanf_s ("%lf", &c);
scanf_s ("%lf", &d);
scanf_s ("%lf", &e);
scanf_s ("%lf", &f);

return c+e > d+f ? printf ("%a") : printf ("%b");
}

P.S: se encontrarem alguma coisa no código que esteja mal (para além da declaração de variáveis) agradecia que me avisassem 🙂

Link to comment
Share on other sites

Não podes re-definir as variaveis depois de as teres definido na "assinatura" da função

char calcs(char*a, char*b, int c) { /* ... */ }

Dentro da função a é um char*; b é um char*, c é um int, etc ...

Não é possível redefinir, nem que seja para a mesma coisa.

Se queres as variaveis definidas na assinatura da função, tira-as do código. Se preferes defini-las no código, tira-as da assinatura da função.


Outros pontos dignos de nota:

1) Usas um protótipo para a função calcs() que não respeitas dentro da função main.

Basicamente tem tudo de estar de acordo em todas as vertentes.

Se o protótipo diz que a função tem 6 parametros, quando chamas a função fornce 6 argumentos!

2) A função scanf_s() não é reconhecido pelo Standard. Possivelmente o teu compilador fornece-a como extra.

Se queres fazer um programa que funcione em todos os compiladores de C (sem extra) usa scanf()

3) Não conheço os particulares da função scanf_s(), mas assumindo que são parecidos com os da função scanf(), a string de conversão e o tipo de variável têm que estar de acordo.

Na função scanf(), a string de conversão "%c" "quer" um ponteiro para caracter que estás a fornecer; o "a" seguinte não faz nada.

a string de conversão "%lf" "quer" um ponteiro para um double, mas estás a fornecer um ponteiro para um int. Não faças isso: tem tudo de estar acordo com tudo.

4) Por último; a tua última expressão de return está a fazer muitas coisas ao mesmo tempo.

Sugiro que dividas em duas ou mais instruções que façam uma só coisa cada.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

obrigado pela resposta e pelas dicas  🙂

em relação à funcão scanf_s, eu utilizei-a porque o na altura da compilação aparecia um aviso a dizer que a função era insegura e, nas aulas o professor avisou que deviamos ter atenção também à segurança quando estivessemos a programar

Link to comment
Share on other sites

em relação à funcão scanf_s, eu utilizei-a porque o na altura da compilação aparecia um aviso a dizer que a função era insegura e, nas aulas o professor avisou que deviamos ter atenção também à segurança quando estivessemos a programar

O problema de seguranca com a funcao scanf aplica-se apenas quando a string de formatacao 'pede' um buffer (basicamente "%s" ou "%[...]"). Nestes casos, se o utilizador escrever um input que nunca mais acaba, esse input iria ser escrito no tal de buffer que nao tem espaco suficiente para o input: causando buffer overflow.

Para evitar buffer overflow no scanf, limita sempre o input ao espaco disponivel.

Alem disso verifica sempre se o resultado do scanf é o esperado, ou seja, basicamente se é o numero de variaveis a atribuir.

char name[30], address[256];
if (scanf("%29s", name) != 1) /* erro */
if (scanf("%255[^\n]", address) != 1) /* erro */;

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.