Loading...
Smeshan avatar Smeshan 89 Точки

Премахване на глобалните променливи [hello_world project]

Привет,

аз съм малко назад все още. Това което се случва е, че прозорец излиза, но картинката не зарежда.

smeshan@ubuntu:~/workspace/HelloWorld/build$ ./hello_world 
SDL_BlitSurface() failed. Reason: SDL_UpperBlit: passed a NULL surface
SDL_UpdateWindowSurface() failed. Reason: Invalid window

След  if (globalScreenSurface == nullptr) в init() ми излиза адрес на пойнтъра, но веднага щом се върна в main пак става nullptr. Дори пробвах да сменя hello.bmp с bmp1 и там пропусна да отбележи грешка. Също ако пък е верен файла, получавам адрес, но връщайки се от loadResources() веднагa globalImage става nullptr. Така че предполагам е нещо по-основно и свързано с премахването на глобалните променливи.

Ето файлове:
main.cpp
CMakeLists.txt

Благодаря предварително,
Илиян

Тагове:
0
C++ Applications Development 12/10/2021 17:20:44
Smeshan avatar Smeshan 89 Точки

Ех, знаех си, че ще е някоя рефенция, но не посмях да пробвам, защото наистина ми изглеждаше странно. Та гледах втоарата част и ми стана ясно :)

0
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Илиян,

Радвам се, че си си намерил грешката.
Приятно е да работиш само с референции, а не с пойнтъри, защото наистина улесняват живота.
Когато обаче работим със С библиотека няма как да работим с референции, защото в С няма такива.

С течение на курса ще успеем да изградим С++ wrapper на библиотеката, който ще реши горния проблем.
Разбира се, това не значи, че един С++ програмист не трябва да работи с пойнтъри.

Пойнтърите са си обикновенни integer данни (size_t).
Щом подаваш пойнтър на функция - ти правиш копие на този пойнтър и имаш достъп до оригиналната памет под този пойнтър.
Когато обаче имаш нужда да модифицираш самия пойнтър трябва и него да предадеш по референция.
От там идва и "странният" синтаксис
void foo(int*& arr)
Което се чете референция към integer пойнтър.

Поздрави

2
13/10/2021 11:34:01
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.