AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer & Co

Ein Thema von gibb · begonnen am 3. Mär 2010 · letzter Beitrag vom 16. Mär 2010
Antwort Antwort
Seite 2 von 4     12 34      
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#11

Re: Pointer & Co

  Alt 4. Mär 2010, 13:41
Hi,

hab jetzt folgendes gemacht:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  hSFMemory: HWND;
  SfAreaPtr: Pointer ;
  MyResultRecord: TMyRecord;
  i: Integer;
  txt: String;
begin
  fillchar(buffer,1000,0);
  hSFMemory := 0;
  SfAreaPtr := nil;
  i := 0;
  try
    hSFMemory := OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM');
    if HSFMemory <> 0 then begin
      SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0);
      CopyMemory(Addr(buffer),SfAreaPtr,1000);
      MyResultRecord.Unknown:= buffer[0];
      MyResultRecord.NumTemps:= buffer[1];
      MyResultRecord.NumFans:= buffer[2];
      MyResultRecord.NumVolts:= buffer[3];
      MyResultRecord.Temps:= buffer[4];
      MyResultRecord.Fans:= buffer[5];
      MyResultRecord.Volts:= buffer[6];
    end;
  finally
    UnmapViewOfFile(SfAreaPtr);
    CloseHandle(hSFMemory);
  end;
end;
Wobei das scheint nicht zu stimmen, die einzige zahl die ich wiedererkenne währ numoftemps wobei diese so bei numofvolts eingetragen ist.

Was macht dieser VB Code? oder was ist der gedanke dabei?:
Zitat:
RetVal.Temps = mMyArea.NumTemps
RetVal.Volts = mMyArea.NumVolts
RetVal.Fans = mMyArea.NumFans
For x = 0 To 32 Step 2
RetVal.Temp(x / 2) = mMyArea.Temps(x) / 100
RetVal.Fan(x / 2) = mMyArea.Fans(x)
RetVal.Volt(x / 2) = mMyArea.Volts(x) / 100
Next
gruss gibb
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#12

Re: Pointer & Co

  Alt 4. Mär 2010, 13:56
Dein Record stimmt doch noch gar nicht :
Delphi-Quellcode:
Private Type SF_Raw_MemMap
   Unknown(5) As Integer 'unbekanntes Tag
NumTemps As Integer
'Anzahl der Temperaturen
   NumFans As Integer 'Anzahl der Lüfter
NumVolts As Integer
'Anzahl der Spannungen
   Temps(63) As Integer 'Werte der Temperaturen
Fans(63) As Integer
'Drehzahl der Lüfter
   Volts(63) As Integer 'Werte der Spannungen
End Type
Probier mal so
Delphi-Quellcode:
TSF_Raw_MemMap = Packet Record
   Unknown : Array[0..5] of Integer //unbekanntes Tag
   NumTemps : Integer //Anzahl der Temperaturen
   NumFans : Integer //Anzahl der Lüfter
   NumVolts : Integer //Anzahl der Spannungen
   Temps : Array[0..63] of Integer //Werte der Temperaturen
   Fans : Array[0..63] of Integer //Drehzahl der Lüfter
   Volts : Array[0..63] of Integer //Werte der Spannungen
end;
Glückauf
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#13

Re: Pointer & Co

  Alt 4. Mär 2010, 14:01
Ah das is ein array in VB wenn eine klammer mit zahl angegeben wird..... dachte mir schon das die Zahlen für was sind, hab aber nicht geschnallt wofür. Hab das ja ettliche beiträge vorher schonmal geschrieben. Dank dir =D
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#14

Re: Pointer & Co

  Alt 4. Mär 2010, 14:05
Die Array-Grenzen stimmen noch nicht
(5) ist 0..4 bzw 63 ist 0..62 laut http://www.vbarchiv.net/faq/strings_array.php
Edit : Da sind sich die Leute nicht einig : http://de.wikibooks.org/wiki/Visual_Basic_6:_Arrays
Nach dem lesen der beiden Seiten : Die Arraygrenzen stimmen doch, die Zahl in der Klammer gibt den höchsten Index an und der Startindex ist normalerweise 0 wenn kein Option Base 1 angegeben ist
Glückauf
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#15

Re: Pointer & Co

  Alt 4. Mär 2010, 14:20
Naja, hilft aber auch nicht weiter wenn da nicht mehr daten stehen oder?

http://www.abload.de/thumb/inspectorecos.jpg

PS: ich hab den buffer rausgeschmissen und versucht die daten gleich in den Record zu schreiben:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,1000);

Sollte so doch auch stimmen, gibt mir ja die selben werte zurück nur bereits in die record struktur angepasst was meiner meinung nach ja unser ziel ist oder?
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#16

Re: Pointer & Co

  Alt 4. Mär 2010, 15:15
fillchar(buffer,1000,0); // Dein Buffer ist gar nicht so groß

RetVal.Temps = mMyArea.NumTemps
RetVal.Volts = mMyArea.NumVolts
RetVal.Fans = mMyArea.NumFans
For x = 0 To 32 Step 2
RetVal.Temp(x / 2) = mMyArea.Temps(x) / 100
RetVal.Fan(x / 2) = mMyArea.Fans(x)
RetVal.Volt(x / 2) = mMyArea.Volts(x) / 100
Next

ist eine VB -Schleife, die die Integer aus den einzelnen Feldern in Floats umrechnet, wobei die Schrittweite 2 ist, also nur 16 Werte übertägt
Glückauf
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#17

Re: Pointer & Co

  Alt 4. Mär 2010, 15:53
Ist ein buffer immer wie ein Array aufgebaut?

Trozdem kommt nicht mehr als das hier:
http://www.abload.de/thumb/buffer156t.jpg

oberes bild ist mit:
CopyMemory(Addr(Buffer),SfAreaPtr,1000); aber direkt so scheint auch zu gehen:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,1000); )

Was das erste bild zustande bringt, da hab ich den Buffer garnicht erst verwedet. Aber irgendwie scheine ich nicht alle daten zu kriegen ??

PS: wie kann ich z.b. die lenge von myResultRecord herausfinden? denn dann währe folgendes möglich:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,length(MyResultRecord)); Ich gehe ja davon aus das der record der form der Daten die ich zurückbekomme entsprechen sollte...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#18

Re: Pointer & Co

  Alt 4. Mär 2010, 16:00
Hallo Gibb,

im Prinzip liegst Du schon richtig aber
1)Dein MyresultRecord muß ein packed record sein
2) statt Length solltest du Sizeof verwenden, das gibt Dir die Größe in Bytes zurück.

z.B.
Delphi-Quellcode:
  a1 : array [0..3] of integer;

length(a1) >> 4 { 4 Integer}
sizeof(A1) >> 16 {16 Bytes }
Gruß
K-H

Edit: Tippfehler
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#19

Re: Pointer & Co

  Alt 4. Mär 2010, 16:12
1: isses doch:
Delphi-Quellcode:
  TMyRecord = packed record
  public
   Unknown : Array[0..5] of Integer; //unbekanntes Tag
   NumTemps : Integer; //Anzahl der Temperaturen
   NumFans : Integer; //Anzahl der Lüfter
   NumVolts : Integer; //Anzahl der Spannungen
   Temps : Array[0..63] of Integer; //Werte der Temperaturen
   Fans : Array[0..63] of Integer; //Drehzahl der Lüfter
   Volts : Array[0..63] of Integer; //Werte der Spannungen
  end;
Also scheint beim Copy was nicht ganz zu stimmen oder sonstwo

2: danke das hab ich gesucht XD wusste nur nicht wie die funktion heisst ^-^' war mir schon klar das length nicht geht, aber du hast es verstanden

EDIT:

Habs jetzt so:
CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord)); EDIT2:
Was könnt hier nicht stimmen?

Delphi-Quellcode:
    hSFMemory := OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM');
    if HSFMemory <> 0 then begin
      SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0);
      CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord));
Das stimmt schon mit Addr von MyResultRecord oder?

CopyMemory nimmt ja nur Pointers folglich geb ich ihm den Pointer zu meinem Record. :-/
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

Re: Pointer & Co

  Alt 4. Mär 2010, 16:49
Also ich seh da jetzt keine Fehler, aber wie wäre es zb mit so etwas
Delphi-Quellcode:
Type
  pMyrecord:=^TMyrecord;

....
 
  SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0);
  pMyrecord:=SfAreaPtr;
  CopyMemory(Addr(MyResultRecord),SfAreaPtr,sizeof(MyResultRecord));
und dann schau Dir mal den Inhalt von pMyRecord^ und MyResultRecord an, da sollte eigentlich das gleiche stehen.

(ich hatte die Record Definition übersehen)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 14:44 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