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

11

02.02.2005, 20:29

zum codebsp steven77:
die for schleife verursacht wahrscheinlich einen fehler weil tbMemGetSize die groesse in bytes zurückliefert. ein int hat aber 4 bytes. deswegen bereichsfehler.

du musst doch auch noch memory2 füllen??

auf die erste speicherstelle greifst du so zu: memory1[0] = bla;
auf die zweite " greifst du so zu: memory1[1] = blub;
auf die dritte " greifst du so zu: memory1[2] = bläh;
usw....
bla, blub und bläh sollten ints sein...

ich hab die übung mit nur 10 ints gemacht, damit man den inhalt der bereiche noch bequem ins logbuch schreiben kann. so kann man sehen ob das tauschen auch geklappt hat! ( der code is aber etwas länger):

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
#include <windows.h>
#include <tribase.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
                          int iCmdShow)
{

    //tribase engine aufrufen..

    if(tbInit())
    {
        MessageBox(NULL, "Es ist ein Fehler aufgetreten...",
                        "tbInitError",
                        MB_ICONINFORMATION | MB_OK);
    }
    else
    {
        MessageBox(NULL, "Tribase success!", "tbinit", MB_ICONINFORMATION | MB_OK);


        int i;
        int numberOfElements = 10;
        int memSize = numberOfElements * sizeof(int);

    //speicher resevieren 

        int* pMem1 = (int*)(tbMemAlloc(memSize));
        int* pMem2 = (int*)(tbMemAlloc(memSize));

       //werte neiwurschteln:

        if(tbMemIsValid(pMem1))
        {
            for(i = 0; i < numberOfElements; i++)
                pMem1[i] = tbIntRandom(0,100);
        }
        

        if(tbMemIsValid(pMem2))
        {
            for(i=0; i < numberOfElements; i++)
                pMem2[i] = tbIntRandom(0,100);
        }


        tbWriteToLog("\n Inhalt von pMem1: \n");
        for(i=0; i < numberOfElements; ++i)
            tbWriteToLog("%d \n", pMem1[i]);

        tbWriteToLog("\n");
        tbWriteToLog("Inhalt von pMem2: \n");

        for(i=0; i < numberOfElements; ++i)
            tbWriteToLog("%d \n", pMem2[i]);

    //tauschen von pmem1 und pmem2...


        int* pTmp = (int*) (tbMemAlloc(memSize));

        if(tbMemIsValid(pTmp))
        {
            for(i=0; i < numberOfElements; ++i)
                pTmp[i] = pMem1[i];
        }
    
        for(i=0; i < numberOfElements; ++i)
            pMem1[i] = pMem2[i];

        for(i=0; i < numberOfElements; ++i)
            pMem2[i] = pTmp[i]; 


        TB_SAFE_MEMFREE(pTmp);

    //zum gucken in tbLogdatei schreiben...


        tbWriteToLog("\n\n nach dem tausch... \n");

        tbWriteToLog("\n Inhalt von pMem1: \n");
        for(i=0; i < numberOfElements; ++i)
            tbWriteToLog("%d \n", pMem1[i]);

        tbWriteToLog("\n");
        tbWriteToLog("Inhalt von pMem2: \n");

        for(i=0; i < numberOfElements; ++i)
            tbWriteToLog("%d \n", pMem2[i]);



        TB_SAFE_MEMFREE(pMem1);
        TB_SAFE_MEMFREE(pMem2);
    }

    tbExit();

    return 0;
}

bei mir geht das...

12

02.02.2005, 21:40

Hi,

so, habe es auch hingekriegt:

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

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
    if(tbInit())
    {
        tbWriteToLog("Error...");
    }
    else
    {
        tbWriteToLog("Engine initialisiert...");

        int size=1000*sizeof(int);
        int i;

        int* memory1=(int*)tbMemAlloc(size);
        int* memory2=(int*)tbMemAlloc(size);
        int* temp=(int*)tbMemAlloc(size);

        tbWriteToLog("Speicher1 reserviert...          %d",tbMemGetSize(memory1));
        tbWriteToLog("Speicher2 reserviert...          %d",tbMemGetSize(memory2));
        tbWriteToLog("Temporärer Speicher reserviert...%d",tbMemGetSize(temp));

        
        tbWriteToLog("Memory1\n------------");
        for(i=0;i<5;i++)
        {
            memory1[i]=tbIntRandom(0,1000);
            tbWriteToLog("%d--%d",i,memory1[i]);
        }

        tbWriteToLog("\n");
        tbWriteToLog("Memory2\n------------");
        for(i=0;i<5;i++)
        {
            memory2[i]=tbIntRandom(0,1000);
            tbWriteToLog("%d--%d",i,memory2[i]);
        }

        memcpy(temp,memory1,size);
        memcpy(memory1,memory2,size);
        memcpy(memory2,temp,size);

        tbWriteToLog("\nNach dem Tausch");
        tbWriteToLog("--------------------------");
        tbWriteToLog("Memory1\n------------");
        for(i=0;i<5;i++)
        {
            tbWriteToLog("%d--%d",i,memory1[i]);
        }

        tbWriteToLog("\n");
        tbWriteToLog("Memory2\n------------");
        for(i=0;i<5;i++)
        {
            tbWriteToLog("%d--%d",i,memory2[i]);
        }

        tbMemFree(memory1);
        tbMemFree(memory2);
        tbMemFree(temp);
    }

    tbExit();

    return 0;
}

Das Problem war: ein Fehler in der For-Schleife und Cast von void*; ( War vieleicht mein Verständnisfehler, oder Speicherreservierung war nicht genau im Buch beschrieben:

Zitat

.......Zurück liefert sie dann einen void*-Zeiger auf den neuen Speicherbereich.... (Seite 29)

Egal, jetzt ist alles klar, danke an prokaion und anderen für die Hilfe!
Cya
::check your reality::