Skocz do zawartości
Mati_(POL)

[ROZWIĄZANY]kalkulacje w argumencie

Rekomendowane odpowiedzi

W większości przypadków mogłem prosto implementować jeszcze dodatkowe obliczenia w argumentach funkcji i było spoko.

new var = 0;
DestroyPlayerObject(playerid, var + 1);

To tylko przykład. Wyrzuca mi: argument type mismatch (argument 2). Funkcja oczekuje consta czy jaka cholera, troche mi to psuje szyki. Mógłbym w lokalnych robić obliczenia i później wsadzać, ale tylko pytanie dlaczego i czy da się obejść?

Edytowane przez Mati_(POL)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
new objectid = 0;
DestroyPlayerObject(playerid, ++objectid);

Ewentualnie przy okazji jakiejść wcześniejszej modyfikacji wartości zmiennej dopisać +1 albo, tak jak napisałeś, zwiększać ją przed przekazaniem do funkcji, choć w zasadzie kod, który dałem właśnie tak działa - zwiększa przed odczytaniem wartości.
Natomiast komunikat argument type mismatch wskazuje, że zmienna ma inny typ danych (np tablica) niż jest oczekiwany w argumencie funkcji (liczba).

Edytowane przez PrzMas
opis

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No rozumiem, ale dlaczego wyrzuca mi ten komunikat skoro dałem tak jakby inta na tacy. Obiekty nie mają swoich tagów, więc w czym problem, odpalam compile i widzę na środku ekranu takiego wrednego trolla z dopiskiem 'umad?'. To już raczej mój płacz, 'problem' uważam za rozwiązany, nie trzeba odpowiadać - można zamknąć.

Edytowane przez Mati_(POL)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
new objectid = (36842010 << 10) >>> 20;
DestroyPlayerObject(0, objectid);

Tak nie może być?

Jeżeli dla poszczególnego argumentu funkcji nie ma określonego słowa const to wówczas kompilator będzie oczekiwał w miejscu tego argumentu zmiennej "lvalue". Wówczas w momencie wywołania funkcji w kodzie zostaną przekazane argumenty do funkcji, a tam gdzie będzie zmienna najpierw nastąpi jej odczyt (po adresie w pamięci), a następnie przekazanie jej wartości do funkcji jako argument.
Jeżeli w nagłówku funkcji przed argumentem jest & to znaczy, że wartość zmiennej przekazywanej do tej funkcji może być (lub będzie) modyfikowana w trakcie wykonywania kodu znajdującego się wewnątrz niej. Wówczas jako argument przekazywany jest adres w pamięci danej zmiennej.
Dla wyrażenia "++zmienna" najpierw następuje zwiększenie wartości zmiennej a dopiero po tym dostęp do niej i przekazanie jej wartości jako argument. W twoim przypadku najpierw powinny zostać wykonane operacje bitowe na wartości zmiennej a dopiero po tym dostęp do tej zmiennej (odczyt jej wartości i przekazanie jako argument dla funkcji), jednak dla operacji bitowych nie ma operatora działającego (kompilowanego) analogicznie do prefiksowej inkrementacji/dekrementacji.

1 godzinę temu, Mati_(POL) napisał:

No rozumiem, ale dlaczego wyrzuca mi ten komunikat skoro dałem tak jakby inta na tacy. Obiekty nie mają swoich tagów, więc w czym problem, odpalam compile i widzę na środku ekranu takiego wrednego trolla z dopiskiem umad?

Kompilator ma dylemat czy do funkcji przekazywana jest zmienna czy wartość.

4 minuty temu, CeKa napisał:

W nawiasie spróbuj zrobić :)

Miał tak, ale edytował post :P

Edytowane przez PrzMas

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
57 minut temu, PrzMas napisał:

new objectid = (36842010 << 10) >>> 20;
DestroyPlayerObject(0, objectid);

Tak nie może być?

Oczywiście, może być. To są dla mnie szczegóły, chciałem po prostu oszczędzić sobie tworzenia kolejnych zmiennych, bo widzisz.. te 36842010 to nie jest jakaś tam stała liczba, to jest pewna liczba x która zawsze będzie inna. I gdybym nie musiał tworzyć zmiennej "obiektid" to od razu mógłbym tego x'a (w moim przypadku 'var', która zawierała AZ 3 informacje) użyć w funkcjach (wraz z tymi działaniami wydobywającymi informacje). I tak naprawdę odpalam 3 funkcje: setvehiclehealth (od 20 do 32 bitu) DestroyPlayerObject (10 - 20) i jeszcze raz DestroyPlayerObj (0 - 10). Teraz muszę stworzyć 3 zmienne i na każdą robić te działania i dopiero wrzucać do funkcji (lub modyfikować jedną co funkcję - i tak właśnie zrobię). Tak to na prawdę u mnie wygląda. Mam taki fetysz, że choćby nie wiem co próbuję optymalizować rzeczy. Bo z każdą linijką coraz bardziej kuje mnie w serce (a prawda czasami jest taka, że robię większy bajzel przez wiele obliczeń, zamiast po prostu stracić trochę na Ramie i odciążyć proca). Dzięki Wam, dzięki PrzMas, doceniam ten cały wodospad tekstu :D lubię dogłębne tłumaczenia, dobrze jest wiedzieć jak co działa (tak samo w fizyce), nie pomyslalem ze w niektórych przypadkach w arg func. są przekazywane adresy pamięci a nie same już wartości.

Edytowane przez Mati_(POL)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×