Mail Archives: djgpp/1998/12/21/08:41:54
From: | tmurez AT nospam DOT planete DOT net (Thibaut Murez)
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Class pb appeared with djgpp 2.02
|
Date: | Mon, 21 Dec 1998 14:39:08 +0100
|
Organization: | Planete.net, France
|
Lines: | 216
|
Message-ID: | <MPG.10e867f7c461fa949896a5@news>
|
NNTP-Posting-Host: | numeris-bdx-1.planete.net
|
X-Newsreader: | Anawave Gravity v2.00
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Reply-To: | djgpp AT delorie DOT com
|
Hi
i've built a class to use personal resources under DOS.Whereas the code
ran fine when compiled using djgpp 2.01, now it generates a GPF at the
exit, when i delete my class. Full sources of my class are following (1
header and 1 C++ code file) but are commented in french. At the end of
this post youll find an example program and the gpf i get for you to
understand my problem.
################################################
#pack.h
include <stdlib.h> //malloc
#include <stdio.h> //fopen etc
#ifndef BYTE
#define BYTE unsigned char
#endif
#ifndef WORD
#define WORD unsigned short
#endif
#ifndef DWORD
#define DWORD unsigned long
#endif
#ifndef PACKED
#define PACKED __attribute__ ((packed))
#endif
#define PAS_DE_FICHIER 0 //pas de fichier dans l archive
#define ERREUR_D_OUVERTURE 1 //Impossible d'ouvrir l archive
#define MAUVAIS_FICHIER 2 //archive d'un autre type ou pas d archive
#define SUCCES 255
typedef struct {
BYTE Signature[8] PACKED;
WORD NbFichiers PACKED;
} Pack_PreHeader;
typedef struct {
BYTE NomFichier[13] PACKED; //8.3=12 + caractere nul de fin de
chaine
DWORD DebutFichier PACKED;
DWORD FinFichier PACKED;
DWORD LongueurFichier PACKED;
} Pack_Header;
class PackedFile
{
public:
////////////////////////////////////////////////////////////////////
/////////////////////Variables/////////////////////////////////////
//////////////////////////////////////////////////////////////////
Pack_PreHeader PreHeader;
Pack_Header *Header;
BYTE Succes;
WORD NombreFichiers;
FILE *FichierPacke;
////////////////////////////////////////////////////////////////////
//////////////////Constructeur/Destructeur/////////////////////////
//////////////////////////////////////////////////////////////////
PackedFile(char *NomFichier);
~PackedFile();
////////////////////////////////////////////////////////////////////
/////////////////////Fonctions Membres/////////////////////////////
//////////////////////////////////////////////////////////////////
WORD RetournePositionFichier(BYTE *NomFichierDOS);
DWORD ExtraitFichier(WORD PositionFichier);
void RefermeFichier(BYTE *FichierExtrait);
};
########################################################################
#pack.cc
#include "pack.h"
PackedFile::PackedFile(char *NomFichier)
{
if((FichierPacke=fopen(NomFichier, "rb"))!=NULL)
{
fseek(FichierPacke, -(sizeof(PreHeader)), SEEK_END);
fread(&PreHeader, sizeof(PreHeader), 1, FichierPacke);
if(PreHeader.Signature[0]!='T' ||
PreHeader.Signature[1]!='h' ||
PreHeader.Signature[2]!='i' ||
PreHeader.Signature[3]!='b' ||
PreHeader.Signature[4]!='a' ||
PreHeader.Signature[5]!='u' ||
PreHeader.Signature[6]!='t' ||
PreHeader.Signature[7]!='\0')
Succes=MAUVAIS_FICHIER;
else
{
if((NombreFichiers=PreHeader.NbFichiers)==0)
Succes=PAS_DE_FICHIER;
else
{
fseek(FichierPacke, -
(sizeof(PreHeader)+(sizeof(Pack_Header)*NombreFichiers)), SEEK_END);
Header=(Pack_Header *)malloc(NombreFichiers);
fread(Header,
sizeof(Pack_Header)*NombreFichiers, 1, FichierPacke);
Succes=SUCCES;
}
}
}
else
Succes=ERREUR_D_OUVERTURE;
}
PackedFile::~PackedFile()
{
if(Succes==SUCCES)
free(Header);
fclose(FichierPacke);
}
WORD PackedFile::RetournePositionFichier(BYTE *NomFichierDOS)
{
WORD Retour=0xffff, Position;
BYTE Trouve;
for(Position=0;Position<NombreFichiers;Position++)
{
Trouve=1;
for(int i=0;i<13;i++)
{
if(Header[Position].NomFichier[i]==NomFichierDOS[i
])
{
if(Trouve) Trouve=1;
}
else Trouve=0;
if(Header[Position].NomFichier[i]=='\0') break;
}
if(Trouve)
{ Retour=Position; break; }
//Si trouv‚, sortir de la fonction
}
return Retour;
}
DWORD PackedFile::ExtraitFichier(WORD PositionFichier)
{
BYTE *FichierArchive;
FichierArchive=(BYTE
*)malloc(Header[PositionFichier].LongueurFichier);
fseek(FichierPacke, Header[PositionFichier].DebutFichier,
SEEK_SET);
fread(FichierArchive, Header[PositionFichier].LongueurFichier, 1,
FichierPacke);
return (DWORD)FichierArchive;
}
void PackedFile::RefermeFichier(BYTE *FichierExtrait)
{
free(FichierExtrait);
}
###########################################################
#Exemple
#include "pack.h"
void main(int argc, char *argv[])
{
class PackedFile *Data;
BYTE *Buffer;
...
Data=new PackedFile("test.dat");
if(Data->Succes==SUCCES)
{
int position=Data->RetournePositionFichier((BYTE *)"test1.pcx");
Buffer=(BYTE *)Data->ExtraitFichier(position);
//Décompression de l'image
Data->RefermeFichier(Buffer);
//Affichage de l'image, retour en mode texte
delete Data;
}
else
//Affichage msg d erreur
}
#########################################################################
#GPF
General Protection Fault at eip=00005217
eax=0d31e000 ebx=0009616c ecx=0009617c edx=0d333acc esi=0009617c
edi=034c7800
ebp=00095b5c esp=00095b50
program=C:\PROGRA~1\PROGRA~1\SOURCES\DJGPP\PACKER\PACK
.EXE
cs: sel=00a7 base=829cd000 limit=000dffff
ds: sel=00af base=829cd000 limit=000dffff
es: sel=00af base=829cd000 limit=000dffff
fs: sel=0087 base=00018df0 limit=0000ffff
gs: sel=00bf base=00000000 limit=0010ffff
ss: sel=00af base=829cd000 limit=000dffff
App stack: [00095bc0..00015bc0] Exceptn stack: [00015aa4..00013b64]
Call frame traceback EIPs:
0x00005217 _free+247
0x0000168e __$_10PackedFile+22, line 35 of pack.cc -->free(Header)
[destructor]
0x00001c19 _main+741, line 61 of test.cc ->delete Data;
0x0000471a ___crt1_startup+174
Thanks in advance
- Raw text -