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

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


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 686
от 20.03.2007, 03:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 460, Экспертов: 50
В номере:Вопросов: 7, Ответов: 16


Вопрос № 78262: Здравствуйте! Наверно все знают о возможности посылать сообщения в сети net send 192.168.x.x message! Кто-нибудь может сказать как можно програмно отослать такие сообщения может быть есть api функции? и как узнать дошло-ли сообщение? ..
Вопрос № 78281: Здравствуйте Уважаемые эксперты! Вот читаю хорошую книжку по C на досуге(и вашу рассылку) . Не подскажите компилятор полностью поддерживающий стандарт С99 , очень хочется опробывать все "фишки" =) . Использую Microsoft Visual C++ Ex...
Вопрос № 78282: Привет всем ! Как создать процесс без окна?...
Вопрос № 78287: Всем привет. Такая проблемка. Нужно вычистить память из под двумерного массива. Работаю в С++ Builder 6. Что - то не выходит. Помогайте....
Вопрос № 78290: мне нужно знать как в Си++: 1. Как конектиться к базе данных (при использовании SQL server 2005) 2. Как создавать потоки (threads, т.е. для распределенной обработки) 3. Какую библиотеку нужно подключить для работы с таймером, т.е. для выч...
Вопрос № 78296: Здравствуйте. Вопрос по синтаксису. Я тут подзапутался, можно ли работать с многомерными массивами с помощью указателей. Конкретно, мне нужно инициализировать int array[60][4]. Я сталкивался только с одномерными - там без проблем. Если...
Вопрос № 78348: Здравствуйте, уважаемые эксперты!!! Не совсем уверен, что мой вопрос подходит по тематике, но всё же задам: я решил написать в среде CBuilder собственный копировальщик файлов для проверки гипотезы о том, что windows копирует файлы медленно.<b...

Вопрос № 78.262
Здравствуйте!
Наверно все знают о возможности посылать сообщения в сети net send 192.168.x.x message!
Кто-нибудь может сказать как можно програмно отослать такие сообщения может быть есть api функции?
и как узнать дошло-ли сообщение?
один вариант я знаю: SystemExecute(0,"open","cmd.exe","-c net send 192.168.x.x message!",0,0)
какие ещё есть варианты?
Отправлен: 14.03.2007, 15:04
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Mihasic
Здравствуйте, Tatarin!
Есть WinAPI NetMessageBufferSend - находится в Netapi32.dll (соответственно Netapi32.lib). Объявлена в заголовке Lmmsg.h, но использовать надо Lm.h.
Работает только на WinNT/2K/XP (на висте не знаю).
Подробнее будет в справке.

Кстати, а зачем было SystemExecute(0,"open","cmd.exe","-c net send 192.168.x.x message!",0,0), когда можно без cmd.exe - консоль тут и так есть. И вообще можно было создать процесс без окна.
Ответ отправил: Mihasic (статус: 9-ый класс)
Ответ отправлен: 14.03.2007, 16:10
Оценка за ответ: 5


Вопрос № 78.281
Здравствуйте Уважаемые эксперты!
Вот читаю хорошую книжку по C на досуге(и вашу рассылку) . Не подскажите компилятор полностью поддерживающий стандарт С99 , очень хочется опробывать все "фишки" =) .
Использую Microsoft Visual C++ Express Edition (SP1, Windows Vista x64(лицензия, ето если что)).
Вот собственно вбиваю вот такой код (В шаблонах указал Console Application):

Просто много интересного читаю , а опробывать вживую как то не получается и соответственно плохо запоминается =)

Приложение:

Отправлен: 14.03.2007, 18:06
Вопрос задал: MeSaNei (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Thread
Здравствуйте, MeSaNei!
Если вы хотите писать именно на С99, то вы выбрали не тот компилятор. Могу посоветовать бесплатный компилятор MinGW32 ( Minimalist GNU for Windows) - он полностью поддерживает С99. Хочу заметить, что С++ не совместим полностью с С99.
Ответ отправил: Thread (статус: 5-ый класс)
Ответ отправлен: 14.03.2007, 18:18
Оценка за ответ: 5

Отвечает: V1s0r
Здравствуйте, MeSaNei!

Использую Gentoo Linux, компилятор - GCC. И то и другое Open Source, лицензия - GNU GPL (неужели есть какие-то ещё лицензии???).

Компилятор превосходный, поддерживает последний стандарт как C, так и C++.
Есть порты в Windows (MSYS MinGW Cygwin).
Ответ отправил: V1s0r (статус: 2-ой класс)
Ответ отправлен: 15.03.2007, 14:28


Вопрос № 78.282
Привет всем !
Как создать процесс без окна?
Отправлен: 14.03.2007, 18:08
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Ilkras
Здравствуйте, Tatarin!
Здравствуйте, Tatarin!
С помощью функции CreateProcess (Windows), fork(Unix/Linux)
Есть еще много других операционок (VxWorks, PSOS, Nucleus...), вам для всех нужно?
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 14.03.2007, 20:43
Оценка за ответ: 5

Отвечает: kool
Здравствуйте, Tatarin!
Создать программный модуль(проект "Приложение Win32"),
кот не имеет окна, а затем загрузить его с помощью
CreateProcess, например, или просто выполнить.
Удачи!

---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 14.03.2007, 20:44
Оценка за ответ: 5


Вопрос № 78.287
Всем привет. Такая проблемка. Нужно вычистить память из под двумерного массива. Работаю в С++ Builder 6. Что - то не выходит. Помогайте.

Приложение:

Отправлен: 14.03.2007, 18:27
Вопрос задал: Dmeet (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Dmeet!
Все там выходит.
Память освобождается.
Но это н значит, что
она заполняется нулями.
Удачи!

---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 14.03.2007, 20:44

Отвечает: Олег Владимирович
Здравствуйте, Dmeet!

Когда освобождается память из-под массива, надо писать delete [] ar[i] и delete [] ar.
Удачи!

Приложение:

---------
Факультет ПМ-ПУ - лучший в СПбГУ!

Ответ отправил: Олег Владимирович (статус: Студент)
Ответ отправлен: 14.03.2007, 21:33

Отвечает: Терсков Сергей
Здравствуйте, Dmeet!
Верным является только второй вариант. Первый и третий если где-то и откомпилируются, то это не значит, что программа будет работать корректно. Если вы вызываете оператор new[], то и память нужно освобождать оператором delete[].
Ответ отправил: Терсков Сергей (статус: 6-ой класс)
Ответ отправлен: 15.03.2007, 03:10

Отвечает: John Paramol
Здравствуйте, Dmeet!

Если память выделялась с помощью new (т.е. под один объект), то удаляться она должна delete, а если с помощью new[] (т.е. под массив объектов, пусть даже размерностью в 1 элемент), то удаляться она должна delete[]. Иначе будут утечки памяти или ошибка времени выполнения. В вашем случае вы сначала выделяете память под массив объектов (указателей), а потом под каждый указатель выделяете еще по массиву объектов. Соответственно, освобождать сначала надо память из-под каждого указателя с помощью delete[], а потом из-под всего массива, тоже delete[]. Т.о. правильный второй вариант.

Кстати говоря, у вас это не совсем двумерный массив. Сходство лишь в синтаксисе обращения к эелементам. В настоящем двумерном массиве (который выделяется new[][], а освобождается delete[]) элементы физически располагаются друг за другом в одной непрерывной области памяти. А в вашем случае массивы чисел, на которые указывают каждый из указателей, могут физически находиться и на большом расстоянии друг от друга и отдельно от самого массива указателей, да и на массив указателей выделяется лишняя память, чего нет в настоящем двумерном массиве. Однако этот настоящий двумерный массив не так часто используется по следующей причине: только первая размерность может быть переменной (например int (*mass)[3] = new int[count][3], count - переменная, 3 - константа), что часто не подходит для программиста.
В вашем случае можно сделать так:
int size=3;
double (*ar)[3] = new double[size][3];
//...
delete[]ar;

Успехов!
---------
1=2, at values 1 large enough
Ответ отправил: John Paramol (статус: 6-ой класс)
Ответ отправлен: 15.03.2007, 22:39


Вопрос № 78.290
мне нужно знать как в Си++:
1. Как конектиться к базе данных (при использовании SQL server 2005)
2. Как создавать потоки (threads, т.е. для распределенной обработки)
3. Какую библиотеку нужно подключить для работы с таймером, т.е. для вычисления времени.
Отправлен: 14.03.2007, 18:39
Вопрос задал: Ventola
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ilkras
Здравствуйте, Ventola!
threads создаются с помощью CreateThread (Windows)
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 14.03.2007, 20:46


Вопрос № 78.296
Здравствуйте. Вопрос по синтаксису. Я тут подзапутался, можно ли
работать с многомерными массивами с помощью указателей. Конкретно, мне нужно инициализировать int array[60][4].
Я сталкивался только с одномерными - там без проблем.
Если ответ - да, можно, то хотелось бы примерчик.
Спасибо.
Отправлен: 14.03.2007, 19:59
Вопрос задал: Lameruga (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: kool
Здравствуйте, Lameruga!
Инициировать можно так (см. приложение):
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: Студент)
Ответ отправлен: 14.03.2007, 20:43
Оценка за ответ: 5
Комментарий оценки:
Спасибо. То что надо.

Отвечает: Ilkras
Здравствуйте, Lameruga!
Разницы между одномерными и многомерными массивами никакой нет. Можете считать ваш массив одномерным (int array[240]) или, например, четырехмерным (int array[30][2][2][2]). Кроме того массив - это просто выделенная область памяти - можете инициализировать ее с помощью memset. Например так: memset(array, 0, 240*sizeof(int));
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 14.03.2007, 20:53
Оценка за ответ: 4
Комментарий оценки:
см минифорум.

Отвечает: Sergey A. Wedensky
Здравствуйте, Lameruga!
Инициализацией обычно называют задание значения переменной (значений элементов массива) при определении этой переменной, вроде int a = 2;
Не уверен, что Вам захочется вбивать 240 значений, но в принципе инициализировать можно, например int ar[4][2] = {{1,2},{3,4},{5,6},{7,8}};
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 15.03.2007, 10:14
Оценка за ответ: 5
Комментарий оценки:
Спасибо.


Вопрос № 78.348
Здравствуйте, уважаемые эксперты!!!
Не совсем уверен, что мой вопрос подходит по тематике, но всё же задам:
я решил написать в среде CBuilder собственный копировальщик файлов для проверки гипотезы о том, что windows копирует файлы медленно.
Пишу, естественно, под windows и на API. Код очень большой, но суть проста: при нажатии на кнопку я создаю новый поток, который изредка посылает сообщения окну о прогрессе. Для полноты приведу код поточной процедуры и структуры STRUCT_START_THREAD в отдельном окне. Ну, конечно, для возможности настроить копировальщик на макс. скорость я добавил такие опции, как:
- копирование файла полностью (выделяю буфер в памяти размером с файл)
- задание размера буфера
- изменение класса приоритета процесса
- изменение приоритета (относительного) потока (у первичного потока приоритет не меняется и равен THREAD_PRIORITY_NORMAL)
- тихий режим (bQuiet = true), когда во время операции копирования никакие сообщения окну вообще не посылаются.
Вот. Всё работает:-)
Собственно вопрос:
Когда я стал играться с программой, я обнаружил, что при одинаковых настройках время копирования может разниться на 50%!! (в диспетчере задач никаких изменений не происходило)
Когда я ставил критический приоритет THREAD_PRIORITY_TIME_CRITICAL и REALTIME_PRIORITY_CLASS (в документации написано, что это выставляет базовый приоритет в 31) время копирования абсолютно не менялось, а загрузка прцессора доходила макс. до 30% и опять-таки разброс результатов был катастрофическим!!!
Почему?
Я проверял: в диспетчере задач мой процесс был процессом "реального времени", но "бездействие системы" жрало 70-80% процессорного времени и ничего не глючило!
Опять-таки почему?
И скажите пожалуйста, как можно увеличить скорость копирования еще?
Спасибо всем тем, кто откликнется.

Приложение:

Отправлен: 15.03.2007, 02:08
Вопрос задал: Evkwarrior (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sergey A. Wedensky
Здравствуйте, Evkwarrior!

Боюсь все Ваши ухищрения с приоритетами реального времени бесполезны. Полагаю скорость копирования файла должна слабо зависеть от процессорного времени, на это затрачиваемого. Посудите сами: нужно физически считать данные с носителя, передать их по шине в оперативную память, оттуда обратно в контроллер диска и опять же физически записать на диск. Эти операции большей частью производит не процессор, от него вообще мало что требуется. Это если нет кэширования. На самом деле в системе существует файловый кэш, который несколько (а иногда и сильно) меняет описанную схему. Из-за его наличия, в первую очередь, и может меняться реальное время, необходимое для копирования файла. Например, если Вы только что скопировали файл и потом хотите его же скопировать в еще один, реальное чтение с диска может вообще не произойти - содержимое файла уже есть в ОП (дисковом кэше системы), хотя бы чистично.
В общем, вывод: такими методами (использование File API) Вы точно ничего не добьетесь и приоритеты процесса тут ни причем совершенно. Если очень хотите добиться ускорения копирования, можно было бы попробовать низкоуровневую работу с носителем - чтение/запись напрямую в сектора, минуя системный кэш и пр. - это, возможно что-то и даст.
Удачи.
P.S. Было бы интересно узнать о результатах.
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 15.03.2007, 10:37
Оценка за ответ: 5
Комментарий оценки:
DMA и кэш? Да, вы правы, копирование происходит без загрузки процессора, наверное. Но что интересно, повторное копирование одного файла приводит не к увеличению скорости, а, наоборот, к уменьшению!!! (так, по крайней мере, происходит у меня)

Отвечает: V1s0r
Здравствуйте, Evkwarrior!

"Пишу, естественно, под windows и на API."
Это, типа, круто? LPVOID, HINSTANCE, HRESULT, WPARAM, MB_ICONINFORMATION, LPARAM, 0xFFFFFFFF м-да...

Я вот, например, под Windows пишу редко.
Преимущественно под Linux.

А ещё лучше - многоплатформенная разработка программного обеспечения (много есть библиотек, но лучшая - Qt).
Ответ отправил: V1s0r (статус: 2-ой класс)
Ответ отправлен: 15.03.2007, 14:20
Оценка за ответ: 2
Комментарий оценки:
А где, собственно, ответ???

Отвечает: kool
Здравствуйте, Evkwarrior!
>>И скажите пожалуйста, как можно увеличить скорость копирования еще?
А еще можно использовать отображение файлов на память.
И это должно быть значительно быстрее.
Удачи!


---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 15.03.2007, 20:49
Оценка за ответ: 5
Комментарий оценки:
Интересно, попробую!


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.46 от 18.03.2007
Яндекс Rambler's Top100

В избранное