Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 236
от 18.04.2003, 19:50

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 712
Отправлено ответов: 1569
Активность: 220.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Ramzes
Статус: Опытный
Общий рейтинг: 129.19
URL: :))
[Подробней >>]
Yuri Gordienko
Статус: Опытный
Общий рейтинг: 114.65
[Подробней >>]
Avl2k
Статус: Опытный
Общий рейтинг: 123.34
[Подробней >>]
 
DiGiT[old]
Статус: Профессиональный
Общий рейтинг: 111.41
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.04
[Подробней >>]
Eugene
Статус: Профессиональный
Общий рейтинг: 109.07
URL: мощный файловый архив
[Подробней >>]
 
Dzik
Статус: Профессиональный
Общий рейтинг: 113.81
URL: Разработка игрушек
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 698. Всем Hi! 1 Ошибка – не отпечатывает переменную Day. 2 Ошибка – проблемы с дестрактором, windows прог... (ответов: 4)
Вопрос № 699. Уважаемые эксперты, если можете, поделитесь пожалуйста алгоритмом балансировки бинарных деревьев, ес... (ответов: 3)
Вопрос № 700. Подскажите компилятор, который бы ругнулся void testException()throw(int) { throw 666; } int main(... (ответов: 2)
Вопрос № 701. Привет всем! По поводу вопроса 682: можно создать отдельный виток и использовать функции QueryPerfom... (ответов: 2)
Вопрос № 702. Здравствуйте, эксперты! Могу ли я передавать в качестве аргумента функции динамической библиотеки ра... (ответов: 5)

Вопросов: 5, ответов: 16


 Вопрос № 698

Всем Hi!
1 Ошибка – не отпечатывает переменную Day.
2 Ошибка – проблемы с дестрактором, windows программу закрывает.
Код в приложении, плиз помогите.
Использую Visual C++
Компилирую сначала FunsDate.cpp(Ctrl+F7), затем MainDate.cpp(Ctrl+F7), и запускаю через Ctrl+F5.
Best regards
alexneta.


Приложение:


Вопрос отправлен: 14.04.2003, 21:37
Отправитель: alexneta (alexneta@urbis.net.il)

[Следующий вопрос >>] [Список вопросов]

Отвечает Ramzes

Приветствую Вас, 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

Уважаемые эксперты, если можете, поделитесь пожалуйста алгоритмом балансировки бинарных деревьев, если можно, то максимально простым в реализации и прозрачным. И подскажите пожалуйста, где можно найти подробную и полную е-документацию на эту тему. Спасибо за внимание!



Вопрос отправлен: 14.04.2003, 22:48
Отправитель: Maniac

[Следующий вопрос >>] [Список вопросов]

Отвечает Avl2k

Доброе время суток, 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;
}



Вопрос отправлен: 14.04.2003, 23:17
Отправитель: Antonio

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Приветствую Вас, 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). Только вот я не врубился- всегда ли они (на всех ли машинах) работают.



Вопрос отправлен: 15.04.2003, 11:31
Отправитель: Morgion (morgion@yandex.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Доброе время суток, 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)
не работает.



Вопрос отправлен: 15.04.2003, 17:02
Отправитель: Игорь

[Следующий вопрос >>] [Список вопросов]

Отвечает Yuri Gordienko

Здравствуйте, Игорь!
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.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (38)
C / C++ (29)
Perl (7)
Delphi (14)
Pascal (23)
Basic / VBA (9)
Java / JavaScript (11)
PHP (5)
MySQL / MSSQL (5)
Пользователю
Windows 95/98/Me (28)
Windows NT/2000/XP (22)
"Железо" (24)
Поиск информации (12)
Администратору
Windows NT/2000/XP (12)
Linux / Unix (12)
Юристу
Гражданское право (8)
Семейное право (5)
Трудовое право (5)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное