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

07.10.2009, 14:39

Kapitel 1.4 Übung 2

Hi allso ich soll ja da zwei speicherbereiche mit 1000 int Werten beschreiben. Leider komm ich nicht wirklich weiter. Könntet ihr mir einen Idee oder so geben?

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

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

        int size = sizeof(int) * 1000;

        if (pdata1 = tbMemAlloc(size))
        {
            printf("Speicherbereich 1 reserviert!\n");
        }

        if (pdata2 = tbMemAlloc(size))
        {
            printf("Speicherbereich 2 reserviert!\n");
        }

        if (pdata3 = tbMemAlloc(size))
        {
            printf("Speicherbereich 3 reserviert! \n");
        }
    }

    tbExit();
    getchar();

    return 1;
}


Das Problem ist ich weis nicht wie ich die int Werte in diesen Speicherbereich bringe. Die zeiger sind ja vom Typ void.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

07.10.2009, 14:57

Du kannst die Zeiger ja problemlos casten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int* pdata1;
int* pdata2;
int* pdata3;

int size = sizeof(int) * 1000;

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

3

07.10.2009, 15:16

Danke einmal. Hab ich jetzt auch gemacht aber das läuft nicht wirklich :)

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
#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 = sizeof(int) * 1000;

        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 = 1; i <= 999; i++)
        {
            *pdata1 = i;
            ++pdata1;
        }

        for (int y = 999; y <= 1; y--)
        {
            *pdata2 = y;
            ++pdata2;
        }

        pdata1 - 999;

        memcpy(pdata3, pdata1, 999);
        memcpy(pdata1, pdata2, 999);
        memcpy(pdata2, pdata3, 999);

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

    tbExit();
    getchar();

    return 1;
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

07.10.2009, 15:19

Was soll das Programm denn genau machen? Bzw, was ist dein Problem?

5

07.10.2009, 15:22

es soll einen speicherbereich mit int werten f:ullen (i,y). danach soll es die beiden speicherbereiche pdata1 und pdata2 vertauschen mit memcpy. dazu braucht es noch den dritten pdata3 als buffer. Am schluss sollte der erste int wert von pdata2 = 1 und von pdata1 = 999 aber das geht nicht

6

07.10.2009, 15:30

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 = sizeof(int) * 1000;

        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 = 1; i <=10; i++)
        {
            *pdata1 = i;
            ++pdata1;
        }

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

        pdata1 - 9;
        pdata2 - 9;

        memcpy(pdata3, pdata1, 10);
        memcpy(pdata1, pdata2, 10);
        memcpy(pdata2, pdata3, 10);

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

    tbExit();
    getchar();

    return 1;
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

07.10.2009, 15:32

Einige Dinge die auffallen:

C-/C++-Quelltext

1
pdata1 - 999;


Das subtrahiert zwar fröhlich 999 von pdata1. Allerdings ist die aktion ohne Effekt, weil pdata1 nicht neu zugewiesen wird.

Lösung:

C-/C++-Quelltext

1
pdata1 -= 999;


Alternativ kannst du die Werte auch per []-Operator schreiben, dann Zeigt pdata1 automatisch auf den ersten Speicherplatz (ändert sich ja nichts mehr).

C-/C++-Quelltext

1
2
for ( int i = 1; i <= 999; i++ )
  pdata1[i-1] = i;


Das schreibt allerdings nur 999 Einträge in dein Array (nicht 1000). Außerdem iteriert man üblicherweise von 0 beginnend (Informatiker fangen immer bei 0 an zu Zählen ;-)):

C-/C++-Quelltext

1
2
for ( int i = 0; i < 1000; i++ )
  pdata1[i] = i;


Dann das kopieren:

C-/C++-Quelltext

1
2
3
memcpy(pdata3, pdata1, 999);
memcpy(pdata1, pdata2, 999);
memcpy(pdata2, pdata3, 999);


Memcpy arbeitet auf Bytelevel. D.h. die Größe, die du angibst, entspricht nicht der Größe des Datenblocks der effektiv kopiert werden soll, richtig:

C-/C++-Quelltext

1
2
memcpy(pdata3, pdata1, 1000*sizeof( int ));
// usw...

8

07.10.2009, 15:40

jo jetzt gehts thanks :D

9

07.10.2009, 15:59

leider gehts doch nur mit max 100 bei 1000 kommt das:
INFO: Initialisierung komplett! (TriBase.cpp, Zeile 104, Funktion tbInit)
INFO: TriBase-Engine wird heruntergefahren... (TriBase.cpp, Zeile 113, Funktion tbExit)
HEAP[(1.4) Aufgabe 2.exe]: Heap block at 003D5E68 modified at 003D6E14 past requested size of fa4
Windows has triggered a breakpoint in (1.4) Aufgabe 2.exe.

This may be due to a corruption of the heap, which indicates a bug in (1.4) Aufgabe 2.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while (1.4) Aufgabe 2.exe has focus.

The output window may have more diagnostic information.
The program '[1928] (1.4) Aufgabe 2.exe: Native' has exited with code 0 (0x0).

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

07.10.2009, 16:43

Zeigmal den fehlerhaften Code.

Werbeanzeige