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

04.05.2005, 15:36

Probleme mit Alloc

Hallo Leute,
Ich hab mich entschlossen, mal in Davids Buch ein wenig zurückzublättern und einige Übungsaufgaben zu machen. Aber die auf Seite 39 krieg ich nicht hin. Man soll zwei Speicherbereiche reservieren, in die 1000 int-Werte passen. Die werden dann mit Zufallszahlen gefüllt. Danach werden die Speicherbereiche vertauscht.

Mein Problem ist, ich weiß nicht, wie ich die int-Werte in den Speicherbereich steck.
Mein Projekt: Rise of the Sylvan

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

04.05.2005, 17:23

Ich denke mal, dass du von Auflage 2 sprichst, denn bei Auflage 1 gehts auf Seite 39 um Visual Studio. Daher weiß ich jetzt nicht ganz genau was du meinst, aber trifft das den Kern?

C-/C++-Quelltext

1
2
3
4
5
6
7
int a[1000];
int b[1000];
int* c;

c = a;
a = b;
b = c;

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

04.05.2005, 18:03

Damit wäre der Sinn nicht erreicht(abgesehen von den fehlenden operatoren), denn c ist nur ein Zeiger und du würdest mit der 3. Anweisung damit den Wert von a auf b transferieren wobei a ja schon gleich b ist(2.Anweisung).......

4

05.05.2005, 10:47

Ja, die Auflage 2 mein ich. Aber ich meinte eigentlich was anderes.
erst mal muss man ja void*-Variablen deklarieren und dann mit tbMemAlloc Speicher reservieren.
Vielleicht so:

void* pData=tbMemAlloc(1000);

Aber wie soll ich das dann mit den Int-Werten machen? Und wie soll ich sie in diesem Speicherbereich ablegen?
Mein Projekt: Rise of the Sylvan

5

05.05.2005, 11:28

Warum nicht so:

C-/C++-Quelltext

1
2
3
4
int* var = (int*)tbMemAlloc(1000 * sizeof(int));
var[0] = 1;
var[1] = 5;
...

PD

unregistriert

6

05.05.2005, 14:42

@Nox: Der code von Spikeevil war richtig, zumindest hätte er Funktioniert (auch wenns net das war wonach gefragt wurde ^^). Denn er tauscht die Adressen zwischen a und b.
beispiel (fake adressen ^^):
a = a4
b = b3
c = null

c = a (c = a4)
a = b (a = b3)
b = c (b = a4)

Due siehst? Werte getauscht ^^ Wobei ich grad net ganz sicher bin ob man nem array so einfach ne neue Adresse zuweisen darf :) Aber in der theorie klappts auf jedenfall ^^

7

05.05.2005, 16:05

Juhu, es funktioniert. Vielen Dank!
Mein Projekt: Rise of the Sylvan

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

05.05.2005, 16:30

Zitat von »"PD"«

Due siehst? Werte getauscht ^^ Wobei ich grad net ganz sicher bin ob man nem array so einfach ne neue Adresse zuweisen darf :)

Nein, das funktioniert nicht.

error C2106: '=' : Linker Operand muss ein L-Wert sein
error C2440: '=' : 'int *' kann nicht in 'int [1000]' konvertiert werden

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

05.05.2005, 18:03

A und b sind keine zeiger daher kannst du auch keine adressen tauschen........................

10

12.09.2005, 12:53

Hab eine Lösung für die Aufgabe und würde gern mal wissen, was ihr davon halten :)

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
        // Speicherbereiche reservieren

        int *pData1 = static_cast<int*>(tbMemAlloc(1000*sizeof(int)));
        int *pData2 = static_cast<int*>(tbMemAlloc(1000*sizeof(int)));
        int *pTempD = static_cast<int*>(tbMemAlloc(1000*sizeof(int)));
        
        // pData1 mit Zufallswerten füllen

        if(!pData1)
        {
            TB_ERROR_MESSAGE("Nicht genug Speicher");
        }
        else
        {
            for(int i = 0; i < 1000; i++)
                pData1[i] = tbIntRandom(0,1000);
        }
        
        // pData2 mit Zufallswerten füllen

        if(!pData2)
        {
            TB_ERROR_MESSAGE("Nicht genug Speicher");
        }
        else
        {
            for(int i = 0; i < 1000; i++)
                pData2[i] = tbIntRandom(0,1000);
        }
        
        TB_INFO("Ersten 10 Werte von pData1 vor Tausch");
        for (int i = 0; i < 10; i++)
        {
            tbWriteToLog("Wert von Integer %d : %d\n",i ,pData1[i]);
        }

        TB_INFO("Ersten 10 Werte von pData2 vor Tausch");
        for (int i = 0; i < 10; i++)
        {
            tbWriteToLog("Wert von Integer %d : %d\n",i ,pData2[i]);
        }

        // Zufallszahlen von pData1 und pData2 vertauschen

        memcpy(pTempD,pData2,tbMemGetSize(pData2));
        memcpy(pData2,pData1,tbMemGetSize(pData1));
        memcpy(pData1,pTempD,tbMemGetSize(pTempD));
        
        TB_INFO("Ersten 10 Werte von pData1 nach Tausch");
        for (int i = 0; i < 10; i++)
        {
            tbWriteToLog("Wert von Integer %d : %d\n",i ,pData1[i]);
        }
        
        TB_INFO("Ersten 10 Werte von pData2 nach Tausch");
        for (int i = 0; i < 10; i++)
        {
            tbWriteToLog("Wert von Integer %d : %d\n",i ,pData2[i]);
        }
        
        // Speicher wieder freigeben

        TB_SAFE_MEMFREE(pData1);
        TB_SAFE_MEMFREE(pData2);
        TB_SAFE_MEMFREE(pTempD);


Eine Frage hab ich aber noch zum Freigeben des Speichers... Und zwar steht im Buch, dass man eine Warnung erhällt, falls man vergessen sollte reservierten Speicher freizugeben. Wenn ich die letzten drei Zeilen auskomentiere gibt es aber diese Warnung nicht sondern ich bekomme die Information, dass alle Speicherbereiche freigegeben wurden. Woher kommt das?

Werbeanzeige