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 3 gostiju 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

Pa to ja kazem... Javi sta je bilo, ako ne uspes i ako na na ultimate postoji taj bug, onda ce mi biti lakse da resim to.