|
Программирование >> Перегруженные имена функций и идентификаторы
int OwlMain(int /*argc*/, char* /*argv*/[]) int res; TRY res = App().Run(); CATCH((xmsg &s) Какие хочешь ексепшены MessageBox(NULL, Message , s.c str()); return res; Почему иногда пытаешься проинспектировать переменную в BC++ во время отладки, а он ругается на inactive scope? Вот пример отлаживаемой программы. Компилим так: bcc -v is.cpp === Cut === #include <iostream.h> void a() int b = 7; cout << b << endl; void main() a(); === Cut === Входим в TD. Нажимаем F8, оказываемся на строке с вызовом a(). Пытаемся inspect b. Естественно, не находим ничего. А теперь перемещаем курсор в окне исходника на строку с cout, но трассировкой в a() не входим и пробуем посмотреть b. И вот тут-то и получаем inactive scope. Были у меня две структуры подобные, но вторая длиннее. Сначала в функции одна была, я на ней отлаживался, а потом поменял на вторую, да только в таНосе, где sizeof(struct ...) старое оставил, и налезали у меня данные на следующий кусок хипа Для избегания подобной баги можно в Си сымитировать Сиплюсный new: #define tmalloc(type) ((type*)malloc(sizeof(type))) #define amalloc(type, size) ((type*)malloc(sizeof(type) * (size))) Более того, в последнем define можно поставить (size) + 1, чтобы гарантированно избежать проблем с завершающим нулём в строках. Можно сделать иначе. Поскольку присвоение от malloc() как правило делают на стилизованную переменную, то нужно прямо так и писать: body = malloc(sizeof(*body)); Теперь вы спокойно можете менять типы не заботясь о malloc(). Ho это верно для Си, который не ругается на присвоение void* к type* (иначе пришлось бы кастить поинтер, и компилятор изменения типа просто не пережил бы). Вообще в Си нет смысла ставить преобразования от void* к указательному типу явно. Более того, этот код не переносим на C++ - в проекте стандарта C++ нет malloc() и free(), а в некоторых компиляторах их нет даже в hosted С++ заголовках. Проще будет: #ifdef cplusplus # define tmalloc(type) (new type) # define amalloc(type, size) (new type[size]) #else # define tmalloc(type) malloc(sizeof(type)) # define amalloc(type, size) malloc(sizeof(type) * (size)) #endif Суммируя вышеперечисленное, можно отметить следующее. Необходимо скомбинировать все варианты: #ifdef cplusplus # define tmalloc(type) (new type) # define amalloc(type, size) (new type[size]) # define del(var) delete(var) #else # define tmalloc(type) ((type*)malloc(sizeof(type))) # define amalloc(type, size) ((type*)malloc(sizeof(type) * (size))) # define del(var) free(var) # define vmalloc(var) ((var) = malloc(sizeof(*(var)))) #endif Я не понимаю, почему выдаются все файлы, вроде указал, что мне нужны только c атрибутом директория? Можно, конечно, проверять ff attrib, что нашли findfirst и findnext, но это мне кажется не выход. Может я что не дочитал или не понял? done = findfirst( *.* , &onlydir, FA DIREC); while(!done) cout << onlydir.ff name << endl; done = findnext(&onlydir); Это не баг, это фича MS DOS. Если атрибут установлен, то находятся как файлы с установленным атрибутом, так и без него. Если не установлен, то находятся только файлы без него. И проверять ff attrib вполне выход. Вы не дочитал хелп про findfirst/findnext. Создается файл: fopen(FPtr, w ). Как может случиться, что структура пишется на диск некорректно? fopen (FPtr, wb ); Режим не тот... При печати функцией cprintf в позицию экрана x = 80, y = 25 происходит автоматический перевод строки (сдвиг всего экрана на строку вверх и очистка нижней строки) и это знакоместо так и остается пустым. Может кто знает, как вывести символ в это знакоместо? Нажмите Ctrl+F1 на слове wscroll в Борландовском IDE. Правда, printf это не вылечит, так как его вывод идёт не через борландовскую библиотеку. Как очистить текстовый экран в стандарте ANSI C? Никак, в ANSI C нет понятия экрана и текстового режима. В Turbo Си так: #include <conio.h> void main(void) clrscr(); Можно также попробовать в1давать ANSI ESC-коды или сделать следующее: #include <stdio.h> #define NROWS 2*25 /* Чтобы обработать случай курсора в первой строке: void main(void) short i; for(i = 0; i < NROWS; puts( ); Ho это совершенно негарантированные способы. Используя прерывания VESA, пытаюсь подключить мышь и вот тут начинается сумасшедший дом... Что делать? Мышиный драйвер не знает какой у вас на данный момент видео-режим и использует параметры предыдущего режима (у вас он наверное текстовый - там мышь скачет дискретно по 8).
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |