Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2012, 10:09   #1
svkpro
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 52
По умолчанию очистка стека С++

здравствуйте всем!
у меня есть структура:
Код:
typedef struct kniga { 
char shifr[10]; 
char avtor[10]; 
char nazv[10];
char izdat[10];
char god[10];
struct kniga* next; 
 } Kniga;
из нее я заношу данные в стек. потом при удалении из стека я использую процедуру:
Код:
void pop()//взятие и удаление с записью в файл
{ 
 if(top != NULL) 
	 { 
	 Kniga* ptr = top->next; 
	 printf("%s ",top->shifr); 
	 printf("%s ",top->avtor); 
	 printf("%s ",top->nazv); 
	 printf("%s ",top->izdat); 
	 printf("%s - deleted\n",top->god); 
 char strz[100];
	 strcpy(strz,top->shifr);
	 strcat(strz,";");
	 strcat(strz,top->avtor);
	 strcat(strz,";");
	 strcat(strz,top->nazv);
	 strcat(strz,";");
	 strcat(strz,top->izdat);
	 strcat(strz,";");
	 strcat(strz,top->god);
	 strcat(strz,";");
FILE* fz;
	 fz=fopen("D:\\udal.txt","a+");
	 fputs(strz, fz);
	 fputc('\n',fz);
	 fclose(fz);
	 free(top);
	 top = ptr;
	 t--;
	 }
 else 
	 cout<<"стек пуст"<<endl;
}
подскажите пожалуйста оператор free(top) освобождает используемую стеком память? если да, то чем отличается операция удаления от очистки стека? если нет, может подскажете как очистить стек?
svkpro вне форума Ответить с цитированием
Старый 03.12.2012, 11:09   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
подскажите пожалуйста оператор free(top) освобождает используемую стеком память?
Не знаю, что вы понимаете под "используемой стеком памятью", но как и написано free(top) удаляет элементы, на который указывает top.

Цитата:
если да, то чем отличается операция удаления от очистки стека?
Обычно, под очисткой стека понимается удаление всех элементов.

Цитата:
если нет, может подскажете как очистить стек?
Пройти по элементам и удалить их, не?
p51x вне форума Ответить с цитированием
Старый 03.12.2012, 11:19   #3
svkpro
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 52
По умолчанию

данной процедурой я поднимаю элементы на вершину стека и потом удаляю, или все таки перемещаю вершину стека на адрес следующего элемента, потому как то не понятно что происходит с памятью???
блин я наверно через чур дотошный?))))
svkpro вне форума Ответить с цитированием
Старый 03.12.2012, 12:27   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

ну прочитайте же свой код, включите голову... или он все-таки не ваш?.. можете нарисовать блоками, после каждой строки отметить что и куда поменялось

Последний раз редактировалось p51x; 03.12.2012 в 12:30.
p51x вне форума Ответить с цитированием
Старый 03.12.2012, 13:11   #5
svkpro
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 52
По умолчанию

код мой.
Код:
Kniga* ptr = (Kniga *)malloc(sizeof(Kniga));
так я резервирую память и по адресам видно как заполняется стек но я не вижу что с этими адресами после запуска процедуры удаления, понимаете ? прога работает. просто преподаватель задал два пункта меню очистка стека и удаление элементов стека циклически это значит до полного опустошения то есть та же самая очистка. вот и встал вопрос разницы. я просто хочу понять правильно ли я понимаю как работает моя программа с памятью, по этому я и спрашиваю мнения более опытных. возможности попасть на консультацию к преподу нету и что он имел ввиду этими пунктами меню я не знаю.
а прога работает все хорошо и по большому счету если не заморачиваться то можно два пункта сделать одинаковыми и хорош, но хотелось бы всетаки понять до конца.
ps. код мой весь, а не только эта строка)))))

Последний раз редактировалось svkpro; 03.12.2012 в 13:15.
svkpro вне форума Ответить с цитированием
Старый 03.12.2012, 16:03   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Где в вашем коде:
Код:
void pop()//взятие и удаление с записью в файл
{ 
 if(top != NULL) 
	 { 
	 Kniga* ptr = top->next; 
	 printf("%s ",top->shifr); 
	 printf("%s ",top->avtor); 
	 printf("%s ",top->nazv); 
	 printf("%s ",top->izdat); 
	 printf("%s - deleted\n",top->god); 
 char strz[100];
	 strcpy(strz,top->shifr);
	 strcat(strz,";");
	 strcat(strz,top->avtor);
	 strcat(strz,";");
	 strcat(strz,top->nazv);
	 strcat(strz,";");
	 strcat(strz,top->izdat);
	 strcat(strz,";");
	 strcat(strz,top->god);
	 strcat(strz,";");
FILE* fz;
	 fz=fopen("D:\\udal.txt","a+");
	 fputs(strz, fz);
	 fputc('\n',fz);
	 fclose(fz);
	 free(top);
	 top = ptr;
	 t--;
	 }
 else 
	 cout<<"стек пуст"<<endl;
}
строка, которую вы привели в качестве примера:
Код:
Kniga* ptr = (Kniga *)malloc(sizeof(Kniga));
Я же вам уже предложил прочтите свой код построчно, если не получается рисуйте.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистка реестра KennyHack Visual C++ 7 03.03.2011 15:08
Очистка стека event-ов Ivan_32 JavaScript, Ajax 0 06.02.2010 01:48
Очистка БД dbase ИВАНьКа Общие вопросы C/C++ 12 28.08.2009 12:28
очистка get Gromsky PHP 1 19.08.2009 19:15
Очистка Edit Шура Помощь студентам 2 01.12.2008 19:18