def clamp(n, minn, maxn):
return max(min(maxn, n), minn)
или функционально эквивалентны:
clamp = lambda n, minn, maxn: max(min(maxn, n), minn)
теперь вы используете:
n = clamp(n, 7, 42)
или совершенно ясно:
n = minn if n < minn else maxn if n > maxn else n
еще четче:
def clamp(n, minn, maxn):
if n < minn:
return minn
elif n > maxn:
return maxn
else:
return n
Держите под рукой копию руководств IBM:
Публикации IBM, как правило, очень хороши, но вам нужно привыкнуть к их формату, а также знать, где искать ответ. Довольно часто вы обнаруживаете, что функция, которую вы хотите использовать, защищена «макросом проверки функций»
. Вам следует попросить своего дружелюбного системного программиста установить XL C / C ++ Run-Time Library Ссылка: Man Страницы в вашей системе. Затем вы можете сделать что-то вроде "man connect", чтобы открыть страницу руководства по API-интерфейсу socket (). Когда я это делаю, я вижу следующее:
FORMAT
X / Open
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address, socklen_t address_len);
Berkeley Sockets
#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>
int connect(int socket, struct sockaddr *address, int address_len);
@Jax: extern "C"
вещь вопросы, очень очень. Если заголовочный файл не имеет один, то (если это не C ++-only заголовочный файл), необходимо было бы включить Ваш #include
с ним:
extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}
В основном, каждый раз, когда то, где программа C++ хочет связаться со средствами на базе С, эти extern "C"
, жизненно важно. На практике это означает, что имена, используемые во внешних ссылках, не будут искажены, как нормальный C++, имена были бы. Ссылка.
ПРАВОВАЯ ОГОВОРКА: Я не программист на C++, однако я знаю C действительно хорошо. Я adapated, который кодируют эти вызовы от некоторого C, я имею.
Также скидка с цены поместила эти странные _ как мои подчеркивания.
необходимо просто быть в состоянии записать класс абстракции вокруг сокетов C с чем-то вроде этого:
class my_sock {
private int sock;
private int socket_type;
private socklen_t sock_len;
private struct sockaddr_in server_addr;
public char *server_ip;
public unsigned short server_port;
};
Тогда имеют методы для открытия, закрытия и отправки пакетов вниз сокет.
, Например, прослушивание могло бы выглядеть примерно так:
int my_socket_connect()
{
int return_code = 0;
if ( this->socket_type != CLIENT_SOCK ) {
cout << "This is a not a client socket!\n";
return -1;
}
return_code = connect( this->local_sock, (struct sockaddr *) &this->server_addr, sizeof(this->server_addr));
if( return_code < 0 ) {
cout << "Connect() failure! %s\n", strerror(errno);
return return_code;
}
return return_code;
}
Я не испытал никаких затруднений с помощью API сокетов BSD в C++ в GNU/Linux. Вот пример программы, который я использовал:
#include <sys/socket.h>
int
main()
{
return AF_INET;
}
, Таким образом, мое взятие на этом - то, что z/OS является, вероятно, усложняющим фактором здесь, однако, потому что я никогда не использовал z/OS прежде, а тем более программировал в нем, я не могу сказать это окончательно.:-P
Можно хотеть смотреть к cpp-сокеты , обертка C++ для системных вызовов сокетов. Это работает со многими операционными системами (Win32, POSIX, Linux, *BSD). Я не думаю, что это будет работать с z/OS, но можно смотреть на включать файлы, которые это использует, и у Вас будет много примеров протестированного кода, который работает хорошо над другим OSS
Так попытка
#define _OE_SOCKETS
перед включением sys/socket.h
_OE_SOCKETS, кажется, просто для позволения/запрещения определения связанных с сокетом символов. Весьма распространено в некоторых библиотеках иметь набор макросов, чтобы сделать это, гарантировать, что Вы не компилируете/связываете не нужные части. Макрос не является стандартным в других реализациях сокетов, это, кажется, что-то характерное для z/OS.
Смотрят на эту страницу:
Компиляция и Соединение z/VM C Программа
См. Раздел Использование сокетов системных служб z / OS UNIX в Руководстве по программированию z / OS XL C / C ++. Убедитесь, что вы включаете необходимые файлы заголовков и используете соответствующие #defines.
Ссылка на документ менялась с годами, но вы сможете легко добраться до него, найдя текущее местоположение Раздел поддержки и загрузки на ibm.com и поиск документации по заголовку.