Attempted to read/write array element at negative index -1

Započeo hendrixx, Decembar 25, 2024, 15:16:00 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Naslov problema*: Attempted to read/write array element at negative index -1
Opis problema*: Kad god igrac proda/kupuje imovinu debug izbacuje "Attempted to read/write array element at negative index -1", takodje kad se jednom proda imovina igracu, ne moze vise da se proda drzavi, izbacuje
if(GlobalImovinaIgracu[playerid]) return SendErrorMessage(playerid, "Ne mozes prodati firmu dok je u procesu prodaja igracu!");
Pokušaj rešavanja*: Pokusao sam da nadjem po samp forumima i drugim forumima kako da resim ali mi nije bas najjasnije jer je uvek nesto drugo u pitanju
Deo programskog koda*:

else if(dialogid == dialog_PROPSELLDRZAVA )
	{
	    if( response )
		{
	        if( PlayerInfo[ playerid ][ xBRacun ] < 0 ) return SendErrorMessage( playerid, "Ne mozes da prodas imovinu dok ne izadjes iz minusa u banci." );
	        new id = ChosenProperty[ playerid ];
			if( GetNearestProperty( playerid ) != id ) return SendErrorMessage( playerid, "Niste pored svoje imovine!" );
			if( strcmp( ImeIgraca( playerid ), II[ GetNearestProperty( playerid ) ][ iOwner ], true) == 0 )
			{
				WriteLog("log-sell", "Igrac %s je prodao imovinu ID %d na buy", ImeIgraca( playerid ), id);

		        strmid( II[ GetNearestProperty( playerid ) ][ iOwner ], "Drzava", 0, strlen( "Drzava" ), 32);

			    DajIgracuNovac( playerid, (II[ GetNearestProperty( playerid ) ][ iPrice ]/2) );
                II[ GetNearestProperty( playerid ) ][ iNeaktivnost ] = 0;
				II[ GetNearestProperty( playerid ) ][ iOwned ] = 0;
				II[ GetNearestProperty( playerid ) ][ iOnAuction ] = false;
  				II[ GetNearestProperty(playerid) ][ iOwnerSQLID ] = -1;
				PlayerPlaySound( playerid, 1058, 0, 0, 0 );
				PropertyRefresh( GetNearestProperty( playerid ) );
				SaveProperty( GetNearestProperty( playerid ) );

				if( PlayerInfo[ playerid ][ xProperty ][ 0 ] == id )
				{
			        PlayerInfo[ playerid ][ xProperty ][ 0 ] = -1;
			        PlayerInfo[ playerid ][ xPropertySqlID ][ 0 ] = 0;
					sql_user_update_integer( playerid, "property_id_1", PlayerInfo[ playerid ][ xPropertySqlID ][ 0 ] );
				}
			    else if( PlayerInfo[ playerid ][ xProperty ][ 1 ] == id )
				{
					PlayerInfo[ playerid ][ xProperty ][ 1 ] = -1;
					PlayerInfo[ playerid ][ xPropertySqlID ][ 1 ] = 0;
					sql_user_update_integer( playerid, "property_id_2", PlayerInfo[ playerid ][ xPropertySqlID ][ 1 ] );
				}
			    else if( PlayerInfo[ playerid ][ xProperty ][ 2 ] == id )
				{
					PlayerInfo[ playerid ][ xProperty ][ 2 ] = -1;
					PlayerInfo[ playerid ][ xPropertySqlID ][ 2 ] = 0;
					sql_user_update_integer( playerid, "property_id_3", PlayerInfo[ playerid ][ xPropertySqlID ][ 2 ] );
				}
			}
			else SendErrorMessage( playerid, "Ovo nije vase." );
	    }
	    if( !response )
		{
	        SendClientMessage( playerid, CRVENA, "(IMOVINA): Odustali ste od prodaje imovine drzavi." );
	    }
	}
	else if(dialogid == dialog_PROPSELLTP )
	{
	    if( !response ) return 1;
	    if( response )
		{
	        if( PlayerInfo[ playerid ][ xBRacun ] < 0 ) return SendErrorMessage( playerid, "Ne mozes da prodas imovinu dok ne izadjes iz minusa u banci." );
	        new id = ChosenProperty[ playerid ], idigraca, cena, string[ 128 ], Float:Pos[ 3 ];
	        if( sscanf( inputtext, "ui", idigraca, cena ) ) return ShowPlayerDialog( playerid, dialog_PROPSELLTP, DIALOG_STYLE_INPUT, D_NASLOV, "{FFFFFF}* U prazni prostor ispod unesite ID igraca i cenu imovina:", "Ponudi", "Odustani" );
            GetPlayerPos( idigraca, Pos[ 0 ], Pos[ 1 ], Pos[ 2 ] );
			if( !IsPlayerInRangeOfPoint( playerid, 3.0, Pos[ 0 ], Pos[ 1 ], Pos[ 2 ] ) ) return SendErrorMessage( playerid, "Igrac nije blizu vas");
			if( cena < 1 ) return SendErrorMessage( playerid, "Cena ne moze biti manja od 1$!");
            if( idigraca == IPI ) return SendErrorMessage( playerid, "Pogresan ID." );
			if( idigraca == playerid ) return SendErrorMessage( playerid, "Ne mozes sam sebi prodati kucu!");
			if( PlayerInfo[ idigraca ][ xProperty ][ 0 ] != -1 && PlayerInfo[ idigraca ][ xProperty ][ 1 ] != -1 && PlayerInfo[ idigraca ][ xProperty ][ 2 ] != -1 ) return SendErrorMessage( playerid, "Igrac vec ima 3 imovine!");
            if( PlayerInfo[ idigraca ][ xLevel ] < II[ id ][ iLevel ] ) return SCMF( playerid, CRVENA, "(IMOVINA): Da bi ste tom igracu prodali ovu imovinu, on mora biti level {FFFFFF}(%d+).", II[ id ][ iLevel ] );
            SCMF( playerid, 0x33CCFFFF, "(IMOVINA): Ponudili ste igracu {FFFFFF}%s {33CCFF}imovinu po ceni od {FFFFFF}($%d).", ImeIgraca( idigraca ), cena );
			GlobalProdaja[ idigraca ] = playerid;
			GlobalCena[ idigraca ] = cena;
			GlobalID[ idigraca ] = id;
			GlobalImovinaIgracu[playerid] = true;
			format( string, sizeof( string ), "{FFFFFF}* Igrac %s vam je ponudio da kupite njegovu imovinu za $%d.", ImeIgraca( playerid ), cena );
			ShowPlayerDialog( idigraca, dialog_ACCEPTPROP, DIALOG_STYLE_MSGBOX, D_NASLOV, string, "Prihvati", "Odbij" );
	    }
	}
	else if(dialogid == dialog_ACCEPTPROP)
	{
	    if( response )
		{
	        new id = GlobalID[ playerid ];
	        if( PlayerInfo[ playerid ][ xNovac ] < GlobalCena[ playerid ] ) return SendErrorMessage( playerid, "Nemate dovoljno novca.");

			if( PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 0 ] == id )
			{
				PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 0 ] = -1;
				PlayerInfo[ GlobalProdaja[ playerid ] ][ xPropertySqlID ][ 0 ] = 0;
			}
			else if( PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 1 ] == id )
			{
				PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 1 ] = -1;
				PlayerInfo[ GlobalProdaja[ playerid ] ][ xPropertySqlID ][ 1 ] = 0;
			}
			else if( PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 2 ] == id )
			{
				PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 2 ] = -1;
				PlayerInfo[ GlobalProdaja[ playerid ] ][ xPropertySqlID ][ 2 ] = 0;
			}

			if( PlayerInfo[ playerid ][ xProperty ][ 0 ] == -1 )
			{
				PlayerInfo[ playerid ][ xProperty ][ 0 ] = id;
				PlayerInfo[ playerid ][ xPropertySqlID ][ 0 ] = II[id][iSQLID];
			}
		    else if( PlayerInfo[ playerid ][ xProperty ][ 1 ] == -1 )
		    {
		    	PlayerInfo[ playerid ][ xProperty ][ 1 ] = id;
				PlayerInfo[ playerid ][ xPropertySqlID ][ 1 ] = II[id][iSQLID];
		    }
		    else if( PlayerInfo[ playerid ][ xProperty ][ 2 ] == -1 )
		    {
		    	PlayerInfo[ playerid ][ xProperty ][ 2 ] = id;
				PlayerInfo[ playerid ][ xPropertySqlID ][ 2 ] = II[id][iSQLID];
		    }

			WriteLog("log-sell", "Igrac %s je prodao imovinu ID %d igracu %s za %d", ImeIgraca( GlobalProdaja[ playerid ] ), id, ImeIgraca( playerid ), GlobalCena[ playerid ]);
            SCMF( playerid, 0x33CCFFFF, "(IMOVINA): Uspesno ste kupili imovinu od igraca {FFFFFF}%s {33CCFF}za {FFFFFF}($%d).", ImeIgraca( GlobalProdaja[ playerid ] ), GlobalCena[ playerid ] );

			strmid( II[ id ][ iOwner ], ImeIgraca( playerid ), 0, strlen( ImeIgraca( playerid ) ), 255);
  			II[ id ][ iOwnerSQLID ] = PlayerInfo[playerid][xID];
			SaveProperty( id );
			PropertyRefresh( id );

			sql_user_update_property( playerid );
			sql_user_update_property( GlobalProdaja[ playerid ] );

			SCMF( GlobalProdaja[ playerid ], ZUTA, "(IMOVINA): Prodali ste kucu igracu {FFFFFF}%s {33CCFF}za {FFFFFF}($%d).", ImeIgraca( playerid ), GlobalCena[ playerid ] );
			SendClientMessage( playerid, ZUTA, "(IMOVINA): Kupili ste kucu." );

			DajIgracuNovac( GlobalProdaja[ playerid ], GlobalCena[ playerid ] );
			DajIgracuNovac( playerid, -GlobalCena[ playerid ] );

			GlobalProdaja[ playerid ] = -1;
			GlobalCena[ playerid ] = -1;
			GlobalID[ playerid ] = -1;
			GlobalImovinaIgracu[GlobalProdaja[playerid]] = false;
			GlobalImovinaIgracu[playerid] = false;
	    }
	    else if( !response )
		{
			SCMF( GlobalProdaja[ playerid ], ZUTA, "(IMOVINA): Igrac {FFFFFF}%s {DABB3E}je odbio vasu ponudu za kupovinu imovine.", ImeIgraca( playerid ) );
			SendClientMessage( playerid, ZUTA, "(IMOVINA): Odbili ste ponudu.");

			GlobalProdaja[ playerid ] = -1;
			GlobalCena[ playerid ] = -1;
			GlobalID[ playerid ] = -1;
	    }
	}
	
	
	
	
	
	else if(dialogid == dialog_ACCEPTVEH )
	{
	    if( response )
		{
            new seller = GlobalProdaja[ playerid ],
				autoid = GlobalID[ playerid ];

	 		if( seller == IPI  ) return SendErrorMessage( playerid, "Taj igrac je offline.");
	 		if( carspawntimer == 1 ) return SCMF( playerid, ANTICHEAT, "(ANTICHEAT): Neko je spawnao/parkirao vozilo pre vas. Pokusajte za 3 sekunde. (Anticrash)");

            new slot = -1;
			for( new j = 0; j < MAX_VEH_SLOT; j ++ )
			{
				if( player_veh[ seller ][ vehicle_id ][ j ] != -1 && player_veh[ seller ][ vehicle_id ][ j ] == autoid  )
				{
			  		slot = j;
					break;
				}
			}
			if( slot == -1 ) return SendErrorMessage( playerid, "To vozilo nije u vlasnistvu igraca koji vam ga je ponudio!");

			if( !IsPlayerNearPlayer( 5.0, playerid, seller ) ) return SendErrorMessage( playerid, "Niste blizu igraca koji vam zeli prodati vozilo.");
			if( PlayerInfo[ playerid ][ xNovac ] < GlobalCena[ playerid ] ) return SendErrorMessage( playerid, "Nemate dovoljno novca da kupite vozilo.");
			if( !IsPlayerConnected( seller ) )
			{
				SendErrorMessage( playerid, "Taj igrac je offline.");
				GlobalProdaja[ playerid ] = -1;
				GlobalCena[ playerid ] = -1;
				GlobalID[ playerid ] = -1;
				return 1;
			}

            slot = -1;
		    for( new j = 0; j < MAX_VEH_SLOT; j ++ )
			{
				if( (j+1) <= PlayerInfo[ playerid ][ xSlotoviVozila ] && player_veh[ playerid ][ vehicle_id ][ j ] == -1 )
				{
			  		slot = j;
					break;
				}
			}
			if( slot == -1 ) return SendErrorMessage( playerid, "Svi slotovi vozila su vam zauzeti." );

			strmid( VehicleInfo[ autoid ][ vOwner ], ImeIgraca( playerid ), 0, strlen( ImeIgraca( playerid ) ), 24);
			VehicleInfo[ autoid ][ vOwner_sqlID  ] = PlayerInfo[ playerid ][ xID ];
			VehicleInfo[ autoid ][ v_owner_id ] = playerid;

			new q[ 128 ];
			mysql_format( mSQL, q, sizeof(q), "UPDATE `vehicles` SET `owner_sqlID` = '%d' WHERE `veh_id` = '%d' LIMIT 1",
									VehicleInfo[ autoid ][ vOwner_sqlID ],
									VehicleInfo[ autoid ][ vSqlID ] );

			mysql_tquery( mSQL, q );

            for( new j = 0; j < MAX_VEH_SLOT; j ++ )
			{
                if( player_veh[ seller ][ vehicle_id ][ j ] == autoid )
				{
					player_veh[ seller ][ vehicle_id ][ j ] = -1;
					break;
				}
            }

            for( new j = 0; j < MAX_VEH_SLOT; j ++ )
			{
                if( (j+1) <= PlayerInfo[ playerid ][ xSlotoviVozila ] && player_veh[ playerid ][ vehicle_id ][ j ] == -1 )
				{
					player_veh[ playerid ][ vehicle_id ][ j ] = autoid;
					break;
				}
            }

			WriteLog("log-sell", "Igrac %s je prodao vozilo %s igracu %s za %d", ImeIgraca( seller ), GetVehicleNameEx( VehicleInfo[ autoid ][ vModel ] ), ImeIgraca( playerid ), GlobalCena[ playerid ]);

			DajIgracuNovac( seller, GlobalCena[ playerid ] );
			RemovePlayerFromVehicle( seller );

			DajIgracuNovac( playerid, -GlobalCena[ playerid ] );
			SendClientMessage( playerid, ZUTA, "(Vozilo): Uspesno ste kupili vozilo." );
			SendClientMessage( seller, ZUTA, "(Vozilo): Uspesno ste prodali vozilo." );

	        carspawntimer = 1;
			SetTimer_("AntiSpawnCrash", 3000, 3000, 1);

			GlobalProdaja[ playerid ] = -1;
			GlobalCena[ playerid ] = -1;
			GlobalID[ playerid ] = -1;
			GlobalImovinaIgracu[GlobalProdaja[playerid]] = false;
			GlobalImovinaIgracu[GlobalProdaja[seller]] = false;
	    }
	    else if( !response )
		{
			SCMF( GlobalProdaja[ playerid ], ZUTA, "(Vozilo): Igrac {FFFFFF}%s {DABB3E}je odbio vasu ponudu za kupovinu vozla.", ImeIgraca( playerid ) );
			SendClientMessage( playerid, ZUTA, "(Vozilo): Odbili ste ponudu.");
			GlobalProdaja[ playerid ] = -1;
			GlobalCena[ playerid ] = -1;
			GlobalID[ playerid ] = -1;
	    }
	}
	else if(dialogid == dialog_VEHSELLDRZAVI )
	{
	    if( !response ) return 1;
		if( response )
		{
 			new vehicleid = ChosenVehicle[ playerid ];
     		if( !IsPlayerInVehicle( playerid, vehicleid ) ) return SendErrorMessage( playerid, "Morate biti u svom vozilu!");

			WriteLog("log-sell", "Igrac %s je prodao vozilo %s na aukciju", ImeIgraca( playerid ), GetVehicleNameEx( VehicleInfo[ vehicleid ][ vModel ] ));

			DajIgracuNovac( playerid, VehicleInfo[ vehicleid ][ vPrice ]/2 );
			SCMF( playerid, ZUTA, "(Vozilo): Dobili ste {FFFFFF}($%d) {DABB3E}za ovo vozilo.", VehicleInfo[ vehicleid ][ vPrice ]/2 );

			for( new j = 0; j < MAX_VEH_SLOT; j ++ )
			{
				if( player_veh[ playerid ][ vehicle_id ][ j ] == vehicleid )
				{
  					player_veh[ playerid ][ vehicle_id ][ j ] = -1;
					break;
				}
			}

			sql_vehicles_delete( vehicleid );
			ResetVehicle( vehicleid );
			SMG_DestroyVehicle( vehicleid );
			SendClientMessage( playerid, ZUTA, "(Vozilo): Vase vozilo je uspesno prodano otpadu.");
		}
	}
	else if(dialogid == dialog_VEHSELLTP )
	{
	    if( !response ) return 1;
		if( response )
		{
	        new idigraca, string[ 128 ],
				cena,
				autoid = ChosenVehicle[ playerid ];

			if( sscanf( inputtext, "ui", idigraca, cena ) ) return ShowPlayerDialog( playerid, dialog_VEHSELLTP, DIALOG_STYLE_INPUT, D_NASLOV, "{FFFFFF}* Unesite id igraca kome zelite da prodate vozilo i cenu.\nPrimer: 145 12003", "Potvrdi", "Odustani" );
			if( !IsPlayerConnected( idigraca ) || idigraca == IPI ) return SendErrorMessage( playerid, "Nevaljan ID igraca.");
			if( !IsPlayerNearPlayer( 5.0, playerid, idigraca ) ) return SendErrorMessage( playerid, "Taj igrac nije blizu vas !");
            if( idigraca == playerid ) return SendErrorMessage( playerid, "Ne mozes sam sebi prodati vozilo!");

            new slot = -1;
			for( new j = 0; j < MAX_VEH_SLOT; j ++ )
			{
				if( (j+1) <= PlayerInfo[ playerid ][ xSlotoviVozila ] && player_veh[ playerid ][ vehicle_id ][ j ] != -1 && player_veh[ playerid ][ vehicle_id ][ j ] == autoid )
				{
			  		slot = j;
					break;
				}
			}
			if( slot == -1 ) return SendErrorMessage( playerid, "Ovo vozilo nije u vasem vlasnistvu." );

            slot = -1;
		    for( new j = 0; j < MAX_VEH_SLOT; j ++ )
			{
				if( (j+1) <= PlayerInfo[ idigraca ][ xSlotoviVozila ] && player_veh[ idigraca ][ vehicle_id ][ j ] == -1 )
				{
			  		slot = j;
					break;
				}
			}
			if( slot == -1 ) return SendErrorMessage( playerid, "Svi slotovi vozila izabranog igraca su zauzeti." );

			if( cena < ( VehicleInfo[ autoid ][ vPrice ]/2 ) ) return SendErrorMessage( playerid, "Cena mora biti veca od polovine kupljene.");

	        if( !IsVehicleBajs( autoid ) ) {
				if( PlayerInfo[ idigraca ][ xLevel ] < 3 ) return SendErrorMessage( playerid, "Igrac mora biti level 3+ da bi ste mu prodali vozilo." );
			}

            SCMF( playerid, ZUTA, "(Vozilo): Ponudili ste igracu {FFFFFF}%s {DABB3E}vozilo po ceni od {FFFFFF}($%d).", ImeIgraca( idigraca ), cena );
			GlobalProdaja[ idigraca ] = playerid;
			GlobalCena[ idigraca ] = cena;
			GlobalID[ idigraca ] = autoid;
			GlobalImovinaIgracu[playerid] = true;
			format( string, sizeof( string ), "{FFFFFF}* Igrac %s vam je ponudio da kupite njegovo vozilo marke %s za $%d.", ImeIgraca( playerid ), GetVehicleNameEx( VehicleInfo[ autoid ][ vModel ] ), cena );
			ShowPlayerDialog( idigraca, dialog_ACCEPTVEH, DIALOG_STYLE_MSGBOX, D_NASLOV, string, "Prihvati", "Odbij" );
	    }
	}

U prvom dijalogu, provjeri koju vrijednost dobijaš za
GetNearestProperty( playerid )

printaj je ili nešto slično. Ukoliko ta funkcija vraća -1, pa ti s tom vrijednošću pokušaš pristupiti nizu onda je to problem. Uglavnom problem je taj što ne postoji index -1 u nizu, nemoguće je pristupiti tom dijelu memorije.

Citat: daddyDOT poslato Decembar 25, 2024, 16:13:06 POSLE PODNEU prvom dijalogu, provjeri koju vrijednost dobijaš za
GetNearestProperty( playerid )

printaj je ili nešto slično. Ukoliko ta funkcija vraća -1, pa ti s tom vrijednošću pokušaš pristupiti nizu onda je to problem. Uglavnom problem je taj što ne postoji index -1 u nizu, nemoguće je pristupiti tom dijelu memorije.

Pazi, ta funkcija vraca -1 ukoliko ne pronadje najblizu imovinu igracu. Ali sta je fazon, on ima proveru da li je vracena vrednost te funkcije poklapa s vrednoscu ChosenProperty odnosno, igraceve imovine, znaci da je -1 returnalo bi ga. Ili ja gresim? Osim ako njegova imovian nije vec -1, onda je to bugcina jer je dirao zabranjeno voce...

GlobalImovinaIgracu[playerid] se ne azurira na false, znaci da ti se neki deo koda ne ucitava kako treba, odnosno dialog_PROPSELLTP.

Nema tu sta da se prica, kako ti je receno, preistupi Debuggingu (isprintaj sve moguce i sve arraye u konzoli, sve sumnjivo da vidis vrednosti i otkrices gde je bug) i to ti je to, drugacije nema. Ovo se desilo zbog tvog cackanja inace...

Citat: daddyDOT poslato Decembar 25, 2024, 16:13:06 POSLE PODNEU prvom dijalogu, provjeri koju vrijednost dobijaš za
GetNearestProperty( playerid )

printaj je ili nešto slično. Ukoliko ta funkcija vraća -1, pa ti s tom vrijednošću pokušaš pristupiti nizu onda je to problem. Uglavnom problem je taj što ne postoji index -1 u nizu, nemoguće je pristupiti tom dijelu memorije.

Provericu ovo

Citat: Dragi poslato Decembar 25, 2024, 21:08:02 POSLE PODNEPazi, ta funkcija vraca -1 ukoliko ne pronadje najblizu imovinu igracu. Ali sta je fazon, on ima proveru da li je vracena vrednost te funkcije poklapa s vrednoscu ChosenProperty odnosno, igraceve imovine, znaci da je -1 returnalo bi ga. Ili ja gresim? Osim ako njegova imovian nije vec -1, onda je to bugcina jer je dirao zabranjeno voce...

GlobalImovinaIgracu[playerid] se ne azurira na false, znaci da ti se neki deo koda ne ucitava kako treba, odnosno dialog_PROPSELLTP.

Nema tu sta da se prica, kako ti je receno, preistupi Debuggingu (isprintaj sve moguce i sve arraye u konzoli, sve sumnjivo da vidis vrednosti i otkrices gde je bug) i to ti je to, drugacije nema. Ovo se desilo zbog tvog cackanja inace...

Ovako je bilo na ultimateu klot jos dok ga nisam ni pipnuo, nego sam ostavio za posle i sad sam se setio da ne valja, probao sam da dodam na mestima gde jos mislim da treba GlobalImovinaIgracu[playerid] na false ali to nije pomoglo, mozda nisam ni to uradio kako treba, printovacu pa testiram sa drugarima jos posle praznika ako ne nadjemo ovde resenje zajedno