AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Double-Pointer als Int-Parameter übergeben und zurück
Thema durchsuchen
Ansicht
Themen-Optionen

Double-Pointer als Int-Parameter übergeben und zurück

Ein Thema von adk · begonnen am 24. Feb 2010 · letzter Beitrag vom 2. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2      
adk

Registriert seit: 24. Feb 2010
9 Beiträge
 
#1

Double-Pointer als Int-Parameter übergeben und zurück

  Alt 24. Feb 2010, 16:01
Hallo Zusammen,

ich habe eine Procedur, die erwartet einen Int-Wert als Parameter:

ProcedurB(intValue : Integer) An diese Methode möchte ich allerdings einen double übergeben. Überschreiben oder mit globalen Variablen möchte ich nicht arbeiten.
Nun war die Idee einen Int-Pointer zu erstellen und diesen auf den Double-Wert zeigen zu lassen. An ProcedurB wird der Pointer-Wert des Integer-Pointers übergeben, das ganze sieht wie folgt aus:

Delphi-Quellcode:
procedure ProcedureA(Gewicht : double);
var
  pGewicht : PInteger;
begin
  pGewicht := nil,
  New(pGewicht);
  pGewicht := @Gewicht;

  ProcedurB(pGewicht^);
end;
Erhoffte 'Rückkonvertierung' in ProcedurB geht leider nicht bzw. ich habe dabei nichts gewonnen:

Delphi-Quellcode:
procedure ProcedurB(intWert : Integer)
var
pGewicht : PInteger;
Gewicht : double;
begin
  pGewicht := @intWert;
  Gewicht := pGewicht^;
end
Hierbei hat man nichts gewonnen, d.h. natürlich kommt nur der Int-Wert heraus, da ich in ProcedurA einen Int-Pointer verwendet habe. Wie kann das Problem gelöst werden? (Geht das überhaupt: Einen Double Wert als "Integer-Pointer-Wert" übergeben und zurück)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 24. Feb 2010, 16:15
Delphi-Quellcode:
procedure ProcedureA(Gewicht : double);
var
  A_pGewicht : PInteger;
begin
  A_pGewicht := nil,
  New(A_pGewicht);
  A_pGewicht := @Gewicht;

  ProcedurB(A_pGewicht^);
end;

procedure ProcedurB(B_intWert : Integer);
var
  B_pGewicht : PInteger;
  B_Gewicht : double;
begin
  B_pGewicht := @B_intWert;
  B_Gewicht := B_pGewicht^;
end;
Delphi-Quellcode:
procedure ProcedureA(Gewicht : double);

var
  A_pGewicht : PInteger;
  B_pGewicht : PInteger;
  B_Gewicht : double;

//A_pGewicht := nil; nicht verwendet, da eh gleich überschrieben
New(A_pGewicht);
A_pGewicht := @Gewicht; // Zeiger auf Gewicht
// der Zeiger auf den mit New reservierten Speicher wird überschrieben = Speicherleck

//ProcedurB(A_pGewicht^);
B_intWert := A_pGewicht^; // Byte 1 bis 4 von Gewicht

B_pGewicht := @B_intWert; // Zeiger auf B_intWert
B_Gewicht := B_pGewicht^; // Wert von B_intWert = Byte 1 bis 4 von Gewicht
Wenn Gewicht rein zufällig ein Integer gewesen wäre, dann hätte es vielleicht klappen können.

Versuch es mal mit PDouble, statt PInteger.



oder belaß es einfach bei einem konvertierten Pointer:
Delphi-Quellcode:
procedure ProcedureA(Gewicht : double);
begin
  ProcedurB(Integer(@Gewicht));
end;

procedure ProcedurB(intWert : Integer);
var
  Gewicht : double;
begin
  Gewicht := PDouble(intWert)^;
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 24. Feb 2010, 16:25
Durch casten kannst du natürlich den den Speicher eines Double als Integer interpretieren lassen. Allerdings macht das keinen Sinn da der Wert als Double interpretiert etwas ganz anderes ergibt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
adk

Registriert seit: 24. Feb 2010
9 Beiträge
 
#4

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 25. Feb 2010, 08:21
@himitsu: Aus deiner Antwort werde ich nicht ganz schlau, was ist davon nun richtig und was falsch? Ich bin diese Beispiele durchgegangen und habe dies in meinem Programm umgesetzt, leider ohne Erfolg.
  Mit Zitat antworten Zitat
adk

Registriert seit: 24. Feb 2010
9 Beiträge
 
#5

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 25. Feb 2010, 08:25
Zitat von himitsu:
Delphi-Quellcode:
procedure ProcedureA(Gewicht : double);

var
  A_pGewicht : PInteger;
  B_pGewicht : PInteger;
  B_Gewicht : double;

//A_pGewicht := nil; nicht verwendet, da eh gleich überschrieben
New(A_pGewicht);
A_pGewicht := @Gewicht; // Zeiger auf Gewicht
// der Zeiger auf den mit New reservierten Speicher wird überschrieben = Speicherleck

//ProcedurB(A_pGewicht^);
B_intWert := A_pGewicht^; // Byte 1 bis 4 von Gewicht

B_pGewicht := @B_intWert; // Zeiger auf B_intWert
B_Gewicht := B_pGewicht^; // Wert von B_intWert = Byte 1 bis 4 von Gewicht
Dies ist (entschuldigung) etwas chaotisch. Ich erwarte natürlich keine 100% passende Lösung (will ja selbst noch zu Lösung beitragen ) jedoch verstehe ich es nicht.

Zitat von himitsu:
oder belaß es einfach bei einem konvertierten Pointer:
Delphi-Quellcode:
procedure ProcedureA(Gewicht : double);
begin
  ProcedurB(Integer(@pGewicht));
end;

procedure ProcedurB(intWert : Integer);
var
  B_Gewicht : double;
begin
  B_Gewicht := PDouble(intWert)^;
end;
Geht leider nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 25. Feb 2010, 08:27
Der erste Codeblock zeigt das, was in deinem Beispielcode sozusagen intern abliefäuft.

Der Letzte zeigt den "einfachen" Weg.

Ein Pointer ist aktuell (in Win32) genauso groß, wie ein Integer ... also braucht man einfach nur zwischen Pointer und Integer hin- und hercasten.

[edit]
Zitat:
Geht leider nicht.
Was geht nicht?
(ist nicht böse gemeint, aber das sind "Fehlerbeschreibungen", welche überhaupt nicht weiterhelfen)

Wenn du das angeblich unbekannte "pGewicht" meinst ... da hätte man eventuell auch selber draufkommen können, daß ich mich da verkopiert (verschrieben) hab und "Gewicht" gemeint war.

Hab den Code da oben nochmal korrigiert.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
adk

Registriert seit: 24. Feb 2010
9 Beiträge
 
#7

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 25. Feb 2010, 08:56
Jup, diesen Fehler habe ich bereits korrigiert. Liefere gleich mehr Infos was gemeinst ist, habe gerade noch 'schnell' etwas probiert...

EDIT: Was ich gemeint habe ist das Ergebnis. Wenn ich z.B. 123,456 übergebe, hat das
Gewicht in ProcedurB anschliessend den Wert 4,205...e-291 , also mit sovielen Nachkommstellen, das dies zwangsläufig eine Exception wird. Fehlt mir da noch eine Wertkonvertierung? (Ist länger her bei mir )
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#8

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 25. Feb 2010, 09:15
Du hast den Code von himitsu nicht richtig zitiert. Bei dir heist es an einer Stelle pGewicht, im Orginal steht überall Gewicht.
Der Code von himitsu funktioniert, also machst du etwas anders/falsch.
Wenn du uns jetzt deinen Code zeigst ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 25. Feb 2010, 09:22
@Blup: Da stand wirklich pGewicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
adk

Registriert seit: 24. Feb 2010
9 Beiträge
 
#10

Re: Double-Pointer als Int-Parameter übergeben und zurück

  Alt 25. Feb 2010, 09:33
Theoretisch ist alles nun korrekt bei mir, aber genanntes Problem der 'Rückkonvertierung' (Zahl mit vielen Nachkommstellen) bleibt bestehen. Mein jetziger Stand:

Delphi-Quellcode:
procedure ProcedureA(Gewicht : double)
begin
ProcedureB(Integer(@Gewicht))
end;


procedure ProcedureB(intWert: integer)
var
  Gewicht: double
begin
  Gewicht := PDouble(intWert)^;
end;
Inzwischen habe ich das auch selbst (wieder) verstanden (ich komme aus der C++ Welt, dann C#, jetzt Delphi), in der Theorie bzw. vom Verständnis her macht das sinn und sollte funktionieren. Bei der Rückkonvertierung wird der IntWert wieder in einen Double-Zeiger konvertiert und anschliessend der Wert ausgelesen. Habe ich vielleicht noch etwas vergessen? Initialisierungen? New-Operator?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz