У меня вопрос по функции IsInetOffline из intshcut.h. Как её вызывать?! Я старался обычным способом как MessageBox, но сообщения об ошибках выходят насчёт какого-то isguids.h . В общем я по-всякому пытался но функция упирается всеми словами и байтами. Напишите мне об этом по E-mail, а то в инете я не часто. Да, кстати компилятор у меня Lcc-Win32
Доброе время суток, Pr0Gr0M! Для работы с функциями Internet я использую модуль WinInet. Есть большая дока по нему на английском языке (~200 стр), где скачал - не помню, но попробуй поискать Google-ом.
Ответ отправлен: 22.01.2003, 00:26 Отправитель: baldr
Вопрос № 541
Здравствуйте господа эксперты! Возникла небольшая проблемма, надеюсь с вашей помощью удастся ее разрешить. Задание было такое: 3. Написать программу работу с динамическими строками. Строка является объектом класса. Память под объект-строку должна выделяться динамически (с помощью new). Должны быть определены деструктор и следующие конструкторы: · Конструктор по умолчанию, создает пустую строку; · Конструктор преобразования, инициализирующий строку с помощью стандартной строки; · Копирующий конструктор. Необходимо перегрузить операцию сложения (по ней должна производится конкатенация (сцепление) строк.. Вот, что у меня получилось... заранее благодарю
Здравствуйте, Ольга! Ваш код, очевидно не компилируется :) оператор ++ перегружается в лучшем случае с одним параметром, да и то фиктивным, который показывает, что это постфиксный инкремент. И еще замечание, члены класса делайте private: Я бы написал такой класс так:
Приложение: Ответ отправлен: 22.01.2003, 08:55 Отправитель: vitya Отвечает Avl2k
Приветствую Вас, Ольга! По Вашему коду есть несколько замечаний. 1. Необходимо определиться, либо Вы всегда храните завершающий ноль, либо никогда, либо как-то различаете эти ситуации. 2. Для того, чтобы можно было использовать данные Вашей строки в функциях типа printf, необходим метод, преобразующий ее к стандартной. 3. Копирующий конструктор отсутствует, он должен копировать одну строку в другую, т.е. иметь объявление вида string( const string& ). 4. Непонятно, при чем здесь конкатенация строк и operator ++, по-моему лучше использовать string operator + (const string&, const string& b). 5. Не помешает operator =, иначе члены строки будут скопированы побитно. C уважением, Avl2k. P.S. Люди, а кто-нибудь знает, почему ответ с приложением иногда пропадает? #include #include #include class string { public:
int m_len; char* m_name; string(int len = 0, char c = ' ') { init(len); _strset(m_name, c); } string(const string& s) { init(s.m_name, s.m_len); } string(const char* s) { init(s, strlen(s)); } ~string() { delete[] m_name; } const char* get_data() const { return m_name; } string& operator=(const string& s); friend string operator + (const string& a, const string& b); private: void init(int len) { m_len=len; m_name=new char[len+1]; assert(m_name!=0); m_name[len]=0; } void init(const char* s, int len) { init(len); strcpy(m_name, s); } }; string& string::operator=(const string& s) { if( &s != this) { delete[] m_name; init(s.m_name, s.m_len); } return *this; } string operator+(const string&
a, const string& b) { string temp(a.m_len+b.m_len); strcpy(temp.m_name,a.m_name); strcpy(temp.m_name+a.m_len,b.m_name); // быстрее, чем strcat return temp; } void main() { char*str="you didnt know who did that hell," ; string a(str), b("although I knew it well"), both; both= a+b; printf("%s",both.get_data()); }
Ответ отправлен: 22.01.2003, 11:18 Отправитель: Avl2k Отвечает Yuri Gordienko
Приветствую Вас, Ольга! У вас не оговорено важное условие,- может ли данный клас в середине строки содержать символ '' или нет, - это условие приводит к совершенно разным алгоритмам. Я далее буду предполагать, что символ '' - конец строки. Проверка assert применяется только в период тестирования и надеятся на нее сильно не стоит, т.к. отключается единственным флагом при компиляции Итак, ошибки в вашем тексте: Объявление переменных из public рекомендую перенести в private - потенциальная ошибка. string(){name=new char[len=0];} - абсолютно лишнее нужно: string():name(0),len(0){} в деструкторе на NULL проверять не нужно, - delete сам проверяет string(int size){name = new char[len=size];} - некорректный конструктор, т.к. далее ваша строка содержит мусор, и в дальнейшем использование strcpy приведет к драматическим результатам. Кроме того,
зачем вам пустая строка? В аналогичных конструкторах как правило еще присутсвует символ, которым строка заполняется, или же используется для предварительного выделения памяти под будущую строку, но тогда как правило используют realloc, а у вас конкретно оговорено использовать только new string(const char*p) { len=strlen(p); name=new char[len+1]; ... В данном случае не проверяется входящая строка на NULL,- готовый segmentation. В нем же, - если длинна строки уже известна, то быстрее будет не strcpy(name,p), а memcpy(name,p,len+1);
Оператор сложения несколько другой(++ в вашем примере - это оператор инкремента, и куда его применить к строкам я придумать не могу): const string &operator+(const string &s) { if(s.len){ ////пустую не копируем char *newstr = new char[len+s.len+1]; memcpy(newstr,name,len); memcpy(&newstr[len],s.name,s.len+1);
delete [] name; name = newstr; } return *this; } Копирующий конструктор. string(const string &s) { len = s.len; if(len){ name = new char[len+1]; memcpy(name,s.name,len+1); } else name = 0; }
Ответ отправлен: 23.01.2003, 11:50 Отправитель: Yuri Gordienko Отвечает baldr
Здравствуйте, Ольга! (Черт (сорри!), никак не могу отправить! Отправляю без кода!) К сожалению адрес не указан, так что отправляю так. Если написать на baldr@pisem.net - все вышлю! Сразу говорю, что в Вашем коде я не разбирался, по причине занятости во время сессии. Просто вспомнил, что пару лет назад у меня было точно такое же задание. В приложении должен был быть h-файл, cpp-файл для класса и пример.
Ответ отправлен: 22.01.2003, 00:42 Отправитель: baldr Отвечает Dzik
Доброе время суток, Ольга! 1)Конструктор по умолчанию выделяет всекий гон-лучше если name=NULL; 2)Конструктора копирования я там не увидел :-) (третий конструктор это еще один конструктор с параметрами) 3)Операция сложения вроде +, а ты перегрузила ++(инкремент), поэтому у тебя и гон в тестировании. З.Ы. Может иногда стоит очищать память? З.З.Ы А зачем при обьединении строк +1 символ, скорее меньше на 1 будет. Ответ отправлен: 21.01.2003, 20:29 Отправитель: Dzik
Вопрос № 542
Доброе время суток , эксперты ! Имеется инициализированный объект сложного класса, в котором имеется большое количество динамических массивов. Как сохранить объект со всеми его данными на диске/потом загрузить его с диска?
Добрый день, DM! 1. Если у тебя иерархия классов, которые связанны друг с другом, то у тебя нет другого варианта, как использовать serialization или использовать ООДБ или написать это как-то самому. 2. Если связей между объектами нету, как например в твоем примере, то делается все просто я напишу под Windows можно поменять сохранение на что угодно. class b { int iSize; int * pArr; pubic: b(int n); ~b(); ... void SaveToDisk(HANDLE hFile) { assert(-1 != hFile); DWORD dwW; WriteFile(hFile, &iSize, sizeof(int), &dwW, NULL); assert(dwW == sizeof(int)); WriteFile(hFile, pArr, sizeof(int) * iSize, &dwW, NULL); assert(sizeof(int) * iSize == dwW); } void LoadFromDisk(HANDLE hFile) { if (pArr != NULL) delete [] pArr; assert(-1 != hFile); DWORD
dwW; ReadFile(hFile, &iSize, sizeof(int), &dwW, NULL); pArr = new int[iSize]; ReadFile(hFile, pArr, sizeof(int) * iSize, &dwW, NULL); } }
Ответ отправлен: 22.01.2003, 11:38 Отправитель: vitya Отвечает Avl2k
Доброе время суток, DM! 1. Надо для типа элементов массива написать функции сохранения/загрузки (или операторы << и >>). Можно хранить как в текстовом виде, так и в двоичном (экономно, но плохо переносится). 2. Запись: для массива сначала записываем количество сохраняемых элементов, а затем в цикле сохраняем каждый элмент. 3. Чтение: читаем количество сохраненных элементов, создаем массив нужной длины, а затем в цикле читаем каждый элемент. Пример сохранения в текстовом виде: class b { public: b(int n): m_len(n), m_mas(new int[n]) { for(int i=0; i ~b() {delete[] m_mas;} friend ostream& operator << (ostream& os, const b&); friend istream& operator >> (istream& is, b&); private: int *m_mas; int m_len; }; ostream& operator << (ostream& os, const b& x) { os << ' ' << x.m_len; for(int
i=0; i os << ' ' << x.m_mas[i]; return os; } istream& operator >> (istream& is, b& x) { is >> ws >> x.m_len; delete[] x.m_mas; x.m_mas=new int[x.m_len]; for(int i=0; i is >> ws >> x.m_mas[i]; return is; } class a { public: a(int n): mas_b(n) {} friend ostream& operator << (ostream& os, const a&); friend istream& operator >> (istream& is, a&); private: b mas_b; }; ostream& operator << (ostream& os, const a& x) { return os << x.mas_b; } istream& operator >> (istream& is, a& x) { return is >> x.mas_b; } void main() { a a1( 5 ); ofstream f1( "test.txt" ); f1 << a1; f1.close(); ifstream f2("test.txt"); a a2(1); f2 >> a2; } С уважением, Avl2k. Ответ отправлен: 22.01.2003, 12:32 Отправитель: Avl2k Отвечает Ramzes
Здравствуйте, DM! вообсще-то было бы не плохо, если бы ты в классе b имел бы переменную запоминающую размер массива см. приложение
Приложение: Ответ отправлен: 22.01.2003, 12:12 Отправитель: Ramzes Отвечает Yuri Gordienko
Здравствуйте, DM! Сохраняй ебъекта елементы как массив байт и грузи соответственно. Только может возникнуть проблема переносимости в связи с возможным разным выравниванием. Есть библиотека POST+, которая, как я понял позволяет все это делать на более производительном уровне (включая динамический перенос объектов на диск,-типа swap'а, и загрузку объектов с диска)
Ответ отправлен: 23.01.2003, 10:39 Отправитель: Yuri Gordienko Отвечает DiGiT[old]
Доброе время суток, DM! необходимо ввести метод вроде Serilize(). А сохранять каждый массив, например каждому из них предварив его описание, длину массива, размер элементов и др. А для загрузки что нить вроду Load() и делать все обратно первому процессу. Вроде все прозрачно. Если видишь какую то абстракцию сделай ее классом (Страуструп) :)) Ответ отправлен: 23.01.2003, 04:01 Отправитель: DiGiT[old]
Вопрос № 543
Доброго времени суток. Меня интересует такой вопрос: Есть ли у многоуважаемых экспертов исходники работы с POP3. Если есть, будьте любезны, скиньте мне их на мыло... З.Ы. Комментарии приветствуются.
Здравствуйте, Gibbel! В MSDN есть все. Искать нужно по словам MAPI или POP3. Ответ отправлен: 22.01.2003, 12:46 Отправитель: Jadd Отвечает Avl2k
Приветствую Вас, Gibbel! http://www.sources.ru/protocols/pop3_learning.shtml http://www.sources.ru/cpp/cpp_mail_utilits.shtml http://www.sources.ru/cpp/pop.zip http://freeprog.hotmail.ru/sources/pop3.html http://pages.ykt.ru/pavel/wsock/ws_smtp_pop3.htm http://pages.ykt.ru/pavel/files/ws/pop3.zip http://codeguru.earthweb.com/internet/index.shtml - тут их куча http://codeguru.earthweb.com/internet/pop3_protocol_class_wrapper.shtml С уважением, Avl2k.
Ответ отправлен: 22.01.2003, 14:10 Отправитель: Avl2k Отвечает PL
Добрый день, Gibbel! Самый классный IMHO ресурс - кодепроджект, там вот я сразу нашел тебе реализацию простого класса для работы с РОР3. Вот те линка, коментарии кстати тоже классные :-) http://codeproject.com/internet/pop3.asp Ответ отправлен: 22.01.2003, 12:04 Отправитель: PL Отвечает Илья
Здравствуйте, Gibbel! Не знаю, есть ли у тебя это, поэтому смотри дока: http://www.sources.ru/protocols/pop3_learning.shtml исходник: http://www.sources.ru/cpp/cpp_mail_utilits.shtml
Ответ отправлен: 23.01.2003, 08:38 Отправитель: Илья Отвечает DiGiT[old]
Приветствую Вас, Gibbel! там все просто посылаются команды текстовые и принимаются ответы, команды вроде 4 символьные. Ответ отправлен: 23.01.2003, 03:58 Отправитель: DiGiT[old]
Вопрос № 544
Вообще вопрос по алгоритмам. Не подскажите ли как выполняется подсветка синтаксиса в разных текстовых редакторах. Как она там реализована. Спасибо.
Приветствую Вас, Craft! А там кто во что горазд. Но, главный принцип - анализ введенного слова и последующей проверки на вхождение в список слов, подлежащих подсветке. Вроде все просто. Ответ отправлен: 22.01.2003, 13:12 Отправитель: Jadd Отвечает vitya
Приветствую Вас, Craft! общий принцип работы следующий - при в воде символа анализируется полученное слово - если оно входит в определенный список с определенным цветом, то цвет слова меняется. если символ стирается смотрится надо ли изменить цвет символы в тексте. Для работы обычно используется CRichEditCtrl.
Ответ отправлен: 22.01.2003, 13:15 Отправитель: vitya Отвечает Ramzes
Приветствую Вас, Craft! Ну вообще-то в этих текстовых редакторах естъ лексичeский анализатор (Parser), который позволяет выявлятъ ошибки во время написания кода, и конкретную позицию ошибки. На основании данной информации редактор и высвечивает данные участки кода разными цветами. Ответ отправлен: 22.01.2003, 13:33 Отправитель: Ramzes Отвечает DiGiT[old]
Доброе время суток, Craft! Возможно на сравнении упорядоченного списка ключевых слов с каждым словом в видимой области экрана, по крайней мере делается это быстро :) Ответ отправлен: 23.01.2003, 03:56 Отправитель: DiGiT[old] Отвечает Илья
Здравствуйте, Craft! Писал что-то подобное (подсветка синтаксиса Си (числа комментарии...) и Асм(директивы, числа...)) НО! - на асме и только как просмотрщик (не редактор). Если интересно - могу выслать исходники и пояснилки (это были курсачи). Ответ отправлен: 23.01.2003, 05:10 Отправитель: Илья
Вопрос № 545
Многоуважаемый Jadd, Я, конечно, понимаю, что в MSDN есть все... Только исходников, работающих напрямую с POP3 там нет... MAPI мне не катит в силу своей корявости... Кстати, книжки от вас я так и не дождался... P.S.: отвечайте на мыло, дабы не засорять рассылку...
Здравствуйте, Gibbel! По-поводу "кстати". Я ответил все желающим получить книжку, что не стану высылать, т.к. появился линк, по которому вы сами сможете скачать. Слишком уж много желающих появилось. ищите в рассылке. Про POP3. Ну, знаете. Берите тогда RFC и по нему шпарьте совю прогу. Но, ИМХО, нет смысла этого делать, т.к. есть MAPI или WinSock, на худой конец. А в чем корявость? Ответ отправлен: 22.01.2003, 13:45 Отправитель: Jadd
Вопрос № 546
Здраствуйте господа эксперты Вопрос такой какие стили нужно использовать и как их совместить чтобы получилось 1. Окно без заголовка и бордюра 2. Окно в стиле диалога но без заголовка Заранее спасибо
Приветствую Вас, brak! 1. Не указывать WS_CAPTION. 2. Указать WS_DLGFRAME. Используйте при формировании параметра dwStyle функции CreateWindow. С уважением, Avl2k. Ответ отправлен: 22.01.2003, 14:34 Отправитель: Avl2k Отвечает Gibbel
Доброе время суток, brak! 1.) Никаких (Значение стилей должно быть 0) 2.) WS_BORDER Ответ отправлен: 22.01.2003, 14:19 Отправитель: Gibbel Отвечает Ramzes
Здравствуйте, brak! ну, чтобы у окна был заголовок и бордюр нужно поставитъ стилъ WS_BORDER и WS_CAPTION, следователъно чтобы у окна их не было, тебе надо от них избавитъся следующим образом у CWnd естъ функция ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags) CWnd wnd; ... wnd.ModifyStyle(WS_BORDER | WS_CAPTION, 0, 0); и все. Ответ отправлен: 22.01.2003, 14:13 Отправитель: Ramzes Отвечает DiGiT[old]
Приветствую Вас, brak! 1) не надо делать с WS_BORDER и WS_SYSMENU, WS_TITLE 1) WS_DLGFRAME Ответ отправлен: 23.01.2003, 03:54 Отправитель: DiGiT[old]
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.