Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] error 12: invalid function call, not a valid adress - Pola bitowe


Najlepsza odpowiedź GwynBleidD, 26.08.2014 09:10

A sprawdź, czy zadziała:

(kupionehe &= ~(1<<id))
Czyli to, co sugeruje sebul.

Poza tym weź pod uwagę to, co się stanie, jeśli zmienne w amxx będą 32 bitowe (czyli możesz wykorzystać bity od 0 do 31) i będziesz miał gracza z ID = 32 :)

Lepiej zrobić jedną tablicę 33 elementową dla graczy, a odpowiednie "flagi" przypisywać dla konkretnych przedmiotów, czyli:

sklep[id] |= (1<<kupionehe)
oznacza, że ktoś kupił granat. Również dużo szybciej jest "wyzerować" flagi dla konkretnego gracza:
sklep[id] = 0
albo jeśli chcesz tylko kilka flag wyzerować:
sklep[id] &= ~(1<<kupionekroki) & ~(1<<kupionerender)
Tak samo zainicjować można konkretnymi flagami.

Oczywiście przy tym rozwiązaniu zmienne (lub stałe) kupione* muszą mieć wartości 1, 2, 3... do czego możesz wykorzystać enum :)

Jeszcze ciekawiej: przypisać im wartości: 1, 2, 4, 8, 16... i używać tak:

sklep[id] &= ~kupionekroki & ~kupionehe
Czyli dosłownie tak, jak flagi admina. I co ciekawe, można to "odpalić" pojedynczym enumem, co w zamierzchłych czasach opisywałem na forum: http://amxx.pl/topic...um/#entry127116 możesz użyć zamiast mnożenia, przesunięcie bitowe ;) Ale to na to samo wyjdzie. Przejdź do postu


  • Zamknięty Temat jest zamknięty
9 odpowiedzi w tym temacie

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 25.08.2014 19:17

Witam.

Używam tego kodu:

public client_connect(id)
{
      ClearBit(kupionehe, id);
      ClearBit(kupionefb, id);
      ClearBit(kupioneexp, id);
      ClearBit(kupionekroki, id);
      ClearBit(kupionestroj, id);
      ClearBit(kupionerender, id);
      ClearBit(kupionereawp, id);
}

I wywala błędy.

Dodam jeszcze że w bibliotece amxmodx.inc mam dodane to:

#define SetBit(%1,%2)    (%1 |= (1<<(%2)))
#define ClearBit(%1,%2)    (%1 &= ~(1<<(%2)))
#define CheckBit(%1,%2)    (%1 & (1<<(%2)))

Załączone miniatury

  • bez

  • +
  • -
  • 0

#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 25.08.2014 23:56

A zastąpienie tego skrótu pełnym wyrażeniem eliminuje błąd?
  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#3 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 26.08.2014 01:01

Na moje wina nawiasu zewnętrznego.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#4 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 26.08.2014 06:50

kupionehe = kupionehe & (1<<id)

Takie coś pomogło.

Dlaczego wywala błąd ? Używam tych flag w wielu pluginach. Może dlatego że nie jedna pod drugą?


  • +
  • -
  • 0

#5 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 26.08.2014 09:10   Najlepsza odpowiedź

A sprawdź, czy zadziała:

(kupionehe &= ~(1<<id))
Czyli to, co sugeruje sebul.

Poza tym weź pod uwagę to, co się stanie, jeśli zmienne w amxx będą 32 bitowe (czyli możesz wykorzystać bity od 0 do 31) i będziesz miał gracza z ID = 32 :)

Lepiej zrobić jedną tablicę 33 elementową dla graczy, a odpowiednie "flagi" przypisywać dla konkretnych przedmiotów, czyli:

sklep[id] |= (1<<kupionehe)
oznacza, że ktoś kupił granat. Również dużo szybciej jest "wyzerować" flagi dla konkretnego gracza:
sklep[id] = 0
albo jeśli chcesz tylko kilka flag wyzerować:
sklep[id] &= ~(1<<kupionekroki) & ~(1<<kupionerender)
Tak samo zainicjować można konkretnymi flagami.

Oczywiście przy tym rozwiązaniu zmienne (lub stałe) kupione* muszą mieć wartości 1, 2, 3... do czego możesz wykorzystać enum :)

Jeszcze ciekawiej: przypisać im wartości: 1, 2, 4, 8, 16... i używać tak:

sklep[id] &= ~kupionekroki & ~kupionehe
Czyli dosłownie tak, jak flagi admina. I co ciekawe, można to "odpalić" pojedynczym enumem, co w zamierzchłych czasach opisywałem na forum: http://amxx.pl/topic...um/#entry127116 możesz użyć zamiast mnożenia, przesunięcie bitowe ;) Ale to na to samo wyjdzie.
  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#6 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 26.08.2014 09:34


Poza tym weź pod uwagę to, co się stanie, jeśli zmienne w amxx będą 32 bitowe (czyli możesz wykorzystać bity od 0 do 31) i będziesz miał gracza z ID = 32 :)

 

Czyżby Benio się pomylił?


  • +
  • -
  • 0

#7 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 26.08.2014 13:54

Poza tym weź pod uwagę to, co się stanie, jeśli zmienne w amxx będą 32 bitowe (czyli możesz wykorzystać bity od 0 do 31) i będziesz miał gracza z ID = 32 smile.png

 
Czyżby Benio się pomylił?

Pisałem o tym wielokrotnie i nawet sam benio przyznał mi rację, że w przypadku id = 32 mogą być problemy, chyba że właśnie id graczy będzie się numerować od 0, ale wtedy wszędzie trzeba by robić tak "id-1". Czyli benio się nie pomylił, dobrze o tym wiedział.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#8 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 26.08.2014 14:30

A jakby do tej makrodefinicji dodać takie coś żeby od indexu odejmowało 1 ?
  • +
  • -
  • 0

#9 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 26.08.2014 18:00

#define id_gracza(%1) %1-1 // nie wiem czy tu można/trzeba dać nawiasy
Na to samo wyjdzie i tak będziesz musiał wpisywać makrodefinicję, zamiast po prostu id, dodatkowo nie będziesz mieć oddzielnej wartości dla zera (czyli tak jakby dla serwera), ale to akurat raczej rzadko jest przydatne.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#10 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 26.08.2014 18:39

Nie trzeba mi w tym przypadku wartości dla zera.

 

A jak to dodać do makrodefinicji, Clear/Set/Check Bit

#define CheckBit(%1,%2)    (%1 & (1<<((%2-1))))

Żeby w środku odejmować jeden od indexu i się pomieści wszystko.


  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych