Задать вопрос
Ответы пользователя по тегу C++
  • Олимпиадное программирование с чего начать?

    manul
    @manul
    Просто пиши на C++ что нибудь интересное для себя, попутно читая про непонятные для тебя вещи.
    Ответ написан
    Комментировать
  • C++ Разработчики под Windows - почему их становится все меньше?

    manul
    @manul
    Хомячкам всегда более по душе грызть мягкое, чем твердое.
    Вот они и беруться за решетки, джаваскрипты, пых - делаем окошки мышкой, ура!
    Ответ написан
    Комментировать
  • Почему программисты не любят возврат константных ссылок в C++?

    manul
    @manul
    Дело в том что если вы вернете константную ссылку на поле - само поле от этого не станет константным. А всё это очень хорошо приводится к обычному указателю, после чего можно менять значение поля.
    Ответ написан
    Комментировать
  • Почему не подключается библиотека DLL к проекту Visual Studio C++?

    manul
    @manul
    Итак, допустим у нас есть динамическая библиотека MyDLL.dll c следующим кодом
    #include <windows.h>
    
    int __declspec(dllexport) MyDLLSqr(const int n) {
        return n*n;
    }
    
    extern "C" bool __declspec(dllexport)
    DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
        return true;
    }


    И наш проект с MyDLL.dll и файлом main.cpp и следующим кодом:
    #include <iostream>
    
    extern "C" void __declspec(dllimport) MyDLLSqr (const int);
    
    int main() {
        std::cout<< MyDLLSqr(4); // 4
    }


    Вот так примерно всё работает.
    А как вы подключали DLL ?

    Скорее всего в отсутствующем файле DLL.h было что то вроде

    #pragma once
    
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
    
    extern "C" void DLL_EXPORT MyDLLSqr (const int);


    Для удобства использования объявленных в вашей DLL функций
    Ответ написан
    Комментировать
  • Лучший вариант проверки ввода на несколько условий в C++?

    manul
    @manul
    Знаете что плохо в вашем варианте?
    То, что несмотря на присутствие continue, вы оставляете эти ужасные else if.

    Можно попробовать так:
    int x;
    while (cin>>x) {
        if (x < 0) {
            cout<<"x должно быть положительным числом"<<endl;
            continue;
        }
        if ( !x ) {
            cout<<"x не должно равняться нулю"<<endl;
            continue;
        } 
        if (x == 5) {
            cout<<"x не должно равняться пяти"<<endl;
            continue;
        }
        break;
    }
    Ответ написан
    Комментировать
  • Возможна ли работа с двумя бинарными файлами одновременно в С++?

    manul
    @manul
    Не нужно использовать сишные либы вперемешку с STL.
    Я говорю про fopen и cin /cout .
    Ответ написан
    Комментировать
  • Как правильно видоизменить код?

    manul
    @manul
    std::string buffer;
    std::getline (std::cin, buffer); // Линия с консоли с пробелами и всем прочим
    Ответ написан
    Комментировать
  • Как считывать данные с текствого файла С++?

    manul
    @manul
    #include<iostream>
    #include<fstream>
    
    int main() {
        std::ifstream textFile ("MyFile.txt");
        std::string buffer;
        while ( std::getline( textFile, buffer ) ) {
            std::cout<< buffer <<std::endl;
        }
    }


    Самый нормальный способ - считывать по строке.
    Ответ написан
    Комментировать
  • Имеет ли смысл начинать с Си?

    manul
    @manul
    Имеет. Синтаксис C и C++ положен в основу всех Си подобных языков - а это C#, Java, тот же Go отчасти.
    Ответ написан
    Комментировать
  • Что изучать C# или С++?

    manul
    @manul
    C# не то что бы легче, просто язык многое делает неявно за тебя, многие вещи сложны внутри, но простые для использования.
    C# усваивается легче, идет сразу с библиотеками почти на все случаи жизни.

    C++ вываливает всю сложность на пользователя, нужно самому разбираться.
    C++ гибче как его освоишь, но пока освоишь пройдет немало времени.

    Понимание C++ дает лучшее понимание как устроена та или иная фишка из C#.

    Вот пример "неявности" C#:
    struct StackWork {  
            public Int32 Value;
        }
    
       class HeapWork {
           public Int32 Value;
       }
       
       // ...
       StackWork sw1 = new StackWork();
       StackWork sw2 = sw1;
       sw2.Value = 475;
      
       Console.WriteLine( sw1.Value.ToString() ); // 0
       
       // ...
       HeapWork hw1 = new HeapWork();
       HeapWork hw2 = hw1;
       hw2.Value = 475;
    
       Console.WriteLine( hw1.Value.ToString() ); // 475


    То есть, область выделяемой под обьект памяти (куча или стек) зависит от типа, причем при одинаковом синтаксисе ( "new TypeName()" ).
    Конечно, это сделано для удобства, но в C# ты не можешь выбирать в какой области памяти разместить свой обьект!

    А вот пример на "страшных и неинтуитивных плюсах":
    struct MyWork {  
            int Value = 0;
        }
        
       //...
       // Явно, выделяем память в стеке
       MyWork sw1;
       MyWork sw2 = sw1;
       sw2.Value = 475;
       
       cout << sw1.Value; // Как и ожидалось, 0
       
       // Явно, выделяем память в куче
       MyWork * h1 = new MyWork;
       MyWork *h2 = h1;
       hw2 -> Value = 475;
       
       cout << hw1 -> Value; // Как и ожидалось, 475


    Интересные вещи есть и там и там.
    Для бизнеса конечно выгоднее C# (никаких заморочек, поддержка, библиотеки).
    Но все же C++ интереснее для саморазвития.
    Ответ написан
  • Как сравнивать и прибавлять строки в "C"?

    manul
    @manul
    А может быть это C++? ...точечку после stringOne пробовали ставить?
    Ответ написан
    3 комментария
  • Почему в функцию передаётся только первый элемент массива?

    manul
    @manul
    Ну, в плюсах массивы не передаются по значению. Всегда передается указатель на массив, будь то массив или даже матрица. А если точнее, то указатель на первый элемент. Это наследие Си, где массивы тесно связанны с указателями. Помимо прочего благодаря этой особенности лишний раз не выделяется память в стеке - при передаче аргументов.
    void anyFunc(int myArray[]) в таком случае просто удобный синтаксис что бы показать, что передается именно указатель на массив, void anyFunc(int *myArray) тоже самое.
    Можно, как рекомендует в таких случаях Страуструп определить структуру хранящую указатель на массив и его размер и принимать ее в функции.

    struct Arr{ 
        int *arrPtr;
        int Size;
    }
    
    void print_array(const Arr &arr){ ... }

    И вызов вашей функции сведется к такому действию:
    print_array( { my_array, sizeof(my_array) / sizeof(int) } );


    Но лучше всего использовать std::vector везде где нет ограничений по памяти.
    Ответ написан
  • C++ (MinGW) Как решить проблему со слишком большим целочисленным числом?

    manul
    @manul
    Хранить его в std::string, очевидно же
    Ответ написан
    Комментировать
  • Что по советуете подростку в программировании?

    manul
    @manul
    Не слушай весь гон что тебе сказали выше!!! Не вздумай начинать с Delphi, Java или C#!
    Ибо выучив их ты больше не сможешь развиваться.
    Учи C++!!!
    С нуля. Можешь для начала почитать Прата - разжевывает для всех, его даже хомяки понимают.
    Освоившись в плюсах ты с легкостью сможешь выучить и C# и Java!
    Ответ написан
  • Какую книгу по С++ выбрать?

    manul
    @manul
    "C++ священные знания" Стивен Дьюрхест - лучшая книга по плюсам из всех что я знаю
    Ответ написан
    Комментировать