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

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск No 18


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

C/C++ Вопрос-Ответ

Выпуск № 18
Cайт : SoftMaker.com.ru
Архив рассылки : C/C++ Вопрос-Ответ (архив)
Количество подписчиков : 1406
В этом выпуске
От ведущего

Здравствуйте уважаемые подписчики !

Прежде всего должен извиниться за задержку в выпуске рассылки. Причина банальна - накрылся комп, ушло некоторое время на его починку (в это время не было возможности сверстать выпуск). Хочется надеяться, что таких случаев в будущем не повториться.

Напоминаю, что, как всегда, вы можете отправить свои пожелания (замечания, предложения, сообщения об ошибках) по поводу рассылки и сайта по этому адресу.
Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций.

С уважением, Вахтуров Виктор.

Подписчикам

Чтобы заранее разрешить возможные недоразумения, прошу Вас помнить, что вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этом выпуске, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущем выпуске (за исключением случая, когда он снова опубликован в этом).

Для того, чтобы задать свой вопрос, пришлите письмо, кликнув по этой ссылке.
Для того, чтобы ответить на вопрос, надо кликнуть по ссылке "ответить", расположенной под текстом вопроса.

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 74 ( ZZZZiC )

Здравствуйте
Я программироую на Borland С++ 3.1 в консольных приложениях
Недавно стал изучать стандарты электронной почты, научился создавать
сообщения в формате *.msg, включать в них файлы в кодировке Base64 и
т. д. Т. е., как я понял это сообщение осталось просто переслать по
байтам ничего не меняя.
Проблема в том, что я абсолютно ничего не знаю по поводу того,
как передавать сообщения по сети, тем более в консольном приложении.
Хорошо было бы, если кто-нибудь даст ссылку на соответствующий ресурс
в интернете.
Заранее благодарен.
ZiC

Ответить на вопрос

Вопрос № 75 ( Гончаров Владимир )

Доброго времени суток! Я начинающий и не всё у меня получается... если кто сможет помогите пожалуйста разобраться в ошибках
Двусвязный список :
линейный поиск в массиве в прямом направлении;
метод сортировки массива - отбор;
в списке хранятся действительные числа (long double).

1 #include <iostream.h>
2 #include <list>
3 class zveno
4 {
5 int data;
6 zveno*next*pred;
7 public:
8 zveno*find(zveno*long double);
9 zveno*zveno::find(zveno*link,long double*mas key)
10 {
11  zveno*g,*p=NULL;
12  g=link;
13  while(g!=NULL&&p==NULL)
14  {
15 if(g->data==key)p=g;
16    g=g->next;
17 mas[? ]=g->data;
18    return p;
19  }
20 };
21 void sSort(long double*mas3)
22{
23 long double buf,min;
24 for(long double i=0;i<10;i++)
25  {
26 min=mas3[i];
27 for (long double j=i+1;j<10;j++)
28   {
29      if (mas[j]<min)
30  {
31        long double buf=mas3[j];
32        mas3[j]=mas3[i];
33        mas3[i]=buf;
34      }
35    }
36 }
37  for(i=0;i<10;i++)
38  cout<<mas3[i]<<endl;
39 }

Непонятна ошибка при запуске программы в 6,8,9,26,29,31,32,33,37,39.
Объясните, пожалуйста.

Ответить на вопрос

Вопрос № 76 ( Smart )

Пишу что то вроде небольшого HEX редактора.
Пока моя прога умеет только зегружать, редактировать и сохранять файлы.
Хотелось бы сделать также возможность редактирования FAT-таблиц
дисков (как обычных дискет, так и HDD). В идеале хочется получить
доступ к любому сектору любого устройства.
Я знаю, что Windows не позволяет напрямую обращаться к устройствам.
Например, программы-редакторы диска для DOS не могут получить к
диску доступ под Windows. Однако, некоторые редакторы все таки делают это.
Значит, все таки как то можно.

Вот вопрос в том и состоит. Можно ли, и если можно, то как получить
доступ к FAT таблице или лучше к произвольному сектору диска под
Windows. Хотелось бы читать сектора как блок байт и сохранять
произвольный блок в определенный сектор.

Ответить на вопрос

Вопрос № 77 ( Sergey Verbenko )

Как с помощью WinAPI создать в программе на С элементы управления типа EditBox, ComboBox, Button и тд.
Stivy.

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 71 ( zhenya1.14 )

Здравствуйте.

Такой вопрос: Как зи строки вида "asd,fgh,jkl" создать массив т.е.
array ( 0 =>asd; 1 => fgh; 2 => jkl)

В PHP есть такая функция: explode (string разделитель, string строка [, int порог]), есть ли ее аналог в C++ ?

Ответ ( Лисенок )

В наборе строковых функций библиотеки С++ есть янялогичная функция

char *strtok(char *str, char *delimiter);

первый раз при вызове в str передается указатель на разбиваемую
строку, при последующих - NULL
С уважением, Лисенок

Ответ ( selto )

А ты хотел всё из PHP? Тогда бы не хвастался С компактностью двоичного
кода.
Решение - в функции strtok(char *строка,const char *пороги)
При первом вызове даём указатель на строчку и разделители, заключённые
в кавычки.
Функция найдёт любой из разделителей и вернёт подстроку до него, потом
нужно вызывать strtok(NULL,...), здесь NULL заставит его обратиться к
остатку строки после группы разделителей.
Важно! Строка будет безвозвратно испорчена:
strtok кинет '\0' на место каждого первого разделителя.
Алгоритм примерно таков:

char *tmp,*array[MAX];//к сожалению, динамически
                      // выделить массив нельзя
//но можно сделать предположение типа MAX=strlen(str)/2+1
//:)))
strcpy(tmp,str);//резервиуем
for(int i=0;i<MAX,array[i++]=strtok(tmp,",");i++)
//важно не забыть проверку о выходе из массива,
//в любом случае это хорошая привычка
tmp=NULL;//он нам со второго захода и не нужен
//здесь у нас массив 0..i-1 и НИКАКОГО левого места
Вопрос № 72 ( Max116 )

Приветствую !
В прошлом выпуске спрашивал про скины, но забыл задать еще вопросик :)
Теперь меня интересуют плагины (plug-ins).

Очень интересно как правильно их реализовывать ?
Плагины есть во многих приложениях - в Winamp и Total Commander, например.
Насколько я понимаю, плагин - просто модуль с функциями (как например, обычная
dll). Может, в большинстве случаев это и есть dll.
Но в dll ведь можно определить некоторые функции, а в программе получится
использовать только те, о которых знаешь (надо ведь знать прототипы).
А плагины пишутся разными людьми.
Может есть способ вызывать функции из длл не зная прототипа ?
И как вообще можно получить список функций в dll ?
И как узнать какие из них надо запускать (если это плагин) ?

Вобщем, вопросов туча. Хотелось бы понять как это (плагины) работает.

Всем заранее спасибо !

Ответ ( 3V )

Мда... Ну и вопросики у Вас :)
Никак проигрыватель (аудио или видео) пишете ?
Да еще и со скинами/плагинами :)

В общем, о плагинах Вы правильно думаете - обычно это dll-ки (хотя, это и не обязательно). Насчет реализации... Много способов есть...
Можно сделать достаточно просто - каждый плагин будет в отдельной dll.
Каждая такая dll должна будет экспортировать функцию с определенным именем (и всегда одинаковыми параметрами), которая будет, например, возвращать указатель на структуру данных (которая лежит в dll). В этой структуре будут, например, поля, описывающие назначение плагина, его имя, и.т.д. Также в этой структуре пусть содержится указатель на массив других структур, которые содержат указатели на некоторые функции внутри dll (методы плагина) и описания этих методов. Это, вобщем, самый простой вариант. Я так делал как то в своем дипломе (диплом был - оптимизатор HTML кода; к основной проге как раз подключались плагины, содержащие функции, реализующие разные алгоритмы оптимизации; времени как обычно, не было и я сделал это так как выше описано).

Короче, у этого метода надостатков полно, и надежность очень низкая.
Гораздо элегантнее для данной задачи использовать COM.
В этом случае можно разработать достаточно универсальный интерфейс (набор интерфейсов), который (которые) и будут реализовываться разработчиками плагинов.
Здесь тоже есть пара особенностей.
Если плагины будут реализованы как inproc серверы, то плагин может повалить все приложение (как и в предыдущем случае). Как бы основное приложение не обрабатывало исключения, это возможно (например, плагин запортит в стеке информацию в EXCEPTION_RECORD). Чтобы этого избежать, можно реализовать плагины как outproc серверы (как отдельные приложения в exe-модулях). Тогда при crash-е плагина, основная прога останется работать, просто ей будет возвращен код ошибки. Но это скажется на времени вызовов методов интерфейса плагина.

Вот. Думаю, основную идею я изложил :)
Надеюсь, не очень сумбурно.
Вопрос № 73 ( Akela )

Здравствуйте.

Пишу в VC++ консольное приложение.
Создал его визардом. Он создал проект с функцией main.
Все вроде понятно. Все почти как в Borland C++ 3.1. под DOS.
Я могу выводить на экран информацию при помощи printf или cout.
Это работает
Но в дос можно было использовать цвет шрифта и фона для текста,
а также ставить курсор в произвольную позицию чтобы текст выводился
начиная оттуда. А тут я не нашел похожих функций.

Интересно таких функций нет вообще или есть аналоги функциям в BC 3.1.

Ответ ( Лисенок )

Ищи в MSDN информацию по консолям в WinAPI, например AllocConsole и
т.д.
С уважением, Лисенок

Ответ ( selto )

Как обычно подключается conio.h и всё пашет

Ответ ( joe329 )

Смотри файл conio.h своего компилятора, там описана работа с экраном в
DOS.

Ответ ( Дмитрий В. Евстегнеев )

Здравствуйте!

Я использовал следующий вариант. Коротенький пример:

#include <windows.h>
#include <wincon.h>

int main()
{
  char Text[]="Every thing is OK!!!\n"; // текст, который
                                        // выводим
  int length=strlen(Text); // получаем длину строки
  DWORD current; // номер выводимого символа
  HANDLE hCon; // дескриптор консоли

  // получаем дескриптор для вывода текста
  // кроме STD_OUTPUT_HANDLE можно отдельно
  // установить для STD_INPUT_HANDLE и STD_ERROR_HANDLE
    hCon =  GetStdHandle( STD_OUTPUT_HANDLE );

  // Задаем атрибуты текста и фона
  SetConsoleTextAttribute( hCon, FOREGROUND_GREEN |
                                 FOREGROUND_INTENSITY |
                                 BACKGROUND_BLUE |
                                 BACKGROUND_INTENSITY );

  // выводим текст с учетом указанных атрибутов
  WriteConsole( hCon, Text, length, &current, NULL);

  system("PAUSE");
  return 0;
}
/*
Допустима любая комбинация следующих констант:
FOREGROUND_BLUE
FOREGROUND_GREEN
FOREGROUND_RED
FOREGROUND_INTENSITY

BACKGROUND_BLUE
BACKGROUND_GREEN
BACKGROUND_RED
BACKGROUND_INTENSITY
*/
Книги по C/C++
Теория и практика C++
Теория и практика C++

Автор: Герберт Шилдт

Книга Герберта Шилдта, одного из самых известных авторов компьютерной литературы, посвящена обсуждению сложных вопросов программирования. В ней подробно рассмотрены параметризованные функции и классы, а также такие задачи программирования, как:
  1. реализация разреженных массивов,
  2. построение программ разбора математических выражений,
  3. алгоритмы шифрования и сжатия данных,
  4. а также проблемы разработки собственных языков программирования и написания интеграторов для них.
Приводятся ценные практические советы по приемам и метода работы, а также тексты готовых работающих программ.

Страница книги на Озоне
C/C++. Алгоритмы и приемы программирования. Код с комментариями
C/C++. Алгоритмы и приемы программирования. Код с комментариями

Автор: Арт Фридман, Ларс Кландер, Марк Михаэлис, Г. Шилдт

Книга является репринтным изданием C/C++. Архив программ.

В ней представлен код работоспособных программ на C/C++, относящихся к самым разнообразным областям и аспектам написания приложений - от работы с достаточно простыми структурами данных (списки, деревья) до построения синтаксических анализаторов и интерпретаторов, доступа к Internet и т. п.

Программный код может использоваться в ваших программах без изменений или в модифицированном и усовершенствованном виде. Чрезвычайно полезно также его изучение в целях освоения главнейших принципов, алгоритмов и приемов решения разных задач.

Программы снабжены развернутыми комментариями и детальными пояснениями их работы.

Книга предназначена для широкого круга программистов, пишущих на языках C/C++.

Страница книги на Озоне
Всего доброго. До встречи в следующем номере.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Отписаться

В избранное