Jump to content
manelit

Ajuda com este erro, estou a desesperar.

Recommended Posts

manelit

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

typedef struct place{
char name[20];
int points;
char mayor[20];
struct coordinates *coord;		
}Place;


//estrutura das coordenadas

typedef struct coordinates{
char* latitude;
char* longitude;
}Coordinates;

//////////////////////////////////////////
/*
* IMPORTANTE -> Para compilar e preciso usar o comando -lm por isso tem
* de ser na consola. ->-> gcc -lm coordenadas.c <-<-
* 
* Funções
*->dividir strings done
*->converter em rad done
*->de string para int atoi done
*->ver se é negativo ou positivo o local
*->return distancia done
*/

/*
* recebe um apontador para uma "palavra" … e um "delimitador" para partir a palavra
* incialmente copio o apontador da palavra para uma variavel (do tipo apontador) 
* de seguida, com o for vou procurar o ponto ou o '\0' 
* quando encontrar sai do ciclo for
* no if testo se foi encontrado o ponto, se foi encontrado entao ele "parte" a palavra
*  e mete um '\0' no meio da palavra e retorna o apontador seguinte que está o resto da palavra
*/ 
char *parte(char *str, char lim){ 

char *teste = str;

for (; (*teste != lim) && (*teste != '\0'); teste++);
if(*teste==lim){ 
	teste='\0'; 
	return ++teste;
} 
else{
	return NULL; 
}
}

float toDegree (int x,int y){

return (x+(y/60));
}

float toRad(float x){

float pi = 3.14159265;

return((x*pi)/180);
}

float distance(Place *p1,Place *p2){

int r = 6371,a,b,d; //raio da terra em Km
int g1, m1, g2, m2, g3, m3, g4, m4;
float lat1, lat2, lon1, lon2, dLat, dLon;
char *min1, *min2, *min3, *min4, *str1, *str2, *str3, *str4;

Coordinates *teste1,*teste2;

/*referente a latitude do primeiro lugar*/
teste1 = p1->coord;
strcpy(str1,(teste1->latitude));
min1 = parte(str1,'.');

g1 = atoi(str1);
m1 = atoi(min1);

lat1 = toRad(toDegree(g1,m1));

/*referente a latitude do segundo lugar*/
teste2 = p2->coord;
strcpy(str2, teste2->latitude);
min2 = parte(str2, '.');

g2 = atoi(str2);
m2 = atoi(min2);

lat2 = toRad(toDegree(g2,m2));

/*referente a longitude do primeiro lugar*/

strcpy(str3,teste1->longitude);
min3 = parte(str3,'.');

g3 = atoi(str3);
m3 = atoi(min3);

lon1 = toRad(toDegree(g3,m3));

/*referente a longitude do primeiro lugar*/

strcpy(str4,teste2->longitude);
min4 = parte(str4,'.');

g4 = atoi(str4);
m4 = atoi(min4);

lon2 = toRad(toDegree(g4,m4));

/*calculo da distancia entre os dois lugares*/

dLat = toRad((lat2-lat1));
dLon = toRad((lon2-lon1)); 
a = sinf(dLat/2) * sinf(dLat/2) +
        toRad(cosf(lat1)) * toRad(cosf(lat2)) * 
        sinf(dLon/2) * sinf(dLon/2); 
b = 2 * atan2f(sqrtf(a), sqrtf(1-a));
d = r * b;

return d;
}

int main(){

float dist=0;

Place *p1 = (Place*) malloc(sizeof(Place));
Place *p2 = (Place*) malloc(sizeof(Place));

Coordinates *a = (Coordinates*) malloc(sizeof(Coordinates));
Coordinates *b = (Coordinates*) malloc(sizeof(Coordinates));


strcpy(p1->name,"porto");
strcpy(p2->name,"braga");

p1->points = 10;
p2->points = 20;

strcpy(a->latitude,"50.14");
strcpy(b->latitude,"40.10");
strcpy(a->longitude,"32.00");
strcpy(b->longitude,"45.18");

memcpy(a,p1->coord,sizeof(Coordinates));
memcpy(b,p2->coord,sizeof(Coordinates));

printf("nome:%s ,points:%d,coord %s %s\n",p1->name,p1->points,a->latitude,a->longitude);
printf("nome:%s ,points:%d,coord %s %s\n",p2->name,p2->points,b->latitude,b->longitude);

dist = distance(p1,p2);

printf("distancia:%f\n",dist);

return 0;
}

gcc -Wall -c "coord.c" (na directoria: /home/manuel/Área de Trabalho)

coord.c: In function ‘distance’:

coord.c:79: warning: ‘str1’ is used uninitialized in this function

coord.c:89: warning: ‘str2’ is used uninitialized in this function

coord.c:99: warning: ‘str3’ is used uninitialized in this function

coord.c:109: warning: ‘str4’ is used uninitialized in this function

Compilação concluída com sucesso.

isto aqui é o que recebo quando compilado com f8 no geany.

quando compilo na consola ( gcc -lm coord.c), obvio que me dá segmentation fault.

Podem-me ajudar com este erro se faz favor?

desde já muito obrigado.

Share this post


Link to post
Share on other sites
bubulindo

Acho que tens de criar uma string... e não um apontador.

Ou seja,

char str1[32]; 

O que fizeste foi criar um apontador... que não aponta para nada porque não definiste para onde apontar.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
manelit

sim ja experimentei corrige esse erro e, segmentation fault :P o melhor erro de sempre.

Share this post


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.