2016-05-18 170 views
-7

我有一个非常基本的问题,为什么我的代码崩溃?我正在学习使用指针,我真的不知道为什么代码崩溃后,我进入X1,X2,Y1和Y2(这发生在第二开关的情况下3)的值。我到处寻找,找不到理由。我需要的功能menuLR输入的值,案件3发送到功能DistDosPuntos,一个则值恢复为menuLR,案例3为什么我的代码崩溃?

这里是我的代码。

某些代码是在西班牙,但它是不相关的知道代码是如何工作的。在此先感谢您的帮助和耐心,我知道这是相当愚蠢的,但我已经试过几种方法,并没有能够解决任何或不懂的问题

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

void menu1(); 
void menuLR(); 
void DistDosPuntos(); 

void menu1() 
{ 
int a; 
float m,x1,x2,y1,y2,k,v,d; 
printf("MENU PRINCIPAL\n"); 
printf("1.- La línea Recta \n"); 
printf("2.- La circunferencia \n"); 
printf("3.- Coordenaas Polares \n"); 
printf("4.- Salir\n"); 
scanf("%d",&a); 

switch(a) 
{ 
    case 1: 
     menuLR(&m,&x1,&x2,&y1,&y2,&k,&v,&d); 
    break; 

    case 2 : 
    // ; 
    break; 

    case 3 : 
    //; 
    break; 

    case 4 : 
    break ; 
} 

} 

void menuLR (float *m,float*x1,float *x2,float *y1,float*y2,float*k,float   *v,float *d) 
{ 
int b; 


printf("LA LINEA RECTA\n"); 
printf("1.- Ecuación de la recta dada su puendiente y un punto de la misma \n"); 
printf("2.- Ecuación de la recta que pasa por dos puntos\n"); 
printf("3.- Distancia entre dos puntos del plano \n"); 
printf("4.- Punto medio entre dos puntos del plano\n"); 
printf("5.- Perímetro y área de un triángulo en un plano\n"); 
printf("6.- Regresar al menú principal\n"); 
scanf("%d",&b); 

switch (b) 
{ 
    case 1 : 
    printf("Introduzca la pendiente de la recta m y el punto P1(x1,y1)\n"); 
    printf("Introduzca m\n"); 
    scanf("%f",m); 
    printf("Introduzca x1\n"); 
    scanf("%f",x1); 
    printf("Introduzca y1\n"); 
    scanf("%f",y1); 

    printf("La ecuación de la recta es:\n"); 
    printf("y-y1 = m(x-x1)\n"); 
    printf("Sustituyendo valores:\n"); 
    printf("y-%f = %f (x-%f) \n" ,*y1,*m,*x1); 
    printf("Desarrollando y despejando:\n"); 
    *k = ((*m)*(*x1)); 
    printf("y-%f = %fx-%f)\n",*y1,*m,*k); 
    *v= -*k+*y1; 
    printf("y=%fx+(%f)\n",*m,*v); 

    printf("La ecuación de la recta en la forma general 'y=mx+b' es:\n"); 
    printf("y=%fx+(%f)\n",*m,*v); 
    break; 

    case 2 : 



    break; 

    case 3 : 
    printf("Introduzca el punto en el plano P1(X1,Y1)\n"); 
    printf("x1:"); 
    scanf("%f",x1); 
    printf("y1:"); 
    scanf("%f",y1); 
    printf("Introduzca el punto en el plano P2(X2,Y2)\n"); 
    printf("X2:\n"); 
    scanf("%f",x2); 
    printf("Y2:\n"); 
    scanf("%f",y2); 

    DistDosPuntos(&x1,&x2,&y1,&y2,&d); 

    printf("La distancia entre los puntos P1 y P2 es:\n %f",*d); 
    break; 

    case 4 : 
    // exit ; 
    break ; 
    } 
    } 

void DistDosPuntos(float *x1,float *x2, float *y1, float *y2,float *d) 
{ 
    *d = sqrt(pow((*x2-*x1),2) + pow((*y2-*y1),2)); 
} 


int main() 
{ 
int a,b; 
float m,x1,y1,k,v,d,y2,x2; 
menu1(&b,&x1,&y1,&x2,&y2,&m,&k,&v,&d); 
DistDosPuntos(&x1,&x2,&y1,&y2,&d); 


return 0; 
} 
+0

错误日志吗? – MedAl

+3

问题寻求帮助调试(“为什么不是这个代码的工作?”)必须包括所期望的行为,一个特定的问题或错误,并重现它在问题本身所需要的最短的代码。没有明确问题陈述的问题对其他读者无益。请参阅:如何创建最小,完整和可验证示例。 – LPs

+2

学习如何使用调试器的时间。 –

回答

3

我认为你正在服用的地址一个指针和通过如本节的指针:

printf("Y2:\n"); 
scanf("%f",y2); 
// wrong? x1,x2... are *float; Remove the &s 
DistDosPuntos(&x1,&x2,&y1,&y2,&d); 

功能menuLR是的参数是与所述姓名X1变量,等等,这些都是类型(浮子*)的。它们碰巧具有相同的名称(不同类型),而不是主函数中的变量。这就是为什么在一种情况下,你不需要&,而在你的主要功能。

+0

如果你写一些关于本地和GLO我会赞成的变量的范围。 – LPs

+0

你觉得呢?尽管主函数中的变量不是全局变量,所以我不确定如何将全局范围应用到它。 –

+0

OP代码在代码顶部具有与主变量相同的定义,具有全局范围。顺便说一下你的编辑很好。 – LPs