A primeira coisa a fazer é tentar entender o programa exemplo dado pelo professor. O programa mostrado nos slides tem alguns erros que eu espero ter corrigido aqui. Esse é o nosso primeiro exercício que requer mais de um arquivo:
ponto.h12345678910111213 | /* TAD: Ponto (x,y) *//* Tipo exportado */typedef struct ponto Ponto;/* Funções exportadas *//* Função cria - Aloca e retorna um ponto com coordenadas (x,y) */Ponto* pto_cria (float x, float y);/* Função libera - Libera a memória de um ponto previamente criado */void pto_libera (Ponto* p);/* Função acessa - Retorna os valores das coordenadas de um ponto*/void pto_acessa (Ponto* p, float* x, float* y);/* Função atribui - Atribui novos valores às coordenadas de um ponto */void pto_atribui (Ponto* p, float x, float y);/* Função distancia - Retorna a distância entre dois pontos */float pto_distancia (Ponto* p1, Ponto* p2); |
ponto.cpp12345678910111213141516171819202122232425262728293031323334353637383940 | #include <iostream>#include <math.h>#include "ponto.h" using std::cout;using std::endl; struct ponto { float x; float y;};//Implementa as funções criadas no "ponto.h"Ponto* pto_cria (float x, float y) { Ponto* p = new Ponto; if (p == NULL) { cout << "Memória insuficiente!\n" << endl; exit(1); } p->x = x; p->y = y; return p;}void pto_libera (Ponto* p) { delete p; } void pto_acessa (Ponto* p, float* x, float* y) { *x = p->x; *y = p->y;}void pto_atribui (Ponto* p, float x, float y) { p->x = x; p->y = y;}float pto_distancia (Ponto* p1, Ponto* p2) { float dx = p2->x - p1->x; float dy = p2->y - p1->y; return sqrt(dx*dx + dy*dy);} |
main.cpp12345678910111213141516 | #include <iostream>#include "ponto.h" using std::cout;using std::endl; int main (void) { float x, y; Ponto* p = pto_cria(2.0,1.0); Ponto* q = pto_cria(3.4,2.1); float d = pto_distancia(p,q); cout <<"Distancia entre pontos: "<< d << endl; pto_libera(q); pto_libera(p); return 0;} |
Rodar esse programa é um pouco mais complicado que o que estávamos acostumados. Até agora todos os exercícios podiam ser executados no DevC++ em um único arquivo e sem a criação de um projeto. Mas agora você precisa criar um projeto e adicionar esses três arquivos, do contrário você vai se deparar com esses erros:
undefined reference to `'pto_cria(float, float)'
undefined reference to `'pto_cria(float, float)'
undefined reference to `'pto_distancia(ponto*, ponto*)'
undefined reference to 'pto_libera(ponto*)'
undefined reference to 'pto_libera(ponto*)'
Isso acontece porque o arquivo
main.cpp tem uma referência a
ponto.h, mas em
ponto.h não h´á referência a
ponto.cpp. Eu esperava que por terem o mesmo nome essa localização fosse automática, mas não é. "undefined reference" significa que o linker não consegue encontrar o arquivo compilado que tem a implementação das funções.