Berechnung Länge einer Kettenlinie m Punkte n Dimensionen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
schos22
Beiträge: 1
Registriert: Mo Nov 26, 2012 7:36 pm

Berechnung Länge einer Kettenlinie m Punkte n Dimensionen

Beitrag von schos22 » Mo Nov 26, 2012 7:57 pm

hallo,

ich soll ein Programm schreiben, das die Länge einer Kettenlinie mit m Punkten und n Dimensionen berechnet. m und n werden eingegeben, die Speicherverwaltung der Struktur soll dynamisch sein.

Mein Programm stürzt aber leider immer wieder ab, ich schätze, ich mache was mit der Speicherverwaltung falsch. hat einer von euch eine idee?

Code: Alles auswählen


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

double *ptr;

struct point { //Struktur point mit dynamischer Anzahl von double-Werten
    double* ptr;
};

struct point *p; //dynamische Anzahl an Punkten p aus struct point

double abstand (struct point* p , int n, int m) {
    double d [m-1]; //array zum Speichern der jeweiligen Abstände zwischen je             zwei Punkten
    double D = 0, summe = 0; //D = späteres Ergebnis, Quadratwurzel aus der Summe des obigen arrays
    int abst = 0, dim = 0, j = 0;

    for (;abst < m-1; abst++) { //solange abst kleiner als die Anzahl der Abstände
        for (dim = 0; dim < n; dim++) {
           summe = summe + (p[abst+1].ptr [dim] - p[abst].ptr [dim]) *  (p[abst+1].ptr [dim] - p[abst].ptr [dim]);
       } //wird der Hilfsvariable summe der Wert der alten Summe + der Differenz  des Quadrates der derzeitigen Koordinate zweier Punkte zugewiesen
    d [abst] = summe; //abschließend wird diese summe in einem array-Element    gespeichert und 0 gesetzt
    summe = 0;
   }

   for (j = 0; j < m-1; j++) {
      D = D + d[j]; //solange noch ein Abstand vorhanden, werden diese alle aufaddiert
   }

   D = sqrt (D); //abschließend wird die Quadratwurzel daraus gezogen

   return D; //und das Ergebnis zurückgegeben
}

int main () {

    int n = 0, m = 0, i = 0, k=0;
    char c = 'j';

    printf ("Berechnung Laenge D einer Kettenlinie zwischen m Punkten im n- dimensionalen Raum\n\n");

   while (c== 'j') {

      printf ("n = ");
      fflush (stdin);
      scanf ("%d", &n); //Einlesen der Dimension

      ptr = (double*) malloc (n*(sizeof(double))); //Reservieren Speicherplatz für die n Dimensionen

     printf ("m = ");
     fflush (stdin);
     scanf ("%d", &m); //Einlesen Anzahl Punkte

     p = (struct point*) malloc (m * (sizeof(struct point))); //Reservieren des   Speicherplatzes für die m Punkte

     for (; k<m; k++) { //solange k kleiner ist als die Anzahl der Punkte
        printf ("p%d", k); //Wird dem punkt p k
        printf ("\n");
        for (i=0; i < n; i++) { // solange i kleiner als die Dimension ist
            printf ("%d. Koordinate: ", i+1); //jeweilige Koordinate
            fflush (stdin);
            scanf ("%lf", &p[k].ptr[i]); //der Koordinate i des Punktes k wird ein Wert zugewiesen
            printf ("\n");
        }

      }
    k = 0; //Rücksetzen von k

    printf ("Abstand: %lf", abstand (p, n, m)); //Berechung Abstand zwischen den  Punkten in abstand
    printf ("\n\n");
    free (ptr); //Freigabe Speicherplatz
    free (p);

    printf ("\n\nNochmal? (j/n)");
    fflush (stdin);
    scanf ("%c", &c);
    }

}




Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Berechnung Länge einer Kettenlinie m Punkte n Dimensione

Beitrag von Xin » Mo Nov 26, 2012 8:08 pm

Nur mal flott drübergeguckt, muss also nicht richtig sein:

Code: Alles auswählen

   scanf ("%lf", &p[k].ptr[i]); //der Koordinate i des Punktes k wird ein Wert zugewiesen
Du forderst Speicher für p an. Wo forderst Du Speicher für p.ptr an?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Berechnung Länge einer Kettenlinie m Punkte n Dimensione

Beitrag von cloidnerux » Mo Nov 26, 2012 8:09 pm

Mein Programm stürzt aber leider immer wieder ab, ich schätze, ich mache was mit der Speicherverwaltung falsch. hat einer von euch eine idee?
Ich denke mal, es sind Indexprobleme

Code: Alles auswählen

p[abst+1].ptr [dim] - p[abst].ptr [dim]
Wenn abst dein Indexzähler ist und dein Array m Elemente besitzt, wirst du bis m-1 und dann hier m-1+1 rechnen, greifst also auf ein Element dahinter zu.

Code: Alles auswählen

   p = (struct point*) malloc (m * (sizeof(struct point)));
...
 scanf ("%lf", &p[k].ptr[i]);
Du Weist zwar deinem Array aus point-structs einen Speicherplatz zu, aber dem Array aus doubles(ptr) jedes einzelnen Punktes weist du nichts zu. Daher greifst du hier auf vollkommen willkürliche Speicherzellen zu. Du musst jedem einzelnen ptr aus dem point-struct Speicherplatz zuweisen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Fisherman
Beiträge: 84
Registriert: Mi Jun 06, 2012 4:53 am
Wohnort: 127.0.0.1

Re: Berechnung Länge einer Kettenlinie m Punkte n Dimensione

Beitrag von Fisherman » Mo Nov 26, 2012 8:29 pm

Code: Alles auswählen

struct point { //Struktur point mit dynamischer Anzahl von double-Werten
    double* ptr[];
Zumindest läuft dadurch die Abfrage der Koords komplett durch. (Array von Pointern)
There is no place like 127.0.0.1

Antworten