Skocz do zawartości
MAGNET

[Rozwiązane] ArrayList - PushString powoduje crash (invalid handle)

Rekomendowane odpowiedzi

Krótko

 

Czy ktoś domyśla się jaka jest przyczyna wysypywania się serwera z powodu tablic dynamicznych? Kiedy próbuję na nie wepchnąć stringa dostaje takie errorlogi:

Spoiler

Exception reported: Invalid Handle 0 (error: 4)
L 01/12/2019 - 23:59:51: [SM] Blaming: codmod_nowy_tablice.smx
L 01/12/2019 - 23:59:51: [SM] Call stack trace:
L 01/12/2019 - 23:59:51: [SM]   [0] ArrayList.PushString
L 01/12/2019 - 23:59:51: [SM]   [1] Line 2384, C:\Users\Olek\Desktop\Plac zabaw\PAWN\Kompilator\codmod_nowy_tablice.sp::AddToDynamicArray
L 01/12/2019 - 23:59:51: [SM]   [2] Line 2364, C:\Users\Olek\Desktop\Plac zabaw\PAWN\Kompilator\codmod_nowy_tablice.sp::DodajBronieDoTablicDynamicznych
L 01/12/2019 - 23:59:51: [SM]   [3] Line 2331, C:\Users\Olek\Desktop\Plac zabaw\PAWN\Kompilator\codmod_nowy_tablice.sp::ZarejestrujKlase
L 01/12/2019 - 23:59:51: [SM]   [5] cod_register_class
L 01/12/2019 - 23:59:51: [SM]   [6] Line 31, codclass_wsparcieogniowe.sp::OnPluginStart
L 01/12/2019 - 23:59:51: [SM] Unable to load plugin "codclass_wsparcieogniowe.smx": Error detected in plugin startup (see error logs)

 

Wpycham dane przy okazji rejestrowania nowej klasy, ponieważ robię lekką przeróbkę i zamiast broni jako ciąg znaków umieszczone są one w tablicach

 

Sample code:

Spoiler

ArrayList BronieKlasyPrimary_Nazwa[MAKSYMALNA_ILOSC_KLAS];
ArrayList BronieKlasyPrimary_Naboje[MAKSYMALNA_ILOSC_KLAS];
ArrayList BronieKlasySecondary_Nazwa[MAKSYMALNA_ILOSC_KLAS];
ArrayList BronieKlasySecondary_Naboje[MAKSYMALNA_ILOSC_KLAS];
ArrayList BronieKlasyInne[MAKSYMALNA_ILOSC_KLAS];

//.... 
public void OnPluginStart() {
for (int i = 0; i < MAKSYMALNA_ILOSC_KLAS; i++) {
    BronieKlasyPrimary_Nazwa[i] = new ArrayList(32);
    BronieKlasyPrimary_Naboje[i] = new ArrayList();
    BronieKlasySecondary_Nazwa[i] = new ArrayList(32);
    BronieKlasySecondary_Naboje[i] = new ArrayList();
    BronieKlasyInne[i] = new ArrayList(32);
  }

//....
  
public int ZarejestrujKlase(Handle plugin, int numParams) {
  if (numParams != 9)
    return -1;

  if (++ilosc_klas > MAKSYMALNA_ILOSC_KLAS)
    return -2;

  pluginy_klas[ilosc_klas] = plugin;
  GetNativeString(1, nazwy_klas[ilosc_klas], sizeof(nazwy_klas[]));
  GetNativeString(2, opisy_klas[ilosc_klas], sizeof(opisy_klas[]));
  char wszystkieBronie[512];
  GetNativeString(3, wszystkieBronie, sizeof(wszystkieBronie));
  DodajBronieDoTablicDynamicznych(ilosc_klas, wszystkieBronie);
  
//....
  
oid DodajBronieDoTablicDynamicznych(int klasa, char[] weapons) {
  char weaponsclass[16][32];
  for (int i = 0; i < sizeof(weaponsclass); i++)  Format(weaponsclass[i], 32, "");

  ExplodeString(weapons, "#", weaponsclass, sizeof(weaponsclass), sizeof(weaponsclass[]));
  for (int i = 0; i < 16; i++) {
    if (StrEqual(weaponsclass[i], ""))  continue;

    // zwraca indeks z tablicy z wszystkimi broniami w celu rozroznienia czy bron jest primary czy secondary (na pozycjach 0-9 sa pistolety). Jesli -1, to granaty czy cos podobnego...
    int weaponPos = GetWeaponPosition(weaponsclass[i]);

    if (weaponPos == -1) {
      BronieKlasyInne[klasa].PushString(weaponsclass[i]);
    } else {
      if (weaponPos < 10) {
        BronieKlasySecondary_Nazwa[klasa].PushString(weaponsclass[i]);
        BronieKlasySecondary_Naboje[klasa].Push(naboje_broni[weaponPos][0]);
      } else {
        BronieKlasyPrimary_Nazwa[klasa].PushString(weaponsclass[i]);
        BronieKlasyPrimary_Naboje[klasa].Push(naboje_broni[weaponPos][0]);
      }
    }
  }
}

 

 

Nie wiem o co chodzi. Podejrzewam, że wina nie leży tutaj, jednak nie mam pomysłu o co mogłoby chodzić. Będe wdzieczy na wszelką pomoc ?

Pozdro!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Otrzymałem pomoc od @mastah7991. Wielkie dzięki za sprytny pomysł ?

 

Rozwiązaniem była inicjalizacja pojedyńczej tablicy w funkcje ZarejestrujKlase, zamiast wszystkich na raz w pętli:

public int ZarejestrujKlase(Handle plugin, int numParams) {
  if (numParams != 9)
    return -1;

  if (++ilosc_klas > MAKSYMALNA_ILOSC_KLAS)
    return -2;

  BronieKlasyPrimary_Nazwa[ilosc_klas] = new ArrayList(32);
  BronieKlasyPrimary_Naboje[ilosc_klas] = new ArrayList();
  BronieKlasySecondary_Nazwa[ilosc_klas] = new ArrayList(32);
  BronieKlasySecondary_Naboje[ilosc_klas] = new ArrayList();
  BronieKlasyInne[ilosc_klas] = new ArrayList(32);
  //...

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Pomoc udzielona

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.

×
×
  • Dodaj nową pozycję...