Não consigo compilar, undefined reference.

1. Não consigo compilar, undefined reference.

giuliodanelon_@hotmail.com
Giuio2

(usa Outra)

Enviado em 25/06/2013 - 13:01h

O programa era para printar 10 inteiros aleatorios de 0 - 1000, e depois orderar eles em ordem crescente e printar.

Porem tenho esse erro ao compilar

make generate
gcc -std=c99 -o generate generate.c -lcc50 -lm
/tmp/ccB6dZQh.o: In function `main':
generate.c:(.text+0x8d): undefined reference to `sort'
collect2: ld returned 1 exit status
make: ** [generate] Erro 1

Não entendi porque sort não esta definido se eu declarei o protótipo da função.



#include <stdio.h>
#include <cc50.h>


void
sort(int valores[], int h);

int
main()
{



int a[10];

for (int i = 0; i < 10; i++) \\ gera os numeros aleatorios e coloca no array a
a[i] = rand() % 1000;

for (i = 0; i < 10; i++) \\ printa os numeros
printf("%d\n", a[i]);

sort(a, 10); \\ aqui que acontece o erro, era para ordenar o array a em ordem crescente

void
sort(int valores[], int h) \\ aqui a funcao que ordena
{
int tmp;
int i, j;

for(i = 0; i < h; i++)
for(j = i + 1; j < h; j++)
if(valores[i] > valores[j])
tmp = valores[j];
valores[j] = valores[i];
valores[i] = tmp;
}


for (i = 0; i < 10; i++) \\ printar o array ja ordenado
printf("%d\n", a[i]);

}



  


2. Re: Não consigo compilar, undefined reference.

Augusto
LinuxMH

(usa BackTrack)

Enviado em 25/06/2013 - 13:09h

for (int i = 0; i < 10; i++) \\ gera os numeros aleatorios e coloca no array a
a = rand() % 1000;

você não está guardando cada elemento na sua posição

coloca ai
a[i] = rand() % 1000; 
e vê se da certo


3. Re: Não consigo compilar, undefined reference.

giuliodanelon_@hotmail.com
Giuio2

(usa Outra)

Enviado em 25/06/2013 - 13:25h

Opa, acho que apaguei os "[]" de alguma forma quando fui postar o códico, mas aqui no meu arquivo.c está certo. Não é esse o meu problema. Valeu


4. Re: Não consigo compilar, undefined reference.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/06/2013 - 14:34h

Giuio2 escreveu:

Opa, acho que apaguei os "[]" de alguma forma quando fui postar o códico, mas aqui no meu arquivo.c está certo. Não é esse o meu problema. Valeu


Provavelmebte está postado sim. Só que, aqui no fórum do VoL, [i] é usado para sinalizar início de texto em caracteres itálicos (sendo o final desse caracteres indicados por [/i]).

Para que o seu programa fique com uma apresentação decente*, incluindo não dar pau com marcadores de texto em itálico, edite a sua postagem original e coloque o seu código entre os marcadores [code] e [/code].

*: Tal funcionalidade de postagem de código, no entanto, não é perfeita. Algumas expressões contendo o caráter de barra invertida ("\"), especialmente o '\0', que é usado no C e no C++ para representar o byte nulo, são interceptadas pelos scripts do site e transformadas em "{TEXTO}" ou "{TTEXTO}".


5. Re: Não consigo compilar, undefined reference.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/06/2013 - 14:46h

Com relação ao problema original, o problema é que declarar a função é uma coisa, e defini-la é outra coisa. Quando você declara a função, o compilador sabe que ela existe, que é uma função, quais argumentos ela espera e que tipo de valor ela retorna, e isso permite a ele gerar código que referencia uma função com tais características.

Mas a efetivação dessa referência é deixada para uma etapa posterior da geração do programa executável, chamada de ligação (ou linking, link-edição, dependendo de quem fala), quando as referências, que ainda usam os nomes dos símbolos (variáveis e funções), são amarrados aos endereços de memória onde tais símbolos residem/devem residir.

Seu prgrama, de fato, compilou, mas não linkou porque o linker não conseguiu localizar a implementação da função sort().

Como você está usando um arquivo de cabeçalhos não-padrão "cc50.h", será que essa função sort() não está numa biblioteca cc50.lib ou cc50.a?


6. Re: Não consigo compilar, undefined reference.

giuliodanelon_@hotmail.com
Giuio2

(usa Outra)

Enviado em 25/06/2013 - 15:17h

 #include <stdio.h>
#include <cc50.h>


void
sort(int valores[], int h);

int
main()
{



int a[10];

for (int i = 0; i < 10; i++) \\ gera os numeros aleatorios e coloca no array a
a[i] = rand() % 1000;

for (i = 0; i < 10; i++) \\ printa os numeros
printf("%d\n", a[i]);

sort(a, 10); \\ aqui que acontece o erro, era para ordenar o array a em ordem crescente

void
sort(int valores[], int h) \\ aqui a funcao que ordena
{
int tmp;
int i, j;

for(i = 0; i < h; i++)
for(j = i + 1; j < h; j++)
if(valores[i] > valores[j])
tmp = valores[j];
valores[j] = valores[i];
valores[i] = tmp;
}


for (i = 0; i < 10; i++) \\ printar o array ja ordenado
printf("%d\n", a[i]);

}



7. Re: Não consigo compilar, undefined reference.

giuliodanelon_@hotmail.com
Giuio2

(usa Outra)

Enviado em 25/06/2013 - 15:38h

paulo1205 escreveu:

Com relação ao problema original, o problema é que declarar a função é uma coisa, e defini-la é outra coisa. Quando você declara a função, o compilador sabe que ela existe, que é uma função, quais argumentos ela espera e que tipo de valor ela retorna, e isso permite a ele gerar código que referencia uma função com tais características.

Mas a efetivação dessa referência é deixada para uma etapa posterior da geração do programa executável, chamada de ligação (ou linking, link-edição, dependendo de quem fala), quando as referências, que ainda usam os nomes dos símbolos (variáveis e funções), são amarrados aos endereços de memória onde tais símbolos residem/devem residir.

Seu prgrama, de fato, compilou, mas não linkou porque o linker não conseguiu localizar a implementação da função sort().

Como você está usando um arquivo de cabeçalhos não-padrão "cc50.h", será que essa função sort() não está numa biblioteca cc50.lib ou cc50.a?


Cara, mas não entendi, essa é uma função "minha", não é só o protótipo + a função ?

Edit: A função cc50.h é só para pegar input no usuário (alternativo ao scanf), que coloquei só por costume.


8. Re: Não consigo compilar, undefined reference.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/06/2013 - 16:24h

Tire a definição de sort() de dentro da definição de main(), deixando as duas no nível mais externo do programa.


9. Re: Não consigo compilar, undefined reference.

giuliodanelon_@hotmail.com
Giuio2

(usa Outra)

Enviado em 26/06/2013 - 10:11h

paulo1205 escreveu:

Tire a definição de sort() de dentro da definição de main(), deixando as duas no nível mais externo do programa.


Ae, agora sim, consegui compilar, mas o programa não esta ordenando os números. Se alguem tiver uma idéia do que pode ser.



#include <stdio.h>
#include <cc50.h>


void
sort(int valores[], int h);

int
main()
{

int a[10];
int i;

for (i = 0; i < 10; i++)
a[i] = rand() % 1000;

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

sort(a, 10);



for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

}

void
sort(int valores[], int h)
{
int tmp;
int i, j;

for(i = 0; i < h; i++)
for(j = i + 1; j < h; j++)
if(valores[i] > valores[j])
tmp = valores[j];
valores[j] = valores[i];
valores[i] = tmp;


}





10. Re: Não consigo compilar, undefined reference.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/06/2013 - 17:42h

Eu sempre recomendo que se compile todo e qualquer programa com o máximo de opções de diagnóstico ligadas, No caso do GCC, eu recomendo "-O2 -Wall -Werror -pedantic".

Se você fizer isso, vai ver uma porção de coisas problemáticas no seu código, e nem vai precisar de que eu lhe diga explicitamente que o problema é que você esquecer de algumas chaves na hora de fazer a troca dos valores.


11. Re: Não consigo compilar, undefined reference.

giuliodanelon_@hotmail.com
Giuio2

(usa Outra)

Enviado em 26/06/2013 - 18:53h

paulo1205 escreveu:

Eu sempre recomendo que se compile todo e qualquer programa com o máximo de opções de diagnóstico ligadas, No caso do GCC, eu recomendo "-O2 -Wall -Werror -pedantic".

Se você fizer isso, vai ver uma porção de coisas problemáticas no seu código, e nem vai precisar de que eu lhe diga explicitamente que o problema é que você esquecer de algumas chaves na hora de fazer a troca dos valores.


Ok, obrigado. Vou tentar compilar com as flags.
Abraços.


12. Re: Não consigo compilar, undefined reference.

giuliodanelon_@hotmail.com
Giuio2

(usa Outra)

Enviado em 26/06/2013 - 19:02h

usuario@usuario-desktop:~/c/sort$ make generate
gcc -std=c99 -O2 -Wall -Werror -pedantic -o generate generate.c -lcc50 -lm
generate.c: Na função ‘sort’:
generate.c:40:24: erro: ‘j’ may be used uninitialized in this function [-Werror=uninitialized]
generate.c:41:28: erro: ‘tmp’ may be used uninitialized in this function [-Werror=uninitialized]
cc1: all warnings being treated as errors
make: ** [generate] Erro 1
usuario@usuario-desktop:~/c/sort$

Pelo que entendi, as variáveis da função sort aparentam não ser usadas. Mas eu não sei como consertar o códico.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts