2017-07-20 2 views
-1

Ich habe ein Problem in meinem Code, aber ich weiß nicht, warum ich die Segmentierungsfehler 11. Der Fehler in Zeile geschieht bekommenSegmentierungsfehler 11 aber warum?

#include <stdio.h> 
#include "VectorMath.h" 

int getUserInput() { 
    int userinput; 

    printf("1) Calculating new vector and distance \n"); 
    printf("0) Exit \n"); 

    scanf("%d", &userinput); 

    return userinput; 
} 

void getUserPoint(int vector[3]) { 
    int userinput; 
    char coordinate[] = {'x', 'y', 'z'}; 
    int counter = 0; 

    for(counter = 0; counter < 3; counter++){ 
     printf("%c", coordinate[counter]); 
     scanf("%d", &userinput); 
     vector[counter] = userinput; 
    } 
} 


int main() { 
    int vectorA[3]; 
    int vectorB[3]; 

    int input = 0; 
    int counter = 0; 

    int *p_result; 

    double result; 

    _Bool run = 1; 

    while(run) { 
     input = getUserInput(); 

     if (input == 1){ 
      printf("Enter point A (x,y,z) \n"); 
      getUserPoint(vectorA); 
      printf("Enter point B (x,y,z) \n"); 
      getUserPoint(vectorB); 
     }else if(input == 0) { 
      break; 
     } 

     result = distance(vectorA, vectorB, p_result); 

     printf("The distance between the points A and B is %.2lf \n", result); 
     printf("The vector between the point A and B is \n"); 
     for (counter = 0; counter < 3; counter++){ 
      printf("%d \n", p_result[counter]); 
     } 
    } 

    return 0; 
} 

Dies ist die wichtigste Methode. Der Fehler tritt nach (oder innerhalb) der for-Schleife auf. Der Zeiger wird in dieser C-Datei initialisiert:

#include "VectorMath.h" 
#include <math.h> 

double distance(int pointA[3], int pointB[3], int *p_result) { 
    double distance_result; 
    int vectorbtw[3]; 
    int counter = 0; 

    for(counter = 0; counter < 3; counter++) { 
     vectorbtw[counter] = pointB[counter] - pointA[counter]; 
    } 

    p_result = vectorbtw; 

    for(counter = 0; counter < 3; counter++) { 
     distance_result += pow(vectorbtw[counter], 2); 
    } 

    distance_result = sqrt(distance_result); 

    return distance_result; 
} 

Und das ist der headder:

#ifndef VectorMath_h 
#define VectorMath_h 
    double distance(int pointA[3], int pointB[3], int *p_result); 
#endif 

Sorry für den langen Code, aber ich dachte, dass Sie den gesamten Code benötigen. Wie gesagt, ich weiß nicht, warum das passiert, also wird der Zeiger p_result in der anderen .c-Datei initialisiert und er zeigt auf den Anfang des Arrays.

BEARBEITEN: Ich sollte sagen, dass der Zweck von diesem ist, dass ich eine Funktion habe, die den Abstand zwischen 2 Punkten berechnet und den Abstand UND den Vektor zwischen den zwei Punkten zurückbringt. und deshalb mache ich das mit dem Zeiger p_result.

+0

'p_result' wird nicht von Ihrer Routine geändert. –

Antwort

0

Sie initialisieren int *p_result; nirgendwo. Sie übergeben den Wert eines vereinheitlichten Zeigers an Ihre Distanzroutine. Diese lokale Kopie ist so eingestellt, dass sie auf ein lokales Array zeigt, aber nach diesem Funktionsaufruf ist die p_result in Ihrer Hauptfunktion immer noch nicht initialisiert.

0

Der p_result Zeiger muss gültig Speicher-zu-Punkt, zum Beispiel ein Array, so dass anstelle von

int *p_result; 

Verwendung

int p_result[3]; 

und den Rest unverändert, hat es funktioniert?

Ihre distance() Funktion geht davon aus, dass p_result bereits ein gültiger Zeiger ist, aber um wahr zu sein, muss es irgendwo zeigen. Wie es ist, ist zeigt es nicht überall, weil es nie initialisiert ist, können Sie auch

int result[3]; 
int *p_result; 

p_result = result; 

Ich hoffe, jetzt sehen Sie den Punkt so wie diese es tun.

+0

Ich löste die Segmentierung Fehler, aber ich gebe mir nur Nullen, aber Sie und https://stackoverflow.com/users/1813336/cleblanc beantwortete meine Frage danke. – nCap

Verwandte Themen