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
