Du bist nicht angemeldet.

Werbeanzeige

11

09.10.2009, 10:00

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

int main ()
{
    if (tbInit())
    {
        printf("Fehler bei der Inizialisierung");
    }
    else
    {
        int* pdata1 = NULL;
        int* pdata2 = NULL;
        int* pdata3 = NULL;

        int size = 1000*sizeof(int);

        if (pdata1 = static_cast<int*>(tbMemAlloc(size)))
        {
            printf("Speicherbereich 1 reserviert!\n");
        }

        if (pdata2 = static_cast<int*>(tbMemAlloc(size)))
        {
            printf("Speicherbereich 2 reserviert!\n");
        }

        if (pdata3 = static_cast<int*>(tbMemAlloc(size)))
        {
            printf("Speicherbereich 3 reserviert! \n");
        }

        for (int i = 0; i < 1000; i++)
        {
            *pdata1 = i;
            pdata1++;
        }

        for (int y = 1000; y > 1; y--)
        {
            *pdata2 = y;
            pdata2++;
        }

        pdata1 -= 999;
        pdata2 -= 999;

        memcpy(pdata3, pdata1, 1000*sizeof( int ));
        memcpy(pdata1, pdata2, 1000*sizeof( int ));
        memcpy(pdata2, pdata3, 1000*sizeof( int ));

        printf("%i\n", *pdata2);
        printf("%i", *pdata1);
    }

    tbExit();
    getchar();

    return 1;
}

MrCube

Frischling

Beiträge: 4

Beruf: Informatik Student

  • Private Nachricht senden

12

09.10.2009, 13:02

So, wie ich das sehe, werden dem Speicherbereich 2 nur 999 Werte zugewiesen.

Du fängst bei 1000 an und hörst bei 2 auf (dadurch, dass du i>1 geschrieben hast). Versuchs mal mit i>0, also genau umgekehrt, wie bei der for-Schleife oben drüber.

Wenn du denn dann nämlich pData2 -= 999 machst, dann gehst du vorne über den Speicherbereich hinaus.


Wieso machst dus eigentlich nicht in der Array Schreibweise, dann bleibt dir das seperate runterzählen erspart, was den Code nicht wirklich lesbarer macht.

C-/C++-Quelltext

1
2
3
4
5
for (int i=0; i<1000; i++)
{
     pData1[i] = i;
     pData2[i] = 1000 - i;
}

rewb0rn

Supermoderator

Beiträge: 2 873

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

13

09.10.2009, 13:25

Ein Array der Größe 1000 hat Einträge von 0 bis 999. Wenn du mit y = 1000 anfängst greifst du einen Platz hinter dem letzten auf den Speicher zu, dann knallts. Du musst bei 999 beginnen und y muss solange größer als -1 sein, bzw größer gleich null.

MrCube

Frischling

Beiträge: 4

Beruf: Informatik Student

  • Private Nachricht senden

14

09.10.2009, 14:06

ohja, das hab ich auch übersehen ;)

Immer diese Arraygrenzen... *schäm*

rewb0rn

Supermoderator

Beiträge: 2 873

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

15

09.10.2009, 15:30

Ach ich seh gerade dass du ja gar nicht mit dem [] Operator auf die Elemente zugreifst, dann ist es natürlich egal ob du y = 2000; y > 1000; --y machst oder y = 999; y >= 0; --y, Wobei letzteres wohl weniger verwirrend ist.. Wie aber MrCube schon geschrieben hatte hattest du zumindest ein Element zuwenig zugewiesen.

16

21.03.2010, 15:30

ich scheine bei derselben aufgabe auch ein problem zu haben.

der code den ich geschrieben habe lässt sich zwar kompilieren, wenn man ihn jedoch ausführt stürzt die anwendung jedes mal ab. (Fehlermeldung von windows vista: "dateiname.exe funktioniert nicht mehr")

hier der 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
#include<iostream>
#include<TriBase.h>

using namespace std;


int main()
{
    if(tbInit())
        cout << "Fehler beim Initialisieren!\n";
    else
    {

        //size of dataspace

        int Size = sizeof(int) * 1000;

        //the dataspaces

        int *pDatenblock1;
        int *pDatenblock2;
        int *pDatenTemp;

        //allocate dataspaces

        if(pDatenblock1 = static_cast<int*>(tbMemAlloc(Size)))
            cout << "Speicher 1 reserviert\n";

        if(pDatenblock2 = static_cast<int*>(tbMemAlloc(Size)))
            cout << "Speicher 2 reserviert\n";

        if(pDatenTemp = static_cast<int*>(tbMemAlloc(Size)))
            cout << "Speicher Temp reserviert\n";

        //fill space with 1000 random int

        for(int i=0; i<Size; i++)
        {
            pDatenblock1[i] = tbIntRandom(0, 1000);
            
            pDatenblock2[i] = tbIntRandom(0, 1000);
            
        }
    

        //test before switching

        cout << pDatenblock1[0] << endl;
        cout << pDatenblock2[0] << endl;

        //switch contents

        memcpy(pDatenTemp, pDatenblock1, Size);
        memcpy(pDatenblock1, pDatenblock2, Size);
        memcpy(pDatenblock2, pDatenTemp, Size);

        //test after switching

        cout << pDatenblock1[0] << endl;
        cout << pDatenblock2[0] << endl;


        //free dataspaces

        TB_SAFE_MEMFREE(pDatenblock1)
        TB_SAFE_MEMFREE(pDatenblock2)
        TB_SAFE_MEMFREE(pDatenTemp)

    }


    tbExit();

    return (0);
}


das speichergebiet zuzuweisen scheint ohne weiteres zu funktionieren, da die dazugehörigen drei ausgaben gemacht werden, dann crasht die anwendung jedoch. ich habe keine ahnung weswegen, ob es an mir liegt oder einfach nur an windows vista...

ernest7

Frischling

Beiträge: 20

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

17

21.03.2010, 16:19

mögliches problem:

Zitat

for(int i=0; i<Size; i++)


du hast ja nicht (sizeof(int)*1000) Elemente in den Arrays, sondern nur 1000.

18

21.03.2010, 16:27

hmm, wie dumm von mir... da hätte ich auch selbst draufkommen müssen


auf jeden fall funktioniert es jetzt, vielen dank

Werbeanzeige