• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

[Неактуальная тема] Проблема С Очисткой Памяти

  • Автор темы Best
  • Дата начала
B

Best

Здравствуйте! Помогите пожалуйста исправить проблему с очисткой памяти в void memfree(). Заранее спасибо.
P.S. Для удобства могу выложить саму программу.

C++:
#include "stdafx.h"
#include <windows.h>
#include "resource.h"
#include <string>
#define MAXPOINTS 1000

int ko,key1=0;
int kolreb;

struct spis
{
int x,y;
int c;
int n;
spis *next;
};
spis *first = NULL;

spis **Mas;//массив координат 

struct rebro
{
int a,b,l;
int flag;
};

rebro *Spis = NULL;
rebro *curr_rebro;

int n,kolr,step,kolvern=0, kolnev=0;

bool AddError = true;


void memfree()
{
int i;
spis *st, *sp;
st=first;
while (st!=NULL)
{
sp=st; 
st=st->next; 
delete sp;
}
rebro *Spis;
if(Spis!=NULL)
{
for(i=0;i<n*(n-1)/2;i++)
{
delete Spis;
}
delete Spis;
}

first=NULL;
Mas=NULL; 
n=0;
step=0;
kolr=0;
}

void masPOINT()
{
int i, j, k;
spis *st;
Mas = new spis*[n];
Spis = new rebro[n*(n-1)/2];

for(i=n, st = first; st != NULL; st = st->next)
{
i--;
Mas[i] = st;
Mas[i]->n=0;
Mas[i]->c=i;
}
for(i=0, k=0; i<n; i++)
for(j=i+1; j<n; j++, k++)
{
Spis[k].flag = 0;
Spis[k].a = i;
Spis[k].b = j;
Spis[k].l = abs(Mas[i]->x-Mas[j]->x)+abs(Mas[i]->y-Mas[j]->y);
}
}



int cmp_rebra(const void* r1, const void* r2)
{
const rebro *reb1 = (const rebro*)r1;
const rebro *reb2 = (const rebro*)r2;
return reb1->l-reb2->l;
}

int CALLBACK MyDlgProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
int iL,i,j,kurposX,kurposY,nev,sr,t,f;
char buf[100];
int otver=0,otnever=0;

HDC hdc;
HPEN hpen,old_pen;
HBRUSH hbrush,old_brush;
PAINTSTRUCT ps;

static POINT points[MAXPOINTS];
static int iCount;

switch(msg)							 
{
case WM_INITDIALOG:break;	  
case WM_COMMAND:				
switch(LOWORD(wp))
{
case IDC_LIST1:
{
if(HIWORD(wp) != LBN_DBLCLK)
break;
int i = SendMessage((HWND)lp, LB_GETCURSEL, 0, 0);
if(i == LB_ERR)
break;
rebro *r = (rebro*)SendMessage((HWND)lp, LB_GETITEMDATA, i, 0);
if(kolreb==n-1)
{
MessageBox(hwnd,"вы уже ввели нужное кол-во рёбер..нажмите на кнопку конец алгоритма","Ошибка",MB_OK);//вы уже ввели нужное кол-во рёбер
key1=1;
break;
}
if(r->flag != 0)
{
MessageBox(hwnd,"вы уже выбирали это ребро","Ошибка",MB_OK);//уже выбиралось
key1=1;
break;
}
if(Mas[r->a]->c == Mas[r->b]->c)
{
MessageBox(hwnd,"данное ребро образует цикл","Ошибка",MB_OK);//образует цикл
key1=1;
break;
}
if(Mas[r->a]->n==step || Mas[r->b]->n==step)
{
MessageBox(hwnd,"привышение степени вершины","Ошибка",MB_OK);//превышает степень
key1=1;
break;
}
if(r->l!=curr_rebro->l)
{
MessageBox(hwnd,"вы выбрали не то ребро","Ошибка",MB_OK);//ошибка,не то ребро
key1=1;
break;
}
r->flag = 1;
sprintf(buf," %d ",r->a+1);
SendMessage(GetDlgItem(hwnd,IDC_EDIT1),EM_REPLACESEL,0,(LPARAM)buf);
sprintf(buf," -%d  ",r->b+1);
SendMessage(GetDlgItem(hwnd,IDC_EDIT1),EM_REPLACESEL,0,(LPARAM)buf);
sprintf(buf,"%6d ",r->l);
SendMessage(GetDlgItem(hwnd,IDC_EDIT3),EM_REPLACESEL,0,(LPARAM)buf);
ko+=r->l;
Mas[r->a]->n++;
Mas[r->b]->n++;
t=Mas[r->a]->c;
f=Mas[r->b]->c;
for(i=0;i<n;i++)
if(Mas[i]->c==f)Mas[i]->c=t;
kolreb++;
if(kolreb<n-1)
{
curr_rebro = r;
do
{
curr_rebro++;
}
while( Mas[curr_rebro->a]->c==Mas[curr_rebro->b]->c ||
Mas[curr_rebro->a]->n==step || Mas[curr_rebro->b]->n==step);
}
sprintf(buf,"%d ",ko);
SetWindowText (GetDlgItem(hwnd,IDC_STATIK),buf);

InvalidateRect(hwnd, NULL, 1);
break;
}

case IDCANCEL:
return EndDialog(hwnd,IDCANCEL);

case IDC_OK:
{									  
sprintf(buf,"%d ",kolreb);
SetWindowText (GetDlgItem(hwnd,IDC_KOLR),buf);
if(kolreb<n-1)
{											  
MessageBox(hwnd,"вы получили несвязанные компоненты","Ошибка",MB_OK);//вы уже ввели нужное кол-во рёбер
key1=1;
}
if(key1==1) otnever++;
else otver++;
sprintf(buf,"%d ",otver);
SetWindowText (GetDlgItem(hwnd,IDC_VERN),buf);
sprintf(buf,"%d ",otnever);
SetWindowText (GetDlgItem(hwnd,IDC_NEV),buf);
break;
if((otver+otnever)==10)MessageBox(hwnd,"Ваш результат: %d из 10","завершение",MB_OK);
}

case IDC_RASST:
{
EnableWindow(GetDlgItem(hwnd, WM_LBUTTONDOWN), 0);
int i,j;
HWND hList;
spis *st, *sp;
char rast[128];
ko = 0;
kolreb = 0;
if(n>1)
{
masPOINT();
qsort(Spis, n*(n-1)/2, sizeof(*Spis), cmp_rebra);
curr_rebro = Spis;
hList = GetDlgItem(hwnd, IDC_LIST1);
for(int i = 0; i < n*(n-1)/2; i++)
{
sprintf(rast, "%d - %d -> %d", Spis[i].a+1, Spis[i].b+1, Spis[i].l);
SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)rast);
SendMessage(hList, LB_SETITEMDATA, i, (LPARAM)&Spis[i]);
}
}
else MessageBox(hwnd,"Щёлкните на координатной сетке для ввода вершин!","Количества вершин недостаточно",MB_OK);
break;
}

case IDC_CLEAR:														 
AddError = true;
RECT rect;
rect.top=0;
rect.left=0;
rect.right=800;
rect.bottom=800;
InvalidateRect(hwnd,&rect,1);
SendDlgItemMessage(hwnd, IDC_LIST1, LB_RESETCONTENT, 0, 0); // очищение листа со списком
memfree();
for(i=0;i<99;i++)
{
buf[i]=' ';

}
ko=0;
//sprintf(buf,"%s",' ');
SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),buf);
SetWindowText(GetDlgItem(hwnd,IDC_EDIT3),buf);
SetWindowText(GetDlgItem(hwnd,IDC_KOLR),buf);
SetWindowText(GetDlgItem(hwnd,IDC_STEP),buf);
SetWindowText(GetDlgItem(hwnd,IDC_STATIK),buf);
EnableWindow(GetDlgItem(hwnd,WM_LBUTTONDOWN ), 1);
break;




case IDC_STP:
{
int l=0;
step++;
l=sprintf(buf,"%d",step);
SetWindowText(GetDlgItem(hwnd,IDC_STEP),buf);
break;
}

case IDC_STM:
{ 
int l=0;
if(step!=0) step--;
l=sprintf(buf,"%d",step);
SetWindowText(GetDlgItem(hwnd,IDC_STEP),buf);
break;
}

default:return 0;
}
break;

case WM_LBUTTONDOWN:
{
POINT CursorPos; 
CursorPos.x = LOWORD(lp);
CursorPos.y = HIWORD(lp);

if ((CursorPos.x/20<=25)&&(CursorPos.y/20<=25))
{
spis *st, *sp;
st=new spis;
st->next = first;
first = st;
st->x=CursorPos.x/20;
st->y=CursorPos.y/20;
n++;
InvalidateRect(hwnd, NULL, 1);
}

}
break;

case WM_MOUSEMOVE :

if ((LOWORD (lp)/20<=25)&&(HIWORD (lp)/20<=25))
{

sprintf(buf,"%d",LOWORD (lp)/20);
SetWindowText (GetDlgItem(hwnd,IDC_VIVKOR), buf);
sprintf(buf,"%d",HIWORD (lp)/20);
SetWindowText (GetDlgItem(hwnd,IDC_VIVKOR1), buf);

}	  

break;

case WM_PAINT:														 
{
HPEN pen;
hdc=BeginPaint(hwnd,&ps);
Rectangle(hdc,0,0,510,510);
hpen=CreatePen(PS_SOLID,1,RGB(0,0,255));
hbrush=CreateSolidBrush(RGB(0,255,0));
old_pen=(HPEN)SelectObject(hdc,hpen);
old_brush=(HBRUSH)SelectObject(hdc,hbrush);
MoveToEx(hdc,0,20,0);
LineTo(hdc,500,20);
MoveToEx(hdc,20,0,0);
LineTo(hdc,20,500);
for(i=0;i<25;i++)
{
MoveToEx(hdc,i*20,0,0);
LineTo(hdc,i*20,500);
MoveToEx(hdc,0,i*20,0);
LineTo(hdc,500,i*20);
}
int i = n;
for(spis *st = first; st != NULL; st = st->next, i--)
{
hbrush=CreateSolidBrush(RGB(0,190,0));
old_brush=(HBRUSH)SelectObject(hdc,hbrush);
kurposX = st->x;
kurposY = st->y;
Ellipse(hdc,(kurposX*20-5),(kurposY*20-5),(kurposX*20+5),(kurposY*20+5));
iL=sprintf(buf,"%d", i);
TextOut(hdc,(kurposX*20-15),(kurposY*20-35),buf,iL);
}
if(Spis != NULL)
{
for(i=0; i<n*(n-1)/2; i++)
if(Spis[i].flag != 0)
{
pen=CreatePen(PS_SOLID,2,RGB(0,33,99));
SelectObject(hdc,pen);
MoveToEx(hdc,Mas[Spis[i].a]->x*20,Mas[Spis[i].a]->y*20,0);
LineTo(hdc,Mas[Spis[i].b]->x*20,Mas[Spis[i].b]->y*20);
}
}

EndPaint(hwnd,&ps);
DeleteObject(hpen);
DeleteObject(hbrush);
DeleteObject(pen);
}
break; 
default:return 0;																			  
}
return 1;																									  
}

void main()
{
DialogBox(0,MAKEINTRESOURCE(IDD_DIALOG1),0,MyDlgProc);


}
 
R

rrrFer

а что там за проблемы?
Код:
		rebro *Spis;
if(Spis!=NULL)
не инициализированный указатель нельзя использовать
и что это за бред:
Код:
				for(i=0;i<n*(n-1)/2;i++)
{
delete Spis;
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!