Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Использование API ФТС Avaya

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

Может быть на этом форуме найдутся специалисты по программированию под avaya.
У меня следующая задача:
Получить список доступных телефонов, определить статус любого телефона из найденного списка (Свободен/занят)
Рассматривал примеры программ, идущих с Avaya API. Читал официальную документацию. Застреваю в самом начале - на получении списка.
Подключение к станции проходит (использовал код из примеров)
 provider = ServiceProvider.getServiceProvider(properties);
devServ = (DeviceServices) provider.getService(com.avaya.csta.device.DeviceServices.class.getName());

GetDeviceId devRequest = new GetDeviceId();
devRequest.setSwitchIPInterface(callServerAddress);
devRequest.setExtension(extension);
GetDeviceIdResponse response = null;
DeviceID deviceID = null;
response = devServ.getDeviceID(devRequest);
if(response != null)
   deviceID = response.getDevice();

А вот дальше пытаюсь получить список устройств
GetDeviceIdList request = new GetDeviceIdList();
request.setSessionID(provider.getSessionID());
GetDeviceIdListResponse resp = devServ.getDeviceIdList(request);

На последней строке ошибка ch.ecma.csta.errors.InvalidDeviceStateException
Подозреваю, что передаю не тот ИД.

Если есть специалисты, пните меня в правильном направлении.
Ответ: Конечно же АТС Avaya. В заголовке темы опечатка

Вам также можеть быть интересно:

NetBeans 8.2. FormGuardedBlockError
Про ADO
2013 события с иконками в календаре
Вопрос по мультиязычности PHP
AES_256
Вопрос: Использование стандартных графических методов в Visual Basic

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

Рассмотрим графические методы.

Scale (маштаб) метод маштабирования.С помощью метода можно задать необходимую или возможную декартовую систему координат
Preset (Point Set) Поместить точку. Позволяет изобразить на заданном обьекте точку в заданной системе координат,например,с помощью метода Scale
Line (линия, контур) Позволяет отобразить на заданном обьекте отрезок с заданными координатами его концов, а также прямоугольник с заданными декартовыми координатами его углов
Circle (круг,овал) Позволяет построить на заданном объекте круги,эллипсы,дуги,секторы с заданными координатами их центров
Cls (Clean Screen) Очистить экран или заданный объект
Shape (фигура) Графический объект-геометрическая фигура, которая задана целым числом от 0 до 5

Метод Scale. Метод можно применять к объектам класса - экранная форма и PictureBox - графическое окно. Объекты form и PictureBox имеют абсолютные координаты, которые измеряются в твипах и позволяют задать положение на экране для формы или положение на форме для графического окна, а также ширину и длину.

Экранная форма покрыта рядами точек. По умолчанию расстояние между точками составляет 120 твипов. В результате следует отметить, что абсолютные координаты выражаются большими числами, поэтому необходимо задать новую систему координат:
Код Visual Basic
1
<Имя Объекта> . Scale (<х1>, <у1>) - (<х2>,<у2>)
,где
х1,у1- новые координаты верхнего левого угла;
х2,y2- новые координаты нижнего левого угла окна формы, либо графического окна, в новой системе координат.

Например:
Код Visual Basic
1
Picture2. Scale (-15, 20) - (15, -20)
Новый масштаб составляет 30 условных единиц по ширине и 40 единиц по высоте.

Другой способ назначения новой системы координат в Visual Basic - это установка значений свойств объекта, которые относятся к категории Scale.

Например:
Scale Mode - модификация
Scale Width - ширина объекта
Scale Height - высота объекта
Scale Left - левый угол
Scale Top - верхний угол

Метод Pset. Применяется к тем же объектам, к которым применим метод Scale. Синтаксис записи метода следующий:
Код Visual Basic
1
<Имя Объекта> . Pset (<x>, <у>) [, <цвет>]
,где х, у - координаты точки.

Цвет - это число, которое задает тот или иной цвет. Если позиция «цвет» отсутствует, то по умолчанию цвет = 0. Если перед Pset не использовался метод Scale, то по умолчанию используются абсолютные координаты объекта.

Например:
Код Visual Basic
1
2
3
4
5
6
Dim a As Single
Rem График функции sin(a)
Pictures3. Scale (-12, 2) - (12, -2)
for a = -9 to 9 step 0.02
Picture3. Pset (a, sin (a)), vbRed
Next a
Чтобы изменить размер точек - «пятен» (например, увеличить), можно изменить параметр - ширина черчения Draw Width. Для объекта Picture - целое 1, 2. Изменить можно в процессе проектирования приложения или непосредственно вставить необходимую строку в программный код.

Например:
Код Visual Basic
1
Pictures. DrawWidth = 3
Метод Line. Применяется к тем же объектам, к которым применим метод Scale. Синтаксис записи метода следующий:

Код Visual Basic
1
<Имя Объекта> . Line [(<tx1>, <у1>) ] - (<х2>, < у2>)[. [<цвет>].[, <Флаг>] ]
,где:
x1, у1 – координаты справа или верхнего левого угла;
х2, y2 – координаты слева или нижнего левого угла.

Если имя объекта отсутствует, то по умолчанию используется экранная форма. В качестве параметра «цвет» используется либо константа, либо соответствующее ей числовое значение (см. следующую таблицу). Если параметр «цвет» отсутствует, то по умолчанию он совпадает с цветом края обрамления - параметр foreColor.

Таблица Описание цветовых констант
Код Code
1
2
3
4
5
6
7
8
9
Цвет     Константа   Число
Черный      vbBlack      0
Красный     vbRed    255
Зелёный     vbGreen      65 280
Желтый      vbYellow     65 535;
Синий       vbBlue   16 711 680
Сиреневый  vbMagenta     16 711 935
Голубой    vbCyan    16 776 960
Белый       vbWhite      16 777 215
Цвет может определяться значением аргументов функции RGB(x1, x2, х3), причем x1 - интенсивность красного, х2 - интенсивность зеленого, х3 - интенсивность синего, где хi изменяется в диапазоне от 0 до 255. Это позволяет создавать 256 х 256 х 256 различных оттенков.

Например:
RGB(0, 128, 0) - зеленый фон,
RGB(255, 255, 0) - желтый фон
RGB(0, 0, 64) - темно-синий фон

Флаг - одно из трех значений - результат применения метода: пусто - линия с координатами (х1, y1) и (х2, у2), лишняя запятая не отбрасывается;

В - контур прямоугольника с координатами (x1, y1) и (х2, у2); в свойствах объекта устанавливается стиль заполнения FillStyle = 1 (Transparent - прозрачный);

ВF - закрашенный прямоугольник с заданным цветом с координатами (х1; y1) и (х2, у2).Толщина линии отрезка или обводка прямоугольника по умолчанию равна 1. Чтобы увеличить толщину линии, необходимо изменить свойство DrawWidth.

Свойство DrawStyle определяет тип линии: является ли линия сплошной, пунктирной, двойной пунктирной и т. д. Допустимые значения можно установить в режиме проектирования.

Совместное использование Line и Print. Как сказано выше, метод Print используется в основном для вывода чисел и строк текста на объект. Синтаксис записи метода следующий:

Код Visual Basic
1
<Имя Объекта> . Print <Список вывода: последовательность фрагментов>
Метод Print можно использовать совместно с графическими методами. При этом строки и числа будут выводиться в том месте формы или графического окна, где закончилось рисование, - ниже или правее точки, на которой закончилось рисование. Цвет символов задается свойством foreColor.

Метод Shape
. Геометрический объект - применяется для изображения некоторых фигур, которые реализованы в этом объекте.
Код Code
1
2
3
4
5
6
7
8
9
Целое число от 0 до 5   
0    rectangle   прямоугольник
1    square      квадрат
2    oval            овал
3    circle      круг
4     rounded        скругленый
         rectangle   прямоугольник
5     rounded        скругленный 
         square      квадрат
Цвет и прозрачность задают свойства backColor и backStyle. Свойства FillColor и FillStyle задают цвет и стиль заполнения фигуры. BorderStyle и BorderColor задают тип и цвет линии границы (прозрачная, штрих и др.).

Рисование круга
В следующем коде показано рисование круга в форме во время выполнения. В примере Visual Basic 6.0 используется метод Circle; он принимает координаты X и Y центральной точки, значение радиуса и, дополнительно, цвета как аргументы.
Код Visual Basic
1
2
3
4
Private Sub Form_Paint()
    ' Draw a 1000 twip diameter red circle
    Circle (500, 500), 500, vbRed
End Sub
Примечание. В Visual Basic 6.0 единицей измерения по умолчанию являются твипы
Ответ: Полярные координаты. Обычно точки на плоскости представляют их декартовыми координатами. Но есть и другой способ определения расположения точек на плоскости – задание полярных координат.
Название: P1070149.jpg
Просмотров: 8885

Размер: 2.9 Кб
В этом случае имеется единственная ось и некая точка на ней, называемая полюсом. Любую точку на плоскости теперь можно определить парой чисел (r, z), где r – расстояние от полюса и z – угол между осью и прямой, соединяющей полюс и данную точку (угол изменяется в направлении против часовой стрелки от оси).

Графики в полярных координатах. Функции, в которых используются полярные координаты, будем называть функциями в полярных координатах. Например, r = Sin(z) – функция в полярных координатах. Здесь для каждого значения z из некоторой заданной области строится точка с полярными координатами (r, z). Чтобы упростить построение, обратимся снова к декартовым координатам. Точка (r, z) в полярных координатах – это то же самое, что точка (r*Cos(z), r* Sin(z)) в декартовых координатах, и именно ее мы строим.

Проект «График функции в полярных координатах». Приступим к созданию проекта. В качестве примера рассмотрим построение графика функции r = Sin(8*z).

Разместим на форме frmGraph графическое окно picGraph, в котором будет строиться график, командную кнопку cmdGraph для реализации событийной процедуры построения графика и метку lbl1 для обозначения графического окна.

Для графического окна picGraph зададим удобную систему координат, учитывающую диапазоны изменения аргумента и функции, с помощью графического метода Scale. Для рисования точек графика воспользуемся методом PSet. Для очистки графического окна используем метод Cls.

Построение графика будет производиться с помощью цикла со счетчиком, в котором значение аргумента z будет меняться от 0 до 2π с шагом 0,001.

Введем программный код событийной процедуры cmdGraph_Click () для кнопки cmdGraph:
Код Visual Basic
1
2
3
4
5
6
7
8
Dim z, r As Single
Private Sub cmdGraph_Click ()
picGraph . Scale (-1.25, 1.25) - (1.25, -1.25)
For z = 0 To 2 * 3.14 Step 0.001
r = Sin (8 * z)
picGraph . PSet (r * Cos (z), r * Sin (z)), vbMagenta
Next z
End Sub
Запустим проект. Щелкнем по кнопке График.
Использование стандартных графических методов в Visual Basic
Усовершенствуем наш проект.

Вместо использования при построении декартовых координат (r * Cos (z), r * Sin (z)), введем два дополнительных параметра a и b и построим (r * Cos (a * z), r * Sin (b * z)).

Разместим на форме два текстовых поля txtA и txtB для ввода значений переменных a и b и две метки lbl2 и lbl3 для обозначения текстовых полей (имен переменных и диапазона изменения их значений).

Внесем изменения в программный код событийной процедуры cmdGraph_Click ():
picGraph .
Код Visual Basic
1
PSet (r * Cos (Val (txtA . Text) * z), r * Sin (Val (txtB . Text) * z)), vbMagenta
Добавим две кнопки: cmdClear – для очистки текстовых полей и графического окна и cmdExit – для завершения работы приложения.

Введем программный код событийной процедуры для кнопки cmdClear:
Код Visual Basic
1
2
3
4
5
Private Sub cmdClear_Click ()
txtA . Text = ""
txtB . Text = ""
picGraph . Cls
End Sub
Для кнопки cmdExit код событийной процедуры следующий:
Код Visual Basic
1
2
3
Private Sub cmdExit_Click ()
End
End Sub
Запустим проект. Меняя значения a от 1 до 9 и значения b от 1 до 6, получим массу замечательных картинок.
Использование стандартных графических методов в Visual Basic
взято с festival.1september.ru
а вот сцыла на википедию
Вопрос: Считается ли использование рефлексии плохим тоном?

Доброго времени суток. Может вопрос и глупый, но все же было бы интересно узнать, считается ли использование рефлексии плохим тоном? Влияет ли использование этой рефлексии на производительность? Спасибо.
Ответ:
Сообщение от OwenGlendower
с таким же успехом можно интересоваться считается ли плохим тоном использование молотка
Вот именно, использование молотка там где нужна отвертка - плохой тон)
Рефлексией, как и небезопасным кодом, пользоваться можно, но сильно увлекаться не стоит.
Вопрос: Ошибка использования строки

В чем состоит ошибка в данном фрагменте программы при использовании строки message?
C
1
2
3
char message[14] = "Hello, world!";
for(int i = 0; i < 14; i++) message[i] += 1;
printf("%s\n", message);
В чем ошибка?
Ответ: Тут две ошибки.
Первая ошибка в данном случае - использование предположений об содержании самой строки.
Т.е. код рассчитан, на предположение, что там будет текст ровно 14 байт. Вся логика поедет если записать меньше.
т.е. если код отделить от строчки километрами кода - то это очень и очень плохой код.

И вторая ошибка - приведённая инициализация строки подразумевает терминирующий ноль на хвосте строки. И он будет именно 14 по счёту. Т.е. к нему будет добавлена константа одын, что повлечёт за собой проблемы при использовании принтф.

ну и менее серьёзное предупреждение по коду: использование не дефайных констант(для сей) или статик констов(для си плас плас) - за это выгоняют из правильных контор.

удачи вам
(круглый)
Вопрос: Использование кортежей (Tuple) в качестве параметров: Create or new?

Всем привет! Относительно недавно начал изучать азы С#, дойдя до кортежей столкнулся с дилеммой на которую не смог найти вразумительного ответа. Помогите разобраться...

При передаче в качестве параметров методу или возвращаемого значения, кортежей менее 8-ми переменных проблем нет, можно использовать как Tuple.Create() (без явного указания типов) так и new Tuple<T1, T2, ...>, но при добавлении 8-мой переменной типа Tuple использование Tuple.Create приводит к ошибке:

Error CS1503 Argument 1: cannot convert from 'System.Tuple<int, int, int, int, int, int, int, System.Tuple<System.Tuple<int, int>>>' to 'System.Tuple<int, int, int, int, int, int, int, System.Tuple<int, int>>'
C#
1
2
3
4
5
6
7
8
9
10
...
    var tup = Tuple.Create(8, 9);
    var tup2 = Tuple.Create(1, 2, 3, 4, 5, 6, 7, tup);
 
    Func(tup2);
 }
 static void Func (Tuple<int, int, int, int, int, int, int, Tuple<int, int>> buf)
 {
 
 }
Использование 'new Tuple' решает конечно проблему, но все таки хотелось бы разобраться, возможно ли использовать 'Tuple.Create' при передаче/возврате кортежей, содержащих более 7-ми переменных. Ведь именно для больших кортежей трудозатратно объявлять все типы.
Ответ:
Сообщение от WolfGrin
Проблема заключается в передаче или возврате такого кортежа из метода, при условии использования Tuple.Create()
Посмотрите на тип возвращаемого значения при использовании метода Create с 8-ю параметрами:
C#
1
Tuple<T1,T2,T3,T4,T5,T6,T7,Tuple<T8>>
Обратите внимание, что последний параметр оборачивается в кортеж из одного элемента, то есть если вы вызовете метод Create с аргументами (1, 2, 3, 4, 5, 6, 7, 8), то в результате получите кортеж, где Item8 является не восьмеркой, а Tuple<int>(8).
Восьмым аргументом вы передаете Tuple<int, int>, метод Create старательно оборачивает его в единичный кортеж и в итоге Item8 — это Tuple<Tuple<int, int>>.
Почему этот метод оборачивает последний параметр в единичный кортеж — не знаю, возможно сделано для какой-то совместимости. А может разработчик и сам запутался в этих типах (что не удивительно) и баг пошел в релиз.

Вы можете изменить сигнатуру метода Func таким образом, чтобы последний параметр кортежа имел соответствующий тип.
Как вариант, можно использовать только седьмую перегрузку метода Create, передавая последним, седьмым аргументом кортеж уже из трех элементов: Tuple<int, int, int>.

Но лучший вариант, как посоветовал выше товарищ Usaga — создать тип с необходимыми полями или в крайнем случае просто передавать значения как параметры, возможно даже используя params.
Вопрос: TCP сервер и ошибка "Обычно разрешается только одно использование адреса сокета"

Всем привет! Волей случая, в общеобразовательных целях решил заняться написанием WEB сервиса для своей игрушки. Общаться хочу по TCP.
Поставил дэнвер, написал простой сервер из примера php.net, и столкнулся с первой проблемой - никак не запустить его, постоянно выкидывает ошибку:
unable to bind address [0]: Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
Дело встало, моих скудных познаний катастрофически не хватает для того, чтобы понять в чём дело.
Подскажите, пожалуйста, в какую сторону копать)
Код PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
error_reporting(E_ALL);
 
/* Позволяет скрипту ожидать соединения бесконечно. */
set_time_limit(0);
 
/* Включает скрытое очищение вывода так что мы получаем данные
 * как только они появляются. */
ob_implicit_flush();
 
$address = '127.0.0.1';//localhost - проверено
$port = 10000;//пробовал разные
 
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
}
 
if (socket_bind($sock, $address, $port) === false) {
    echo "Не удалось выполнить socket_bind(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
}
 
if (socket_listen($sock, 5) === false) {
    echo "Не удалось выполнить socket_listen(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
}
 
do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "Не удалось выполнить socket_accept(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Отправляем инструкции. */
    $msg = "\nДобро пожаловать на тестовый сервер PHP. \n" .
        "Чтобы отключиться, наберите 'выход'. Чтобы выключить сервер, наберите 'выключение'.\n";
    socket_write($msgsock, $msg, strlen($msg));
 
    do {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "Не удалось выполнить socket_read(): причина: " . socket_strerror(socket_last_error($msgsock)) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == 'выход') {
            break;
        }
        if ($buf == 'выключение') {
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: Вы сказали '$buf'.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } while (true);
    socket_close($msgsock);
} while (true);
 
socket_close($sock);
Ответ: Ошибка в строке 17. Скрипт лежит в папке www. Запускаю в браузере localhost/script.php. Может не так надо? Просто я пока немного недопонимаю всей сути. Для меня это всё тёмный лес, в инете всё перерыл, инфы очень мало.

Добавлено через 5 часов 14 минут
#!/usr/local/bin/php -q
Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт). in Z:\home\localhost\www\U1.php on line 19
Не удалось выполнить socket_bind(): причина: Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт).
Warning: socket_listen() [function.socket-listen]: unable to listen on socket [0]: Получен недопустимый аргумент. in Z:\home\localhost\www\U1.php on line 23
Не удалось выполнить socket_listen(): причина: Получен недопустимый аргумент.
Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [0]: Получен недопустимый аргумент. in Z:\home\localhost\www\U1.php on line 28
Не удалось выполнить socket_accept(): причина: Получен недопустимый аргумент.
Вопрос: За один просмотр файла действительных чисел и с использованием очереди напечатать элементы файла в следующем п

За один просмотр файла действительных чисел и с использованием очереди напечатать
элементы файла в следующем порядке: сначала – все числа, меньшие а, затем – все числа
из отрезка [а, b], и, наконец – все остальные числа, сохраняя исходный порядок в каждой
из этих трех групп чисел. Числа а и b задает пользователь
Ответ: Взято отсюда:


Сообщение от zenya19981
За один просмотр файла действительных чисел и с использованием очереди
Не осилил. Особенно с очередью. У меня три прохода получается. Не стал доделывать.
Вообще возможно такое? Без танцев с бубнами.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
Program Ochered;
uses
  crt; {Для использования readkey и clrscr}
type
  Tinf=real; {тип данных, который будет храниться в элементе очереди}
  List=^TList;  {Указатель на элемент типа TList}
  TList=record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
    data:TInf;  {данные, хранимые в элементе}
    next:List;   {указатель на следующий элемент}
  end;
 
{Процедура добавляющая элемент в очередь}
procedure AddElem(var stek1:List;znach1:TInf);
var
  tmp:List;
begin
  GetMem(tmp,sizeof(TList)); {выделяем в памяти место для нового элемента}
  tmp^.next:=stek1;  {указатель на следующий элемент "направляем" на хвост очереди}
  tmp^.data:=znach1; {добавляем к элементу данные}
  stek1:=tmp; {хвост очереди изменился, надо перенести и указатели на неё}
end;
 
{Процедура вывода очереди начиная с хвоста}
procedure Print(stek1:List);
begin
  if stek1=nil then {проверка на пустоту очереди}
  begin
    writeln('Очередь пуста.');
    exit;
  end;
  while stek1<>nil do {пока указатель stek1 не станет указывать в пустоту}
  begin   {а это произойдёт как только он перейдёт по ссылке последнего элемента}
    Write(stek1^.data:8:2); {выводить данне}
    stek1:=stek1^.next  {и переносить указатель в начало очереди}
  end;
end;
 
{Процедура освобождения памяти занятой очередью}
Procedure FreeStek(stek1:List);
var
  tmp:List;
begin
  while stek1<>nil do {пока stek1 не станет указывать в "пустоту" делать}
  begin
    tmp:=stek1; {указатель tmp направим на хвост очереди}
    stek1:=stek1^.next; {хвост очереди перенесём на следующий за данным элементом элемент}
    FreeMem(tmp,SizeOf(Tlist)); {освободим память занятую под удаляемый элемент}
  end;
end;
 
{Поиск элемента в очереди по значению}
Function SearchElemZnach(stek1:List;znach1:TInf):List;
begin
  if stek1<>nil then {если стек не пуст, то}
    while (Stek1<>nil) and (znach1<>stek1^.data) do {пока stek1 не укажет в "пустоту" или пока мы не нашли нужный нам элемент}
      stek1:=stek1^.next; {переносить указатель}
  SearchElemZnach:=stek1;{функция возвращает указатель на найденный элемент}
end;         {в случае если элемент не найден, она вернёт nil}
 
{Процедура удаления элемента по указателю}
Procedure DelElem(var stek1:List;tmp:List);
var
  tmpi:List;
begin
  if (stek1=nil) or (tmp=nil) then {если очередь пуст или указатель никуда не указывает, то выходим}
    exit;
  if tmp=stek1 then {если мы удаляем элемент который является хвостом очереди, то}
  begin
    stek1:=tmp^.next;{следует перенести вершину и}
    FreeMem(tmp,SizeOf(TList)); {высвободить память из под элемента}
  end
  else {в случае, если удаляемый элемент не хвост очереди, то}
  begin
    tmpi:=stek1; {ставим указатель на хвост очереди}
    while tmpi^.next<>tmp do {доходим до элемента стоящего "перед" тем, который нам следует удалить}
      tmpi:=tmpi^.next;
    tmpi^.next:=tmp^.next; {указатель элемента переносим на следующий элемент за удаляемым}
    FreeMem(tmp,sizeof(TList)); {удаляем элемент}
  end;
end;
 
{Процедура удаления элемента по значению}
procedure DelElemZnach(var Stek1:List;znach1:TInf);
var
  tmp:List;
begin
  if Stek1=nil then {Если очередь пуста, то выводим сообщение и выходим}
  begin
    Writeln('Очередь пуста.');
    exit;
  end;
  tmp:=SearchElemZnach(stek1,znach1); {tmp указывает на удаляемый элемент}
  if tmp=nil then {если элемент не был найден, то выводим сообщение и выходим}
  begin
    writeln('Элемент с искомым значением ' ,znach1, ' отсутствует в очереди.');
    exit;
  end;
  DelElem(stek1,tmp); {удаляем элемент из очереди}
  Writeln('Элемент удалён.'); {сообщаем о выполнении действия}
end;
 
{Удаление элемента по порядковому номеру (хвост имеет номер 1)}
Procedure DelElemPos(var stek1:List;posi:integer);
var
  i:integer;
  tmp:List;
begin
  if posi<1 then {проверка на ввод информации}
    exit;
  if stek1=nil then {если очередь пуста}
  begin
    Write('Очередь пуста.');
    exit
  end;
  i:=1; {будет считать позиции}
  tmp:=stek1;
  while (tmp<>nil) and (i<>posi) do {пока tmp не укажет в "пустоту" или мы не найдём искомый элемент}
  begin
    tmp:=tmp^.next; {переходим на следующий элемент}
    inc(i)   {увеличиваем значение счётчика}
  end;
  if tmp=nil then {если элемента нет выводим соответствующие сообщения и выходим}
  begin
    Writeln('Элемента с порядковым номером ' ,posi, ' нет в очереди.');
    writeln('В очереди ' ,i-1, ' элементов(а).');
    exit
  end;
  DelElem(stek1,tmp); {если мы не вышли, то элемент есть и его следует удалить}
  Writeln('Элемент удалён.'); {сообщаем о выполнении действия}
end;
 
{Процедура сортировки "пузырьком" с изменением только данных}
procedure SortBublInf(nach:list);
var
  tmp,rab:List;
  tmps:Tinf;
begin
  GetMem(tmp,SizeOf(Tlist)); {выделяем память для рабочего "буфера" обмена}
  rab:=nach; {рабочая ссылка, становимся на хвост очереди}
  while rab<>nil do {пока мы не дойдём до конца стека делать}
  begin
    tmp:=rab^.next; {перейдём на следующий элемент}
    while tmp<>nil do {пока не конец очереди делать}
    begin
      if tmp^.data<rab^.data then {проверяем следует ли менять элементы}
      begin
        tmps:=tmp^.data; {стандартная замена в 3 операции}
        tmp^.data:=rab^.data;
        rab^.data:=tmps
      end;
      tmp:=tmp^.next {переход к следующему элементу}
    end;
    rab:=rab^.next {переход к следующему элементу}
  end
end;
 
{Процедура сортировки "пузырьком" с изменением только адресов}
procedure SortBublLink(nach:List);
var
  tmp,pered,pered1,pocle,rab:List; {все рабочие ссылки}
begin
  rab:=nach; {становимся на вершину стека}
  while rab<>nil do{пока не конец очереди делать}
  begin
    tmp:=rab^.next; {переходим к следующему за сортируемым элементу}
    while tmp<>nil do {пока не конец очереди делать}
    begin
      if tmp^.data<rab^.data then {если следует произвести замену, то}
      begin
        pered:=nach; {становимся на хвост очереди}
        pered1:=nach; {становимся на хвост очереди}
        if rab<>nach then {если мы не стоим на изменяемом элементе, то}
          while pered^.next<>rab do pered:=pered^.next; {станем на элементе перед изменяемым}
        while pered1^.next<>tmp do pered1:=pered1^.next; {станем на элементе перед изменяемым, который находится за
        первым изменяемым}
        pocle:=tmp^.next; {запоминаем адрес элемента после второго изменяемого}
        if rab^.next=tmp then {если элементы "соседи", то}
        begin
          tmp^.next:=rab; {меняем ссылки, тут если не понятно рисуйте на листочке}
          rab^.next:=pocle
        end
        else {в случае если элементы не соседи, то}
        begin
          tmp^.next:=rab^.next;{меняем ссылки, тут если не понятно рисуйте на листочке}
          rab^.next:=pocle;
        end;
        if pered1<>rab then{советую просмотреть на листочке}
          pered1^.next:=rab;
        if rab<>nach then{советую просмотреть на листочке}
          pered^.next:=tmp
        else{всё советую просмотреть на листочке}
          nach:=tmp;
        pered1:=tmp;{советую просмотреть на листочке}
        tmp:=rab;{советую просмотреть на листочке}
        rab:=pered1;{советую просмотреть на листочке}
      end;
      tmp:=tmp^.next; {переходим на следующий элемент}
    end;
    rab:=rab^.next;{переходим на следующий элемент}
  end;
end;
 
var
  Stk, {переменная, которая всегда будет указывать на "хвост" очереди}
  tmpl:List; {рабочая переменная}
  znach:Tinf; {данные вводимые пользователем}
  ch:char; {для работы с меню}
  a,b,x:real;
  i,n:integer;
  f:file of real;
 
begin
  n:=20;
  randomize;
  Stk:=nil;
  // создание файла
  writeln('Original file:');
  assign(f,'f.dat');
  rewrite(f);
  for i:=1 to n do
    begin
      x:=random*n;
      write(f,x);
      write(x:8:2);
      AddElem(stk,x);
    end;
  close(f);
  writeln;
  writeln('The source queue:');
  print(stk);
  writeln;
  write('Enter a: ');
  readln(a);
  write('Enter b: ');
  readln(b);
 
  if stk=nil then {проверка на пустоту очереди}
  begin
    writeln('Очередь пуста.');
    exit;
  end;
  while stk<>nil do {пока указатель stek1 не станет указывать в пустоту}
    begin   {а это произойдёт как только он перейдёт по ссылке последнего элемента}
      if stk^.data<a then
        Write(stk^.data:8:2); {выводить данне}
    stk:=stk^.next;  {и переносить указатель в начало очереди}
  end;
(*  while stk<>nil do {пока указатель stek1 не станет указывать в пустоту}
    begin   {а это произойдёт как только он перейдёт по ссылке последнего элемента}
      if (stk^.data>=a) and (stk^.data<=b) then
        Write(stk^.data:8:2); {выводить данне}
    stk:=stk^.next;  {и переносить указатель в начало очереди}
  end;
*)
(*  if (stk^.data>=a) and (stk^.data<=b) then
    Write(stk^.data:8:2); {выводить данне}
  if (stk^.data>b) then
    Write(stk^.data:8:2); {выводить данне}
*)
  FreeStek(Stk); {освобождаем память занятую очередью}
  readln;
end.
Вопрос: Предусмотреть использование очередей при реализации запросов ввода-вывода

Всем доброго времени суток!

Возникла проблема с написанием программы на С. Хотя, не столько с её написанием, сколько с её модификацией. Нужно было написать программу с использованием пользовательских функций, массивов, структур, чтение и запись в/из файл(а), сортировка данных и тд. Программу я написал, работает отлично. Но теперь нужно её модифицировать следующим образом:

-предусмотреть использование очередей при реализации запросов ввода-вывода;
-предусмотреть оценку времени, необходимого на выполнение операций сортировки для каждого используемого способа (всего три вида сортировки).

Теперь вопрос: что означают эти модификации? Как понять "очередь при реализации запросов ввода-вывода"? Ну и как реализовать оценку времени? Я так понимаю, должны быть использованы таймеры, или я ошибаюсь?

Всем заранее большое спасибо за ответы.
Ответ:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <time.h>       /* clock_t, clock(), CLOCKS_PER_SEC */
 
int main ()
{
  clock_t t;
 
  t = clock();
 
  /* Блок кода */
 
  t = clock() - t;
 
  printf ("It took me %d clicks (%f seconds).\n", 
          (int)t, ((double)t)/CLOCKS_PER_SEC);
  return 0;
}
примерно так измеряется время, только надо прогнать несколько раз(и взять среднее - самый простой вариант)
очередь, она и в Африке очередь queue называется (бывают еще очереди с приоритетами)
приоритет в linux напримр задается через nice()
Сообщение от Rebel1994
предусмотреть использование очередей при реализации запросов ввода-вывода;
-предусмотреть оценку времени, необходимого на выполнение операций сортировки для каждого используемого способа (всего три вида сортировки).
какие сортировки? какие данные? в принципе, кроме сортировки Шелла почти все сортировки изучены матаналитическим аппаратом
что тут еще добавить к вашему вопросу... каков вопрос - таков ответ.
Вопрос: Использование функции DeviceIoControl с кодом IOCTL_SCSI_PASS_THROUGH

Всем доброго времени суток. Пытаюсь передать диску скази запрос для чтения памяти, но есть проблемы:
  • при использовании логического "или" в флагах FILE_READ_DATA || FILE_WRITE_DATA,FILE_SHARE_READ || FILE_SHARE_WRITE DeviceIoControl возвращает ошибку "Access denied"
  • при использовании побитового "или" получаю ошибку "1306 indicates two revision levels are incompatible"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "stdafx.h"
#include <Windows.h>
#include <Ntddscsi.h>
#include <iostream>
#include <strsafe.h>
 
#define  TRANSFER_B_SIZE    0x100
#define SENSE_B_SIZE        0xb
 
HANDLE hFile, hDevice;
 
void DisplayError(LPTSTR lpszFunction)
{
 
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError();
 
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lpMsgBuf,
        0,
        NULL);
 
    lpDisplayBuf =
        (LPVOID)LocalAlloc(LMEM_ZEROINIT,
        (lstrlen((LPCTSTR)lpMsgBuf)
            + lstrlen((LPCTSTR)lpszFunction)
            + 40) // account for format string
            * sizeof(TCHAR));
 
    if (FAILED(StringCchPrintf((LPTSTR)lpDisplayBuf,
        LocalSize(lpDisplayBuf) / sizeof(TCHAR),
        TEXT("%s failed with error code %d as follows:\n%s"),
        lpszFunction,
        dw,
        lpMsgBuf)))
    {
        printf("FATAL ERROR: Unable to output error code.\n");
    }
 
    _tprintf(TEXT("ERROR: %s\n"), (LPCTSTR)lpDisplayBuf);
 
    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
 
}
 
int main()
{
    hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive1"),
        GENERIC_WRITE ^ GENERIC_READ,
        FILE_SHARE_READ ^ FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        NULL,
        NULL);
    if (hDevice == INVALID_HANDLE_VALUE) {
        DisplayError(TEXT("CreateFile"));
        system("pause");
        return(FALSE);
    }
 
    BOOL        status;
    ULONG       dwInputBufferSize;
    ULONG       dwBytesReturned;
    _SCSI_PASS_THROUGH wvm;
 
    dwInputBufferSize = sizeof(SCSI_PASS_THROUGH) + TRANSFER_B_SIZE;
    char *pInputBuffer = new char[dwInputBufferSize];
    char *pInputBufferIn = new char[dwInputBufferSize];
 
    wvm.Length = sizeof(SCSI_PASS_THROUGH);     //размер всей структуры
    wvm.CdbLength = 10;                         //длина CDB-пакета
    wvm.SenseInfoLength = SENSE_B_SIZE;         //длина Sense-буфера для возврата ошибки
    wvm.DataIn = SCSI_IOCTL_DATA_IN;            //направление передачи данных
    wvm.DataTransferLength = TRANSFER_B_SIZE;   //размер буфера для приёма/передачи данных
    wvm.TimeOutValue = 15;                      //максимальное время выполнения команды
    wvm.DataBufferOffset = sizeof(SCSI_PASS_THROUGH) + SENSE_B_SIZE; //смещение от начала структуры до буфера для приёма/передачи данных
    wvm.SenseInfoOffset = sizeof(SCSI_PASS_THROUGH);                 //смещение от начала структуры до Sense-буфера для возврата ошибки
    wvm.Cdb[0] = 25;                                                 //CDB-блок с управляющим кодом
 
    status = DeviceIoControl(hDevice,
        IOCTL_SCSI_PASS_THROUGH,         //Управляющий код для операции
        pInputBufferIn,                  //Указатель на буфер ввода данных
        dwInputBufferSize,               //Размер буфера ввода данных
        pInputBuffer,                    //Указатель на буфер вывода данных
        dwInputBufferSize,               //Размер буфера вывода данных
        &dwBytesReturned,                //Указатель на переменную, которая получает размер данных, сохраненных в буфере вывода 
        NULL);
        if (0 == status)
    {
        DisplayError(TEXT("DeviceIoControl"));
        system("pause");
        return(FALSE);
    }
 
}
Кто что может сказать по этому поводу?
Ответ:
Сообщение от Pchelman
при использовании логического "или" в флагах FILE_READ_DATA || FILE_WRITE_DATA,FILE_SHARE_READ || FILE_SHARE_WRITE DeviceIoControl возвращает ошибку "Access denied"
Не следует использовать логические операции в таких выражениях, это ошибка.
Правильно так: FILE_READ_DATA | FILE_WRITE_DATA.

По поводу остального: попробуй, во-первых, занулить структуру wvm (там не все
поля заполняются адекватными значениями, в некоторых лежит мусор), во-вторых,
можно попробовать запустить этот же код из-под 64-битного процесса
(где-то видел, что у кого-то были такие же проблемы с ошибкой 1306 и они
решались перекомпиляцией под x64).
Вопрос: Подтверждение Email без использования Identity

как добавить подтверждение email без использования identity???
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[HttpPost]
        public ActionResult Register(Registration account)
        {
            if (ModelState.IsValid)
            {
                var user = db.Registration.FirstOrDefault(p => p.Email.Equals(account.Email));
                    if (user != null)
                    {
                        ModelState.AddModelError("Email", "Данная почта уже занята");
                }
                else
                {
              db.Registration.Add(account);
              db.SaveChanges();  
              ModelState.Clear();
              ViewBag.Message = account.Email + " " + "Вы удачно зарегистрировались";
                }
        }
            return View();
        }
 
    }
}
Ответ: pro_100_gram, мне сложно оперировать какими либо документированными фактами потому что я их не знаю. Отличие вижу только в одном, использование PartialView, но не думаю что при использовании таковых метод передачи сообщений об ошибке должен меняться. Видимо придйется ждать экспертов.

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