LINUX.ORG.RU

Как правильно написать функцию?

 ,


0

3

Пишу простенький редактор кода. В функцию Init() передаю три указателя на структуры.

int main(int agrc, char* argv[]) {

	//initialisation
	SDL_Init(SDL_INIT_EVERYTHING);
	TTF_Init();

	SDL_Window* window;
	SDL_Renderer* renderer;
	MyWindow* myWindow;

	Init(window, renderer, myWindow);

	std::vector<std::string> settings = LoadSettings();
	std::vector<ButtonWithLabel> menu_bar = LoadMenu();

	while (!myWindow->_exit) {
		Draw(window, renderer, myWindow);
		Input(window, renderer, myWindow);
	}

	return 0;
}

Функция Init():

void Init(SDL_Window* window,
	SDL_Renderer* renderer,
	MyWindow* myWindow) {

	float dpi;

	SDL_GetDisplayDPI(0, &dpi, &dpi, &dpi);

	float coefficient = 128 / dpi;
	
	SDL_DisplayMode dm;

	SDL_GetDisplayMode(0, 0, &dm);

	window = SDL_CreateWindow("F*ckThisIDE",
		SDL_WINDOWPOS_CENTERED,
		SDL_WINDOWPOS_CENTERED,
		dm.w * 0.4, 
		dm.h * 0.4,
		SDL_WINDOW_RESIZABLE);

	renderer = SDL_CreateRenderer(window, 1,
		SDL_RENDERER_PRESENTVSYNC);

	myWindow = CreateMyWindow(CreateEditor(), coefficient);
}

В функции Init() структур имеют значения, но после выхода из неё, они удаляются. Как сделать, чтобы значения структур остались в куче?

Лол :-) Поменяй сигнатуру Init вот так:

Init(SDL_Window** window,
	SDL_Renderer** renderer,
	MyWindow** myWindow);

Соответственно, вызов будет таким:

SDL_Window* window;
SDL_Renderer* renderer;
MyWindow* myWindow;

Init(&window, &renderer, &myWindow);

Остальное переделаешь в качестве домашнего задания :-) Лол :-)

anonymous
()
Ответ на: комментарий от GooseDB

Раз уж все-равно плюсы, то и добавлять лучше ссылку, а не указатель — не придется при вызове добавлять взятие адреса &.

bormant ★★★★★
()
Ответ на: комментарий от aandrew002

на SDL жеж... не выходя из редактора можно будет дум погонять...

anonymous2 ★★★★★
()
Ответ на: комментарий от bormant

Раз уж все-равно плюсы, то и добавлять лучше ссылку, а не указатель — не придется при вызове добавлять взятие адреса &

Сколь же вас таких умников, после которых приходится иметь дело с мочекодом, от которого приходится заплёвывать несчастный монитор от отвращения :-) Какая ссылка тут, родненький? :-) Чтобы читатель потом думал, что туда передаётся указатель, который рассматривается как in-параметр? :-) Взятие адреса уже намекает читающему код, что параметр будет out :-) Иди учись писать понятный код, а не сыпать ссылками «потому что в цепепе для вас дедушка Бьярн открыл ссылки» :-)

anonymous
()
Ответ на: комментарий от anonymous

поддерживаю анонима, для выходных параметров лучше использовать указатели, а не ссылки. Следовать так сказать заветам Google...

warning: non-const reference parameter 'name', make it const or use a pointer [google-runtime-references]

fsb4000 ★★★★★
()

Пиши [ code=c++] ... [ /code], а то сложно читать

BceM_IIpuBeT ★★☆☆☆
()
Последнее исправление: BceM_IIpuBeT (всего исправлений: 5)
Ответ на: комментарий от fsb4000

Следовать так сказать заветам Google...

Об этом ещё сам Бьерн Страуструп говорил в своей TC++PL 3rd edition без Google :-) Лол :-)

anonymous
()
Ответ на: комментарий от aandrew002

А нормальных — нет. Вся надежда на xi.

anonymous
()
Ответ на: комментарий от bormant

Иди учись декларации читать, ванга хренова.

Ты меня будешь отсылать учиться читать декларации? :-) Лол :-) Ты чего хочешь, чтобы я тебе написать портянку про безвкусицу или про плохой стиль? :-) Зачем ты мне на справедливое замечание отвечаешь отсылкой к каким-то там декларациям? :-) Ну и чего ты мелочишься? :-) Ты предложи читать уже всю реализацию, чтобы твои побочные эффекты ещё понимать :-) Иди хоть Страуструпа почитай, прежде чем мне, эксперту по цепепе что-то там указывать :-) Лол :-)

anonymous
()
Ответ на: комментарий от fsb4000

поддерживаю анонима,

Надо же, у смайлодауна появился последователь из регистрантов. Верной дорогой, дрогой товарисчь...

Следовать так сказать заветам Google...

В Google работает такое количество неосиляторов, что им пришлось свой Go запилить, чтобы хоть в Go тамошние разработчики себе ноги не отстреливали.

Если уж советовать что-то нормальное ТС-у, так это вообще уйти от использования out-параметров в сторону возвращаемого значения. Хотя бы до такого уровня:

struct InitializationResult {
  SDL_Window * window_{nullptr};
  SDL_Renderer * renderer_{nullptr};
  MyWindow * myWindow_{nullptr};
};

InitializationResult Init() {
  InitializationResult result;
  ...
  return result;
}

int main(int agrc, char* argv[]) {

	//initialisation
	SDL_Init(SDL_INIT_EVERYTHING);
	TTF_Init();

	auto init_result = Init();
	...
}

А еще лучше сразу сделать RAII-обертки для SDL-ных ресурсов и окон. И тип InitializationResult сделать с их помощью, да еще и noncopyable, но moveable.

eao197 ★★★★★
()
Ответ на: комментарий от PPP328

Да, есть. Это clang-tidy.

У меня включены как-то так

P.S. Я в Posix Shell вообще плох, возможно скрипт можно написать лучше, но вроде работает, и не выдаёт ошибок если проект только на С и не найдены .cpp файлы, или только на С++ и не найдены .c файлы

CPP_FILES=`find src/*.cpp -printf x 2> /dev/null | wc -c`
C_FILES=`find src/*.c -printf x 2> /dev/null | wc -c`

if [ $CPP_FILES -gt 0 ]; then
    clang-tidy  -checks=* src/*.cpp -- -std=c++1z -I"include" -I"3rd"  >> report.txt;
fi

if [ $C_FILES -gt 0 ]; then
    clang-tidy  -checks=* src/*.c -- -std=c11 -I"include" -I"3rd"  >> report.txt;
fi

fsb4000 ★★★★★
()
Ответ на: комментарий от eao197

Надо же, у смайлодауна появился последователь из регистрантов. Верной дорогой, дрогой товарисчь...

Женька, из того, какую ты несёшь ахинею про CMake можно сделать вывод, что эксперт из тебя так себе :-) До моего уровня тебе ещё далеко, несмотря на твой великий опыт :-)

Вот что ты тут понасоветовал :-) Ну создал ты структурку, ну возвратил :-) Тебя что-ли ТС об этом просил? :-) Нет, не просил :-) Т.е. ты даже не читаешь того, о чём спрашивают :-) Цель твоего ответа показать какой ты крутой RAII-мастер, эксперт цепепе 80-го уровня :-) Но со стороны это выглядит смешно :-) Иди лучше CMake учи, разбирайся в этой отличной системе сборки, до которой всяким недоразумениям типа сконса или твоего mxx как до Парижа пешком :-) Лол :-)

anonymous
()

Судя по твоим постам, с C++ ты пока даже не на «вы», а на «ваша милость». Может, стоит начать с “Hello world”?

Miguel ★★★★★
()
Ответ на: комментарий от eao197

В Google работает такое количество неосиляторов, что им пришлось свой Go запилить, чтобы хоть в Go тамошние разработчики себе ноги не отстреливали.

Зато в твоей конторке работают сплошь одни осиляторы :-) Куда уж там Google с их Go :-) Лол :-)

anonymous
()
Ответ на: комментарий от BruteForce

man CCG

Щёки сильно раздувать не надо :-) А то сразу видно выскочку, который бросается ссылками на гайдлайны того, чьи книги не читал :-) Ещё раз посылаю почитать Страуструпа TC++PL 3rd edition, глава 5.5:

The increment(x) notation doesn’t give a clue to the reader that x x’s value is being modified, the way x=next(x) and incr(&x) does. (C)

Понятно, что цепепе даже тут на фоне чистого Си является языком, в котором лишь одни противоречия :-) Годами адепты обсуждают ссылки против указателей, подчёркивания против камель-кейса и т.д. :-) И как видно, адептам нравится казаться умными и знающими профессионалами, сыпать ссылками на гайдлайны :-) Но даже книги за авторством автора их любимого язычка, переполненного противоречиями на пустом месте, они не осиливают прочитать :-) Да что там книги, даже те же гайдлайны, наверняка, тоже не знают :-)

Нет, вряд ли у цепепе есть шанс на будущее :-) Учите другой язык, этот не знает никто :-) Лол :-)

anonymous
()
Ответ на: комментарий от fsb4000

Названия было достаточно. Спасибо большое.

PPP328 ★★★★★
()
Ответ на: комментарий от anonymous

Но даже книги за авторством автора их любимого язычка, переполненного противоречиями на пустом месте, они не осиливают прочитать :-) Да что там книги, даже те же гайдлайны, наверняка, тоже не знают :-)

Я не кресто-фанат. Просто деньги зарабатываю.

Понятно, что цепепе даже тут на фоне чистого Си является языком, в котором лишь одни противоречия :-) Годами адепты обсуждают ссылки против указателей, подчёркивания против камель-кейса и т.д. :-)

Да.

И как видно, адептам нравится казаться умными и знающими профессионалами, сыпать ссылками на гайдлайны :-)

Не шарю в крестах, «профессионалом» или знатоком крестов не являюсь. Тема гайдлайнов мне нравится, с тем, что в ссылке согласен, расшариваю для ТС бесплатно.

Если `man CCG` было воспринято как «ха-ха, вот вы лошье, не знаете такого простого» — прошу прощения, не пытался показаться умником или выскочкой.

BruteForce ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.