Jump to content

Erros na declaração de main


Luís Paiva

Recommended Posts

Luís Paiva

No código seguinte:

char main(char s1[], char s2[]) {
    int i=0,len=strlen(s1);
    while (s1[i+len]=s2){
        i++;
    }
    return s1;
}

e retorna-me os seguintes avisos:

line 5 warning return type of 'main' is not 'int'
line 5 warning first argument of 'main' should be 'int' 
line 5 warning second argument of 'main' should be 'char **'

in function 'main':
line 6 warning implicit declaration of function 'strlen'
line 6 warning incompatible implicit declaration of built-in function 'strlen'
line 6 note: include '<string.h>' or provide a declaration of 'strlen'
line 7 warning suggest parentheses around assignment are used as truth value
line 10 warning return makes integer from pointer without a cast

alguém me pode explicar o porquê de tantos avisos? e porquê de serem avisos e não erros?

Edited by pwseo
Reformatação do tópico, alteração de título
Link to post
Share on other sites

@Luís Paiva

Para começar, deverás formatar os teus tópicos adequadamente, se pretendes que os mesmos sejam respondidos e não ocultados (pois infringem as regras da comunidade). Tens à disposição um editor que permite inserir código, tal como eu fiz na edição do teu tópico. Além disso, deverás escolher um título adequado: «*mystrcat» não o é, nem sequer aparece no teu código.

Posto isto, posso dizer-te que os avisos que te são mostrados são relativamente directos, e sugiro vivamente que sigas o que lá é aconselhado de modo a produzir código correcto.

line 5 warning return type of 'main' is not 'int'
line 5 warning first argument of 'main' should be 'int'
line 5 warning second argument of 'main' should be 'char **'

Segundo o standard da linguagem C, a função main() deverá ser declarada de uma das seguintes formas:

int main(void) { ... }
int main(int argc, char **argv) { ... }

No teu código, utilizaste uma declaração não suportada, e é precisamente disso que o compilador se está a queixar: o tipo de retorno deveria ser int (tu colocaste char), o primeiro argumento deveria ter também tipo int (tu colocaste char[]) e o segundo argumento deveria ser do tipo char ** (tu colocaste char[]).

line 6 warning implicit declaration of function 'strlen'
line 6 warning incompatible implicit declaration of built-in function 'strlen'
line 6 note: include '<string.h>' or provide a declaration of 'strlen'

Estás a utilizar a função strlen() sem incluir no teu programa o header que a define. Como resultado, o compilador limita-se a tentar adivinhar (faz uma «declaração implícita») como funciona a função strlen() e assume, erradamente, que devolve um int.
Na realidade, strlen() devolve um size_t, e o compilador avisa-te da incompatibilidade entre a declaração real e a que tentou adivinhar.
Por fim, para solucionar tudo isto, o compilador indica-te que deverias ter incluido o header <string.h>:

#include <string.h>
...

int main(...) {
    ...
}

Passemos ao próximo:

line 7 warning suggest parentheses around assignment are used as truth value

Estás a fazer uma atribuição de valor e não uma comparação. É isso que pretendes com s1[i+len]=s2? Se sim, o compilador aconselha-te a rodear a expressão com parênteses, sinalizando que é tua intenção fazer isso.

line 10 warning return makes integer from pointer without a cast

Quando fazes return s1; estás a devolver um valor do tipo char[] quando na realidade declaraste main() dizendo que ela devolve valores do tipo char.
Na realidade, main devolve sempre int (definido pelo standard, como referi acima), pelo que o aviso refere que estás a tentar criar um integer a partir de um pointer (vamos assumir que char[] é semelhante a um pointer, pois não tens ainda conhecimento suficiente para compreender a diferença).

Por fim: o compilador emite todos estes avisos porque cometeste todos esses erros ao escrever código. Por que motivo são avisos em vez de erros? Porque o compilador é tolerante, muito tolerante, e tenta fazer o seu melhor para perceber o que o programador queria fazer, apesar dos erros.

Para principiantes recomendo que este tipo de avisos sejam explicitamente considerados erros, obrigando assim a programar mais correctamente.

Que compilador e sistema operativo utilizas? Podes aprender a configurar o teu compilador para que seja mais rígido, trazendo-te benefícios a longo prazo (embora seja uma fonte de atrito no início, enquanto não dominas a linguagem).

No meu computador, configurei o GCC para ser muito rígido:
 

~ $ cc -o lpaiva lpaiva.c
lpaiva.c:1:6: error: return type of ‘main’ is not ‘int’ [-Wmain]
lpaiva.c:1:6: error: first argument of ‘main’ should be ‘int’ [-Wmain]
lpaiva.c:1:6: error: second argument of ‘main’ should be ‘char **’ [-Wmain]
lpaiva.c: In function ‘main’:
lpaiva.c:2:17: error: implicit declaration of function ‘strlen’ [-Wimplicit-function-declaration]
lpaiva.c:2:17: warning: incompatible implicit declaration of built-in function ‘strlen’
lpaiva.c:2:17: note: include ‘<string.h>’ or provide a declaration of ‘strlen’
lpaiva.c:3:21: error: assignment makes integer from pointer without a cast [-Wint-conversion]
lpaiva.c:3:12: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
lpaiva.c:6:12: error: return makes integer from pointer without a cast [-Wint-conversion]

Repara que a maioria dos avisos que obtiveste são considerados erros pelo GCC no meu computador. Aqui, o teu código não compila.

P.S. Apresentas falhas graves no domínio sintáctico de C. Devias investir um pouco de tempo a tentar perceber como se organiza um programa escrito em C, que sintaxe se usa, etc. Não conseguirás produzir código complexo se este tipo de falhas persistirem.

Link to post
Share on other sites
Luís Paiva

@pwseo agora tenho a mesma função desta maneira:

char *mystrcat(char s1[], char s2[]) {
 int i=0,len=strlen(s1);
 while (s1[i+len]=s2[i]){
 i++;}
 return s1;
} 

se eu quisesse verificar se esta função estaria correta no codeblocks, como o faria?

Link to post
Share on other sites
Luís Paiva

@pwseo É que o meu maior problema é como é que eu verifico se a minha função está correta no codeblocks? tenho mesmo que criar um função main com algum printf? é que quando escrevo no codeblocks apenas uma função como esta última (*mystrcat) quando corro o programa não me aparece nada.

Link to post
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
×
×
  • 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.