Słowo jako argument funkcji

0

Witam

Mój problem nie należy do trudnych ponieważ to podstawy, otóż piszę prostą funkcję ładującą obraz

 
void texture_load(char *name, char *path) {
SDL_Surface* name = NULL;
name = IMG_Load(path);
}

int main(int argc, char *args[])
{
...
texture_load(image, "materials/lighter.png");
...
}

Po trwającej pewien czas walce z typem argumentu pozostałem przy "char *" i wydaje mi się że to poprawne wyjście lecz program nadal się nie kompiluje, a ja otrzymuję dwa errory:

declaration of 'SDL_Surface* name' shadows a parameter
'image' was not declared in this scope

Podejrzewam że drugi error jest następstwem pierwszego, ale z tym pierwszym nie mam pojęcia jak sobie poradzić, jak dotąd pisałem proste programy w LUA, a tam wszystko wyglądało trochę inaczej.

dodanie znacznika <code> - @furious programming

1
SDL_Surface *texture_load(const std::string &path){ return IMG_Load(path.c_str()); }

To co robisz nie ma sensu.

Jedynie drugi problem to błąd jako taki. Nigdzie nie zadeklarowałeś zmiennej o nazwie "image". Kompilator jasno wszystko mówi.

0
SDL_Surface *texture_load(const std::string &path){ return IMG_Load(path.c_str()); }

Nie do końca rozumiem czemu odniosłeś się do 'path', skoro kompilator mówi o argumencie 'name', również nadal nie rozumiem w czym tkwi problem i czemu to co próbuję zrobić jest bez sensu, ponieważ starałem się pisać analogicznie do tutoriali (z tym że one wszystkie bazowały o liczby).

Sprawdziłem czy funkcja sama w sobie działa i jak się okazało wszystko jest w miarę ok, tak też teraz całkowicie zgłupiałem ponieważ konsola wyświetla poprawne dane, a kompilator nadal widzi błąd.


void texture_load(char *name, string const&path) {
//SDL_Surface* name;
cout<<name<<endl; 
cout<<path<<endl;
//name = IMG_Load(path);
} 

int main(int argc, char *args[])
{
...
texture_load("image", "materials/lighter.png"); //poprawione
...
}

I dzięki za szybką odpowiedź.

1

W funkcji texture_load masz parametr o nazwie name i zmienną lokalną o nazwie name.

1
Back2k napisał(a):

[..]

void texture_load(char *name, string const&path) {
//-->SDL_Surface* name; <--
cout<<name<<endl; 
cout<<path<<endl;
//--> name = IMG_Load(path); <--
}

[..]

Wcześniej nie użyłeś literału. image nie przejedzie, "image" tak
Przykrywanie nazw. Zmień nazwę tego surfejsa.

0

Nie jestem pewien czy zrozumieliśmy się nawzajem, otóż właśnie parametr i zmienna są takie same ponieważ chciałbym aby sobie odpowiadały, dokładniej mówiąc, jeśli wywołuję tę funkcję i piszę texture_load("image", "materials/lighter.png") to oczekuję że zostanie stworzona struktura SDL_Surface o nazwie image i automatycznie to image (czyli zmienna name) zostanie przypisana dalej do IMG_Load. Dlatego też zmienianie nazw czy fakt że istnieje zmienna i parametr o tej samej nazwie jest zamierzonym działaniem. Przepraszam za brak zrozumienia, czasem pomału łapię niektóre rzeczy.

4

Dlatego też zmienianie nazw czy fakt że istnieje zmienna i parametr o tej samej nazwie jest zamierzonym działaniem

Nie możesz mieć konfliktu nazw.

int foo(int a) {
 int a;

 return a; // o jakie "a" chodzi?
}
0

Dzięki, teraz rozumiem co zrobiłem źle lecz nie zmienia to tego że jeśli w Cpp nie mogę użyć zmiennej jako nazwy to jest trochę bez sensu bo wymaga od programisty podwójnej pracy i każe powtarzać w kółko te same komendy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.