I think you need to understand that your two problems are strongly
related.

You seem to be assuming that you can write pointers to a file, and then
read them back (which you can), and have this make some sort of sense
(which you can't).
Unfortunately, pointers are the address of (usually dynamically
allocated) memory within the address space of the current instance of
your application.
When you run the program again, there is no reason to assume that these
addresses will be within the address space, and more importantly, even
if they are, the memory will not have been allocated to stroe the data
you are trying to address - it may be unsued or more likely already in
use for something else. Even within the same run, the memory might not
still be allocated to the structure (if it is, then why re-read the
data?)

It is quite possihle that the "pointers" you read will point to memory
being used by Delphi itself.

You need to re-think the way in which you are saving your data
structures to use a format which does not involve memory pointers.

Desigin a binary format is not trivial, and is usually hard to extend
when you think of one more bit of information you need to stire (because
it breaks any data you have saved before). I am now using XML formats to
store information which in the past I would have used binary files for -
the files are much larger, but the e-X-tensibility makes it all
worthwhile.

Regards,
Ken.

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Richard R
Sent: 14 October 2005 03:50
To: 'Delphi-Talk Discussion List'
Subject: wierd stuff happening


Hello again. I dont have any explanation on what's going on, maybe its
just the nature of things or delphi is seriously a messed up program
(i'm using delphi 6 enterprise)

I have a pointer that points to an array of pointers. It's under the
public section of the TObject class. When data is put into it via the
host application, extracting data such as name, etc works just fine.
However, as soon as a call to the BlockRead function that reads another
public variable of type integer named differently, it totally
reallocates the array pointer, erasing all the data.

I have shut down delphi, normally, and rebooted my ssytem and still it
acts all wierd and stuff. Any suggestions? I dont have any viruses or
trojans on my system, its clean. These problems only occur within this
block of code. In different projects, i've come across really wierd crap
happening, usually I can work around it (placing a call toa  function
before another, which to me has no logical reason, but makes it work),
however this problem is like the entire file is corrupt or whatever. I
really am at my wits end. Here's the pas file, maybe you can make
something out of it.

http://element8mm.250free.com/pedata.pas

procedure TSPEObjs.FRead(fname: string);
var
  f: File;
  i, j: integer;
  flag1, flag2: boolean;
begin
  if (fname = '') then
    exit;
  AssignFile(f, fname);
  try
    Reset(f);
    BlockRead(f, nbrPEObjs, sizeof(nbrPEObjs)); // peObjs array is f'd
up after this is called
    BlockRead(f, flag1, sizeof(flag1));
    BlockRead(f, flag2, sizeof(flag2));
    FreeData; // if I put this behind the first block read line, peObjs
(supposed to be nil) still gets allocated with data from god knows where
    if (nbrPEObjs > 0) then begin
      if flag1 then // is forced as false in write procedure
        peObjs:= tsxMalloc(nbrPEObjs * sizeof(pointer));
      if flag2 then
        selDataArray:= tsxMalloc(nbrPEObjs * sizeof(TSelData));
      for i:= 0 to nbrPEObjs - 1 do begin
        if flag1 then
          BlockRead(f, peObjs[i], sizeof(peObjs[i]));
        if flag2 then begin
          // this info gets read in correctly with all correct data
          BlockRead(f, selDataArray[i].seltype,
sizeof(selDataArray[i].seltype));
          BlockRead(f, selDataArray[i].nbrSelVxs,
sizeof(selDataArray[i].nbrSelVxs));
          if (selDataArray[i].nbrSelVxs > 0) then begin
            selDataArray[i].vxsIdxArray:=
tsxMalloc(selDataArray[i].nbrSelVxs * sizeof(integer));
            for j:= 0 to selDataArray[i].nbrSelVxs - 1 do
              BlockRead(f, selDataArray[i].vxsIdxArray[j],
sizeof(selDataArray[i].vxsIdxArray[j]));
          end;
          BlockRead(f, selDataArray[i].nbrSelEdges,
sizeof(selDataArray[i].nbrSelEdges));
          if (selDataArray[i].nbrSelEdges > 0) then begin
            selDataArray[i].edgeArray:=
tsxMalloc(selDataArray[i].nbrSelEdges * sizeof(integer));
            for j:= 0 to selDataArray[i].nbrSelEdges - 1 do
              BlockRead(f, selDataArray[i].edgeArray[j],
sizeof(selDataArray[i].edgeArray[j]));
          end;
          BlockRead(f, selDataArray[i].nbrSelFaces,
sizeof(selDataArray[i].nbrSelFaces));
          if (selDataArray[i].nbrSelFaces > 0) then begin
            selDataArray[i].faceIdxArray:=
tsxMalloc(selDataArray[i].nbrSelFaces * sizeof(integer));
            for j:= 0 to selDataArray[i].nbrSelFaces - 1 do
              BlockRead(f, selDataArray[i].faceIdxArray[j],
sizeof(selDataArray[i].faceIdxArray[j]));
          end;
        end;
      end;
    end;
  finally
    CloseFile(f); // when this is called, the host application has a
cow, its interface all chewed up, etc
  end;
end;
__________________________________________________
Delphi-Talk mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi-talk

__________________________________________________
Delphi-Talk mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi-talk

Reply via email to