• Есть ли в stl такой мьютекс, который можно разблокировать из другого потока?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Если тебе надо заблокировать один поток (или несколько, поставив их в очередь блокировки) до события в другом потоке, то тебе хорошо подойдет std::condition_variable.

    На основе этой сущности можно реализовать механику "wait() -> notify/notifyall()" из pthread_monitor или из Java.
    Ответ написан
    2 комментария
  • Как задать формат boost::lexical_cast?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    boost::format вам в помощь. lexical_cast не предназначен для этого.
    std::string str = boost::str(boost::format("%.2f") % temp);
    Ответ написан
    Комментировать
  • Есть ли простой многопоточный генератор случайных чисел с заданной размерностью на C#?

    Spetros
    @Spetros
    IT-шник
    Если хотите сами программированию научиться, нужно лабы писать самому и не искать готовых решений.
    Ответ написан
    1 комментарий
  • Есть ли такая возможность расширенной обработки в зависимости от состояния числового флага?

    @SZolotov
    Asp.net core, MAUI,WPF,Qt, Avalonia
    Гуглите attached depency property и триггеры. Что то из этого вам точно подойдёт
    Ответ написан
    2 комментария
  • VS15 не видит iostream?

    ThePyzhov
    @ThePyzhov
    iOS Ninja
    Все зависит от того, как вы поставили студию, и что с ней делали.

    1. Создайте новый проект и попробуйте подключить.
    2. Если с новым проектом тож никак, полностью сносите, перезагружайте компьютер и ставьте студию по новой.
    Ответ написан
    Комментировать
  • Стоит ли начать учить c# с этого ресурса?

    @GoldGoblin
    я иногда почитываю metanit.com
    Ответ написан
    Комментировать
  • Как генерировать Json на C#, если структура динамическая, не прописывая все возможные варианты?

    yamaoto
    @yamaoto
    la programmeur
    Можно оформить классы вот так:
    public class CommandResult
    {
        public string Command {get;set;}
    }
    public class CommandResult<T>:CommandResult
    {
        public T Data {get;set;}
    }
    public class FilesList
    {
        public string[] Files {get;set;}
    }
    public class UserInfo
    {
        ...
    }


    и используешь в WebApi
    public class MyAwesomeController:ApiController
    {
    
        public CommandResult<FilesList> GetFilesList(){
            ...
            return new CommandResult<FilesList> (){
                Command = "FilesList",
                Data = new FilesList(){Files = new []{"file1","file2","file3","file4"}}
            };
        }
     public CommandResult<UserInfo> GetUserInfo(){
    ...
     }
    }


    или со своей логикой
    public class MyAwesomeCommands
    {
    
        private CommandResult<FilesList> _getFilesList(){
        ...
            return new CommandResult<FilesList> (){
                Command = "FilesList",
                Data = new FilesList(){Files = new []{"file1","file2","file3","file4"}}
            };
        }
        public string GetFilesList(){
            var data = getFilesList();
            return JsonConvert.SerializeObject(data);
        }
     public string GetUserInfo(){
    ...
     }
    }
    Ответ написан
    Комментировать
  • По какой книге учить язык си?

    ThePyzhov
    @ThePyzhov
    iOS Ninja
    The_C_Programming_Language_Book_2th_Ed.j
    Ответ написан
    Комментировать
  • В чем разница между #pragma pack(1) и #pragma pack(push, 1)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    push заносит текущее значение на вершину стека, затем его можно восстановить по #pragma pack(pop).
    Это позволяет исключить конфликты при сборке нескольких .h-файлов с разными требованиями к pack.
    Ответ написан
    3 комментария
  • Для чего нужны замыкания в C++ и как вы их используете?

    @Mercury13
    Программист на «си с крестами» и не только
    Замыкание — это способ передать в callback, из какого контекста он запустился.
    struct Row {
      int data[10];
    };
    struct Table {
      Row rows[10];
    }

    Нам нужно отсортировать таблицу по j-му столбцу. Номер j заранее неизвестен.

    int sortJ;
    
    int myCompare(const void* a,const void* b) {
      int ia = reinterpret_cast<Row*>(a)->data[sortJ];
      int ib = reinterpret_cast<Row*>(b)->data[sortJ];
      if (ia < ib) return -1;
      if (ia == ib) return 0;
      return 1;
    }
    
    int someJ = 5;
    sortJ = someJ;
    qsort(table.rows, 10, sizeof(Row), myCompare);

    Вот эта переменная sortJ — по какому столбцу сортировать — это и есть замыкание. Но, как известно, «избегай незнакомых женщин и глобальных переменных». Поэтому на STL мы делаем функтор (объект-функцию) и эту информацию кидаем в него.

    class MyCompare {
    public:
      MyCompare(int aJ) : j(aJ) {}
      bool operator () (const Row& a, const Row& b) const
        { return (a.data[j] < b.data[j]); }
    private:
      const int j;
    }
    
    int someJ = 5;
    std::sort(table.rows, table.rows + 10, MyCompare(someJ));

    Вот мы и избавились от глобальной переменной, закинув наше замыкание в private-поля объекта.

    Что плохо? Не будем говорить про технические тонкости. С точки зрения красоты и лаконичности кода: код слишком разлапистый. И тут пришёл C++11.
    int someJ = 5;
    std::sort(table.rows, table.rows + 10,
      [someJ](const Row& a, const Row& b) -> bool { return (a.data[someJ] < b.data[someJ]); } );

    Корявовато, но таков синтаксис Си++. Автоматически создаётся объект-функтор, и someJ становится его полем. Вот оно, замыкание — [someJ] — то есть те вещи, которые надо протащить внутрь функтора.

    Из реального проекта. Отбегал поток автоматического поиска нового регистрационного ключа; если что-то получилось — синхронно вызываем лямбду через Qt’шный механизм «сигнал-слот». Чтобы всё было синхронно, нужен объект, живущий в главном потоке (и он в интерфейсе MainControl — управление главной формой — тоже есть). Но тогда придётся вызывать не слот, а лямбду. Этой лямбде нужны два поля: fReregKey (новый ключ защиты от копирования) и fMainControl. Оба они в this, его и замыкаем.
    connect(this, &RenewThread::needUpdate, fMainControl.maincQobj(),
                [this]() {
            drm::createFile(fReregKey);
            fMainControl.maincLayoutOnRegister();
        });


    А теперь посмотрим в WinApi. Первая попавшаяся функция из DirectInput.
    HRESULT EnumObjects(
             LPDIENUMDEVICEOBJECTSCALLBACK lpCallback,
             LPVOID pvRef,
             DWORD dwFlags
    );
    
    BOOL DIEnumDeviceObjectsCallback(
             LPCDIDEVICEOBJECTINSTANCE lpddoi,
             LPVOID pvRef
    );

    Про pvRef говорится: функции EnumObjects он ни на что не нужен; что функция приняла, то и даст в callback. Тоже форма замыкания: можно передать указатель на любые данные, которые нужны callback’у.
    Ответ написан
    4 комментария
  • Для чего нужны замыкания в C++ и как вы их используете?

    Замыкания неотделимы от лямбд. Они позволяют передавать в лямбду ссылки. Например в лямбде вам потребовалось менять приватную переменную класса. Без замыкания вам пришлось бы делать сеттер и геттер (что уже меняет интерфейс класса, их можно будет вызвать там, где не стоило бы), передавать в лямбду указатель на объект.
    А так вы работаете с переменной объекта внутри лямбды, как будто это локальная переменная лямбды.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    using IntV = vector<int>;
    
    int main(int argc, char const *argv[]) {
    
      IntV v = {0, 9, 4, 6, 7, 8, 5, 6};
      size_t count = 0;
    
      for_each(begin(v), end(v), [](IntV::value_type x){cout << x << " ";});
      cout << endl;
    
      sort(begin(v), end(v), [&count /*closure*/](IntV::value_type &a, IntV::value_type &b){
        ++count;
        return a < b;
      });
    
      cout << count << endl;
    
      for_each(begin(v), end(v), [](IntV::value_type x){cout << x << " ";});
      cout << endl;
    
      return 0;
    }


    Вот пример вам подсчёта количества сравнений при сортировке вектора.
    Ответ написан
    3 комментария
  • Можно ли реализовать следущий подход с помощью Generic типов?

    Nipheris
    @Nipheris Куратор тега C#
    interface IFoo
    {
      // Не содержит метод Commit()
      // Но содержит все остальные методы и свойства, которые реализованы в классе Foo
    }
    interface ITransaction
    {
        void Commit();
    }
    class Foo : IFoo, ITransaction
    {
      // ...
      
      public void Commit() 
      {
        // ...
      }
    }

    class Bar<T, TImpl> where TImpl : T, ITransaction, new()
    {
      private readonly TImpl _foo;
    
      protected T Foo {
        get { return _foo; }
      }
    
      public Bar() {
        _foo = new TImpl();
      }
     
      public void Commit()
      {
        _foo.Commit();
      }
    }
    Ответ написан
    3 комментария
  • Каким образом я могу использовать IoC контейнер IServiceProvider в .NET Core Class Library?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    А причем тут IoC? Я думал всегда, что IoC наоборот, чтобы разорвать связь между уровнями.

    services.AddTransient, PersonService>(); эта строка не связь обеспечивает, она лишь говорит контейнеру, экземпляр какого конкретного класса создавать при запросе его из контейнера.

    если вам необходимо, чтобы в конструктор сервиса передавался контекст данных, то добавляем его в IoC контейнер
    services.AddTransient<DdContext>(),
    а в конструктор сервиса добавляем параметр, например,
    public PersonService(DbContext context)
    Те, когда вы запросите экземпляр IService, контейнер, скажем так, рекурсивно будет разрешать зависимости, те увидев зависимость сервиса от DbContext, и зная зарегистрированный класс, контейнер сначала создаст DbContext, затем создаст PersonService, передав в него созданный экземпляр DbContext.
    Ответ написан
    6 комментариев
  • Как правильно создать валидатор DataAnnotations?

    1) metanit.com/sharp/mvc5
    Глава 7. Метаданные и валидация модели
    Аннотации данных для отображения свойств
    Основы валидации
    Атрибуты валидации
    Валидация модели в контроллере
    Отображение ошибок валидации
    Создание собственной логики валидации


    2) FluentValidation, модель отдельно, валидация отдельно.
    https://chsakell.com/2015/08/23/building-single-pa...

    public class MovieViewModel : IValidatableObject
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string Image { get; set; }
        public string  Genre { get; set; }
        public int GenreId { get; set; }
        public string Director { get; set; }
        public string Writer { get; set; }
        public string Producer { get; set; }
        public DateTime ReleaseDate { get; set; }
        public byte Rating { get; set; }
        public string TrailerURI { get; set; }
        public bool IsAvailable { get; set; }
        public int NumberOfStocks { get; set; }
     
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            var validator = new MovieViewModelValidator();
            var result = validator.Validate(this);
            return result.Errors.Select(item => new ValidationResult(item.ErrorMessage, new[] { item.PropertyName }));
        }
    }
    
    public class MovieViewModelValidator : AbstractValidator<MovieViewModel>
        {
            public MovieViewModelValidator()
            {
                RuleFor(movie => movie.GenreId).GreaterThan(0)
                    .WithMessage("Select a Genre");
     
                RuleFor(movie => movie.Director).NotEmpty().Length(1,100)
                    .WithMessage("Select a Director");
     
                RuleFor(movie => movie.Writer).NotEmpty().Length(1,50)
                    .WithMessage("Select a writer");
     
                RuleFor(movie => movie.Producer).NotEmpty().Length(1, 50)
                    .WithMessage("Select a producer");
     
                RuleFor(movie => movie.Description).NotEmpty()
                    .WithMessage("Select a description");
     
                RuleFor(movie => movie.Rating).InclusiveBetween((byte)0, (byte)5)
                    .WithMessage("Rating must be less than or equal to 5");
     
                RuleFor(movie => movie.TrailerURI).NotEmpty().Must(ValidTrailerURI)
                    .WithMessage("Only Youtube Trailers are supported");
            }
     
            private bool ValidTrailerURI(string trailerURI)
            {
                return (!string.IsNullOrEmpty(trailerURI) && trailerURI.ToLower().StartsWith("https://www.youtube.com/watch?"));
            }
        }
    Ответ написан
    1 комментарий
  • Best Practices ASP.NET, в чём смысл многослойности?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Сервис - это бизнес-логика, которая позволяет абстрагироваться от DAL с его репозиториями.

    Слои:
    • абстрагированы друг от друга - заменяемы (допустим, заменяя презентационный слой можно из обычного сайта сделать SPA или бэкенд для мобильного приложения; мы не зависим от модели хранения (разные СУБД, файлы, глиняные таблички, голубиная почта), можем легко "вклинить" какой-нибудь прокси-слой между ними, который будет проводить какую-либо обработку или кэшировать, например)
    • абстрагированы друг от друга - их легко изучать, легко поддерживать (модифицировать, т.к. четко разграничена зона ответственности и меньше риск, что от взмаха крыла бабочки на другом конце света рухнет небоскреб)
    • легко поддаются независимому тестированию (взяв один тип можно легко воспроизвести вокруг него необходимое тестовое окружение)


    На проекты принято дробить, как правило, как для логического отделения, как и возможности безболезненно обернуть любой такой модуль в NuGet-пакет и подключать во многих местах. На волне этой идеи и появился .NET Core.
    Ответ написан
  • Почему не работает SelectedItem в ListView для UWP приложении?

    @SZolotov
    Asp.net core, MAUI,WPF,Qt, Avalonia
    двунаправленный биндинг делали?
    Ответ написан
    2 комментария
  • Почему программа не отвечает во время скачивания методом WebClient?

    Nipheris
    @Nipheris Куратор тега C#
    Очевидно потому, что вы вызываете синхронный метод скачивания (DownloadFile), и он вешает event loop до момета завершения загрузки. Асинхронно качать не пробовали?
    Ответ написан
    Комментировать
  • Как убрать черную панельку с формы WPF?

    163ae02cc9e44996a65954578c6b1679.png
    Ответ написан
    Комментировать
  • Как убрать черную панельку с формы WPF?

    Под отладчиком не запускать. Или отключить в настройках студии, где , не знаю. Это уи хелпер.
    Ответ написан
    Комментировать