Никто не мешает указать спецификатор width в scanf для вводимой строки. И надо предусмотреть в массиве место под завершающий нулевой байт.
кто поумнее делают так
Пользователь с клавиатуры может вводить строку какой угодно длинны, ему до фанаря размер массива под вводимую строку, который предусмотрен в программе. Это вызовет выход за пределы массива и тот же SYGSEGV с вылетом программы. Так что это не многим лучше первого варианта. Выход все тот же - спецификатор width.
Оба совета годные, но они не достаточные - в любом случае надо при вводе контролировать размер вводимых данных. https://en.cppreference.com/w/c/io/fscanf
Обратите внимание - по ссылке extern C используется только с обычными функциями (не с типами, не с данными и не с членами классов).
extern C - заставляет компилятор не использовать плюсовый name mangling для указанных объектов. Вместо него используется сишный манглинг. Это вносит определенные ограничения на использование возможностей С++, например в этом случае не возможна перегрузка функций (т.к. она реализована за счет плюсового name mangling).
Т.к. в Си нет классов, а Си структуры - это совсем не С++ структуры, то классы и структуры С++ вообще нет смысла экспортировать, если планируется использование библиотеки в программах на Си. Экспортируйте только стандартные типы.
Почему важен сишный name mangling - потому что его поддерживает не только Си, но и куча других языков программирования, которые способны использовать динамические библиотеки. А плюсовый mangling используют только плюсы, на сколько я знаю.
Но вы же пишете библиотеки для себя. И, видимо, будете их использовать только в С++ программах. В этом случае можно вообще не использовать extern C. И тут у вас нет ограничений на экспорт структур и классов.
Spooky 2020, Может в шарпе просто берут значение таймера в тиках и берут от него остаток от деления на некоторое число. Вполне себе генератор. Довольно быстрый. Теоретически на многоядерных системах может выдать одинаковый результат, если одновременно выполнить генерацию на разных ядрах.
В Си используется обычно линейный конгруэнтный ГПСЧ. Константы в нем могут быть разные, но алгоритм один и тот же. Там всего несколько арифметических операций.
В плюсах несколько вариантов ГПСЧ, более сложных чем в Си.
Есть методы проверки результатов ГПСЧ на "случайность". Случайные числа могут быть не достаточно случайны для конкретного применения. Поэтому в стандартной библиотеке выбирают ГПСЧ, который и достаточно быстрый и дает достаточно не плохие результаты случайности для среднестатистического использования.
Maga Izdaga, Нет. Пул для клиентов с белыми IP адресами, можно такой заказать у прова за отдельные деньги.
Раз вы выходите в инет через NAT провайдера, то пров вам выдает адрес из диапазона серых адресов (можете нагуглить эти диапазоны). С серым адресом нельзя выходить в интеренет, только через NAT.
С НАТом все несколько проще - NAT находится где-то у провайдера и внешний адрес у него один, через него то вы и выходите в инет.
Другое дело, что серверов с NATом у провайдера может быть много. Но, видимо, для вас (вашего дома, улицы, района) у провайдера выделен конкретный NAT с фиксированным адресом. Провайдер может как-то чередовать NAT сервера в зависимости от нагрузки или расположения звезд, так что адрес NATа так же может меняться. Похоже ваш оператор такое не практикует.
Quark, Я не в курсе архитектуры вашей библиотеки. Из приведенных исходников трудно сделать каких-то выводов.
Когда вы создаете библиотеку, то у вас есть некоторые экспортируемые типы, данные и функции (методы), которые должны быть видны из вне (пользователям библиотеки). А так же есть другие типы, данные и функции, которые являются внутренними для библиотеки и их не надо показывать на ружу.
В связи с этим у вас должен быть заголовочный файл (или несколько файлов) для внешних пользователей (для программ, которые будут использовать библиотеку) и другие заголовочные файлы для внутреннего использования (они нужны только для сборки самой библиотеки).
Вы сами, как разработчик библиотеки, определяете, что надо экспортировать, а что не надо.
Во внешней программе, использующей библиотеку нужно подключать только файлы заголовков для экспорта, внутренние заголовки вообще не нужны внешней программе и они должны/могут быть не доступны во время сборки внешней программы.
Если библиотека не большая, то в принципе, может не быть внутренних типов и данных, тогда нет смысла во внутренних заголовочных файлах.
Еще несколько замечаний:
Использовать etxern C не логично для классов и структур С++, т.к. в Си нет классов и структуры там отличаются от структур в С++. Если вы хотите, что бы ваша библиотека могла использоваться в программах на Си, то нужно поступать несколько по другому. А плюсовые программы смогут использовать вашу библиотеку и без extern C.
Не зачем в классе/структуре для каждого метода писать модификатор доступа (public), это же не Java.
Quark, Кто вам мешает оставить в заголовке только объявления.
А все определения (или только те, что считаете нужным) оставить в cpp? Вообще стандартная практика так-то.
PS: В прошлом посте ошибся с определениями, конечно. Исправился.
lukepker, Я в шоке :-)
Можете начать отсюда: https://softclipper.net/soft-skachat/clipper-5-2e-...
Помнится в середине 90х как раз закончил работу на клиппере на этой версии. С тех пор не приходилось его использовать. Но впечатления остались самые положительные.
Вы попали на самый неудачный вариант для создания графического приложения - с использованием чистого WinAPI. Как уже было сказано - это мучительно и неудобно, а главное надо хорошо понимать что вы делаете, т.к. это нижний уровень GUI, а у вас с этим проблемы.
На самом деле, вам стоит подумать - а нужно ли вам в принципе приложение с граф.интерфейсом, т.к. задача у вас примитивная, если не надо рисовать графики, то все остальное прекрасно делается в консольном приложении. А кроме того это гораздо проще.
Если же сильно хочется GUI, рекомендую использовать Qt. И может быть даже не MSVS, а QtCreator.
Ruslan, да и провайдер далеко не факт что в принципе сможет это сделать, т.к. возможно маршрут изменен где-то на промежуточном этапе, который не зависит от твоего провайдера.
Может на вашем компе появился какой-нить процесс который: занимает канал связи, занимает процессорное время, отжирает память.
Может нагрузка на облаке выросла или DDOSят его. Может в прошлый раз облако было ближе к вам, а сейчас переехало на край света.
Причин увеличения задержки и помимо провайдера может быть очень много.
Читайте внимательно мой первый пост.
Бесполезно выполнять эти команды на ВПН сервере - он и так имеет доступ к гугловским ДНСам.
Причину не работы, я описал в этом же посте. На вопросы вы не ответили.
Сергей, Начните с того, что покажите конфиг ВПН сервера. Используете ли в нем опцию: push "redirect-gateway def1 bypass-dhcp"
Именно она прописывает на клиенте ВПН сервер как шлюз по умолчанию.
Я первый способ пробовал
Вы где выполняли эти команды?
как фаервол может работать в качестве маршрутизатора
Правилами фаервола можно перенаправлять пакеты на другой интерфейс и т.п., а это прямое управление маршрутизацией. В т.ч. можно отправить пакеты на NAT, например.
Сергей, Как ВПН сервер сам попадает в интернет? Что является шлюзом в интернет для него?
Дело в том, что шлюз вашего ВПН сервера ничего не знает о ВПН сети. Поэтому он не знает куда слать полученные ответы и он их отбрасывает (или пересылает на свой шлюз по умолчанию).
Есть 2 варианта решения проблемы:
1. простой, но не всегда применимый: настроить на шлюзе статический маршрут до ВПН сети через ваш ВПН сервер.
2. чуть более сложный: поднять на ВПН сервере NAT на интерфейсе в сторону шлюза в интернет, отправлять на NAT все пакеты от ВПН клиентов в интернет с помощью правил фаервола. В этом случае пакеты от ВПН клиентов в интернет будут попадать на шлюз с адресом ВПН сервера, а не ВПН клиентов.
Никто не мешает указать спецификатор width в scanf для вводимой строки. И надо предусмотреть в массиве место под завершающий нулевой байт.
Пользователь с клавиатуры может вводить строку какой угодно длинны, ему до фанаря размер массива под вводимую строку, который предусмотрен в программе. Это вызовет выход за пределы массива и тот же SYGSEGV с вылетом программы. Так что это не многим лучше первого варианта. Выход все тот же - спецификатор width.
Оба совета годные, но они не достаточные - в любом случае надо при вводе контролировать размер вводимых данных.
https://en.cppreference.com/w/c/io/fscanf