Çok eski bir web tarayıcısı kullanıyorsunuz. Bu veya diğer siteleri görüntülemekte sorunlar yaşayabilirsiniz.. Tarayıcınızı güncellemeli veya alternatif bir tarayıcı kullanmalısınız.
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
gibi kodlar görüyorum bu arguments tam olarak ne işe yarıyor , bu sayılar neyi temsil ediyor ve neden bazılarında +1 ekli ? bunun gibi bir de buf[256 + 1] vs. var onlar da ne işe yarıyor?
Burada ki arg verilerinin tamamı char türündedir. Yani string. Burada sayılar da string'e dahildir.
char arg1[256] = 256 ise bu string verisinin karakter sayısını temsil eder. (0 dan 255'e kadar)
Yani arg1 argümanı 257 karakter olarak gelirse...
Burada ki arg verilerinin tamamı char türündedir. Yani string. Burada sayılar da string'e dahildir.
char arg1[256] = 256 ise bu string verisinin karakter sayısını temsil eder. (0 dan 255'e kadar)
Yani arg1 argümanı 257 karakter olarak gelirse kod çalışmayıp syserr verecektir. Her arg, bir komutu temsil eder.
Buna bağlı olarak aşağıdaki tanım daha kolay anlamayı sağlayacaktır:
Kod:
arg1[256] = <target> Temsil eder.
arg2[256] = <skillname> Temsil eder.
arg3[256] = <lev> Temsil eder.
Örnek kullanıma bakınca da:
Kod:
/setskillother Kaiser 78 40
Görüldüğü üzere Kaiser(target), 78(skill kodu) ve skill leveli olarak 40 şeklinde 3 argüman gönderiliyor.
Bunların her birinin en fazla alacağı karakter sayısı ise 256'dır.
arg[0] ise genellikle tanım olarak değil koşul olarak kullanılır.
Mesela yukarıdaki örnekten giderek şöyle bir örnek vereyim:
C++:
if(arg2[0] == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Skill index 0 ile başlayamaz.");
return;
}
Burada arg2 verisinin(skill kodunun) 0.karakterini yani ilk karakterinin 0'a eşit olup olmadığı kontrol edilir. Eğer GM karakterle şöyle bir komut girilirse:
Burada ki arg verilerinin tamamı char türündedir. Yani string. Burada sayılar da string'e dahildir.
char arg1[256] = 256 ise bu string verisinin karakter sayısını temsil eder. (0 dan 255'e kadar)
Yani arg1 argümanı 257 karakter olarak gelirse kod çalışmayıp syserr verecektir. Her arg, bir komutu temsil eder.
Buna bağlı olarak aşağıdaki tanım daha kolay anlamayı sağlayacaktır:
Kod:
arg1[256] = <target> Temsil eder.
arg2[256] = <skillname> Temsil eder.
arg3[256] = <lev> Temsil eder.
Örnek kullanıma bakınca da:
Kod:
/setskillother Kaiser 78 40
Görüldüğü üzere Kaiser(target), 78(skill kodu) ve skill leveli olarak 40 şeklinde 3 argüman gönderiliyor.
Bunların her birinin en fazla alacağı karakter sayısı ise 256'dır.
arg[0] ise genellikle tanım olarak değil koşul olarak kullanılır.
Mesela yukarıdaki örnekten giderek şöyle bir örnek vereyim:
C++:
if(arg2[0] == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Skill index 0 ile başlayamaz.");
return;
}
Burada arg2 verisinin(skill kodunun) 0.karakterini yani ilk karakterinin 0'a eşit olup olmadığı kontrol edilir. Eğer GM karakterle şöyle bir komut girilirse:
anladığım kadarıyla bu argümanlar spesifik bir veriyi içinde barındırıyor ve oradaki sayıda veri boyutunu belirliyor, 0 olursa da koşul olmuş oluyor.
tmm ama bu veri nerden geliyor bu veri ne nasıl bilebiliriz,
mesela;
anladığım kadarıyla bu argümanlar spesifik bir veriyi içinde barındırıyor ve oradaki sayıda veri boyutunu belirliyor, 0 olursa da koşul olmuş oluyor.
tmm ama bu veri nerden geliyor bu veri ne nasıl bilebiliriz,
mesela;
Çünkü orası kontrol yapılan blok değil, şifrenin tutulduğu blok.
Blok içinde ch->ReqSafeboxLoad(arg1); diye bir gönderme var.
İşleme alınan şifreyi doğrudan buraya gönderiyor.
char.cpp:
OnSafeBoxError kısmı game.py içindedir ve "Yanlış şifre girdin." hatasını gösterir.
Yani arg mevzusu, kullanım amacına göre farklılık gösterebilir.
Bir önceki mesajımdaki örnek, sadece oyuncudan alınan verilerin karakter(string) kontrolünü sağlıyordu.
Ancak depo şifresi gibi spesifik durumlarda, veritabanı kontrolü gibi kontroller yapıldığı için paketler de olaya dahil oluyor ve kullanım değişebiliyor.
Çünkü orası kontrol yapılan blok değil, şifrenin tutulduğu blok.
Blok içinde ch->ReqSafeboxLoad(arg1); diye bir gönderme var.
İşleme alınan şifreyi doğrudan buraya gönderiyor.
char.cpp:
OnSafeBoxError kısmı game.py içindedir ve "Yanlış şifre girdin." hatasını gösterir.
Yani arg mevzusu, kullanım amacına göre farklılık gösterebilir.
Bir önceki mesajımdaki örnek, sadece oyuncudan alınan verilerin karakter(string) kontrolünü sağlıyordu.
Ancak depo şifresi gibi spesifik durumlarda, veritabanı kontrolü gibi kontroller yapıldığı için paketler de olaya dahil oluyor ve kullanım değişebiliyor.
Cevaplar için teşekkürler kafamda bir şeyler oluştu ama tam da anlayabildim diyemem dingin kafayla sabah bir daha bakıcam şuan kafam almıyor .
Mesela bu argüman kontrolünü yaptırmazsak ne olabilir? bug yapılıp oyunun hata verip ch kapatmasına vs. sebep olurmu?(paylaştığım sistemlerde kullanmam gerekiyormuydu acaba )
Bu buf[32] larda argümanmı oluyor yoksa onlar daha başka bir şeymi?
mesela zen fasülyesinde(70103) buf kullanılmamış ama derece meyvesinde(71107) kullanılmış ikiside aynı işe yarıyor neden birinde kullanırken diğerinde kullanmamışlar ki? Ve ben kendi paylaştığım Derece Meyvesi Sistemi 'nde buf kullanmalımıyım?
Bu tür geçici depolama alanlarının kullanılması veya kullanılmaması kişiye ve yapılan işleme göre değişir. O yüzden "kullanmalı mıyım?" vb sorular cevapsız kalır.
Bu kısımda item2->GetID() verisi "%u" türüne dönüştürülür ve dönüştürülürken sizeof (buf) ile overflow kontrolü yapar. Bir sıkıntı yoksa dönüşümü yapar ve item2->GetID() değerini, "%u" türünde buf belleğine atar.
Bu şekilde buf olmadan, doğrudan GetID değerini de gönderebilirdik diye düşünülebilir. Ancak bu sefer beklenen metinsel veriyi değil doğrudan tam sayı gönderilmiş olacak ve bu da sorunları beraberinde getirecek.
item2->GetID() verisi gördüğüm kadarıyla DWORD türünde tanımlanmış. Ancak hem ItemLog fonksiyonu, hem de MySQL bu veriyi NULL olmaması şartıyla beraber unsigned int türünde bekliyor. Dolayısıyla burada böyle bir kodun kullanılması da gayet normal olmuş.
Aslında kodların gittiği yönü takip ederek cevaplar rahatlıkla görülebiliyor.