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

17.06.2008, 21:00

Übungsaufgabe 1.4.7 Nr.2

Hallo,

will mich auch mehr über directx lernen, stosse allerdings bereits bei den ersten Programmen auf Fehler.

ich poste mal mein Quellcode

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
#include "TriBase.h"


int main()
{
    if (tbInit())
    {

    }
    else
    {

        void* pData1 = tbMemAlloc(1000 * sizeof(int));//Speicherbereich 1

        void* pData2 = tbMemAlloc(1000 * sizeof(int));//Speicherbereich 2

        void* pTemp = tbMemAlloc(1000 * sizeof(int)); //Hilfsspeicherbereich

        //Größen testen

        if (!pData1)
            tbWriteToLog("Nicht genügend Speicher für pData1");
        if (!pData2)
            tbWriteToLog("Nicht genügend Speicher für pData2");
        if (!pTemp)
            tbWriteToLog("Nicht genügend Speicher für pData3");
        
        //Größe von pData1 ins Log schreiben

        tbWriteToLog("Die reservierte Speichergröße ist %d Byte",tbMemGetSize(pData1));
        
        //Speicherbereiche als Int-Felder initialisieren

        pData1 = new int[1000];
        pData2 = new int[1000];
        pTemp = new int[1000];

        for (int i=0;i<1000;i++)
        {
            pData1[i] = tbIntRandom(0,100);//Random Zahl in pData1 schreiben

            pData2[i] = tbIntRandom(0,100);//Random Zahl in pData2 schreiben

        }
        
        //memcpy(ziel,quelle,größe)

        memcpy(pTemp,pData1,tbMemGetSize(pData1));
        memcpy(pData1,pData2,tbMemGetSize(pData1));
        memcpy(pData2,pTemp,tbMemGetSize(pData1));
    }
    TB_SAFE_MEMFREE(pData1);
    //TB_SAFE_MEMFREE(pData2);

    //TB_SAFE_MEMFREE(pTemp);

    tbExit();

}


Nun zu meinem Fragen:
Warum kommt bei mir der Fehler "void* unbekannte Größe" bei

pData1 = tbIntRandom(0,100);

und warum wird bei TB_SAFE_MEMFREE(pData1); pData1 als nichtdeklarierter Typ bezeichnet?

Hoffe Ihr könnt mir helfen

Falls ich was falsch oder unvollständlich formuliert habe, bitte melden bzw nachfragen.

Danke schonmal für eure Hilfe

butane

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

2

17.06.2008, 21:42

Naja du reservierst zwar Platz für 1000 Int Zahlen - schreibst den Speicherplatz aber in einen void * - und void * sind eben nur als Zeiger gedacht - in void(leer) kann man nix schreiben und deswegen beschwert sich der Kompiler ;).
Du brauchst also nen int * wenn du int Werte reinschreiben willst.

Dann legst du pData in dem else- Block an - wenn du den wieder verlässt wird pData wieder frei und der Kompiler beschwert sich wiederum weil es außerhalb des else Blocks nicht mehr existiert - folglich musste also entweder innerhalb von else freigeben oder außerhalb von else (zB vorm if) pData anlegen

Außerdem - du reservierst zuerst Speicher mit tbMemAlloc, gibst den aber nicht mehr frei, bevorst du einen neuen Speicher mit new anlegst - bei new- bringt dir MEMFREE nix - du brauchst TB_SAFE_DELETE_ARRAY. Memfree solltest du aufrufen bevor du den Speicher mit new reservierst.
Hältst du nicht den Bug in Ehren, wird er dich noch manches Lehren.

Ein Gespräch setzt voraus, dass der andere Recht haben könnte.

3

18.06.2008, 10:52

ok,
Danke für deine schnelle Antwort. Kann es leider erst heut Abend ausprobieren:

C-/C++-Quelltext

1
2
3
4
int * pData1;
pData1 = new int[1000];
for (int i=0;i<1000;i++)
        pData1[i] = tbIntRandom(0,100);


Also brauch ich die Funktion tbMemAlloc ja gar nicht. mmh

tschüss

butane

4

18.06.2008, 18:06

ok so gehts jetzt

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
#include "TriBase.h"


int main()
{
    if (tbInit())
    {

    }
    else
    {

        int* pData1;//Speicherbereich 1

        int* pData2;//Speicherbereich 2

        int* pTemp; //Hilfsspeicherbereich

        int anz=10;//Anzahl Zufallszahlen

        
        //Speicherbereiche als Int-Felder initialisieren

        pData1 = new int[anz];
        pData2 = new int[anz];
        pTemp = new int[anz];

        for (int i=0;i<anz;i++)
        {
            pData1[i] = tbIntRandom(0,100);//Random Zahl in pData1 schreiben

            pData2[i] = tbIntRandom(0,100);//Random Zahl in pData2 schreiben

        
            //Ergebnis in Log schreiben

            tbWriteToLog("pData1[%d]: %d",i ,pData1[i]);
            tbWriteToLog("pData2[%d]: %d",i ,pData2[i]);
        }
        //memcpy(ziel,quelle,größe), Speicherbereiche Tauschen

        memcpy(pTemp,pData1,anz*sizeof(int));
        memcpy(pData1,pData2,anz*sizeof(int));
        memcpy(pData2,pTemp,anz*sizeof(int));
        
        tbWriteToLog("Nach Memcpy Operation");

        //Ergebnis nach memcpy ins Log schreiben

        for(i=0;i<anz;i++)
        {
            tbWriteToLog("pData1[%d]: %d",i ,pData1[i]);
            tbWriteToLog("pData2[%d]: %d",i ,pData2[i]);
        }
    //Speicherbereiche freigeben

    TB_SAFE_DELETE_ARRAY(pData1);
    TB_SAFE_DELETE_ARRAY(pData2);
    TB_SAFE_DELETE_ARRAY(pTemp);
    }

    tbExit();
    return 0;
}


falls noch Fehler drin sind, bzw man eine schlechte programmierweise zieht bitte melden, Für kritische Meinungen bin ich immer offen :-)

Tschüss

butane

Werbeanzeige