2016-05-18 169 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