я не уверен но вроде по стандарту после вызова delete/delete[] указатель становится равным NULL, во всяком случае надо глянуть стандарт, а на компилятор полагатся не стоит.
в стандарте не указано. поэтому лучше прравнивать, а еще лучше исользовать умные указатели. это спасет от утечек памяти.
пытаюсь скомпилить код, пишет ошибку " Не удается открыть файл include: math: No such file or directory" в чем может быть проблема ? (microsoft visual C++ 2008 express) Code: #include <iostream> #include <math> #include <stdio> #include <conio> #include <stdlib> #include <string> using namespace std; unsigned long dec=0; int oct[10],bin[10],hex[10]; int len=0; int count=0; char *vosm_strchar*)malloc(sizeof(char)); vvod() { scanf("%s",vosm_str); for(int i=0;vosm_str[i];i+ { oct[i]=vosm_str[i]-0x30; if((vosm_str[i]<'0')||(vosm_str[i]>'7')) return 1; } len=i; return 0; } void todec() { for(int i=0;i<len;i+ dec+oct[i]*(pow(8,len-i-1))); } void tobin() { for(int i=0;i<len;i+ switch(oct[i]) { case 0: bin[i]=0;break; case 1: bin[i]=1;break; case 2: bin[i]=10;break; case 3: bin[i]=11;break; case 4: bin[i]=100;break; case 5: bin[i]=101;break; case 6: bin[i]=110;break; case 7: bin[i]=111;break; } } void tohex() { int i=0; double temp = dec; while(temp>=16) { hex[i]=16*(modf(temp/16, &temp)); i++; count++; switch(int(hex[i])) { case 10: hex[i]=0xA;break; case 11: hex[i]=0xB;break; case 12: hex[i]=0xC;break; case 13: hex[i]=0xD;break; case 14: hex[i]=0xE;break; case 15: hex[i]=0xF;break; } } hex[i]=temp; } void vuvod() { printf("\nChislo v 8-ou s.s. = %s",vosm_str); printf("\nChislo v 10-ou s.s. = %ld",dec); printf("\nChislo v 2-ou s.s. = "); for(int i=0;i<len;i+ printf("%.3d",bin[i]); printf("\nChislo v 16-ou s.s. = "); for(i=count;i>=0;i--) printf("%X",int(hex[i])); } void main() { clrscr(); if(vvod()==0) { todec(); tobin(); tohex(); vuvod(); } else puts("Chislo zapizano ne v 8-ou s.s."); getch(); }
в отсутствии файла math )) попробуй написать math.h или возьми его из другой версии типа VC++ 6.0 МЫ 2008 сильно урезан во многих модулях. хотя этот должен быть
В с++ в названиях всех сишных хэдэров должен быть префикс "c", example: #include <cstdio> #include <cstring> не имеют права это хэдэр со стандартной либы) каким бы не был экспресс билд, стандарт он должен поддерживать полностью.
Не удается открыть файл include: conio: No such file or directory уже как только не писал,и #include <conio>, и #include <cconio>, бесполезно
файл conio.h это чисто борландовский хэдэр который не входит ни в какие стандарты, по этому его надо обьявлять в си-стиле #include <conio.h>
лучше приравнивай.а ещё лучше - сразу следи, чтобы не обратиться к нему после делита. но всё равно обнули)
отследить легко в хеллоуворлде. а в даже чуть более крупной ЛАБЕ, не то что в коммерческом проекте, можно банально проморгать удаление вектора. потом получается магическая ошибка, когда вызывается метод, но почему то данные неправильные. а все потому, что объект класса имеет указатель this, который убивается делитом, но не приравнивается нулю, и поэтому его можно разыменовать и получить данные. кароч кто видел такие моменты тот меня поймет, када в окне дебаг this = 0x00fea34d. это ацкие ошибки, которые могут вынести мозг и убить на дебаггинг лютые часы. поэтому обнулять обязательно. но еще лучше не юзать чистые указатели для хранения динамических объектов. смарт поинтеры решают.
короч вот простой пример проблем, порождаемых ленивой работой с указателями Code: class A{ public: A(){}; A(int _x1, int _x2, int _x3){ x1 = _x1; x2 = _x2; x3 = _x3; }; ~A(){}; void f1 (){ y = x1 + x2 - x3; } protected: int x1, x2, x3; int y; }; class B{ public: B(int _x1, int _x2, int _x3){ a = new A(_x1, _x2, _x3); }; ~B(){ delete a; } void f1(){ a->f1(); } protected: A* a; }; int main(void) { B* b; b = new B(45, 5, 15); delete b; b->f1(); system("pause"); return 0; } дебажить заходя внутрь методоа f1 сначала в классе B потом в A. В A имеем следующую картинку + this 0xfeeefeee {x1=??? x2=??? x3=??? ...} A * const причина проста - не обнулен указатель b после делита. программа будет крашица, но причиной ошибки является не это место. на поиск реального места уйдет драгоценное время. это кстати опять же зависит от компилера и системы. чем заполняется освободившееся место. тут ошибка только благодаря тому что там нет страницы. попробуйте руками изменить адрес this на число например 0x00401000 =) вообще никакой ошибки. это повлечет еще более веселый дебаггинг. и это тот самый тип ошибок, который зависит от сосотяния адресного простарнства процесса. которые не повторяются при выполнении одной и той же послеовательности действий... delete b; b = 0; b->f1(); исправляете так и легко узнаете о попытке обратиться к несуществующему объекту.
Дайте рабочего кода (winapi) с мониторингом физич. памяти, не важно, что: размер дисков, общий объём физ.памяти и т.д.
Помогите, пожалуйста, как в QT сделать кнопку и прогресс бар, что бы при нажатие на кнопку импортировались значения в реестр и показывало на прогресс баре состояние импорта.
я так понимаю импорт будет идти в цикле? если так то после каждой итерации изменяй значение на прогрессбаре, а вообще в документации все хорошо расписано как работать с виджетами.
только еще нужно расчитать, чтоб ровномерно. Иначе может быть циклов 300, а прогресс бар, при каждом вызове, увеличивает на 1%(ну так в GTKmm если не ошибаюсь), и наоборот, 10 циклов, 10 вызовов и всего 10%.
я пока ни разу не использовал прогрессбары, толкьо читал. Вот учебник на сайте gtkmm.org(т.е. на gtkmm как это выглядит) , тут объяснения и пример. http://gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/sec-progressbar.html Если нужны все методы класса, то покапайся в доках. Если не на си++ то смотри доки по gtk+
Подскажите пожалуйста консольную простую среду разработки для win приложений. Минимум излишеств - требуется для начального обучения синтаксису и т д Ну что то вроде g++ в никсах