Ответы пользователя по тегу C++
  • Как пeредать const char* в c++ фунцию из c#?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Ответ написан
    Комментировать
  • Почему cout не выводит сообщение?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Ты не вызывал показ сообщения в случае успеха. Немного причесал код и удалил то, что ты можешь просто скопировать из своего кода обратно. Я бы на твоём месте сразу учился писать код так, чтобы каждая функция отвечала за какой-то свой один функционал. Не смешивай всё в одном месте.

    #ifdef _WIN32
    #include <windows.h>
    #endif
    
    #include <iostream>
    #include <fstream>
    #include <string>
    
    bool IsLoggedIn()
    {
        using namespace std;
    
       // ...
    
        return un == username && pw == password;
    }
    
    int main()
    {
        using namespace std;
    
    #ifdef _WIN32
        // https://habr.com/ru/sandbox/108750/
        // Устраняет проблемы выводом кириллицы на консоль Windows
        // Файл должен быть сохранён с кодировкой Windows 1251
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
    #endif
    
        int choice;
        do
        {
            cout << "1: Register\n2: Login\n Your choice: ";
            cin >> choice;
    
            if (choice == 1)
            {
                // ...
            }
            else if (choice == 2)
            {
                bool status = IsLoggedIn();
                if (!status)
                {
                    cout << "False Login!\n";
                }
                else
                {
                    cout << "Succesfully logged in!\n";
                }
    
    #ifdef _WIN32
                system("pause");
    #endif
                return status ? 1 : 0;
            }
    
        } while (choice == 1);
    }
    Ответ написан
  • Как исправить ошибку в с++?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    На примере UWP C++ проекта. Нужно сформировать С++ строку и конвертировать её в Managed String.
    Свойство Text имеет тип данных Platform::String (в других типах проектов не знаю какой там тип, как и не знаю, какой у вас тип проекта, видимо, Windows Forms, который для С++ мне создать не удалось из Visual Studio 2019)
    6043bd0d024ab531874548.png

    Подсмотреть разные примеры можно здесь: https://github.com/stammen/uwp-cpp-examples
    Использовать Sleep в UI потоке -- это зависание окна.
    И да, как писали в комментариях это не чистый С++, а С++/CX. Здесь пригодились бы знания C# и платформы .NET.

    MainPage.xaml.cpp
    #include "pch.h"
    #include "MainPage.xaml.h"
    
    using namespace RemoveApp;
    
    using namespace Platform;
    using namespace Windows::Foundation;
    using namespace Windows::Foundation::Collections;
    using namespace Windows::UI::Xaml;
    using namespace Windows::UI::Xaml::Controls;
    using namespace Windows::UI::Xaml::Controls::Primitives;
    using namespace Windows::UI::Xaml::Data;
    using namespace Windows::UI::Xaml::Input;
    using namespace Windows::UI::Xaml::Media;
    using namespace Windows::UI::Xaml::Navigation;
    
    std::string FormatPoint(POINT&);
    
    std::wstring_convert<std::codecvt_utf8<wchar_t>> MainPage::s_converter;
    std::mutex MainPage::s_mutex;
    
    DispatcherTimer^ _timer;
    uint32_t _counter;
    const uint32_t TICK = 10000;
    
    MainPage::MainPage()
    {
        InitializeComponent();
        UpdateLabel();
    
        _timer = ref new DispatcherTimer();
        TimeSpan ts;
        ts.Duration = 1000 * TICK;
        _timer->Interval = ts;
        
        auto registrationToken = _timer->Tick += ref new EventHandler<Object^>(this, &MainPage::OnTick);
    
        _button->Click += ref new RoutedEventHandler(this, &MainPage::OnClick);
    }
    
    void MainPage::OnTick(Object^ sender, Object^ e)
    {
        UpdateLabel();
    }
    
    void MainPage::UpdateLabel()
    {
        //GetCursorPos(&cp);
        //SetCursorPos(0, 0);
        //SetCursorPos(cp.x, cp.y);
        ++_counter;
        POINT cp = { _counter, _counter + 10 };
        std::string text = FormatPoint(cp);
        _label1->Text = StringToPlatformString(text);
    }
    
    void MainPage::OnClick(Object^ sender, RoutedEventArgs^ e)
    {
        if (!_timer->IsEnabled)
        {
            _timer->Start();
        }
    }
    
    std::string MainPage::PlatformStringToString(Platform::String^ text)
    {
        if (text == nullptr) {
            return std::string("");
        }
    
        std::lock_guard<std::mutex> lock(s_mutex);
        return s_converter.to_bytes(text->Data());
    }
    
    Platform::String^ MainPage::StringToPlatformString(const std::string& text)
    {
        if (text.empty()) {
            return ref new Platform::String();
        }
        std::lock_guard<std::mutex> lock(s_mutex);
        std::wstring converted = s_converter.from_bytes(text);
        return ref new Platform::String(converted.c_str());
    }
    
    std::string FormatPoint(POINT& point)
    {
        return "x = " + std::to_string(point.x) + ", y = " + std::to_string(point.y);
    }


    MainPage.xaml.h
    #pragma once
    
    #include "MainPage.g.h"
    #include <codecvt>
    #include <string>
    #include <mutex>
    #include <cstdint>
    
    using namespace Platform;
    using namespace Windows::UI::Xaml;
    
    namespace RemoveApp
    {
    	/// <summary>
    	/// An empty page that can be used on its own or navigated to within a Frame.
    	/// </summary>
    	public ref class MainPage sealed
    	{
    	public:
    		MainPage();
    
    		void OnTick(Object^ sender, Object^ e);
    		void OnClick(Object^ sender, RoutedEventArgs^ e);
    		void MainPage::UpdateLabel();
    
    	private:
    		std::string PlatformStringToString(String^ s);
    		String^ StringToPlatformString(const std::string& s);
    
    		static std::wstring_convert<std::codecvt_utf8<wchar_t>> s_converter;
    		static std::mutex s_mutex;
    	};
    }


    MainPage.xaml
    <Page
        x:Class="RemoveApp.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="using:RemoveApp"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        mc:Ignorable="d">
    
        <Grid>
            <StackPanel
                HorizontalAlignment="Center"
                VerticalAlignment="Center">
                <TextBlock
                    x:Name="_label1"
                    Margin="0,25,0,0"
                    FontSize="24" />
                <Button
                    x:Name="_button"
                    Margin="0,18,0,0"
                    Content="Запустить таймер" />
            </StackPanel>
        </Grid>
    </Page>


    pch.h
    #pragma once
    
    #include <collection.h>
    #include <windows.h>
    
    #include "App.xaml.h"


    pch.cpp
    #include "pch.h"
    Ответ написан
    Комментировать
  • Как обратиться к параметру класса?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Обратиться к полю класса можно так:

    #pragma once
    #include <string>
    
    class Window
    {
    public:
    	Window(const std::string& fileName);
    	void MaximizeWindow();
    
    private:
        std::string _fileName;
    };


    #include "Window.h"
    
    Window::Window(const std::string& fileName)
        : _fileName(fileName) {
    
    }
    
    void Window::MaximizeWindow() {
        // Здесь можно обратиться к полю _fileName
    }
    Ответ написан
  • Изучил C#, написал пару своих проектов. Стоит ли переходить на С++?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Я думаю, что просто изучить C# - этого мало. Нужно научиться писать сопровождаемый/поддерживаемый и тестируемый код. Научиться придерживаться какого-то адекватного стиля при написании кода, держать проект в чистоте и порядке, чтобы смотреть на него было не противно. Научиться строить более-менее грамотно архитектуру приложения. Научиться писать нормальный рабочий многопоточный код (а здесь нужны знания не только C#). Алгоритмы там и т.д. Просто знать язык и написать пару программ - этого мало. С++ можно изучить для общего развития и в целом это пригодится, так как иной раз нужно что-то написать на С++ и использовать в C#. В целом для понимания С++ кода.

    Вообще, чтобы научиться писать нормальный код, нужно иметь такое желание. Если есть такое желание, то нужно написать несколько довольно-таки больших проектов, только тогда придёт понимание, какие проблемы могут в таких проектах возникать и там уже архитектура станет важной настолько, что нужно будет учиться её проектировать/рефакторить.

    Скажу так, если алгоритмы всех своих программ, например, с UI, пишешь в MainWindow.cs или Form1.cs, то на С++ пока переходить не стоит, если хочется быть хорошим программистом, я бы развивался пока в C#. Книги бы почитал.

    Ещё я бы на твоём месте попробовал F#, вот там мозг в первые несколько часов/дней будет поломан из-за объёма непривычных конструкций, но язык крут.
    Ответ написан
    Комментировать
  • Как понять что в объект была добавлена информация, но не изменена существующая?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Если нужно бросать исключение (я бы бросал). С массивами ты ничего не сделаешь, чтобы нельзя было менять часть массива. Нужно использовать свой тип данных вместо массива, в котором и делать проверки.
    using System;
    
    namespace ConsoleApp1
    {
        public class ModelBase
        {
            protected bool CheckValueTypeField<T>(T field)
                where T : struct
            {
                return field.Equals(default(T));
            }
    
            protected bool CheckReferenceTypeField<T>(T field)
                where T : class
            {
                return field == null;
            }
    
            protected void ThrowIfNotDefault<T>(T field)
                where T : struct
            {
                if (!CheckValueTypeField(field))
                {
                    throw new InvalidOperationException();
                }
            }
    
            protected void ThrowIfNotNull<T>(T field)
                where T : class
            {
                if (!CheckReferenceTypeField(field))
                {
                    throw new InvalidOperationException();
                }
            }
        }
    
        public class TestModel : ModelBase
        {
            private string _name;
            private int _value;
    
            public string Name
            {
                get { return _name; }
                set
                {
                    ThrowIfNotNull(_name);
                    _name = value;
                }
            }
    
            public int Value
            {
                get { return _value; }
                set
                {
                    ThrowIfNotDefault(_value);
                    _value = value;
                }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var test = new TestModel();
                test.Name = "test name";
                test.Value = 1;
    
                try
                {
                    test.Name = "new name";
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                try
                {
                    test.Value = 5;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                Display(test);
            }
    
            static void Display(TestModel model)
            {
                Console.WriteLine(
                    $"{nameof(model.Name)} == {model.Name}; {nameof(model.Value)} == {model.Value};");
            }
        }
    }


    Можно, конечно, и так, но игнорировать изменения и никого об этом не уведомлять так себе затея.
    public class TestModel : ModelBase
        {
            private string _name;
            private int _value;
    
            public string Name
            {
                get { return _name; }
                set
                {
                    if (!CheckReferenceTypeField(_name))
                    {
                        _name = value;
                    }
                }
            }
    
            public int Value
            {
                get { return _value; }
                set
                {
                    if (!CheckValueTypeField(_value))
                    {
                        _value = value;
                    }
                }
            }
        }


    Или такой вариант, пока не определился с поведением, как определишься, можно удалить параметр из конструктора и часть поведения.
    using System;
    
    namespace ConsoleApp1
    {
        public abstract class ModelBase
        {
            private readonly bool _throwAnExceptionInsteadOfAnEvent;
    
            public event EventHandler FieldIsNotDefault;
    
            protected ModelBase(bool throwAnExceptionInsteadOfAnEvent = true)
            {
                _throwAnExceptionInsteadOfAnEvent = throwAnExceptionInsteadOfAnEvent;
            }
    
            protected bool CheckValueTypeField<T>(T field)
                where T : struct
            {
                return field.Equals(default(T));
            }
    
            protected bool CheckReferenceTypeField<T>(T field)
                where T : class
            {
                return field == null;
            }
    
            protected void AssertIsNotDefault<T>(T field)
                where T : struct
            {
                if (!CheckValueTypeField(field))
                {
                    if (_throwAnExceptionInsteadOfAnEvent)
                    {
                        throw new InvalidOperationException();
                    }
    
                    OnFieldIsNotDefault();
                }
            }
    
            protected void AssertIsNotNull<T>(T field)
                where T : class
            {
                if (!CheckReferenceTypeField(field))
                {
                    if (_throwAnExceptionInsteadOfAnEvent)
                    {
                        throw new InvalidOperationException();
                    }
    
                    OnFieldIsNotDefault();
                }
            }
    
            protected void OnFieldIsNotDefault()
            {
                FieldIsNotDefault?.Invoke(this, EventArgs.Empty);
            }
        }
    
        public class TestModel : ModelBase
        {
            private string _name;
            private int _value;
    
            public string Name
            {
                get { return _name; }
                set
                {
                    AssertIsNotNull(_name);
                    _name = value;
    
                }
            }
    
            public int Value
            {
                get { return _value; }
                set
                {
                    AssertIsNotDefault(_value);
                    _value = value;
                }
            }
    
            public TestModel()
                : base(false)
            {
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var test = new TestModel();
                test.FieldIsNotDefault += OnFieldIsNotDefault;
                test.Name = "test name";
                test.Value = 1;
    
                try
                {
                    test.Name = "new name";
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                try
                {
                    test.Value = 5;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                test.FieldIsNotDefault -= OnFieldIsNotDefault;
                Display(test);
            }
    
            private static void OnFieldIsNotDefault(object sender, EventArgs e)
            {
                Console.WriteLine("Поле уже установлено");
            }
    
            static void Display(TestModel model)
            {
                Console.WriteLine(
                    $"{nameof(model.Name)} == {model.Name}; {nameof(model.Value)} == {model.Value};");
            }
        }
    }
    Ответ написан
    Комментировать
  • Как отловить момент, когда окно помещается в одну из сторон экрана (прилипает как бы), при нажатии WIN + LEFT?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Вот решение проблемы с максимизацией окна
    blogs.msdn.com/b/llobo/archive/2006/08/01/maximizi...

    Но в конкретно этом примере есть проблема, там сбрасывается минимальный размер окна. Его тоже нужно задавать.
    Ответ написан
    Комментировать