AGB  ·  Datenschutz  ·  Impressum  







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

Warum verursacht diese Zeile eine AV?

Ein Thema von Daniel G · begonnen am 15. Aug 2005 · letzter Beitrag vom 15. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
Daniel G
(Gast)

n/a Beiträge
 
#1

Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 21:17
Es gibt Programme, die man schreibt, die verfolgen einen 'ne verdammt lange Zeit. "Be S.M.A.R.T." ist so eines davon.

Welche Zeile ich meine? Diese hier:

 pAttrBuffer := PChar(PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0]); //Zeile 73 Ich hab' das Beispiel - Projekt mit allen notwendigen Dateien angehängt. Ich würde mich freuen, wenn man mir helfen könnte. Das Programm in Einzelteilen hier hinein zu kopieren, würde keinen Sinn machen. Es muss doch irgendwie gehen...
Angehängte Dateien
Dateityp: zip smart_696.zip (30,9 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 21:27
Ich weiss hier jetzt zwar auch nicht weiter aber ich mache es normalerweise immer so, dass ich die entsprechende Zeile mit showmessage-Meldungen suche und dann aufsplitte

var
c:char;
begin
c:=PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0];
pattrbuffer:=pchar(c);

und so weiter... vielleicht hilft das ja...
Michael Enßlin
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 22:13
Hallo Daniel,

müsste das nicht eher so aussehen:

pAttrBuffer := PChar(@PSENDCMDOUTPARAMS(@SCOP).bBuffer); Auch die Zeile danach sieht sehr suspekt aus...

Verstehe auch nicht warum du da mit PChar arbeitest.

Grüße vom marabu
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 22:19
Hmmm ... irgendwie sagt mein Delphi "Invalid Stream Format" ... kannst du mir helfen?

Scherz beseite ... was soll denn das bitte sein?
PChar(PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0]); ... bei mir ist AttrOutCmd == 16 ... kein Wunder also, daß das abkackt. Du castest hier den Wert 16 in einen Pointer auf eine Struktur und versuchst auf ein Element dieser Struktur (von der du sagst sie sei an Adresse 0x00000010) zuzugreifen. Du landest damit großzügig in der Nullpointerseite des Systems.

Erklär mal was du willst.

EDIT: hab ich doch den marabu übersehen ... tut mir sorry

Übrigens kann man dann ja auch gleich zB schreiben:      pAttrBuffer := @SCOP.bBuffer[0]; oder sogar:      pAttrBuffer := SCOP.bBuffer; ... nee, also das letzte mag er nicht, da bräuchtest du wohl wieder einen Typecast ...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 22:30
Hi Olli,

bin auch schon drauf gekommen. Habe zwar keine Doku aber das sieht vielversprechend aus:

Delphi-Quellcode:
var
  pAttrBuffer: PDRIVEATTRIBUTE;
begin
  ...
        pAttrBuffer := @SCOP.bBuffer;
  ...
end;
marabu
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 22:41
Zitat von marabu:
bin auch schon drauf gekommen. Habe zwar keine Doku aber das sieht vielversprechend aus
Stimmt. Ohne Verweis auf das erste Arrayelement geht's natürlich auch. Ist halt Angewohnheit bei mir
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#7

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 23:22
Hmm... Ok, die AV ist weg. Mal sehen, wie das jetzt weiter geht....

Ich hatte mich an dem orig. Microsoft - Code orientiert:

Code:
DoPrintData(((PSENDCMDOUTPARAMS)AttrOutCmd)->bBuffer,
      ((PSENDCMDOUTPARAMS)ThreshOutCmd)->bBuffer,
                     i);
"DoPrintData" ist dabei wie folgt deklariert:

Code:
VOID DoPrintData(PCHAR pAttrBuffer, PCHAR pThrsBuffer, BYTE bDriveNum)
int   i;
PDRIVEATTRIBUTE   pDA;
PATTRTHRESHOLD   pAT;
BYTE Attr;

   //
   // Print the drive number
   //
   printf("\nData for Drive Number %d\n", bDriveNum);
   //
   // Print the revisions of the data structures
   //
   printf("Attribute Structure Revision         Threshold Structure Revision\n");
   printf("            %d                                     %d\n\n",
            (WORD)pAttrBuffer[0],
            (WORD)pThrsBuffer[0]);

   //
   // Print the header and loop through the structures, printing
   // the structures when the attribute ID is known.
   //
   printf("  -Attribute Name-      -Attribute Value-     -Threshold Value-\n");

   pDA = (PDRIVEATTRIBUTE)&pAttrBuffer[2];
   pAT = (PATTRTHRESHOLD)&pThrsBuffer[2];

   for (i = 0; i < NUM_ATTRIBUTE_STRUCTS; i++)
   {
      Attr = pDA->bAttrID;
      if (Attr)
      {
         if (Attr > MAX_KNOWN_ATTRIBUTES)
            Attr = MAX_KNOWN_ATTRIBUTES+1;
         printf("%2X %-29s%d%20c%d\n",
               pDA->bAttrID,
               pAttrNames[Attr],
               pDA->bAttrValue,
               ' ',
               pAT->bWarrantyThreshold );
      }
      pDA++;
      pAT++;
   }

}
Zum Testen habe ich mir die erste Variable geschnappt:

pAttrBuffer: PChar Und dann dachte ich halt, das obige würde in Delphi so aussehen:
PChar(PSENDCMDOUTPARAMS(AttrOutCmd).bBuffer[0]) Oder hab' ich das damit völlig verhauen? Ich mochte "C" noch nie....
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 23:30
Zitat von Daniel G:
Oder hab' ich das damit völlig verhauen? Ich mochte "C" noch nie....
Jupp. Aber ohne die Deklaration für AttrOutCmd zu kennen, können wir auch mit deinem C-Codebeispiel nix machen ... also die Diagnose wird wohl ausbleiben müssen. Das kann in C formal korrekt sein, aber die Delphiversion war's nicht.
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#9

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 23:33
Zitat von Olli:
Aber ohne die Deklaration für AttrOutCmd zu kennen...
Kein Problem:

C:

Delphi-Quellcode:
#define READ_ATTRIBUTE_BUFFER_SIZE   512
BYTE   AttrOutCmd[sizeof(SENDCMDOUTPARAMS) + READ_ATTRIBUTE_BUFFER_SIZE - 1];
Und ...naja... halt dasselbe in Delphi:

Delphi-Quellcode:
const
   READ_ATTRIBUTE_BUFFER_SIZE = 512;
var
AttrOutCmd : Byte = BYTE(sizeof(TSENDCMDOUTPARAMS) + (READ_ATTRIBUTE_BUFFER_SIZE - 1));
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#10

Re: Warum verursacht diese Zeile eine AV?

  Alt 15. Aug 2005, 23:40
Zitat von Daniel G:
Delphi-Quellcode:
const
   READ_ATTRIBUTE_BUFFER_SIZE = 512;
var
AttrOutCmd : Byte = BYTE(sizeof(TSENDCMDOUTPARAMS) + (READ_ATTRIBUTE_BUFFER_SIZE - 1));
Nope, eher:
Delphi-Quellcode:
const
   READ_ATTRIBUTE_BUFFER_SIZE = 512;
var
AttrOutCmd : array[0.. BYTE(sizeof(TSENDCMDOUTPARAMS) + (READ_ATTRIBUTE_BUFFER_SIZE - 1))]of Byte;
Willst du genau wissen was du gemacht hast? Ein Byte kann Werte von 0..255 halten. 512 ist 0 + 512 ist dementsprechend wieder 0 in den Grenzen eines Bytes. Daher enthielt dein Byte den Wert sizeof(TSENDCMDOUTPARAMS)-1 oder so ...
  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 04:00 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