Задать вопрос
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Wataru, извините неправильно понял. Да помогло большое спасибо.
    Сделал с sizeof /sizeof возвращает шестнадцатиричное значение
    Сделал list.size тоже 16ричное значения
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Wataru, написал как ты сказал
    std::vector<std::string> Config::list[]
    Библиотеку vector я подключил
    После повылазило 6 ошибок:
    1) слишком много инициализаторов в list
    2) инициализация: невозможно преобразовать "const char[13]" в "
    std::vector<std::string,std::allocator<std::string>>
    "
    3) бинарный "=": не найден оператор, принимающий правый операнд типа "
    std::vector<std::string,std::allocator<std::string>>
    " (или приемлемое преобразование отсутствует). В функции rewrite строчка value = list[a];
    4) бинарный "<<": не найден оператор, принимающий правый операнд типа "
    std::vector<std::string,std::allocator<std::string>>
    " (или приемлемое преобразование отсутствует). В функции update строчка w_config << list[a] << std::endl;
    5) функция "substr": не является членом "
    std::vector<std::string,std::allocator<std::string>>
    ". В функции rewrite строчка str = list[a].substr(0, list[a].find_first_of(' '));
    6) "find_first_of": не является членом "
    std::vector<std::string,std::allocator<std::string>>
    " та же строчка что в предыдущем пункте
  • Как бы вы сделали текстурную наточенность на катане(или другом любом предмете?)?

    @Acaunt
    Вы меня можете назвать душнилой, но я просто так не могу. Данная волнистая линия это не заточка (никто не станет точить клинок криво) - это называется Хамон, видимая линия зонной закалки. На не острую поверхность клинка наносится специальная смесь глины, позволяя добиться разных температу закалки на поверхности метала. После закалки может остаться данный след его лучше можно будет получить после травления.
    А как это реализовать на модели у меня в голову приходит только то что в блендере в шейдерах подключить микс РГБ где основной цвет текстуры идёт и сам Хамон который можно сделать с помощью процедурной текстуры волны и поиграться с цветом и масштабом
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Wataru, mayton2019, я переписал много функций. Добавил функцию перезаписи параметра, немного усовершенствовал инициализацию, и упростил систему поиска значений, перенёс все значения параметров в массив строк. И самое важное теперь каждый раз, когда возвращается неправильное значение переписывается только строчка с данным значением (я так и не понял как можно использовать std::optional<int> о которых вы писали, но мне кажется это уже не так важно. В моём коде меня только смущает функция получения количества переменных lot_list() так как она может вызываться несколько раз если несколько переменых неправильных. Я пробовал использовать sizeof(list)/sizeof(list[0]) но компилятор выдает ошибку: std::string []: недопустимый оператор sizeof.
    Вот код:
    Класс:
    #ifndef CONFIG_H_
    #define CONFIG_H_
    
    #include <string>
    
    class Config {
    private:
    	static const int lot_list();
    	static std::string list[];
    	static void update();
    public:
    	static int initialize();
    	static void rewrite(std::string parametr, std::string value = "");
    	static std::string search_str(std::string parametr);
    	static int search_int(std::string parametr);
    	static bool search_bool(std::string parametr);
    };
    
    #endif /* CONFIG_H_ */

    Функции:
    #include "Config.h"
    
    #include <iostream>
    #include <fstream>
    
    std::ofstream w_config;
    std::ifstream r_config;
    
    const int Config::lot_list() {
    	int i = 0;
    	while (!list[i].empty()) {
    		++i;
    	}
    	return i;
    }
    
    std::string Config::list[]{
    	"title = NAME",
    	"window_mode = 0",
    	"width = 800",
    	"hight = 600"
    };
    
    void Config::update() {
    	std::cout << "Create file Config.ini" << std::endl;
    	w_config.open("Config.ini");
    	for (int a = 0; a < lot_list(); a++) {
    		w_config << list[a] << std::endl;
    	}
    	w_config.close();
    }
    
    int Config::initialize() {
    	r_config.open("Config.ini");
    	if (!r_config.is_open()) {
    		r_config.close();
    		std::cout << "Have not file Config.ini" << std::endl;
    		update();
    		r_config.open("Config.ini");
    	}
    
    	if (!r_config.is_open()) {
    		r_config.close();
    		std::cerr << "Failed open file Config.ini" << std::endl;
    		return -1;
    	}
    	else if (r_config.peek() == EOF) {
    		r_config.close();
    		std::cout << "File Config.ini empty" << std::endl << "Re-";
    		update();
    		r_config.open("Config.ini");
    	}
    
    	if (!r_config.is_open()) {
    		r_config.close();
    		std::cerr << "Failed open file Config.ini" << std::endl;
    		return -1;
    	}
    	else {
    		r_config.close();
    		std::cerr << "Open file Config.ini" << std::endl;
    		return 0;
    	}
    }
    
    void Config::rewrite(std::string parametr, std::string value) {
    	std::cout << "Re-Create file Config.ini" << std::endl;
    	std::string str;
    
    	if (value == "") {
    		for (int a = 0; a < lot_list(); a++) {
    			str = list[a].substr(0, list[a].find_first_of(' '));
    			if (str == parametr) {
    				value = list[a];
    				break;
    			}
    		}
    	}
    	else {
    		value = parametr + " = " + value;
    	}
    
    	bool i = 1;
    	w_config.open("Config_copy.ini");
    	r_config.open("Config.ini");
    	while (!r_config.eof()) {
    		std::getline(r_config, str);
    		if (parametr == str.substr(0, str.find_first_of(' '))) {
    			w_config << value << std::endl;
    			i = 0;
    		}
    		else if (str == "") {}
    		else {
    			w_config << str << std::endl;
    		}
    	}
    	if (i) {
    		w_config << value << std::endl;
    	}
    	w_config.close();
    	r_config.close();
    
    	w_config.open("Config.ini");
    	r_config.open("Config_copy.ini");
    	while (!r_config.eof()) {
    		std::getline(r_config, str);
    		if (str == "") {}
    		else {
    			w_config << str << std::endl;
    		}
    	}
    	w_config.close();
    	r_config.close();
    	std::remove("Config_copy.ini");
    }
    
    std::string Config::search_str(std::string parametr) {
    	std::string str;
    
    	for (int a = 0; a < 2; a++) {
    		r_config.open("Config.ini");
    		std::cout << "Search in file Config.ini -> " << parametr;
    
    		while (!r_config.eof()) {
    			std::getline(r_config, str);
    
    			if (parametr == str.substr(0, str.find_first_of(' '))) {
    				r_config.close();
    				str.erase(0, parametr.length() + 3);
    				break;
    			}
    			else {
    				str = "";
    			}
    		}
    
    		if (str == "") {
    			r_config.close();
    			std::cout << " -> not found" << std::endl;
    			rewrite(parametr);
    		}
    		else {
    			break;
    		}
    	}
    
    	std::cout << " = " << str << std::endl;
    
    	return str;
    }
    
    int Config::search_int(std::string parametr) {
    	std::string int_str = Config::search_str(parametr);
    	char* ch;
    	strtol(int_str.c_str(), &ch, 10);
    
    	if (*ch) {
    		std::cout << "Not the corect value" << std::endl;
    		rewrite(parametr);
    		int_str = search_str(parametr);
    	}
    
    	return stoi(int_str);
    }
    
    bool Config::search_bool(std::string parametr) {
    	std::string bool_str = search_str(parametr);
    
    	if (bool_str == "0") {}
    	else if (bool_str == "1") {}
    	else {
    		std::cout << "Not the corect value" << std::endl;
    		rewrite(parametr);
    		bool_str = search_str(parametr);
    	}
    
    	return stoi(bool_str);
    }
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Wataru, спасибо за совет посмотрю позже как сделать эту проверку
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    mayton2019, в функции serch_str идёт поиск параметра по названию и предполагается что все значения указаны правильны. Я также сделал проверку на тот случай если если необходимо параметра нет в конфиге, он просто пересоздается. А после если вызваны serch_int search _bool будут переобразованы в необходимые типы.
    А делать проверку на то что вернулся не тот тип я как-то не очень хочу. Как мне кажется большая часть пользователей вряд-ли будет залезать в конфиг и менять значения. Позже я допишу пару функций позволяющих переписывать конкретные значения для настройки самой программы во время её использования
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Александр Ананьев, Евгений Петряев, Wataru,
    Спасибо вам всем я бился над этим решением 2 дня и сейчас 31 декабря в 00:05 путем совместных действий ответ был найден. Да я переделал функцию на std::string я пробовал это и раньше просто я не использовал #include string в классе, у меня вылазила ошибка компилятора но после подключения библиотеки ошибка пропала. Ладно всех с наступающим. Пост скриптум я оставлю здесь исправленный код если вдруг кому-то понадобится
    Класс:
    #ifndef CONFIG_H_
    #define CONFIG_H_
    
    #include <string>
    
    class Config {
    private:
    	static void update_config();
    public:
    	static int initialize();
    	static std::string search_str(std::string parametr);
    	static int search_int(std::string parametr);
    	static bool search_bool(std::string parametr);
    };
    
    #endif /* CONFIG_H_ */

    И функции:
    #include "Config.h"
    
    #include <iostream>
    #include <fstream>
    
    std::ofstream w_config;
    std::ifstream r_config;
    
    void Config::update_config() {
    	std::cout << "Create file Config" << std::endl;
    	w_config.open("Config.ini");
    
    	w_config << "title = NAME" << std::endl;
    	w_config << "window_mode = 0" << std::endl;
    	w_config << "width = 800" << std::endl;
    	w_config << "hight = 600" << std::endl;
    
    	w_config.close();
    }
    
    int Config::initialize() {
    	r_config.open("Config.ini");
    	if (!r_config.is_open()) {
    		std::cout << "Have not file Config.ini" << std::endl;
    		r_config.close();
    		update_config();
    		r_config.open("Config.ini");
    	}
    
    	if (!r_config.is_open()) {
    		std::cerr << "Failed open file Config.ini" << std::endl;
    		r_config.close();
    		return -1;
    	}
    
    	else {
    		std::cout << "Open file Config.ini" << std::endl;
    		r_config.close();
    		return 0;
    	}
    }
    
    std::string Config::search_str(std::string parametr) {
    	std::string str;
    	for (int a = 0; a < 2; a++) {
    		r_config.open("Config.ini");
    		std::cout << "Search in file Config.ini -> " << parametr;
    
    		while (!r_config.eof()) {
    			r_config >> str;
    			if (parametr == str) {
    				std::getline(r_config, str);
    				r_config.close();
    				str.erase(0, 3);
    				a = 2;
    				break;
    			}
    			else {
    				str = "";
    			}
    		}
    
    		if (str == "") {
    			r_config.close();
    			std::cout << " -> not found" << std::endl;
    			std::cout << "Re-";
    			update_config();
    		}
    	}
    
    	std::cout << " = " << str << std::endl;
    
    	return str;
    }
    
    int Config::search_int(std::string parametr) {
    	return stoi(search_str(parametr));
    }
    
    bool Config::search_bool(std::string parametr) {
    	return stoi(search_str(parametr));
    }
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Александр Ананьев, Евгений Петряев, Wataru,
    Спасибо вам всем я бился над этим решением 2 дня и сейчас 31 декабря в 00:05 путем совместных действий ответ был найден. Да я переделал функцию на std::string я пробовал это и раньше просто я не использовал #include string в классе, у меня вылазила ошибка компилятора но после подключения библиотеки ошибка пропала. Ладно всех с наступающим. Пост скриптум я оставлю здесь исправленный код если вдруг кому-то понадобится
    Класс:
    #ifndef CONFIG_H_
    #define CONFIG_H_
    
    #include <string>
    
    class Config {
    private:
    	static void update_config();
    public:
    	static int initialize();
    	static std::string search_str(std::string parametr);
    	static int search_int(std::string parametr);
    	static bool search_bool(std::string parametr);
    };
    
    #endif /* CONFIG_H_ */

    И функции:
    #include "Config.h"
    
    #include <iostream>
    #include <fstream>
    
    std::ofstream w_config;
    std::ifstream r_config;
    
    void Config::update_config() {
    	std::cout << "Create file Config" << std::endl;
    	w_config.open("Config.ini");
    
    	w_config << "title = NAME" << std::endl;
    	w_config << "window_mode = 0" << std::endl;
    	w_config << "width = 800" << std::endl;
    	w_config << "hight = 600" << std::endl;
    
    	w_config.close();
    }
    
    int Config::initialize() {
    	r_config.open("Config.ini");
    	if (!r_config.is_open()) {
    		std::cout << "Have not file Config.ini" << std::endl;
    		r_config.close();
    		update_config();
    		r_config.open("Config.ini");
    	}
    
    	if (!r_config.is_open()) {
    		std::cerr << "Failed open file Config.ini" << std::endl;
    		r_config.close();
    		return -1;
    	}
    
    	else {
    		std::cout << "Open file Config.ini" << std::endl;
    		r_config.close();
    		return 0;
    	}
    }
    
    std::string Config::search_str(std::string parametr) {
    	std::string str;
    	for (int a = 0; a < 2; a++) {
    		r_config.open("Config.ini");
    		std::cout << "Search in file Config.ini -> " << parametr;
    
    		while (!r_config.eof()) {
    			r_config >> str;
    			if (parametr == str) {
    				std::getline(r_config, str);
    				r_config.close();
    				str.erase(0, 3);
    				a = 2;
    				break;
    			}
    			else {
    				str = "";
    			}
    		}
    
    		if (str == "") {
    			r_config.close();
    			std::cout << " -> not found" << std::endl;
    			std::cout << "Re-";
    			update_config();
    		}
    	}
    
    	std::cout << " = " << str << std::endl;
    
    	return str;
    }
    
    int Config::search_int(std::string parametr) {
    	return stoi(search_str(parametr));
    }
    
    bool Config::search_bool(std::string parametr) {
    	return stoi(search_str(parametr));
    }
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Евгений Петряев, если вы имеете ввиду что вместо const char* search сделать std::string search то мне нужно возвращать именно const char* это нужно для библиотеки glfw для передачи в функцию создания окна
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Александр Ананьев, написал return str;
    Компилятор пишет: не существует подходящей функции преобразования из "std::string" в "const char*"
  • Почему Config::search у меня возвращает мусор?

    @Acaunt Автор вопроса
    Александр Ананьев, поверьте я пробовал у меня компилятор ругается говорит что нельзя возвращать std::string.