Всем Hi! 1 Ошибка – не отпечатывает переменную Day. 2 Ошибка – проблемы с дестрактором, windows программу закрывает. Код в приложении, плиз помогите. Использую Visual C++ Компилирую сначала FunsDate.cpp(Ctrl+F7), затем MainDate.cpp(Ctrl+F7), и запускаю через Ctrl+F5. Best regards alexneta.
Приветствую Вас, alexneta! Ну естесственно, если у вас вызывается конструктор, в котором не инициализируется переменная StrDay, то в деструкторе вы передаете оператору delete неизвестно что, и в результате программа вылетает. Во всех конструкторах добавьте StrDay = 0; А в деструкторе измените "delete [] StrDay" на if( StrDay != 0 ) delete StrDay;
Ответ отправлен: 16.04.2003, 13:18 Отправитель: Ramzes Отвечает Yuri Gordienko
Здравствуйте, alexneta! В конструкторах Date(const int ,const int ); Date(const int ,const int ,const int ); проинициализируй нулем StrDay, - иначе получаешь указатель в никуда, соответственно в деструкторе что-то прибиваешь. На экран ничего не выводится, т.к. предыдущая ощибка приводит к segmentation fault, а т.к. cout - это буферизированый вывод, то прибивается он на корню. Для немедленного вывода используй cerr (std::cerr правильнее будет) PS Передавать(и возвращать) в функции константные базовые типы это слишком круто, - для этих типов значение полностью копируется в стек, поэтому объявлять их константными глупо. Удачи
Ответ отправлен: 15.04.2003, 16:59 Отправитель: Yuri Gordienko Отвечает Avl2k
Здравствуйте, alexneta! 1. У меня Day печатается. 2. В первом и втором конструкторе не инициализируется член StrDay. Соответственно, когда в деструкторе delete пытается освободить память по случайному указателю, происходит ASSERT. С уважением, Avl2k. Ответ отправлен: 15.04.2003, 12:22 Отправитель: Avl2k Отвечает DiGiT[old]
Приветствую Вас, alexneta! так у тебя когда вызывается деструктор для неинициализированной StrDay то delete[] StrDay делает вообще говоря неопределенную вещь при неопределенном StrDay. Хотя бы StrDay в NULL обращай в конструкторе Ответ отправлен: 15.04.2003, 06:47 Отправитель: DiGiT[old]
Вопрос № 699
Уважаемые эксперты, если можете, поделитесь пожалуйста алгоритмом балансировки бинарных деревьев, если можно, то максимально простым в реализации и прозрачным. И подскажите пожалуйста, где можно найти подробную и полную е-документацию на эту тему. Спасибо за внимание!
Доброе время суток, Maniac! См. здесь 1) http://www.rsdn.ru/article/default.asp?alg/bintree/avl.xml 2) http://www.junik.lv/~georg/programming/sa/avl.htm 3)http://www.idknet.com/isp/development/bin_trees/avl.htm 4) http://structur.h1.ru/avl.htm C уважением, Avl2k. Ответ отправлен: 15.04.2003, 16:13 Отправитель: Avl2k Отвечает Yuri Gordienko
Добрый день, Maniac! В www.google.com набери "бинарные деревья", - разгребать неделю будешь. Также можешь сходить на http://www.nist.gov/dads/ - здесь конкретно по алгоритмам + ссылки на библиотеки, мануалы и т.п. Удачи
Ответ отправлен: 15.04.2003, 16:48 Отправитель: Yuri Gordienko Отвечает vitya
Доброе время суток, Maniac! Посмотри у себя реализацию красно-черных деревьев - stl ассоциативные контейнеры set и map реализованы посредством именно балансированных деревьев. Заголовочные файлы называются и Ответ отправлен: 15.04.2003, 13:10 Отправитель: vitya
Вопрос № 700
Подскажите компилятор, который бы ругнулся void testException()throw(int) { throw 666; } int main(int argc, char *argv[]) { testException(); // вот здесь чтоб ругнулся, что не // обработано исключение return EXIT_SUCCESS; }
Приветствую Вас, Antonio! Например VC6.0. Вообще не поддерживает синтаксис типа void f() throw (int) { } О чем и дается предупреждения. Думаю в C++ (в отличии от Java) не надо обязательно ставить try catch блок вокруг функции, которая может выкинуть исключение. Ответ отправлен: 15.04.2003, 13:08 Отправитель: vitya Отвечает Eugene
Доброе время суток, Antonio! Может ты имел ввиду оператор, который отловит такое исключение? Так это try...catch. А компиляторов таких нету. Исключение может произойти даже в заведомо работающем куске. Все исключения, даже если захочешь не предугадаешь. А компиляторы строятся на точном знании, а не на угадывании, где и что произойдёт. Ответ отправлен: 15.04.2003, 09:23 Отправитель: Eugene
Вопрос № 701
Привет всем! По поводу вопроса 682: можно создать отдельный виток и использовать функции QueryPerfomanceCounter и QyeryPerfomaceFrequency (см. MSDN). Только вот я не врубился- всегда ли они (на всех ли машинах) работают.
Доброе время суток, Morgion! Нет. Не на всех. Если процессор не поддерживает счетчики, то возвращенный результат будет 0. Ответ отправлен: 15.04.2003, 13:03 Отправитель: vitya Отвечает Avl2k
Добрый день, Morgion! Операционкой функция согласно MSDN поддерживается, начиная с NT3.1 и Win95. Но и "железо" также должно поддерживать возможность получить значение счетчика (P4-то точно умеет). С уважением, Avl2k. Ответ отправлен: 15.04.2003, 13:50 Отправитель: Avl2k
Вопрос № 702
Здравствуйте, эксперты! Могу ли я передавать в качестве аргумента функции динамической библиотеки размер массива указателей, у меня выдает ошибку "expected constant expression". 1)int WINAPI Func(int iSize) { char *arr_tmp[iSize]; ..... 2)Возможно ли инициализировать массив указателей на С++ не используя цикл: for(k=0;k arr_tmp_metka[k] = new char[300]; memset(arr_tmp_metka[k],0,300); } вариант memset(arr_tmp_metka[k],0,300*iSize) не работает.
Здравствуйте, Игорь! 1)Так нельзя, т.к. размер статического массива должен быть известен на этапе компиляции, - используй динамический: int WINAPI Func(int iSize) { char *arr_tmp = (char*)malloc(iSize); ... free(arr_tmp); 2)Пиши так: memset(&arr_tmp_metka[k],0,300*iSize) Удачи
Ответ отправлен: 16.04.2003, 10:10 Отправитель: Yuri Gordienko Отвечает vitya
Доброе время суток, Игорь! 1. Первое не компилируется, так как ты пытаешься создать статический массив неизвестной длинны. Это в Си запрещенно. Вместо этого пиши char * arr_tmp = new char[iSize]; только потом не забудь вызвать delete [] arr_tmp. Или же char * arr_tmp = (char *)malloc(iSize * sizeof(char)); потом free(arr_tmp); 2. Нет нельзя, так как у встроенных типов нет конструкторов, соответственно у тебя не выйдет. А делать надо так memset(arr_tmp_metka[k], 0, iSize * sizeof(char)); Если конечно 300 это был размер массива в твоем примере. Ответ отправлен: 16.04.2003, 08:32 Отправитель: vitya Отвечает DiGiT[old]
Добрый день, Игорь! 1) А разве такая вещь как Func(char**, int count){ } не работает ?... Помни что WINAPI это не __cdecl и такая вещь как Func(...) не прокатит 2) Если нужно выделить обнуленную память используй calloc, а memset работает просто нужно уметь ей пользоваться. memset(arr_tmp_metka[k],0,300);, не совсем понятно, что arr_tmp_metka, но нужно передавать указатель. Но здесь у тебя скорее все не ошибка а непонимание. Смотри у тебя есть массив указателей, каждый из них указывает на свою область памяти. И в данном случае нет другого способа как обнулять в массиве. Потому что блоки не обязательно идут последовательно. А вообще читай побольше теориии. Ответ отправлен: 16.04.2003, 03:01 Отправитель: DiGiT[old] Отвечает Dzik
Здравствуйте, Игорь! 2)Конечно же не возможна, ведь ты должен сначала выделить память под данные, на которые ссылаешься!
Ответ отправлен: 15.04.2003, 18:04 Отправитель: Dzik Отвечает Avl2k
Добрый день, Игорь! 1. DLL тут не причем. По правилам C++ при объявлении массива в качестве размерности должно использоваться выражение, значение которого может быть вычислено на этапе компиляции. 2. Если массив нединамический, то можно: int *p1, *p2; int *a[] = { new int[5](), new int[10]() }; delete[] a[0]; delete[] a[1]; С уважением, Avl2k. Ответ отправлен: 15.04.2003, 18:45 Отправитель: Avl2k
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.