Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Structs und ihre Probleme ...  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
nusskipfaL
Unregistrierter




Beitrag nusskipfaL Unregistrierter 09:26:04 28.04.2012   Titel:   Structs und ihre Probleme ...            Zitieren

Hallo!

Stecke seit ca. 24 Stunden beim gleichen Problem und finde den Fehler nicht - alles was ich weiß: "Segmentation fault" ist nicht gut.

Mein Programm soll Daten einlesen (macht es eigentlich ganz okay - würde nur am liebsten von char auf double umstellen, aber das mag es nicht ...). Danach versuche ich die eingelesenen Daten in meine structs zu packen - und da hängts.
Egal in welcher Funktion ich auf meine structs zugreifen möchte: "Segmentation fault".
Speicherverwaltung sollte soweit eigentlich passen, hoffentlich. Habe wahrscheinlich ein paar zu viele mallocs drinnen, da ich alles ausprobiere im Augenblick.
Zuweisen hab ich ganz normal versucht - mittlerweile durch "C von A bis Z" bin ich bei strcpy angelangt. Und selbst wenn ich einen Sourcecode abtippe - natürlich angepasst - funktioniert das nicht.
Bin mit meinem Latein am Ende. Hat jemand eine Idee was nicht passen könnte?

Hier der Source Code - sollte mehr benötigt werden, kein Problem, dachte aber das wären die wichtigsten Zeilen - und ein Auszug aus der Datei zum Einlesen.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
enum PointType
{
    Fix = 1, // Festpunkt (FP)
    Distant, // Fernziel (FZ)
    Terrain, // allgemeiner Punkt (AP)
    Poly, // Polygonpunkt (PP)
    Stand, // Standpunkt (SP)
    Target, // Zielpunkt (ZP)
};
 
struct Coordinates // in Meter
{
    char *y; // y-Koordinate
    char *x; // x-Koordinate
    char *h; // Höhe
};
 
struct Point
{
    char *Number;
    struct Coordinates YXH;
    enum PointType Type;
    enum Processing Status;
    struct Point *Next;
};
 
void Reading(FILE *file_r)
{
#define MAX 256
    char line[MAX];
    char *new_line;
    char type[3], number[8], x[10], y[10], height[6];
    struct Point *Pt;
 
    while(new_line = fgets(line, MAX, file_r))
    {
        sscanf(new_line, "%8s %9s %9s %6s", number, y, x, height);
        Sort(Pt, number, y, x, height);
    }
}
 
struct Point *PAlloc()
{
    if ((struct Point *) malloc (2 * sizeof(struct Point)) == NULL)
    {
        printf("Kein Speicherplatz vorhanden\n");
    }
    return;//((struct Point *) malloc(2 * sizeof(struct Point)));
}
 
void Sort(struct Point *Pt, char number[8], char y[9], char x[9], char height[6])
{
    AssignType(Pt, number);
    struct Coordinates *Co = malloc(2 * sizeof(struct Coordinates));
    struct Point *Ot = malloc(2 * sizeof(struct Point));
 
    strncpy(Pt -> Number, number, 8);
    strcpy(Pt -> YXH.y, y);
    strcpy(Pt -> YXH.x, x);
    strcpy(Pt -> YXH.h, height);
 
    Pt = Assign(Pt);
}
 
struct Point *Assign(struct Point *Pt)
{
    if (First == NULL)
    {
        First = PAlloc();
        First = Pt;
        First -> Next = NULL;
    }
 
    else
    {
        struct Point *NewPt = First;
        while(NewPt -> Next != NULL)
        {
            NewPt = NewPt -> Next;
        }
        NewPt -> Next = PAlloc();
        Insert(NewPt -> Next);
        NewPt -> Next -> Next = NULL;
    }
 
    while(Pt != NULL)
    {
        printf("%8s\n", Pt -> Number);
        Pt = Pt -> Next;
    }
    return Pt;
}
 
struct Point *Insert(struct Point *NewPt)
{
    struct Point *New_Point;
    New_Point = PAlloc();
    NewPt -> Next = New_Point -> Next;
    New_Point -> Next = NewPt;
    return New_Point;
}



Zitat:

FZ.00121 -24296.65 287136.12 450.17
FP.544C1 -25088.78 299000.53 425.20
FP.546C1 -25128.10 299132.40 416.00
FZ.00864 -16516.23 296316.53 428.13
FZ.09463 -24230.38 298448.53 487.12
PP.00001 -25123.36 299089.29 437.55
PP.00002 -25068.71 299025.13 467.64
PP.00003 -25078.45 298993.02 433.05
SP.00336 -2170.18 299079.43 450.00


Es hängt beim ersten Zuweisen in den Struct.
Ich habe auch schon eine Funktion Delte() entworfen, doch da der gleiche Fehler mit strcmp. - und ja, ich habe string.h included. Auch das printen funktioniert überhaupt nicht - ebenfalls "Segmentation Fault".

Bin für jede Hilfe dankbar!
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 09:56:11 28.04.2012   Titel:              Zitieren

Ich finde enirgends eine Speicheranforderung für die 3 Elemente von Coordinates und für Number.

C++:
struct Coordinates // in Meter
{
    char *y; // Wo zeigt der Zeiger hin?
    char *x; // Wo ist der Speicherplatz für die Daten
    char *h; // dto.
};


Wie hast du das mit double probiert?

Ein Zeiger muss auch auf Speicher zeigen der für das Programm reserviert ist.
Und der Speicher sollte natürlich auch für die von dir genutzten Daten reseviert sein, damit du nicht andere Daten überschreibst.
nusskipfaL
Unregistrierter




Beitrag nusskipfaL Unregistrierter 10:23:38 28.04.2012   Titel:              Zitieren

In der Funktion Sort() hätte ich Coordinates mit

C++:
struct Coordinates *Co = malloc(2 * sizeof(struct Coordinates));

allokiert. Sollte das *Co besser ein *YXH werden, da es mit dieser Bezeichnung verwendet wird?

Mit double spiele ich gerade, nur liest's mir da meine Daten überhaupt nicht ein. Irgendwo "is der Hund drin". So wird im Augenblick wenn mit strings eingelesen "nur" y übersprungen - bin gerade auf Fehlersuche.

Dh mit double hätte ich einfach alle char für y, x und height auf double gesetzt.

Mittlerweile hab ich aber wie erwähnt wieder auf char umgestellt, da ich da zumindest 3 von 4 Daten eingelesen bekomme.
Struct-Zuweisung funktioniert mit Pt -> ... = ... (Bei double wäre wieder der übliche Fehler).
Trotzdem lässt es nicht weder printen, noch vergleichen. Segmentation fault. Wie üblich ^^
Daher kann ich weder: Daten hinzufügen, löschen, in Datei schreiben, ausgeben etc. - und genau das wären die zu erledigenden Hauptpunkte. Sollte möglichst in den nächsten Stunden auf den Fehler kommen.
Bin wahrscheinlich schon extremst betriebsblind. Gestern schon stundenlang den gleichen Fehler gesucht.

Im Augenblick sieht also das Sort() so aus:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Sort(struct Point *Pt, char number[8], char *y, char *x, char *height)//, char y[9], char x[9], char height[6])
{
    struct Coordinates *Co = malloc(2 * sizeof(struct Coordinates));
//    struct Point *Pt = malloc(2 * sizeof(struct Point));
 
    Pt -> Number = number;
    Pt -> YXH.y = y;
    Pt -> YXH.x = x;
    Pt -> YXH.h = height;
//    strcpy(Pt -> Number, number);
//    strcpy(Pt -> YXH.y, y);
//    strcpy(Pt -> YXH.x, x);
//    strcpy(Pt -> YXH.h, height);
    AssignType(Pt, number);
 
    Pt = Assign(Pt);
}


Beim Debuggen zeigt es auch dass - wie erwähnt bis auf y - die Daten richtig übernommen werden (http://imageshack.us/photo/my-images/502/debugr.png/.

Und um das Ganze noch komplizierter zu machen hier die Delete()-Funktion, wo ich mein Segmentation Fault bei strcmp habe. Habe natürlich auch schon versucht strncmp mit 8 Zeichen zu machen -> Gleicher Fehler.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void Delete()
{
#define MAXIMA 9
 
    struct Point *Pt, *After;
    char name[9];
 
    printf("Welchen Punkt wollen Sie l%cschen?\n\n", 148);
 
    printf("\nPunktnummer:\t");
    fgets(name,MAXIMA, stdin);
 
    if (First != NULL)
    {
        if (strncmp(First -> Number, name,8) == 0)
        {
            Pt = First;
            First = First -> Next;
            free(Pt);
            //Pt = First -> Next;
            //free(First);
            //First = Pt;
        }
        else
        {
            Pt = First;
            while (Pt -> Next != NULL)
            {
                After = Pt -> Next;
                if (strcmp(After -> Number, name) == 0)
                {
                    Pt -> Next = After -> Next;
                    free(After);
                    break;
                }
                Pt = After;
            }
        }
 
    }
    else printf("Es ist kein Datensatz zum L%cschen vorhanden.\n", 148);
}


Ebenso wenn ich eine kurze while-Schleife zum Ausgeben machen - egal in welcher Funktion

C++:
while (Pt != NULL) {
printf("%s\n", Pt -> Number);
Pt = Pt -> Next;
}


Habe einige Funktionen von: http://openbook.galileocomputing.de/c_von_a_bis_z/021_c_dyn_datenstrukturen_001.htm#mjd019c1a582bc18749ab77c2c95a22350

Hoffe, das sind genügend Informationen und es gibt eine Lösung - irgendwie :(
nusskipfaL
Unregistrierter




Beitrag nusskipfaL Unregistrierter 10:28:59 28.04.2012   Titel:              Zitieren

DirkB schrieb:


C++:
struct Coordinates // in Meter
{
    char *y; // Wo zeigt der Zeiger hin?
    char *x; // Wo ist der Speicherplatz für die Daten
    char *h; // dto.
};



Habe soeben auf y[10] etc. umgestellt - danach liest es mir weder number, noch y oder x aus. height funktioniert.
nusskipfaL
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.04.2012
Beiträge: 3
Beitrag nusskipfaL Mitglied 10:32:53 28.04.2012   Titel:              Zitieren

Und um meinen Beitrag wirr-warr abzuschließen ... Habe gerade entdeckt, obwohl es mir die x (!!) Koordinate nicht mehr ausliest (der Rest ist wieder da ...), funktioniert zumindest das Zuweisen im String mit strcpy ... :confused:

Wenn probiere noch etwas herum - aber bedanke mich schon mal, könnte sein, dass es jetzt besser läuft (:


Zuletzt bearbeitet von nusskipfaL am 10:34:54 28.04.2012, insgesamt 1-mal bearbeitet
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 10:43:41 28.04.2012   Titel:              Zitieren

Du musst dein Konzept nochmal überdenken.
Mit dem
C++:
struct Coordinates *Co = malloc(2 * sizeof(struct Coordinates));
besorgst du Speicher für die struct. Da ist aber kein Speicher für x,y und h dabei.
Da bist du mit dem y[10] schon näher dran.
Mit double noch besser.

Daher nochmal die Frage was du mit double versucht hast, dass das nicht klappt?

Da du nicht weißt was du tust, machst du es mit deinem rumraten/probieren nur noch schlimmer.

Nebenbei hat das Buch in diesem Forum keinen guten Ruf.
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 10:51:26 28.04.2012   Titel:              Zitieren

DirkB schrieb:
Nebenbei hat das Buch in diesem Forum keinen guten Ruf.

Dieses "Nebenbei" würde ich zu einer ganz starken empfehlung machen, das Buch zu entsorgen.
http://www.c-plusplus.de/forum/272350
nusskipfaL
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.04.2012
Beiträge: 3
Beitrag nusskipfaL Mitglied 11:01:11 28.04.2012   Titel:              Zitieren

Alles klar. Hab endlich grundsätzlich verstanden, was ich da mache.

Bei double sieht es dann folgendermaßen aus:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
struct Coordinates // in Meter
{
//    char y[11]; // y-Koordinate
//    char x[10]; // x-Koordinate
//    char h[6]; // Höhe
    double y; // y-Koordinate
    double x; // x-Koordinate
    double h; // Höhe
};
 
struct Point
{
    char Number[10];
    struct Coordinates YXH;
    enum PointType Type;
    struct Point *Next;
};
 
void Reading(FILE *file_r)
{
#define MAX 256
    char line[MAX];
    char *new_line;
    char number[8];//y[11], x[10], height[6];
    double y, x, height;
    struct Point *Pt;
 
    while(new_line = fgets(line, MAX, file_r))
    {
        printf("%s\n", new_line);
        sscanf(new_line, "%8s %9.2lf %9.2lf %6lf", number, y, x, height);
        Sort(Pt, number, y, x, height);
    }
}
 
struct Point *PAlloc()
{
    if ((struct Point *) malloc (2 * sizeof(struct Point)) == NULL)
    {
        printf("Kein Speicherplatz vorhanden\n");
    }
    return;
}
 
//void Sort(struct Point *Pt, char number[8], char y[11], char x[10], char height[6])
void Sort(struct Point *Pt, char number[8], double y, double x, double height)
{
    struct Coordinates *YXH = malloc(2 * sizeof(struct Coordinates));
    AssignType(Pt, number);
//    Pt -> Number = number;
    Pt -> YXH.y = y;
    Pt -> YXH.x = x;
    Pt -> YXH.h = height;
    strcpy(Pt -> Number, number);
//    strcpy(Pt -> YXH.y, y);
//    strcpy(Pt -> YXH.x, x);
//    strcpy(Pt -> YXH.h, height);
 
    Pt = Assign(Pt);
}


Jedoch beim Debuggen: http://img267.imageshack.us/img267/3051/debug2.png - könnte evtl. daran liegen, dass ich mit %9.2lf irgendwie was falsch mache. Außerdem wie wird mein Minus-Zeichen miteingelesen?

Außerdem wenn ich mit der zuvor angegeben While-Schleife versuche zB nur die Nummer auszugeben, dann gibt's nur ganz kryptische Zeichen. Liegt das wieder an der Speicherverwaltung? (Auch wenn ich grundsätzlich verstehe um was es da geht - Anwendung ist gar nicht so leicht). Deswegen finde ich auch beim Vergleich nichts (strcmp) wenn ich einen Punkt löschen möchte ...

Aber: Grundsätzlich funktionieren endlich die String-Funktionen.

(Wenn das Buch nicht unbedingt den besten Ruf hat - gibt's was Besseres zu Empfehlen? - hab's nur aus der Bibliothek ;)).
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 11:02:13 28.04.2012   Titel:              Zitieren

Nochmal zu deinem Code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Sort(struct Point *Pt, char number[8], char y[9], char x[9], char height[6])
{
    AssignType(Pt, number);  // Was macht das? Da sehe keinen Code für die Funktion
    struct Coordinates *Co = malloc(2 * sizeof(struct Coordinates));  // Warum besorgst du doppelt Speicher?
//Warum überhaupt für Coordinates, das ist doch schon in Point drin.
 
    struct Point *Ot = malloc(2 * sizeof(struct Point));  //  Warum auch hier 2 * ?
 
    strncpy(Pt -> Number, number, 8);  // Wo ist der Speicher für Pt angelegt worden?
// in Reading jedenfalls nicht.  
    strcpy(Pt -> YXH.y, y);   // dto.
    strcpy(Pt -> YXH.x, x);   // dto.
    strcpy(Pt -> YXH.h, height);  // dto.
 
Wo benutzt du überhaupt Co und Ot ?
    Pt = Assign(Pt);
}

Insgesamt allerübelster Schrott. Tut mir Leid.

Du hast Zeiger überhaupt nicht begriffen. So wird das nichts.
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 11:09:28 28.04.2012   Titel:              Zitieren

nusskipfaL schrieb:
C++:
    char number[8];//y[11], x[10], height[6];
    double y, x, height;
...
        sscanf(new_line, "%8s %9.2lf %9.2lf %6lf", number, y, x, height);


Wie man double mit sscanf (bzw scanf) einliest sollte auch in deinem Buch richtig beschrieben sein.

Zudem brauchst du bei Zahlen (wenn sie durch Leerzeichen) getrennt sind keine width und precision mit angeben.

Bei der width-Angabe zu number musst auch noch Platz für die '\0' berücksichtigen.
c++.de :: C (C89, C99 und C11) ::  Structs und ihre Probleme ...  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.