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

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

  Все выпуски  

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


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

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

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

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

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

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

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

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

Подписчикам

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

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

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

Вопросы

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

Вопрос № 78 ( Able )

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

У меня пара вопросов по winapi!
Подскажите как можно управлять скоростью вентилятора
кулера, может есть какая нибудь функция? И ещё, как
можно при помощи api выключить монитор(в смысле погасить экран,
как это делается в настройках питания в панели управления
при долгом бездействии монитор отключается).

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

Вопрос № 79 ( ZVA )

Приветствую!

Недавно прочел, что при программировании на C++ можно использовать так называемые Smart-указатели. Это указатели, которые сами освобождают выделенную память, когда она больше не нужна. Ими рекомендуют пользоваться, поскольку это удобно.
Напишите пожалуйста как можно использовать эти указатели. Какие типы надо объявлять и какие библиотеки использовать. Если можно, приведите пожалуйста небольшой пример использования таких указателей.

Заранее спасибо.

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

Вопрос № 80 ( Max116 )

Привет, All !

Не подскажет ли кто, как можно заставить модем поднять
трубку и соединиться с провайдером, а потом и оборвать
связь ?
Если кто знает, подскажите API функции, или поделитесь
ссылкой, плиз.

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

Ответы

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

Вопрос № 74 ( ZZZZiC )

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

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

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

Прочитать про передачу данных через сокеты в Ms Windows можно,
например, здесь http://club.shelek.com/view.php?id=29
А про Simple Mail Transfer Protocol (SMTP) на http://www.protocols.ru/

Вот небольшой пример, иллюстрирующий процесс связи с smtp-сервером.

#include <windows.h>
#include <winsock.h>
#include <stdio.h>

WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
hostent *d_addr;
char text[1024];

int main()
{
  // инициализируем сокеты
  if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws))) 
  { 
    printf("Error in WSAStartup(...)\n");
    return 1; }

  // создаем сокет
  s = socket (AF_INET, SOCK_STREAM, 0);
  if (s == INVALID_SOCKET) 
  { 
    printf("Error in socket(...)\n");
    return 1;  }

  // получаем адрес сервера
  d_addr = gethostbyname ("smtp.mail.ru");
  if (d_addr==NULL)
  {
    printf("Error in gethostbyname(...)\n");
    return 1;  };

  // заполняем параметры адреса
  addr.sin_family = AF_INET; 
  addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
  addr.sin_port = htons (25);

  // устанавливаем соединение
  if (SOCKET_ERROR == (connect (s, (sockaddr *) &addr,
                       sizeof (addr)))) 
  { 
    printf("Error in connect(...)\n");
    return 1; }

  // ждем ответ от сервера
  recv(s,text,sizeof(text),0);
  printf("recv - %s", text);

  // приветствуем сервер
  strcpy(text,"HELO smtp.mail.ru\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // ждем подтверждение от сервера
  recv(s,text,sizeof(text),0);
  printf("recv - %s", text);

  // начинаем отправлять конверт состоящий из полей
  // MAIL FROM: и RCPT TO: После каждого поля ждем
  // подтверждение

  // сообщаем отправителя
  strcpy(text,"MAIL FROM: sender@mail.ru\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // ждем подтверждение от сервера
  recv(s,text,sizeof(text),0);
  printf("recv - %s", text);

  // сообщаем получателя
  strcpy(text,"RCPT TO: receiver@mtu-net.ru\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // ждем подтверждение от сервера
  recv(s,text,sizeof(text),0);
  printf("recv - %s", text);

  // подаем команду, что готовы начать передачу письма
  strcpy(text,"DATA\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // ждем подтверждение от сервера
  recv(s,text,sizeof(text),0);
  printf("recv - %s", text);

  // передаем заголовок

  // от кого письмо
  strcpy(text,"FROM: sender@mail.ru\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // кому письмо
  strcpy(text,"TO: receiver@mtu-net.ru\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);
        
  // тема письма
  strcpy(text,"SUBJECT: test\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // текст письма
  strcpy(text,"Hi!\nIt is a message for you\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // говорим, что закончили
  strcpy(text,"\r\n.\r\n");
  send(s,text,strlen(text),0);
  printf("send - %s", text);
  recv(s,text,sizeof(text),0);
  printf("recv - %s", text);

  // прощаемся с сервером
  strcpy(text,"QUIT");
  send(s,text,strlen(text),0);
  printf("send - %s", text);

  // закрываем сокет
  closesocket(s);

  return 0;
}

Ответ ( 3V )

Ну... читать, наверно, надо здесь: Windows Sockets 2, не забыв сначала взглянуть сюда: с чего начать.
Вопрос № 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.
Объясните, пожалуйста.

Ответ ( Михаил )

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

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

6 zveno*next*pred;  // видимо указатели на класс?
                    // запятую ставь между ними.
8 zveno*find(zveno*long double);
                    // ересь! убери эту строку.
                    // Функция определена дальше.
9 zveno*zveno::find(zveno*link,long double*mas key)
                    //запятая где? и зачем :: ?
//можно так :
//  zveno *find(zveno*link,long double*mas ,int key)
21 void sSort(long double*mas3)
                    // напиши (const long double mas3[])
26 min=mas3[i];     // здесь и далее ошибки
                    // из-за ошибки в 21 строке.
29      if (mas[j]<min)
                    // такого массива mas[] нет,
                    // есть массив mas3[] :-)
31        long double buf=mas3[j];
32        mas3[j]=mas3[i];
33        mas3[i]=buf;
38  cout<<mas3[i]<<endl;

Все ошибки синтаксические, поэтому разбираться с тем,
работает или нет эта программа, ну неохота.
Вопрос № 76 ( Smart )

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

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

Ответ ( 3V )

Вобщем, есть только один стандартный способ - через CreateFile и DeviceIoControl.

Если надо работать с физическим диском (получать доступ к таблице разделов, и.т.д.) - надо открывать файл с именем вида \\.\PHYSICALDRIVE<X>, где X - номер диска. Жесткие диски нумеруются с 0. То есть, если на компе установлен 1 винчестер, то для работы с ним надо открывать файл с именем \\.\PHYSICALDRIVE0, для работы со вторым винтом (если таковой имеется) - с именем \\.\PHYSICALDRIVE1.
Если надо получать доступ к флопу, или логическому диску, надо указывать имя типа: \\.\A: или \\.\C:

Работа с дисками через DeviceIoControl различается под Windows 95/98/Me и Windows NT/2000/XP. Подробнее - см. примеры:

Для Windows NT/2000/XP: Calling DeviceIoControl
Для Windows 95/98/Me: Calling DeviceIoControl on Windows 95/98/Me
Вопрос № 77 ( Sergey Verbenko )

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

Ответ ( Михаил )

Все элементы управления создаются при помощи CreateWindow .
Например :

hwndButton = CreateWindow(
     "BUTTON",   // предопределенный класс. может быть
                 // BUTTON, COMBOBOX,EDIT,LISTBOX,MDICLIENT,
                 // SCROLLBAR, STATIC
     "OK",       // текст на кнопке
     WS_VISIBLE| WS_CHILD | BS_DEFPUSHBUTTON |BS_BITMAP,
                                             //стили кнопки
     // Далее идут явные значения размера и позиции
     5, //  позиция по оси x
     5, //  позиция по оси y
     30,// ширина
     18, // высота
     hWnd,// указатель на родительское окно
     NULL,
     (HINSTANCE) GetWindowLong(hWnd,
                 GWL_HINSTANCE), NULL);

Ответ ( Подписка )

BOOL CreateControl(HINSTANCE hInstance, int nCmdShow)
{
    HWND hwndMainWindow;
    HWND hwndButton;

    // Создаем главное окно         
    hwndMainWindow = CreateWindow("Window","Window",
            WS_BORDER|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,
            CW_USEDEFAULT,          
            CW_USEDEFAULT,400,200,NULL,NULL,hInstance,NULL);

    if (!hwndMainWindow)
            return FALSE;
   
    //Создаем кнопку
    hwndButton = CreateWindow("BUTTON", "Test", WS_VISIBLE |
            WS_CHILD | BS_PUSHBUTTON,
            290, 140, 75, 25,hwndMainWindow,NULL,
            hInstance, NULL);

    if (!hwndButton)
            return FALSE;
    
    ShowWindow(hwndButton,SW_SHOW);
    UpdateWindow(hwndButton);
    
    ShowWindow(hwndMainWindow,nCmdShow);
    UpdateWindow(hwndMainWindow);

    return TRUE;

}

Смотри MSDN на предмет - "CreateWindow using button"
                         "CreateWindow using Edit Box"
                         "CreateWindow using Combo Box"

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

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

Так для создания кнопки необходимо вызвать CreateWindow следующим
образом:

hwndButton=CreateWindow(
  "button",
         // имя класса (бегунок - strollbar, редактор - edit,
         // список - listbox и т.д.)
  "Наша кнопка",        // текст на кнопке
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // стиль кнопки
  pos_x,   // положение левого верхнего угла по горизонтали
  pos_y,   // положение левого верхнего угла по вертикали
  width,   // ширина
  hight,   // высота
  hWnd,    // дескриптор родительского элемента
  hIdent,  // идентификатор дочернего элемента
  hInstance,       // дескриптор экземпляра
  NULL             // дополнительные параметры
  );

Более подробно смотри документацию
Книги по 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
Отписаться

В избранное