проблема с c++ Builder6, а именно с его утилитой CodeGuard
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
проблема с c++ Builder6, а именно с его утилитой CodeGuard - 2009-01-06 21:12:53.536666
|
|
|
HDDimon
Сообщений: 96
Оценки: 0
Присоединился: 2008-08-27 15:43:39.283333
|
как очистить память в секции void __fastcall TForm1::Button1Click(TObject *Sender) //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <fstream.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
struct SummaryField
{
static const long sfData = 0x00;
static const long sfLong = 0x01;
static const long sfDouble = 0x02;
static const long sfText = 0x03;
char FieldType;
char FieldDescription[31];
long FieldLength;
double FieldDoubleValue;
void *FieldData;
};
struct FileSummary
{
long RecordCount;
SummaryField * Records;
};
//------------------------------------------------------------
void GetEPSSummary(char *filePath, FileSummary *Sum)
{
char strBuf[150];
char c;
char temp;
AnsiString comments; // одна строка
AnsiString FieldStart; // начало строки comments до пробела
AnsiString FieldNext; // конец строки comments после пробела
ifstream source(filePath); //открываем поток
if (!source) ShowMessage("Error: open File!"); //если не выбран файл то сообщить
else
for (c=0;source.get(c);) // получем по одному символу из потока
{
if (c == '%') //начиная с символа "%" начинаем работать
{
source.getline(strBuf,sizeof(strBuf)); //заносим целую строку в буфер
comments = strBuf; // приводим буфер к более читаемому виду
if ((strBuf[0])=='%') // ищем в строке символ %
{
for (int DeleteCount=0;DeleteCount!=150;DeleteCount++) // ищем первый пробел
{
temp = strBuf[DeleteCount];
if (temp == ' ')
{
FieldStart = (comments.SubString(0,DeleteCount)); // делим строку на 2 части
FieldNext = (comments.SubString(DeleteCount+1,comments.Length()-2));
if (FieldStart == "%%BoundingBox:" || FieldStart == "%BoundingBox:")
{ // заполняем структуру
Sum->Records->FieldType = Sum->Records->sfText;
Sum->Records->FieldData = (void *) calloc(strlen(FieldNext.c_str())+1,sizeof(char));
strcpy((char *)Sum->Records->FieldData,FieldNext.c_str());
strcpy(Sum->Records->FieldDescription,"Размер картинки");
}
if (FieldStart == "%%LanguageLevel:" || FieldStart == "%LanguageLevel:")
{
Sum->Records++;
Sum->Records->FieldType = Sum->Records->sfText;
Sum->Records->FieldData = (void *) calloc(strlen(FieldNext.c_str())+1,sizeof(char));
strcpy((char *)Sum->Records->FieldData,FieldNext.c_str());
strcpy(Sum->Records->FieldDescription,"Уровень языка");
}
if (FieldStart == "%%Creator:" || FieldStart == "%Creator:")
{
Sum->Records++;
Sum->Records->FieldType=Sum->Records->sfText;
Sum->Records->FieldData = (void *) calloc(StrLen(FieldNext.c_str())+1,sizeof(char));
strcpy((char *)Sum->Records->FieldData,FieldNext.c_str());
strcpy(Sum->Records->FieldDescription,"Создатель");
}
if (FieldStart == "%%Title:" || FieldStart == "%Title:")
{
Sum->Records++;
Sum->Records->FieldType=Sum->Records->sfText;
Sum->Records->FieldData = (char *) calloc(StrLen(FieldNext.c_str())+1,sizeof(char));
strcpy((char *)Sum->Records->FieldData,FieldNext.c_str());
strcpy(Sum->Records->FieldDescription,"Заголовок");
}
if (FieldStart == "%%CreationDate:" || FieldStart == "%CreationDate:")
{
Sum->Records++;
Sum->Records->FieldType=Sum->Records->sfText;
Sum->Records->FieldData = (void *) calloc(StrLen(FieldNext.c_str())+1,sizeof(char));
strcpy((char *)Sum->Records->FieldData,FieldNext.c_str());
strcpy(Sum->Records->FieldDescription,"Дата создания");
}
if (FieldStart == "%%DocumentProcessColors:" || FieldStart == "%DocumentProcessColors:")
{
Sum->Records++;
Sum->Records->FieldType=Sum->Records->sfText;
Sum->Records->FieldData = (void *) calloc(StrLen(FieldNext.c_str())+1,sizeof(char));
strcpy((char *)Sum->Records->FieldData,FieldNext.c_str());
strcpy(Sum->Records->FieldDescription,"Цвета документа");
}
if (FieldStart == "%%DocumentSuppliedResources:" || FieldStart == "%DocumentSuppliedResources:")
{
Sum->Records++;
Sum->Records->FieldType=Sum->Records->sfDouble;
Sum->Records->FieldData = (void *) calloc(StrLen(FieldNext.c_str())+1,sizeof(char));
strcpy((char *)Sum->Records->FieldData,FieldNext.c_str());
strcpy(Sum->Records->FieldDescription,"Поставляемы ресурсы");
}
}}}
}
}
source.close();
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString FileName; // имя файла
OpenDialog1->Filter = "eps|*.eps;|"; // фильтр
OpenDialog1->Execute(); // запускаем диалог выбора файлов
FileName=OpenDialog1->FileName;
SummaryField Records[8];
FileSummary sum;
sum.Records = Records;
sum.RecordCount = sizeof(Records);
GetEPSSummary(FileName.c_str(),&sum);
// Заполнение таблицы значениями из структуры
int i=7;
while(i--) sum.Records--;
for(i=0; i<7; i++)
{
StringGrid1->Cells[2][i] = (char*)sum.Records[0].FieldData;
StringGrid1->Cells[1][i] = (char*)sum.Records[0].FieldDescription;
StringGrid1->Cells[0][i] = ("№ " + IntToStr(i));
sum.Records=sum.Records+1;
}
StringGrid1->Cells[0][0] = "Номер:";
StringGrid1->Cells[1][0] = "Названия полей:";
StringGrid1->Cells[2][0] = "Значения:";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->Title = "Eps reader";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int y=1;y!=9;y++)
{
StringGrid1->Cells[2][y] = " "; // чистим колонку значений
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//выход
if ((Application->MessageBox("Would you like to exit?","EPS reader",MB_YESNO)) == IDYES)
{
return;
}
else
{
Abort();
}
}
//---------------------------------------------------------------------------
free() почему-то не работает
|
|
|
RE: проблема с c++ Builder6, а именно с его утилитой CodeGuard - 2009-01-06 22:29:19.520000
|
|
|
HDDimon
Сообщений: 96
Оценки: 0
Присоединился: 2008-08-27 15:43:39.283333
|
проблема была решена while(i–) { free(sum.Records->FieldData); //очищаем выделенную память sum.Records–; }
|
|
|
|
|