Ajuda Erro Codigo C

66 views
Skip to first unread message

Arilson Fontenele

unread,
Dec 24, 2024, 8:29:02 AM12/24/24
to ccppbrasil
Bom dia, estou começando na liguagem C para embarcados e ao fazer um codigo que precisa monitorar o nivel de lixo em containers, solicitar coleta automatizada quando o nivel de lixo atingir determinado valor além de permitir coleta especiais de residous perigosos. 

Porem o codigo que fiz não compila ... e não estou consseguindo encontrar o erro...

#include <stdio.h>
#include <string.h>

#define NIVEL_CRITICO_LIXO 80

void verificarContainer(char *local, int *nivelLixo);
void avaliarESolicitarColeta(char *local, int nivelLixo);
void solicitarColetaAutonoma(char *local);
void coletaEspecial(char *local, char *tipoResiduos);

int main()   {
    printf("Sistema de Gestão de Resíduos de Zenithia (SGR)\n");

    int nivelRuaFlores, nivelAvenidaCentral, nivelPracaLiberdade;

    verificarContainer("Rua das Flores", &nivelRuaFlores);
    verificarContainer("Avenida Central", &nivelAvenidaCentral);
    verificarContainer("Praça da Liberdade", &nivelPracaLiberdade);

    avaliarESolicitarColeta("Rua das Flores", nivelRuaFlores);
    avaliarESolicitarColeta("Avenida Central", nivelAvenidaCentral);
    avaliarESolicitarColeta("Praça da Liberdade", nivelPracaLiberdade);

    coletaEspecial("Hospital Geral", "lixo Hospitalar");
    coletaEspecial("Centro Tecnologico", "eletrônicos");

    return 0;
}

void verificarConteiner(char *local, int *nivelLixo) {
    printf("\nVerificando container em %s...\n", local);

    if (strcmp(local, "Rua das Flores") == 0) {
        *nivelLixo = 30;
    } else if (strcmp(local, "Avenida Central") == 0) {
        *nivelLixo = 80;
    } else if (strcmp(local, "Praça da Liberdade") == 0) {
        *nivelLixo = 100;
    } else {
        *nivelLixo = 0;
    }
   
    printf ("O Container em %s esta com %d%% de lixo.\n", local, *nivelLixo);

}

void avaliarESolicitarColeta(char *local, int nivelLixo) {
   
    if (nivelLixo >= NIVEL_CRITICO_LIXO){
        printf("O Container em %s antingi o nivel critico de lixo.\n", local);
        solicitarColetaAutonoma(local);
    } else {
        printf("O Container em %s ainda não precisa de coleta.\n", local);
    }
}

void solicitarColetaAutonoma(char *local){
    printf("Veiculo autonomo a caminho para coletar o lixo em %s.\n", local);
}

void coletaEspecial(char *local, char *tipoResiduos){
    printf("\nSolicitando coleta especial para %s em %s.\n", tipoResiduos, local);
}

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

O codigo apresenta o seguinte erro de compilação que não estou consseguindo entender:

/rbin/ld: /tmp/ccGb2ZD8.o: in function `main':
main.c:(.text+0x1f): undefined reference to `verificarContainer'
/rbin/ld: main.c:(.text+0x30): undefined reference to `verificarContainer'
/rbin/ld: main.c:(.text+0x41): undefined reference to `verificarContainer'
ERROR!
collect2: error: ld returned 1 exit status

Alguem pode me ajudar ? Obrigado.

Josué Andrade Gomes

unread,
Dec 24, 2024, 8:37:13 AM12/24/24
to ccppb...@googlegroups.com
 verificarContainer("Rua das Flores", &nivelRuaFlores);
void verificarConteiner(char *local, int *nivelLixo)

Container vs Conteiner.


--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver esta conversa, acesse https://groups.google.com/d/msgid/ccppbrasil/0898ea04-6a92-48ed-9585-d15868137160n%40googlegroups.com.

Arilson Fontenele

unread,
Dec 24, 2024, 9:25:25 AM12/24/24
to ccppbrasil
Josué, muito obrigado que erro de principiante que eu cometi em faz até vergonha ... 
Agora compilei em um um compilador online apenas pra testar e funcionou ... Porém no Vscode deu esse erro abaixo... 

Executing task: C:\TDM-GCC-64\bin\gcc.exe -Wall -Wextra -g3 c:\Users\arils\Desktop\Arilson\EmbarcaTech\Desafiocap03 -o c:\Users\arils\Desktop\Arilson\EmbarcaTech\output\Desafiocap03.exe

c:\Users\arils\Desktop\Arilson\EmbarcaTech\Desafiocap03: file not recognized: file format not recognized
collect2.exe: error: ld returned 1 exit status

 *  The terminal process "C:\TDM-GCC-64\bin\gcc.exe '-Wall', '-Wextra', '-g3', 'c:\Users\arils\Desktop\Arilson\EmbarcaTech\Desafiocap03', '-o', 'c:\Users\arils\Desktop\Arilson\EmbarcaTech\output\Desafiocap03.exe'" terminated with exit code: 1.
 *  Terminal will be reused by tasks, press any key to close it.

Porque que em um compilador esta dando certo e em outro não ?

Muito Obrigado.

Josué Andrade Gomes

unread,
Dec 24, 2024, 9:39:16 AM12/24/24
to ccppb...@googlegroups.com

O arquivo não tem uma extensão conhecida: .c, .cpp, etc…
O gcc precisa não consegue reconhecer.


Arilson Fontenele

unread,
Dec 24, 2024, 9:59:54 AM12/24/24
to ccppbrasil
Deu certo Josué ... Obrigado viu... compilou direitinho... 

Fabio Mazzarino

unread,
Dec 25, 2024, 6:41:04 PM12/25/24
to ccppbrasil
Arilson:

Como os problemas de fato já foram  corrigidos, eu vou tentar ajudar dando umas dicas de como usualmente se programa C.

Detalhe, isso não quer dizer que está errado, mas seguindo passos simples seu programa fica mais fácil de ser compreendido e mantido, reduzindo os riscos.

1. PRIMEIRA ALTERAÇÃO
1.1. Tradicionalmente em C a função main fica no final do arquivo, assim vc vai pro final do arquivo e tem mais chance de encontrá-la

1.2. Evite usar ponteiros qdo possível, assim, se vc precisa de um parâmetro que vai retornar um valor, utilize parâmetors por referência, por exemplo:
void verificarConteiner(char *local, int &nivelLixo);
Assim vc evita ter que lidar com ponteiros, oq pode incorrer em risco de má utilização da função, além dos problemas inerentes ao uso de ponteiros. Enquanto que o acesso às variáveis é como se fosse uma variável normal:
nivelLixo = 30;

1.3. Sempre que possível utilize verbos para nomear funções, por exemplo:
void efetuarColetaEspecial(char *local, char *tipoResiduos);

1.4. Qdo vc precisa devolver somente um único valor através da função, utilize valores de retorno. Por exemplo:
int verificarConteiner(char* local);

1.5. Sempre que receber um ponteiro através de parametros, valide se não é nulo antes de usar:
if (!local)
    return 0;

1.6. No email, qdo enviar código, use texto monoespaçado sempre que possível, facilita a leitura.

Seu código, já corrigido, ficaria assim
#include <stdio.h>
#include <string.h>

#define NIVEL_CRITICO_LIXO 80

int verificarConteiner(char *local) {
    if (!local)
        return 0;


    printf("\nVerificando container em %s...\n", local);

    int nevelLixo = 0

    if (strcmp(local, "Rua das Flores") == 0) {
        nivelLixo = 30;
    } else if (strcmp(local, "Avenida Central") == 0) {
        nivelLixo = 80;
    } else if (strcmp(local, "Praça da Liberdade") == 0) {
        nivelLixo = 100;
    }

    printf ("O Container em %s esta com %d%% de lixo.\n", local, nivelLixo);
    return nivelLixo

}

void avaliarESolicitarColeta(char *local, int nivelLixo) {
    if (!local)
        return;
    if (nivelLixo >= NIVEL_CRITICO_LIXO) {
        printf("O Container em %s antingiu o nivel critico de lixo.\n", local);

        solicitarColetaAutonoma(local);
    } else {
        printf("O Container em %s ainda não precisa de coleta.\n", local);
    }
}

void solicitarColetaAutonoma(char *local) {
    if (!local)
        return;

    printf("Veiculo autonomo a caminho para coletar o lixo em %s.\n", local);
}

void efetuarColetaEspecial(char *local, char *tipoResiduos) {
    if (!local || !tipoResiduos)
        return;

    printf("\nSolicitando coleta especial para %s em %s.\n", tipoResiduos, local);
}


int main()   {
    printf("Sistema de Gestão de Resíduos de Zenithia (SGR)\n");

    int nivelRuaFlores;
    int nivelAvenidaCentral;
    int nivelPracaLiberdade;

    verificarConteiner("Rua das Flores", nivelRuaFlores);
    verificarConteiner("Avenida Central", nivelAvenidaCentral);
    verificarConteiner("Praça da Liberdade", &nivelPracaLiberdade);


    avaliarESolicitarColeta("Rua das Flores", nivelRuaFlores);
    avaliarESolicitarColeta("Avenida Central", nivelAvenidaCentral);
    avaliarESolicitarColeta("Praça da Liberdade", nivelPracaLiberdade);

    efetuarColetaEspecial("Hospital Geral", "lixo Hospitalar");
    efetuarColetaEspecial("Centro Tecnologico", "eletrônicos");

    return 0;
}




Arilson Fontenele

unread,
Dec 25, 2024, 7:31:41 PM12/25/24
to ccppb...@googlegroups.com
Boa Noite Fabio ....

Muito obrigado pelas dicas, não sei nem como te agradecer .... 

Mas tentei compilar seu código e deu os seguintes erros:

/tmp/cEQHFxKHuT/main.c: In function 'verificarConteiner':
ERROR!
/tmp/cEQHFxKHuT/main.c:13:5: error: expected ',' or ';' before 'if'
   13 |     if (strcmp(local, "Rua das Flores") == 0) {
      |     ^~
/tmp/cEQHFxKHuT/main.c:15:7: error: 'else' without a previous 'if'
   15 |     } else if (strcmp(local, "Avenida Central") == 0) {
      |       ^~~~
/tmp/cEQHFxKHuT/main.c:16:9: error: 'nivelLixo' undeclared (first use in this function); did you mean 'nevelLixo'?
   16 |         nivelLixo = 80;
      |         ^~~~~~~~~
      |         nevelLixo
/tmp/cEQHFxKHuT/main.c:16:9: note: each undeclared identifier is reported only once for each function it appears in
/tmp/cEQHFxKHuT/main.c:22:21: error: expected ';' before '}' token
   22 |     return nivelLixo
      |                     ^
      |                     ;
   23 | }
      | ~                    
/tmp/cEQHFxKHuT/main.c: In function 'avaliarESolicitarColeta':
/tmp/cEQHFxKHuT/main.c:30:9: error: implicit declaration of function 'solicitarColetaAutonoma' [-Wimplicit-function-declaration]
   30 |         solicitarColetaAutonoma(local);
      |         ^~~~~~~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c: At top level:
/tmp/cEQHFxKHuT/main.c:36:6: warning: conflicting types for 'solicitarColetaAutonoma'; have 'void(char *)'
   36 | void solicitarColetaAutonoma(char *local) {
      |      ^~~~~~~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c:30:9: note: previous implicit declaration of 'solicitarColetaAutonoma' with type 'void(char *)'
   30 |         solicitarColetaAutonoma(local);
      |         ^~~~~~~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c: In function 'main':
/tmp/cEQHFxKHuT/main.c:56:5: error: too many arguments to function 'verificarConteiner'
   56 |     verificarConteiner("Rua das Flores", nivelRuaFlores);
      |     ^~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c:6:5: note: declared here
    6 | int verificarConteiner(char *local) {
      |     ^~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c:57:5: error: too many arguments to function 'verificarConteiner'
   57 |     verificarConteiner("Avenida Central", nivelAvenidaCentral);
      |     ^~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c:6:5: note: declared here
    6 | int verificarConteiner(char *local) {
      |     ^~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c:58:5: error: too many arguments to function 'verificarConteiner'
   58 |     verificarConteiner("Praça da Liberdade", &nivelPracaLiberdade);
      |     ^~~~~~~~~~~~~~~~~~
/tmp/cEQHFxKHuT/main.c:6:5: note: declared here
    6 | int verificarConteiner(char *local) {
      |     ^~~~~~~~~~~~~~~~~~

Tentei corrigir algumas coisas mas ainda assim deu alguns erros ... 

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Thiago Adams

unread,
Dec 25, 2024, 7:43:14 PM12/25/24
to ccppbrasil
On Wednesday, December 25, 2024 at 8:41:04 PM UTC-3 fabio.m...@gmail.com wrote:
Arilson:

Como os problemas de fato já foram  corrigidos, eu vou tentar ajudar dando umas dicas de como usualmente se programa C.


Ficou um pouco confuso, pois aqui parece que são dicas de C.


 
1.2. Evite usar ponteiros qdo possível, assim, se vc precisa de um parâmetro que vai retornar um valor, utilize parâmetors por referência, por exemplo:
void verificarConteiner(char *local, int &nivelLixo);


Mas aqui  é uma dica para C++.

 

Fabio A Mazzarino

unread,
Dec 27, 2024, 7:29:00 AM12/27/24
to ccppb...@googlegroups.com
Sabe aquele pesadelo recorrente de vc estar de cuecas assistindo aula?

Sou eu em com alguns detalhes de diferença entre C e C++. Não é a primeira vez que confundo especificações de cada uma.

@Arilson, o @Thiago tem razão, valores por referência são exclusivos de C++.

Já o código eu confesso que não compilei. Foi mais um conjunto de dicas que de fato algo que fiz pra compilar mm.

De qq forma, chegando em casa eu confiro, compilo e mando corrigido.



--

Lab C++ - Código, Dicas e Snippets


--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Arilson Fontenele

unread,
Dec 27, 2024, 9:46:05 PM12/27/24
to ccppb...@googlegroups.com
Opa Fabio ... Meu pesadelo tem sido em compreender a linguagem ... Imagina só um cara de infra se metendo a aprender linguagem C ... Pense em pesadelos aterrorizantes ....😁😁 

Márcio Ubiratan

unread,
Dec 27, 2024, 10:52:10 PM12/27/24
to ccppb...@googlegroups.com
Olá Arilson,

Recomendo a plataforma C++ MasterClass, a comunidade tb é unida e acho que pode te ajudar também.


Reply all
Reply to author
Forward
0 new messages