Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] Zeiger (https://www.delphipraxis.net/98426-%5Bc-%5D-zeiger.html)

Mark90 27. Aug 2007 10:45


[C++] Zeiger
 
Hi,

ich habe ein kleines problem wegen zeigern.

Delphi-Quellcode:

         ExeFile E;
    PIMAGE_DOS_HEADER doshdr; // Zeiger auf IMAGE_DOS_HEADER
    long e_lfanew;

    this->OpenDialog1->Execute(); // opendialog starten
    E.SetFileName(this->OpenDialog1->FileName);//In meiner ExeFile Klasse DATEInamen setzten
    doshdr = new IMAGE_DOS_HEADER; // speicher reservieren
    doshdr = E.Search_Dos_Header();// zeiger auf dosheader bekommen(Suchen in datei an Mappaddresse)
    e_lfanew = *doshdr->e_lfanew;// e_lfanew zuweisen
e_lfanew = *doshdr->e_lfanew;// e_lfanew zuweisengenau hier tritt das problem auf. es kommt eine fehlermeldung, invalid direction. Aber normalerweise müsste das doch funktionieren. in delphi war es immer so, dass wenn man auf den inhalt eines typs zugreifen wollte musste man dereferenzieren Var^ und in C++ eben *var.

OregonGhost 27. Aug 2007 11:06

Re: [C++] Zeiger
 
Mit
Code:
*doshdr->e_lfanew
greifst du auf das Element e_lfanew in doshdr zu, und dann dereferenzierst du dieses Element. Du derefenzierst mit dem Sternchen e_lfanew, nicht doshdr, und e_lfanew ist vermutlich kein Zeiger, sondern ein long (rate ich jetzt mal, ohne die Struktur zu kennen). Der Pfeil in C++ bewirkt bereits eine Derefenzierung. Um auf ein Element einer Struktur zuzugreifen, die du als Objekt und nicht als Zeiger hast, benutzt man in C++ den Punkt. Korrekt wäre also entweder
Code:
doshdr->e_lfanew
, oder umständlicher
Code:
(*doshdr).e_lfanew
.

Edit:
Das, was Muetze01 schreibt, hat zwar nichts mit deinem Problem zu tun, ist aber ebenfalls etwas, was dir Kopfschmerzen ersparen könnte, weil du so ein Memory-Leak hast :stupid:

Muetze1 27. Aug 2007 11:08

Re: [C++] Zeiger
 
Zitat:

Zitat von Mark90
Delphi-Quellcode:
    doshdr = new IMAGE_DOS_HEADER; // speicher reservieren
    doshdr = E.Search_Dos_Header();// zeiger auf dosheader bekommen(Suchen in datei an Mappaddresse)

btw: warum alloziierst du hier Speicher um ihn dann auf was anderes zeigen zu lassen? Damit hast du keine Referenz mehr auf den alloziierten Speicherblock. Dann kannst du dir das ganze new Gedönse auch sparen...

Mark90 27. Aug 2007 12:03

Re: [C++] Zeiger
 
Zitat:

Zitat von OregonGhost
Mit
Code:
*doshdr->e_lfanew
greifst du auf das Element e_lfanew in doshdr zu, und dann dereferenzierst du dieses Element. Du derefenzierst mit dem Sternchen e_lfanew, nicht doshdr, und e_lfanew ist vermutlich kein Zeiger, sondern ein long (rate ich jetzt mal, ohne die Struktur zu kennen). Der Pfeil in C++ bewirkt bereits eine Derefenzierung. Um auf ein Element einer Struktur zuzugreifen, die du als Objekt und nicht als Zeiger hast, benutzt man in C++ den Punkt. Korrekt wäre also entweder
Code:
doshdr->e_lfanew
, oder umständlicher
Code:
(*doshdr).e_lfanew
.

Edit:
Das, was Muetze01 schreibt, hat zwar nichts mit deinem Problem zu tun, ist aber ebenfalls etwas, was dir Kopfschmerzen ersparen könnte, weil du so ein Memory-Leak hast :stupid:

hi oregonghost,

das was du vorgeschlagen hast habe ich auch schon probiert. leider produziert er da eine Access violatio, die genau hier auftritt: ( e_lfanew = (*doshdr).e_lfanew; ).

OregonGhost 27. Aug 2007 12:15

Re: [C++] Zeiger
 
Dann zeigt doshdr wohl nicht auf einen gültigen Speicherbereich. Vielleicht ist es auch einfach 0. Guck dir zu diesem Zeitpunkt doshdr doch mal im Debugger an. Außerdem solltest du besser die Pfeil-Variante als die mit dem Stern benutzen, auch wenn sie im Endeffekt identisch sind.

Mark90 27. Aug 2007 13:06

Re: [C++] Zeiger
 
Hi oregonghost

doshdr war immer 0. Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz