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

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


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


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

Выпуск № 181
от 25.01.2003, 15:30

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


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

baldr
Статус: Профессиональный
Общий рейтинг: 113.99
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 107.99
[Подробней >>]
Avl2k
Статус: Опытный
Общий рейтинг: 124.33
[Подробней >>]
 
Yuri Gordienko
Статус: Опытный
Общий рейтинг: 114.87
[Подробней >>]
Dzik
Статус: Профессиональный
Общий рейтинг: 114.41
URL: Разработка игрушек
[Подробней >>]
Ramzes
Статус: Доверительный
Общий рейтинг: 122.61
[Подробней >>]
 
DiGiT[old]
Статус: Опытный
Общий рейтинг: 108.14
[Подробней >>]
Jadd
Статус: Профессиональный
Общий рейтинг: 144.19
[Подробней >>]
PL
Статус: Доверительный
Общий рейтинг: 115.06
[Подробней >>]
 
Илья
Статус: Начальный
Общий рейтинг: 109.52
[Подробней >>]
Gibbel
Статус: Профессиональный
Общий рейтинг: 108.23
URL: Страничка обо мне и моих друзьях
Телефон: +7 902 168 02 65
[Подробней >>]


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

Вопрос № 540. У меня вопрос по функции IsInetOffline из intshcut.h. Как её вызывать?! Я старался обычным способом ... (ответов: 1)
Вопрос № 541. Здравствуйте господа эксперты! Возникла небольшая проблемма, надеюсь с вашей помощью удастся ее разр... (ответов: 5)
Вопрос № 542. Доброе время суток , эксперты ! Имеется инициализированный объект сложного класса, в котором имеется... (ответов: 5)
Вопрос № 543. Доброго времени суток. Меня интересует такой вопрос: Есть ли у многоуважаемых экспертов исходники р... (ответов: 5)
Вопрос № 544. Вообще вопрос по алгоритмам. Не подскажите ли как выполняется подсветка синтаксиса в разных текстовы... (ответов: 5)
Вопрос № 545. Многоуважаемый Jadd, Я, конечно, понимаю, что в MSDN есть все... Только исходников, работающих напря... (ответов: 1)
Вопрос № 546. Здраствуйте господа эксперты Вопрос такой какие стили нужно использовать и как их совместить чтобы п... (ответов: 4)

Вопросов: 7, ответов: 26


 Вопрос № 540

У меня вопрос по функции IsInetOffline из intshcut.h.
Как её вызывать?! Я старался обычным способом как MessageBox, но сообщения об ошибках выходят насчёт какого-то isguids.h .
В общем я по-всякому пытался но функция упирается всеми словами и байтами. Напишите мне об этом по E-mail, а то в инете я не часто. Да, кстати компилятор у меня Lcc-Win32



Вопрос отправлен: 21.01.2003, 16:18
Отправитель: Pr0Gr0M (alsou52@rambler.ru)

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

Отвечает baldr

Доброе время суток, Pr0Gr0M!
Для работы с функциями Internet я использую модуль WinInet. Есть большая дока по нему
на английском языке (~200 стр), где скачал - не помню, но попробуй поискать Google-ом.


Ответ отправлен: 22.01.2003, 00:26
Отправитель: baldr


 Вопрос № 541

Здравствуйте господа эксперты!
Возникла небольшая проблемма, надеюсь с вашей помощью удастся ее разрешить.
Задание было такое:
3. Написать программу работу с динамическими строками. Строка является объектом класса. Память под объект-строку должна выделяться динамически (с помощью new). Должны быть определены деструктор и следующие конструкторы:
· Конструктор по умолчанию, создает пустую строку;
· Конструктор преобразования, инициализирующий строку с помощью стандартной строки;
· Копирующий конструктор.
Необходимо перегрузить операцию сложения (по ней должна производится конкатенация (сцепление) строк..
Вот, что у меня получилось...
заранее благодарю


Приложение:


Вопрос отправлен: 21.01.2003, 19:07
Отправитель: Ольга

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

Отвечает vitya

Здравствуйте, Ольга!
Ваш код, очевидно не компилируется :)
оператор ++ перегружается в лучшем случае с одним параметром, да и то фиктивным, который показывает, что это постфиксный инкремент.
И еще замечание, члены класса делайте 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

Доброе время суток , эксперты !
Имеется инициализированный объект сложного класса, в котором имеется большое количество динамических массивов.
Как сохранить объект со всеми его данными на диске/потом загрузить его с диска?


Приложение:


Вопрос отправлен: 22.01.2003, 11:11
Отправитель: DM

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

Отвечает vitya

Добрый день, 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.
Если есть, будьте любезны, скиньте мне их на мыло...
З.Ы. Комментарии приветствуются.



Вопрос отправлен: 22.01.2003, 11:33
Отправитель: Gibbel

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

Отвечает Jadd

Здравствуйте, 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

Вообще вопрос по алгоритмам.
Не подскажите ли как выполняется подсветка синтаксиса в разных текстовых редакторах. Как она там реализована.
Спасибо.



Вопрос отправлен: 22.01.2003, 13:01
Отправитель: Craft

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

Отвечает Jadd

Приветствую Вас, 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.: отвечайте на мыло, дабы не засорять рассылку...



Вопрос отправлен: 22.01.2003, 13:37
Отправитель: Gibbel (Gibbel@narod.ru)

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

Отвечает Jadd

Здравствуйте, Gibbel!
По-поводу "кстати". Я ответил все желающим получить книжку, что не стану высылать, т.к. появился линк, по которому вы сами сможете скачать. Слишком уж много желающих появилось. ищите в рассылке.
Про POP3. Ну, знаете. Берите тогда RFC и по нему шпарьте совю прогу. Но, ИМХО, нет смысла этого делать, т.к. есть MAPI или WinSock, на худой конец. А в чем корявость?

Ответ отправлен: 22.01.2003, 13:45
Отправитель: Jadd


 Вопрос № 546

Здраствуйте господа эксперты
Вопрос такой какие стили нужно использовать и как их совместить чтобы получилось
1. Окно без заголовка и бордюра
2. Окно в стиле диалога но без заголовка
Заранее спасибо



Вопрос отправлен: 22.01.2003, 13:50
Отправитель: brak (brak@nm.ru)

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

Отвечает Avl2k

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

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

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

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

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




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

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

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

В избранное