Професионална програма
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 372 Точки

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

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

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

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

Поздрави

2
13/10/2021 11:34:01