GTAMulti - GTA Türkiye

San Andreas Multiplayer => Yardım Talepleri => PAWN Kodlama => Kilitli Konular => Konuyu başlatan: lastmuchanos - 23 Mart 2022, 00:09:32

Başlık: array problematiği.
Gönderen: lastmuchanos - 23 Mart 2022, 00:09:32
Selamlar, bir problemim var bunu sizinle paylaşmak istedim..

Bir sistem düşünün, bir dizin bahçemiz var ve bu bahçeleri bir kod bloğu içerisinde oyunculara satacağız. Detay; bahçe verilerini tutan bir enum var, ve bir array.. Bu array'de bahçenin posları yazıyor, yani ben tanıtıyorum, bir bahçeye sadece bir kişi sahip olabiliyor, yanii bahçe birisine satılınca, enum içerisinde duran bool değerim, true'ya dönüyor.
Örnek kodlar;

enum Bos_Bahce
{
Float: baPosX,
Float: baPosY,
Float: baPosZ,
bool: kullanim
};

new RandomBahceler[3][Bos_Bahce] =
{
{-1159.5569, -1113.5679, 128.2656},
{1550.1328, -28.8244, 21.3337},
{-391.1916, -1150.3652, 69.4478}
};


Buraya kadar bu şekilde, şimdi bir kod bloğu içerisinde satıldığını farz edelim.

cmd:bahcesat(playerid, params[])
{
   koşullar sorgular vesayre...
   for(new i = 0; i != sizeof(RandomBahceler); i++)
   {
      if(!RandomBahceler[i][kullanim])
      {
           RandomBahceler[i][kullanim] = true // artık diğer insanlar tarafından satın alınamaz..
           diğer kod satıları vs..
           return i;
      }
      else  {
         SendClientMessage(playerid, -1, "Şu an satılacak bir arsa yok.");
   }
   return -1;
}

Bu şekilde, şimdi denediğim zaman şu şekilde bir problem oluşuyor. bahcesat komutunu çağırdığımızı farz edelim, döngü girdi değeri false olan bir bahçeyi aldı ve aşağıda true'ya çevirdi. Evet, bu sadece bir bahçede olması gerekiyor, fakat array'da belirttiğim tüm bahçeler true'ya dönüyor, yani artık satılacak bir bahçe kalmamış oluyor.. Ve farklı bir kişiye satmaya çalışınca ya da farklı bir kişi bahçeyi almaya çalışınca else bloğu devreye giriyor.. Hatanın nerede olduğu konusunda yardımlarınızı bekliyorum. Kişisel fikrim, dönen değerlerde bir problem yapıyorum, return değerini ne olarak vermem gerekiyor? Bu konuda hata yapıyorum sanırım.. Yardımlarınız için çok teşekkür ederim, iyi günler..
Başlık: Ynt: array problematiği.
Gönderen: Murat Budak - 23 Mart 2022, 00:41:20
Telefondan yazdım düzeltebilirsin..
Arrayı 3 yerine #define MAX_BAHCE 3 yap
PAWN Kodu: Seç
stock BahceBosArrayID()
{
for (new i; i < MAX_BAHCE; i++) if (RandomBahceler[i][kullanim] == false)
{
return i;
}
return -1;
}

PAWN Kodu: Seç
cmd:bahcesat(playerid, params[])
{
new id;
if ((id = BahceBosArrayID()) == -1) return hatamesajı
RandomBahceler[id][kullanim] = true;
  return 1;
}
Başlık: Ynt: array problematiği.
Gönderen: squarepants - 23 Mart 2022, 14:43:42
Alternatif :

cmd:bahcesat(playerid, params[])
{
   for(new i = 0; i != sizeof(RandomBahceler); i++)
   {
      if(!RandomBahceler[i][kullanim])
      {
           RandomBahceler[i][kullanim] = true;
           goto SON_DONGU;
      }
      else  { SendClientMessage(playerid, -1, "Şu an satılacak bir arsa yok."); }
   }
   SON_DONGU:
   return 1;
}
Başlık: Ynt: array problematiği.
Gönderen: lastmuchanos - 23 Mart 2022, 17:14:44
Alıntı yapılan: Murat Budak - 23 Mart 2022, 00:41:20
Telefondan yazdım düzeltebilirsin..
Arrayı 3 yerine #define MAX_BAHCE 3 yap
PAWN Kodu: Seç
stock BahceBosArrayID()
{
for (new i; i < MAX_BAHCE; i++) if (RandomBahceler[i][kullanim] == false)
{
return i;
}
return -1;
}

PAWN Kodu: Seç
cmd:bahcesat(playerid, params[])
{
new id;
if ((id = BahceBosArrayID()) == -1) return hatamesajı
RandomBahceler[id][kullanim] = true;
  return 1;
}
Minnettarım, eve geçince bir bakacağım..
Başlık: Ynt: array problematiği.
Gönderen: lastmuchanos - 23 Mart 2022, 17:15:47
Alıntı yapılan: ThePosition - 23 Mart 2022, 14:43:42
Alternatif :

cmd:bahcesat(playerid, params[])
{
   for(new i = 0; i != sizeof(RandomBahceler); i++)
   {
      if(!RandomBahceler[i][kullanim])
      {
           RandomBahceler[i][kullanim] = true;
           goto SON_DONGU;
      }
      else  { SendClientMessage(playerid, -1, "Şu an satılacak bir arsa yok."); }
   }
   SON_DONGU:
   return 1;
}

for döngüsü içerisinde goto kullanmayı akıl edememek benim salaklığım oldu biraz sanırım.. çok teşekkürler.