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

06.03.2009, 14:20

Problem bei der 2. Aufgabe

Hallo, Leute!
Ich bin jetzt bei der 2. Aufgabe vom 1. Kapitel (da wo man zwei Speicherbereiche vertauschen muss). Hab die void Zeiger initialisiert und mit tbMemAlloc(1000) auf die gewünschte Größe gebracht. Jetzt hab ich aber ein kleines Problem, weil ich nicht weiß, wie ich die Speicherbereiche füllen kann. Ich hab's schon mit sämtlichen Casts probiert, der einzige, der geklappt hat war:

C-/C++-Quelltext

1
pData1 = (void*) tbIntRandom(0,1000);

Tja das war's auch schon, lässt sich problemlos kompilieren, erzeugt aber zur Laufzeit einen Fehler! (Ist ja auch logisch, ich hab ja jetzt die Adresse von pData1 verändert)
Doch dann kam mir eine weitere Idee :idea:
Ich könnte statt einem void Zeiger einen int Zeiger verwenden. Ok, Code umgeschrieben, kompiliert alles schön! Ich hab jetzt eine Zahl in den Speicherbereich geschrieben! Auch tbMemIsValid liefert TRUE!
ABER:
Ich soll ja 1000 Zahlen in den Speicherbereich laden, das war jetzt eine. Aber mit inkremieren des int Zeigers klappt's nicht. Wie bekomm ich es jetzt hin, dass die nächste Zahl in die nächste freie Stelle des Speicherbereichs gepackt wird?
Bitte keine kompletten Lösungen posten, nur kleine Tipps, mit denen ihr mir auf die Sprünge helfen könnt...

2

06.03.2009, 16:00

wiso klappt das inkrementieren des int-Zeigers nicht (Fehlermeldung)? müsste eigentlich.

3

06.03.2009, 17:17

Der Zeiger an sich lässt sich schon inkremieren. Aber wenn ich danach eine Funktion des Speichermanagers aufrufe, stürzt das Programm zur Laufzeit ab! Zumindest ist das bei tbMemIsValid der Fall

Anonymous

unregistriert

4

06.03.2009, 17:22

Tja, der Speicher startet aber nicht bei 0 und geht bis 1000, sondern der Speicher startet bei X und endet bei X+1000 ;)

Drum ist die Angabe: tbInitRandom (0, 1000) falsch.

5

06.03.2009, 17:35

Genau!
Ich will ja auch garnicht den Speicherbereich verändern. Ich will nur die 1000 Bytes mit 1000 ints von 0 bis 1000 auffüllen!

Zitat von »"unsigned long"«

Drum ist die Angabe: tbInitRandom (0, 1000) falsch.

Macht eine zufällige Speicheradresse überhaupt Sinn? ;)

6

11.03.2009, 21:06

Also, Leute irgendwie steh ich grad total aufm Schlauch. Ich krieg's einfach nicht hin, die Speicherbereiche zu füllen. Wie habt ihr denn die Aufgabe gelöst?

7

11.03.2009, 21:09

du hast ne Startadresse und die größe des Speicherbereichs - wo ist das problem, ihn stück für stück zu füllen?

8

11.03.2009, 21:32

MasterHelmut

Stichwort Typumwandlung void -> int...
(du wolltest ja keine Komplettlösung)
fka tm

sNej

Frischling

  • Private Nachricht senden

9

12.03.2009, 18:38

Zitat

tbMemAlloc(1000)

Ich stehe auch gerade vor der Aufgabe und bin am verzweifeln xD
Aber wenn du 1000 Bytes reservierst reicht das noch lange nicht für 1000 Integer.

Int = 4 Byte => tbMemAlloc ( 1000 * sizeof (int) );

// edit

Habe es jetzt gelöst, das schlimmste ist nur die von TrikkieMikkie erwähnte Typenumwandlung.
Man braucht auch später nicht die memcpy Funktion, das klappt auch mit einem int buffer Array und na for Schleife ;)

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

10

12.03.2009, 21:16

Zitat von »"sNej"«

Man braucht auch später nicht die memcpy Funktion, das klappt auch mit einem int buffer Array und na for Schleife ;)

was ist wohl performanter? memcpy oder for-schleife? :roll:

Werbeanzeige