Ответы пользователя по тегу C
  • Си записать значение по ссылке на ссылку?

    tsarevfs
    @tsarevfs
    C++ developer
    Мне показалось, вы пытаетесь изобрести указатель на указатель. Такие конструкции поддерживаются языком:
    int *i = NULL; //указатель на ячейку типа int
    int **pi = &i; //указатель на указатель на int
    
    int *a = (int *)malloc(sizeof(int)); создаем саму ячейку
    *a = 10; // записываем в нее значение
    
    *pi = a;//теперь i и a указывают на число 10
    
    free(a); //ячейка помечена как свободная. i и a ссылаются на "мусор"
    Ответ написан
    Комментировать
  • Генерация с помощью комбинаций массива определенной длины из элементов с типом массив символов?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Можно так.
    Ответ написан
    Комментировать
  • Какой может быть максимальный размер двусвязного списка в С?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Элемент списка должен содержать 2 указателя (на предыдущий и следующий элемент) и саму полезную информацию, которую вы там хотите хранить. Для 64 битной машины 2 * 8 + k байт, где k - размер пользовательских данных. Если доступно N байт памяти (не обязательно оперативной в общем случае) то получаем не более N / (16 + k) записей.
    Ответ написан
    2 комментария
  • Float в C, 0.41 на самом деле 0.40999?

    tsarevfs
    @tsarevfs
    C++ developer
    Число хранится в двоичной форме. Почитайте вики для начала.
    Ответ написан
    4 комментария
  • О нюансах работы со строками и массивами в C

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    За вас память в си никто не выделяет.
    Цитата отсюда:
    To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.
    Ответ написан
    1 комментарий
  • Как создать консольный терминал на C++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    @grigorkh
    не используйте reinterpret_cast без крайней необходимости.

    предлагаю создать интерфейс и реализовать для каждой команды:
    class command_t
    {
    public:
    	virtual void apply(std::vector< std::string > const &args) = 0;
    	virtual std::string get_help() = 0;
    };
    
    class add_command_t : command_t
    {
    public:
    	void apply(std::vector< std::string > const &args)
    	{
    		int ans = atoi(args[1].c_str()) + atoi(args[2].c_str());
    		std::cout << ans;
    	}
    
    	std::string get_help()
    	{
    		return "add arg1 arg2\n";
    	}
    };
    
    //аналогично mul_command и.т.д


    Затем запихнуть экземпляры вместо функций в map.
    typedef std::map< std::wstring, command_t * > command_map_t;
    typedef command_map_t::iterator command_iter;
    
    //////////////////////////////////////////
    
    command_map_t commands;
    commands['add'] = new add_command_t();
    //...
    
    while (true)
    {
    	std::string x;
    	std::getline(cin, x);
    	std::vector< std::string > words = split(x); //напиши split сам
    
    	command_iter iter = commands.find(words[0]); 
    	if (iter != commands.end()) //если такая команда есть
    	{
    		iter->apply(words);
    	}
    	else
    	{
    		std::cout << "Wrong command!\n";
    	}
    }


    Так ты сможешь реализовать команды не только с 2 int-овыми параметрами. В конструктор help_command можно передать указатель на commands и в зависимости от аргументов выдавать справку по всем командам, или по конкретной указанной.
    Не забудь почистить память в конце.
    Ответ написан
    Комментировать
  • Как создать консольный терминал на C++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Ладно, @grigorkh, ты меня рассмешил.
    Сначала нужно научиться писать хоть что-то работающее. Вот
    так вы можете создать свою первую программу.
    Далее возьмите книжку по C++, Эккель подойдет. Читайте, напишите хотя бы 5-10 упражнений на строки, ввод-вывод, циклы, if.
    Теперь вы готовы приступить к выполнению вашего задания.
    В цикле (а этому моменту вы уже знаете что это такое) вы считываете команды по одной до тех пор пока не введена команда exit.
    Пусть каждая команда это строка, первое слово в которой - имя действия, остальные - аргументы. Научитесь разбивать строчку на слова. Дальше разбираете какая команда введена и формируете требуемый ответ. В итоге получится что-то такое:
    #include <iostream>
    #include <string>
    
    main ()
    {
    	while (true) 
    	{
    		std::string command;
    		std::getline (std::cin, command); 
    
    		if (command = "exit")
    			break;
    
    		std::vector<std::string> words = разбить_на_слова(command)
    
    		if (words[0] == "help")
    		{
    			std::cout << "plus arg1 arg2\nminus arg1 arg2"
    		}
    
    		if (words[0] == "plus")
    		{
    			std::cout << строка_в_число(words[1]) + строка_в_число(words[2]);
    		}
    
    		// дальше аналогично(или не очень) разобрать остальные команды
    	}
    
      return 0;
    }


    У такого кода будет много недостатков, например новые команды не очень удобно добавлять. Да и 2 + 2 * 2 ему не понять. Но до этого еще очень далеко.

    И научитесь пользоваться гуглом. Там есть ответы на 99.99% вопросов которые у вас возникнут в ближайшее несколько месяцев изучения программирования.
    Ответ написан
    2 комментария