Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.06.2011, 18:52

Probleme mit sscanf

Hallo,

bei den 2ten Übungsaufgaben muss man eine Textdatei Parsen.

Diese Textdatei hat bei mir folgenden Inhalt:

C-/C++-Quelltext

1
2
3
4
5
(1.0,2.0,3.0,4.0;5.0,4.0,3.0,2.0;1.0,2.0,3.0,4.0;1.0,2.0,3.0,4.0)
(1.0,2.0,3.0)
(5.0,4.0,3.0)
(2.0,5.0,8.0)
(2.0,3.0,4.0)


Das erste ist die Matrix die zum transformieren verwendet werden soll.
Die restlichen zeilen sind Vektoren

Nun wollte ich diese Datei parsen aber ich finde keine elegante Lösung die schnell ist und gut funktioniert. Im Moment bin ich bei sscanf gelandet, jedoch bekomm ich während das Programm läuft heftige Fehler. Beim Debuggen sehe ich auch, dass sscanf nicht die richtigen Werte in den Array schreibt.

Wäre super wenn ihr mir da einen Tip geben könntet wie man allgemeine in c++ elegant parst bzw. wie ich mein Problem behebe :).

C-/C++-Quelltext

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
102
103
104
105
106
107
108
109
110
#include 
#include 

using namespace std;

int main() 
{

//Aufgabe 1: 5000 Zufallsvektoren mit einer Länge zwischen 0,10
//addieren und durch 5000 rechnen
if(tbInit())
{
cout << "Fehler bei der TriBase Initialisierung";
return 1 ;
}


tbVector3 vector[5000];
//5000 stueck erzeugen
for(int i = 0; i < 5000; i++)
{
vector[i] = tbVector3(tbFloatRandom(-5.7, 5.7),tbFloatRandom(-5.7, 5.7),tbFloatRandom(-5.7, 5.7));
}

tbVector3 sumVector = tbVector3(0,0,0);
for(int i = 0; i < 5000; i++)
{
sumVector += vector[i];
}

sumVector /= 5000;

tbWriteVector3ToLog(sumVector);


//Aufgabe 2, Transformieren von Vektoren
//1 Matrix, x Vektoren einlesen
//x Vektoren transformiert schreiben
FILE * pFile;
char sMystring [100];
string sReadString;
//Datei zeile für Zeile lesen
float fMatrixValue[16];
float fVectorValue[3];
//Platz fuer 256 Vektoren
tbVector3 vVector_a2[256];
tbMatrix mMatrix;
tbVector3 vTransformed;
int iVectorCount = 0;
pFile = fopen ("Eingabe.txt" , "r");
if (pFile == NULL) perror ("Error opening file");
else 
{
int i = 0;
//Liest die ersten 100 Zeichen oder es kommt ein Zeilenumbruch
while(fgets (sMystring , 100 , pFile) != NULL)
{
//Das erste Element ist die Matrix
if(i++ == 0)
{
sscanf(sMystring,"(%f,%f,%f,%f;%f,%f,%f,%f;%f,%f,%f,%f;%f,%f,%f,%f)",
fMatrixValue[0],fMatrixValue[1],fMatrixValue[2],fMatrixValue[3],
fMatrixValue[4],fMatrixValue[5],fMatrixValue[6],fMatrixValue[7],
fMatrixValue[8],fMatrixValue[9],fMatrixValue[10],fMatrixValue[11],
fMatrixValue[12],fMatrixValue[13],fMatrixValue[14],fMatrixValue[15]);

mMatrix = tbMatrix(fMatrixValue[0],fMatrixValue[1],fMatrixValue[2],fMatrixValue[3],
fMatrixValue[4],fMatrixValue[5],fMatrixValue[6],fMatrixValue[7],
fMatrixValue[8],fMatrixValue[9],fMatrixValue[10],fMatrixValue[11],
fMatrixValue[12],fMatrixValue[13],fMatrixValue[14],fMatrixValue[15]);
}
//Die weiteren sind Vektoren
else
{

if(i > 255)
TB_ERROR("Zu Viele Vektoren!",1);

sscanf(sMystring, "(%f,%f,%f)",fVectorValue[0], fVectorValue[1], fVectorValue[2]);
vVector_a2[iVectorCount++] = tbVector3(fVectorValue[0], fVectorValue[1], fVectorValue[2]);

}



}
fclose (pFile);

pFile = fopen ("Ausgabe.txt" , "w");
for(int i = 0; i < iVectorCount; i++)
{

//Vektor transformieren und direkt in Datei schreiben
vTransformed = tbVector3TransformCoords(vVector_a2[i], mMatrix);
sprintf(sMystring, "(%f,%f,%f)\n", vTransformed.x, vTransformed.y, vTransformed.z);
fputs (sMystring,pFile);

}
fclose (pFile);
}




//Enigne herrunterfahren
tbExit();

system("pause");

}


Wenn ich es starte bekomme ich folgende Ausgabe:
Run-Time Check Failure #3 - The variable 'fMatrixValue' is being used without being initialized.

Theoretisch müsste ja sscanf fMatrixValue initialisieren.

BG

2

28.06.2011, 18:54

naja..... Wie willst du etwas mit sccanf auslesen wenn gar nichts da ist?
Metal ist keine Musik sondern eine Religion.

3

28.06.2011, 18:57

Zeile 56 liest die erste Zeile ein , bestätigt mir auch der debugger, also das ist schon gefüllt sMystring :)

4

28.06.2011, 20:15

/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 04:08)


5

28.06.2011, 20:38

Lösung gefunden! Danke an euch 2.

Trotzdem nochmal zur Klarstellung der folgende Code:

C-/C++-Quelltext

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
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <TriBase.h>

using namespace std;

int main() 
{

    //Aufgabe 1: 5000 Zufallsvektoren mit einer Länge zwischen 0,10
    //addieren und durch 5000 rechnen
    if(tbInit())
    {
        cout << "Fehler bei der TriBase Initialisierung";
        return 1 ;
    }
    

    tbVector3 vector[5000];
    //5000 stueck erzeugen
    for(int i = 0; i < 5000; i++)
    {
        vector[i] = tbVector3(tbFloatRandom(-5.7, 5.7),tbFloatRandom(-5.7, 5.7),tbFloatRandom(-5.7, 5.7));
    }

    tbVector3 sumVector = tbVector3(0,0,0);
    for(int i = 0; i < 5000; i++)
    {
        sumVector += vector[i];
    }

    sumVector /= 5000;

    tbWriteVector3ToLog(sumVector);
    
    
    //Aufgabe 2, Transformieren von Vektoren
    //1 Matrix, x Vektoren einlesen
    //x Vektoren transformiert schreiben
    FILE * pFile;
    char sMystring [100];
    string sReadString;
    //Datei zeile für Zeile lesen
    float fMatrixValue[16];
    float fVectorValue[3];
    //Platz fuer 256 Vektoren
    tbVector3 vVector_a2[256];
    tbMatrix mMatrix;
    tbVector3 vTransformed;
    int iVectorCount = 0;
    pFile = fopen ("Eingabe.txt" , "r");
    if (pFile == NULL) perror ("Error opening file");
    else 
    {
        int i = 0;
        //Liest die ersten 100 Zeichen oder es kommt ein Zeilenumbruch
        while(fgets (sMystring , 100 , pFile) != NULL)
        {
            //Das erste Element ist die Matrix
            if(i++ == 0)
            {
                sscanf(sMystring,"(%f,%f,%f,%f;%f,%f,%f,%f;%f,%f,%f,%f;%f,%f,%f,%f)",
                &fMatrixValue[0],&fMatrixValue[1],&fMatrixValue[2],&fMatrixValue[3],
                &fMatrixValue[4],&fMatrixValue[5],&fMatrixValue[6],&fMatrixValue[7],
                &fMatrixValue[8],&fMatrixValue[9],&fMatrixValue[10],&fMatrixValue[11],
                &fMatrixValue[12],&fMatrixValue[13],&fMatrixValue[14],&fMatrixValue[15]);

                mMatrix = tbMatrix(fMatrixValue[0],fMatrixValue[1],fMatrixValue[2],fMatrixValue[3],
                fMatrixValue[4],fMatrixValue[5],fMatrixValue[6],fMatrixValue[7],
                fMatrixValue[8],fMatrixValue[9],fMatrixValue[10],fMatrixValue[11],
                fMatrixValue[12],fMatrixValue[13],fMatrixValue[14],fMatrixValue[15]);
            }
            //Die weiteren sind Vektoren
            else
            {
                
                if(i > 255)
                    TB_ERROR("Zu Viele Vektoren!",1);
                
                sscanf(sMystring, "(%f,%f,%f)",&fVectorValue[0], &fVectorValue[1], &fVectorValue[2]);
                vVector_a2[iVectorCount++] = tbVector3(fVectorValue[0], fVectorValue[1], fVectorValue[2]);
            
            }

            
            
        }
        fclose (pFile);

        pFile = fopen ("Ausgabe.txt" , "w");
        for(int i = 0; i < iVectorCount; i++)
        {

            //Vektor transformieren und direkt in Datei schreiben
            vTransformed = tbVector3TransformCoords(vVector_a2[i], mMatrix);
            sprintf(sMystring, "(%f,%f,%f)\n", vTransformed.x, vTransformed.y, vTransformed.z);
            fputs (sMystring,pFile);

        }
        fclose (pFile);
    }




    //Enigne herrunterfahren
    tbExit();

    system("pause");

}


Es lag nicht an der initialisierung, jedoch brachte das vorherige Initialisierung ( durch den Tip von den 2 Vorpostern , danke! ) mich weiter und dann stand da etwas von Zugriffsverletzung.

Hier das Problem:

Zitat

The sscanf function reads data from buffer into the location given by each argument. Every argument must be a pointer to a variable with a type that corresponds to a type specifier in format. The format argument controls the interpretation of the input fields and has the same form and function as the format argument for the scanf function. If copying takes place between strings that overlap, the behavior is undefined.
Es waren keine Pointer die ich übergeben habe, daher keine initialisierung :)

trotzdem danke und schönen tag noch :)

Werbeanzeige