www.delorie.com/archives/browse.cgi   search  
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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019