为什么我的代码崩溃了?

时间:2016-05-18 07:10:26

标签: c pointers

我有一个非常基本的问题,为什么我的代码会崩溃?我正在学习使用指针,我真的不知道为什么代码在输入x1,x2,y1和y2的值后崩溃(这发生在第二个开关的情况3中)。我到处寻找,我找不到理由。我需要将函数menuLR,case 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;
}

1 个答案:

答案 0 :(得分:3)

我认为您正在获取指针的地址并在此部分中作为指针传递:

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

函数menuLR的参数是名称为x1等的变量。这些是类型(float *)。它们碰巧与主函数中的变量具有相同的名称(尽管类型不同)。这就是为什么在一种情况下你不需要&amp;,而在你的主要功能中。