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

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

1

06.05.2009, 21:23

Problem/Speichermanager/TriBase

Hey Leute,
ich bin neu hier im Forum.
Bin grade an der Zweiten Aufgabe im ersten Kapitel von "3D Spieleprogrammierung ..."
wollte erstmal ausprobieren wie das mit den Speicher-Funktionen so geht und hab ein kleines Programm geschrieben was einfach einen Speicherbereich reservieren und einen Wert reinschreiben sollte und dann im Logbuch der Wert vermerkt werden sollte.
Leider stürzt das Programm immer ab und das Logbuch sagt tbExit konnte nicht mehr aufgerufen werden weis jemand vllt was ich falsch gemacht habe?
danke schonmal im vorraus
P.S: Wieso ist "v.o.r.r.a.u.s" zensiert^^
Hier ein kleiner Code schnitt:

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
while (GetMessage (&message, NULL, 0, 0) )
  {
    TranslateMessage (&message);
    DispatchMessage (&message);

  }
  tbInit();
  void *PWerte_1 = NULL;
  void *PWerte_2 = NULL;
  int *PMiddle = NULL;
  PWerte_1 = tbMemAlloc(8000);
  PWerte_2 = tbMemAlloc(8000);;
  int Wert = 400;
  PMiddle = &Fuck;
  PWerte_1 = PMiddle;
  tbWriteToLog("PWerte_1 %void*", PWerte_1);
  TB_SAFE_MEMFREE(PWerte_1);
  TB_SAFE_MEMFREE(PWerte_2);
  tbExit();

  return (int)(message.wParam);

} // WinMain

2

06.05.2009, 21:46

Auch Hey,

Willkommen im Forum!

Hab das Thema hierher verschoben.

Voraus schreibt man mit einem "R".
Sozusagen David's Rechtschreibprüfung. ;)


Was ist das:

C-/C++-Quelltext

1
PMiddle = &Fuck; 


:?:
fka tm

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

3

06.05.2009, 22:05

Fehler

oh sry ich hatte vorhin einen Wutausbruch da hab ich die Variable einfach Fuck genannt. Dann hab ichs für euch in "Wert" umgeändert habs aber an der Stelle vergessen :lol:

4

06.05.2009, 22:08

Sowas in der Art habe ich mir gedacht.
Aber wo definiert, welcher Typ?

Ansonsten würde ich mal mit dem Debugger da durchrauschen.

Und so Null-Zeiger von A nach B zu schieben... :?
fka tm

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

5

07.05.2009, 10:22

Ok Werd ich wohl machen müssen
Danke für die schnelle Antwort

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

6

09.05.2009, 13:38

Bin da völlig falsch rangegangen glaube ich. hab jetzt das geschrieben

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
tbInit();
  int *PWerte_1 = NULL;
  int *PWerte_2 = NULL;
  int *bla = NULL;
  PWerte_1 = reinterpret_cast<int*>(tbMemAlloc(8000));
  PWerte_2 = reinterpret_cast<int*>(tbMemAlloc(8000));
 for(int i=0;i < 999;i++)
  {
      *PWerte_1 = tbIntRandom(1,5000);
      *PWerte_2 = tbIntRandom(1,5000);    
      PWerte_1 += 1;
      PWerte_1 += 1;

  }

tbWriteToLog("PWerte_1 %int*", *PWerte_1);
  TB_SAFE_MEMFREE(PWerte_1);
  TB_SAFE_MEMFREE(PWerte_2);
  tbExit();
  return (int)(message.wParam);

} // WinMain


Jetzt hab ich noch ne Frage und zwar wie kann ich bei einem Zeiger die Adresse mit einer einzigen Zuweisung z.B um 8 bits erhöhen oder geht das gar nicht?

7

09.05.2009, 14:21

Zitat von »"Theofanikus"«

Jetzt hab ich noch ne Frage und zwar wie kann ich bei einem Zeiger die Adresse mit einer einzigen Zuweisung z.B um 8 bits erhöhen oder geht das gar nicht?

1. adressierung läuft nur byteweise
2. meinst du sowas: Pointer += 1;

8

09.05.2009, 14:28

Imo werden Pointer aber um die Größe ihres Types erhöht. Also bei einem int Zeiger immer +4 Byte. Demnach müsste man wohl erst nach void* casten, aber eigentlich weiß ich auch keine Situation wo es wirklich sinnvoll oder nötig wäre, Zeiger direkt zu erhöhen, man könnte stattdessen den Index für einen Array Zugriff erhöhen oder so.
Lieber dumm fragen, als dumm bleiben!

Theofanikus

Frischling

  • »Theofanikus« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Schwalbach am Taunus

  • Private Nachricht senden

9

09.05.2009, 14:33

meinte Byte sorry verwechsle die immer :D
Auf die Idee einfach pointer += 8 oder so hab ich schon probiert dann schmiert das Programm ab und der debugger sagt dass es ne Zugriffsverletzung gibt. Müsste aber eigentlich doch gehen, weil ich ja mit tbMemAlloc speicher reserviert habe. In meinem Fall jetzt 8000 bytes.
Dann müsste es doch ohne Zugriffsverletzung gehen bis 8000 zu erhöhen oder?

10

09.05.2009, 14:47

Direkt am Speicher rumzufummeln ist immer sehr fehleranfällig, man vertut sich da ganz schnell mal.
Betrachte den Speicher einfach als Array und greife per [] darauf zu, dann hast du gleich viel weniger Probleme + der Code wird lesbarer, weil keine komischen Speicherberechnungen mehr darin stehen.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige