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

Seal33

Frischling

  • »Seal33« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

11

17.07.2014, 13:45

Hmm also mein Problem wäre dann eher das Konkrete einlesen. Also könnte ich zB tbReadRawFile("Eingabe.txt", ??); aufrufen, aber was genau muss ich denn als 2. Parameter (void**) übergben? Ich verstehe das mit dem void** halt nicht so ganz... ich könnte neatürlich einfach eine variable void** Speicher; erstellen aber was ürde die dann machen? und wie könnte ich daraus schließlich die Vektoren lesen? ?(

Sry dass ich da so wenig kaier und dich jetzt damit vermutlich etwas nerver aber ich kann nicht guten gewissens weiter machen mit dem Gedanken eine der ÜBUNGSaufgaben nicht hinbekommen zu haben... :wacko:

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

12

17.07.2014, 17:36

Es geht um die fopen bzw. fread Funktion. Siehe Quellcode. :grumble: Bitte keine Kritik, hab die letzen 10 Jahre kein C mehr programmiert. :whistling:


#include
<stdafx.h>
#include<StdIO.h>
#include<Sys\\Stat.h>

long ReadTextFile(void); // Deklaration
// Hauptproggy

Main()
{

ReadTextFile(); // Funktionsaufruf

}


// Funktion liest Daten aus Textdatei Eingabe.txt
long
ReadTextFile(void)
{

struct stat FileStats; // Statistiken der Datei
FILE* pFile; // Dateihandle
char cData[4096]; // 4096 Zeichen



// Größe der Datei abfragen
stat("C:\\Users\\Public\\Documents\\Eingabe.txt", &FileStats);
if(FileStats.st_size <= 0) return -1; // Fehler
if(FileStats.st_size >= 4096) return -1; // Fehler - Siehe Deklaration
// Speicherbereich reservieren
ZeroMemory(&cData, FileStats.st_size * sizeof(char));
// Textdatei zum Lesen öffnen
pFile = fopen("C:\\Users\\Public\\Documents\\Eingabe.txt", "rt");
if(!pFile) return -1; // Fehler
// Daten lesen
if(fread(&cData, FileStats.st_size, 1, pFile) != 1) return -1; // Fehler // Datei schließen
fclose(pFile);
// Gucken was drinsteht :grumble:
printf(cData);


return 0; // Und tschüss ;)
}
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »ByteJunkie« (17.07.2014, 20:29)


Seal33

Frischling

  • »Seal33« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

13

18.07.2014, 18:18

so das hat mir jetzt wirklich weitergeholfen! Allerdings hat selbst das mein Problem leider immer noch nicht lösen können ?( sry. Also jetzt (ich ahb das ein wenig umgeschrieben) steht zwar in einem String was in der Eingabe.txt steht, allerdings müssen ja die VEKTOREN (und matrizen) eingelesen und als solche erkannt werden... da besteht mein Problem. Die Datei muss eingelesen werden und dann muss der Kompiler die Vektoren in der Datei mit der Matrix in der Datei Transformieren. Er muss also diese Variablen erkennen und DA liegt mein Problem.

Danke nochmal dass du dir so einen Aufwand wegen mir gemacht hast :thumbup:

Seal

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

14

18.07.2014, 18:46

Die Erkennung musst du selber durchführen. Denk dir eine Syntax aus und probiere einen Parser zu schreiben.

Seal33

Frischling

  • »Seal33« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

15

18.07.2014, 20:04

Ok also ich bin jetzt immerhin soweit gekommen alle Vektoren im Text zu finden, aber weiß einer wie man einen unbekannten integer in einem string suchen kann? also zB dass ich den String "adfe 234 afeaf" habe und jetzt den Text bloß nach einer Zahl durchsuche. Gefunden werden soll dann in dem fall 234, was ich wiederum in einen integer speichern will... geht das?

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

16

18.07.2014, 20:07

Seal33 schrieb: ... Die Datei muss eingelesen werden und dann muss der Kompiler die Vektoren in der Datei mit der Matrix in der Datei Transformieren. ...

Nicht der Kompiler, sondern der Programmierer soll laut Aufgabe ein Programm schreiben, das die Transformation nach dem Einlesen der Daten durchführt.
Dann soll der Programmierer die transformierten Daten in die: AUSGABE.TXT schreiben. (Nimm die fwrite Funktion) ;)
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

Seal33

Frischling

  • »Seal33« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

17

18.07.2014, 20:10

hmmm ok ich glaube ich habe eine idee wie ich das jetzt mache :) und vielen dank nochmal!

Sollte es klappenw erde ich meine finale lösung hier natürlich posten

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

18

18.07.2014, 20:14

Ok also ich bin jetzt immerhin soweit gekommen alle Vektoren im Text zu finden, aber weiß einer wie man einen unbekannten integer in einem string suchen kann? also zB dass ich den String "adfe 234 afeaf" habe und jetzt den Text bloß nach einer Zahl durchsuche. Gefunden werden soll dann in dem fall 234, was ich wiederum in einen integer speichern will... geht das?


Ja das geht, das nennt man PARSEN. Das ist das schöne am Programmieren. :thumbup: Da kann man tolle Sachen machen ... XD

Ergänzung: Ich bin gerade über das Beispiel Kapitel 09, Proggy: 05 - Skripte gestolpert. (Kann ich Dir nur empfehlen mal anzuschauen.)
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ByteJunkie« (19.07.2014, 11:24)


Seal33

Frischling

  • »Seal33« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

19

19.07.2014, 14:00

So, ich habe es jetzt endlich geschafft :) Das mit dem Kapitel über Skripte habe ich leider erst sehr spät gesehen aber da hab ich das eh nicht mehr gebraucht. Der Quellcode ist jetzt zwar vermutlich recht unübersichtlich und an manchen Stellen unnötig lang, aber ich hatte jtzt wirklich keine Lust den nochmal zu überarbeiten! Hier also der Quellcode (windows anwendung)


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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
#include <iostream>
#include <TriBase.h>
#include <string>
#include <fstream>
#include <sstream>

using namespace std;


string GetFile(string Filename);


int WINAPI WinMain(HINSTANCE Instance, HINSTANCE PrevInstance,
                    char* pcCommandLine, int iShowCommand)
{
    string sTempS;//Inhaltsstring
    int iPos = 0;
    int iNextPos = 0;
    int iComPos = 0; //Kommaposition
    int iComPosNew = 0;
    int iNumLenght = 0;
    int iNumV = 0;
    int iVList[99];
    int iValue = 0;
    string sValue = "";
    string sTempValue;
    char cLet;
    tbVector3 vVector[128];
    tbVector3 vVectorTransformed[128];
    tbMatrix mMatrix;
    bool FoundVector = true;

    //TriBase Engine initialisieren
    tbInit();

    //Einlesen
    //--------------------------------------------------------------------------------------------------------

    //Datei öffnen und in String schreiben
    sTempS = GetFile("Eingabe.txt");

    while (FoundVector==true)
    {
        iPos = static_cast<int> (sTempS.find ("tbVector3", iNextPos));

        if (iPos == string::npos)
        {
            //Kein Vektor gefunden!
            FoundVector = false;
            tbWriteToLog("Kein Vektor mehr gefunden!");
        }
        else
        {
            iNumV++;
            iVList[iNumV] = iPos;

            //Vektor gefunden!
            //Vektordaten...

            iComPos = static_cast<int> (sTempS.find (",", iPos));
            iNumLenght = iComPos - iPos - 11;

            sValue = "";

            for (int i = iNumLenght; i>=1; i--)
            {
                iValue = 0;

                int iComPdi = iComPos - i;

                cLet = sTempS[iComPdi];

                sTempValue = cLet;

                sValue = sValue + sTempValue;

                iValue = stoi(sValue);

                vVector[iNumV].x = iValue;
            }

            iComPos = iComPos +1;
            iComPosNew = static_cast<int> (sTempS.find (",", iComPos));
            iNumLenght = iComPosNew - iComPos;
            iComPos = iComPosNew;

            sValue = "";

            for (int i = iNumLenght; i>=1; i--)
            {
                iValue = 0;

                int iComPdi = iComPos - i;

                cLet = sTempS[iComPdi];

                sTempValue = cLet;

                sValue = sValue + sTempValue;

                iValue = stoi(sValue);

                vVector[iNumV].y = iValue;
            }

            iComPos = iComPos +1;
            iComPosNew = static_cast<int> (sTempS.find (")", iComPos));
            iNumLenght = iComPosNew - iComPos;
            iComPos = iComPosNew;

            sValue = "";

            for (int i = iNumLenght; i>=1; i--)
            {
                iValue = 0;

                int iComPdi = iComPos - i;

                cLet = sTempS[iComPdi];

                sTempValue = cLet;

                sValue = sValue + sTempValue;

                iValue = stoi(sValue);

                vVector[iNumV].z = iValue;
            }

            tbWriteVector3ToLog(vVector[iNumV]);
            tbWriteToLog("Das war Vektor %d", iNumV);
        }
        iNextPos = iPos;
        iNextPos++;
    }

    iPos = static_cast<int> (sTempS.find ("tbMatrix", 0));

    if (iPos == string::npos)
    {
        //Kein Vektor gefunden!
        tbWriteToLog("Es konnte keine Matrix in der Datei gefunden werden!");
    }
    else
    {

        int iRow = 0;
        int iColumn = 0;

            for (int i = 1; i<17; i++)
            {
                iColumn++;
                if (iColumn == 5)
                {
                    iColumn = 1;
                }

                if (i>0 && i<5)
                {
                    iRow = 1;
                }
                else if (i>4 && i<9)
                {
                    iRow = 2;
                }
                else if (i>8 && i<13)
                {
                    iRow = 3;
                }
                else if (i>12 && i<16)
                {
                    iRow = 4;
                }

                //--------------------------------------------------------
                int iComPosOldP = iComPos + 1;
                
                if (iRow == 1 && iColumn == 1)
                {
                    iComPos = static_cast<int> (sTempS.find (",", iPos));
                    iNumLenght = iComPos - iPos - 10;
                }
                else if(iRow == 4 && iColumn == 4)
                {
                    iComPos = static_cast<int> (sTempS.find (")", iComPosOldP));
                    iNumLenght = iComPos - iComPosOldP;
                }
                else
                {
                    iComPos = static_cast<int> (sTempS.find (",", iComPosOldP));
                    iNumLenght = iComPos - iComPosOldP;
                }
                sValue = "";
                for (int j = iNumLenght; j>=1; j--)
                {
                    int iComPdi = iComPos - j;

                    cLet = sTempS[iComPdi];

                    sTempValue = cLet;

                    sValue = sValue + sTempValue;

                    iValue = stoi(sValue);
                }
                mMatrix(iRow, iColumn) = iValue;

                //--------------------------------------------------------
            }
        tbWriteMatrixToLog(mMatrix);
    }
    
    //Einlesen ist nun fertig
    //------------------------------------------------------------------------------------------------------------------
    //Vektoren mit Matrix transformieren

    //Nur die Vektoren die auch eingelesen wurden
    for (int i = 1; i<=iNumV; i++)
    {
        vVectorTransformed[i] = tbVector3TransformCoords(vVector[i], mMatrix, NULL);
        tbWriteToLog("Vektor %d transformiert:", i);
        tbWriteVector3ToLog(vVectorTransformed[i]);
    }

    //In Datei schreiben
    //------------------------------------------------------------------------------------------------------------------
    //String erstellen in dem die Vektoren stehen
    string sFString = "";
    string sString = "";
    stringstream ss;

    for (int i = 1; i<=iNumV; i++)
    {
        sString = " tbVector3 (";
        sFString += sString;

        ss << vVectorTransformed[i].x;
        sString = ss.str(); 
        sFString += sString;
        ss.str("");

        sString = ", ";
        sFString += sString;

        ss << vVectorTransformed[i].y;
        sString = ss.str(); 
        sFString += sString;
        ss.str("");

        sString = ", ";
        sFString += sString;

        ss << vVectorTransformed[i].z;
        sString = ss.str();
        sFString += sString;
        ss.str("");

        sString = ")\n";
        sFString += sString;
    }

    fstream f;
    f.open("Ausgabe.txt", ios::out);
    f << sFString << endl;
    f.close();

    //TriBase Engine herunterfahren
    tbExit();
    return 0;
}

string GetFile(string Filename)
{
    string sLine;
    string sContent;
    ifstream Source;
    Source.open(Filename.c_str());

    if (!Source)
    {
        tbWriteToLog("Datei konnte nicht geöffnet werden");
    }
 
    while (!Source.eof())
    {
        getline(Source,sLine);
        sContent = sContent + sLine;
    }

    tbWriteToLog("");
 
    return sContent;
}


In der Eingabe.txt schreibt man dann etwas im Format

tbVector3 (1,43,4)
tbVector3 (24,2,23432)
tbVector3 (57,2,4)
tbVector3 (1,2,4)
tbMatrix (1,54,7,2,876,213,5,2,86,12,643,234,1,2,3,4)


UND NICHT ANDERS!!!! (als zB. kein Space nach den kommas usw. Hätte ich zwar einfügen können war aber zu faul. Ebenso habe ich verpennt dass man auch floats einlesen können sollte, abr naja geschafft hätte ich das bestimmt ohne probleme ^^)

Vielen Dank noch mal für die Hilfe :D

Seal

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

20

19.07.2014, 14:28

Prima, nicht schlecht! :thumbsup: Hab es zwar nicht ausprobiert, aber ist bestimmt für den einen oder anderen nützlich. :)
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

Werbeanzeige