GTAMulti - GTA Türkiye

San Andreas Multiplayer => Yardım Talepleri => PAWN Kodlama => Kilitli Konular => Konuyu başlatan: Murat Budak - 01 Ekim 2021, 21:04:31

Başlık: Foksiyon hatası
Gönderen: Murat Budak - 01 Ekim 2021, 21:04:31
Böyle bir foksiyon yaptım amacım 18000000 değerindeki veya girilen interval değerindeki saat, dakika, saniye süresini yazdırmamdı çalışıyor ama 5:-59:-59 olarak gösteriyor - neden geliyor çözemedim
PAWN Kodu: Seç
stock timerhesapla(timer)
{
    new str[128], l, k, j, i, c;
    j = timer / 3600000;
    i = j * 60;
    k = timer / 60000;
    c = k * 60;
    i -= k;
    l = timer / 1000;
    c -= l;
    format(str, sizeof(str), "%d:%d:%d", j, i, c);
    return str;
}
Başlık: Ynt: Foksiyon hatası
Gönderen: squarepants - 02 Ekim 2021, 16:22:43
Paylaştığınız fonksiyonda 18000000 pozitif tamsayı değeri için çıktı aşağıdaki şekilde olacaktır, herhangi bir işlem hatası yok :
5:0:0Tam olarak kast etmek istediğinizi anlayamadım ancak milisaniye cinsinden girilen bir tamsayı değerini saniye dakika saat gibi zaman birimlerine çevirebilmek için aşağıdaki metodu kullanabilirsiniz :
stock timerhesapla(const Float:ms_timer)
{
    new str[128];
    format(str, sizeof(str), "%f saniye : %f dakika : saat : %f", ms_timer / 1000, ms_timer / 60000, ms_timer / 3600000);
    return str;
}
Değişken veri tipinin Float olmasının nedeni ise girilen her değerin çıktısı tamsayı olmayabilmektedir, örneğin 100 ms için aşağıdaki çıktı karşınıza çıkacaktır :
0.100000 saniye : 0.001666 dakika : saat : 0.000027Bu durumda sonuçlar rasyonel bir ifadeye dönüşmektedir. 18000000 ms için ise aşağıdaki durum söz konusudur :
18000.000000 saniye : 300.000000 dakika : saat : 5.000000
Başlık: Ynt: Foksiyon hatası
Gönderen: Murat Budak - 02 Ekim 2021, 16:39:18
Alıntı yapılan: ThePosition - 02 Ekim 2021, 16:22:43
Paylaştığınız fonksiyonda 18000000 pozitif tamsayı değeri için çıktı aşağıdaki şekilde olacaktır, herhangi bir işlem hatası yok :
5:0:0Tam olarak kast etmek istediğinizi anlayamadım ancak milisaniye cinsinden girilen bir tamsayı değerini saniye dakika saat gibi zaman birimlerine çevirebilmek için aşağıdaki metodu kullanabilirsiniz :
stock timerhesapla(const Float:ms_timer)
{
    new str[128];
    format(str, sizeof(str), "%f saniye : %f dakika : saat : %f", ms_timer / 1000, ms_timer / 60000, ms_timer / 3600000);
    return str;
}
Değişken veri tipinin Float olmasının nedeni ise girilen her değerin çıktısı tamsayı olmayabilmektedir, örneğin 100 ms için aşağıdaki çıktı karşınıza çıkacaktır :
0.100000 saniye : 0.001666 dakika : saat : 0.000027Bu durumda sonuçlar rasyonel bir ifadeye dönüşmektedir. 18000000 ms için ise aşağıdaki durum söz konusudur :
18000.000000 saniye : 300.000000 dakika : saat : 5.000000


Timer ile her saniye
PAWN Kodu: Seç
SoygunData[i][SoygunTimer] -= 1000;1000 ms sildiriyorum bu ve labeli yeniletiyorum label 4:59:59 yani saat:dakika:saniye olarak kalanı göstermesini istiyorum sizin verdiğiniz foksiyon sadece 18000 saniye 300 dakika ve 5 saat gösteriyor yani 5 saatin diğer dilimlere çeviriyor

anlatmak istediğim şey girilen interval değerinin saat:dakika:saniye biçiminde geri saymasını sağlamak
Başlık: Ynt: Foksiyon hatası
Gönderen: squarepants - 02 Ekim 2021, 19:37:51
@_Chucky  Ben sadece metodu ve çalışma prensibini göstermek istedim, oyun modunda kullandığın fonksiyon ve işlevleri hakkında bir kullanım hatası yapıyor olabilirsin. Bu fonksiyonların çalışma prensiplerine göre işlem yapmalısın. Ben kullandığın fonksiyonlar hakkında bilgi sahibi olmadığım için ekstra bir yorum yapamayacağım maalesef.
Başlık: Ynt: Foksiyon hatası
Gönderen: Murat Budak - 02 Ekim 2021, 19:54:18
PAWN Kodu: Seç
stock timerhesapla(const Float:ms_timer)
{
    new str[128];
    format(str, sizeof(str), "%f saniye : %f dakika : saat : %f", ms_timer / 1000, ms_timer / 60000, ms_timer / 3600000);
    return str;
}
Ben bunları bilmesem

PAWN Kodu: Seç
stock timerhesapla(timer)
{
    new str[128], l, k, j, i, c;
    j = timer / 3600000;
    i = j * 60;
    k = timer / 60000;
    c = k * 60;
    i -= k;
    l = timer / 1000;
    c -= l;
    format(str, sizeof(str), "%d:%d:%d", j, i, c);
    return str;
}
Bu foksiyonu nasıl yazabilirdim?

Anlatmak istediğimi ya siz anlamıyorsunuz yada anlatamıyorum.


Girilen interval değerinin kaç saat:dakika:saniye olduğunu hesaplamak için böyle bir foksiyon yaptım çalışıyor doğru gösteriyor ama tek sorun dakika ve saniyenin başlarında - işareti çıkıyor -59, -58, -57 gibi gösteriyor - neden çıkıyor onu çözemedim

(https://media.discordapp.net/attachments/893918534613237811/893932188150665266/unknown.png)
Başlık: Ynt: Foksiyon hatası
Gönderen: squarepants - 02 Ekim 2021, 22:21:49
@_Chucky dediğim gibi fonksiyonunuzda herhangi bir işlem hatası yok ancak her zaman için tutarlı değil. Örneğin 360000 ms değeri için :
j = timer / 3600000; // 0.1 yani 1 / 10 değerini almasi gerekiyor ancak integer veri tipi oldugu için 0 değerini alir
i = j * 60; // 0 * 60 = 0 degerini alir
i -= k; // 0 = 0 - 6 => i degeri -6 degerini alacak.
Bu durumda çıktı aşağıdaki şekilde görünecek :
0:-6:0Bu arada hazırladığınız fonksiyonda gereksiz işlem kalabalığı bulunuyor, bu nedenle daha sağlıklı bir sonuç alabilmek ve dosya boyutunu küçük tutmak için yukarıda vermiş olduğum örnek fonksiyonu kullanabilirsiniz. Eğer sonuçtan ve işleyişten memnunsanız sorunu çözmek için negatif tamsayilari -1 ile çarpmayı deneyebilirsin :
stock timerhesapla(timer)
{
    new str[128], l, k, j, i, c;
    j = timer / 3600000;
    i = j * 60;
    k = timer / 60000;
    c = k * 60;
    i -= k;
    l = timer / 1000;
    c -= l;
    format(str, sizeof(str), "%d:%d:%d", (j < 0) ? (j * -1) : (j), (i < 0) ? (i * -1) : (i), (c < 0) ? (c * -1) : (c));
    return str;
}
Başlık: Ynt: Foksiyon hatası
Gönderen: Murat Budak - 02 Ekim 2021, 22:50:19
Alıntı yapılan: ThePosition - 02 Ekim 2021, 22:21:49
@_Chucky dediğim gibi fonksiyonunuzda herhangi bir işlem hatası yok ancak her zaman için tutarlı değil. Örneğin 360000 ms değeri için :
j = timer / 3600000; // 0.1 yani 1 / 10 değerini almasi gerekiyor ancak integer veri tipi oldugu için 0 değerini alir
i = j * 60; // 0 * 60 = 0 degerini alir
i -= k; // 0 = 0 - 6 => i degeri -6 degerini alacak.
Bu durumda çıktı aşağıdaki şekilde görünecek :
0:-6:0Bu arada hazırladığınız fonksiyonda gereksiz işlem kalabalığı bulunuyor, bu nedenle daha sağlıklı bir sonuç alabilmek ve dosya boyutunu küçük tutmak için yukarıda vermiş olduğum örnek fonksiyonu kullanabilirsiniz. Eğer sonuçtan ve işleyişten memnunsanız sorunu çözmek için negatif tamsayilari -1 ile çarpmayı deneyebilirsin :
stock timerhesapla(timer)
{
    new str[128], l, k, j, i, c;
    j = timer / 3600000;
    i = j * 60;
    k = timer / 60000;
    c = k * 60;
    i -= k;
    l = timer / 1000;
    c -= l;
    format(str, sizeof(str), "%d:%d:%d", (j < 0) ? (j * -1) : (j), (i < 0) ? (i * -1) : (i), (c < 0) ? (c * -1) : (c));
    return str;
}
Eyvallah bu sefer çalıştı.

Bende böyle bir şey yapmıştım :D
PAWN Kodu: Seç
stock timerhesapla(timer)
{
    new str[128], l, k, j, i, c;
    j = timer / 3600000; // 5
    i = j * 60;
    k = timer / 60000; // 300
    c = k * 60;
    i -= k;
    l = timer / 1000; // 18000
    c -= l;

    new q[32], a[32], b[32];
    format(q, sizeof(q), "%d", j);
    switch (strlen(q))
    {
        case 1: format(q, sizeof(q), "0%d", j);
        case 2: format(q, sizeof(q), "%d", j);
    }

    format(a, sizeof(a), "%d", i);
    switch (strlen(a))
    {
        case 1:
        {
            format(a, sizeof(a), "0%d", i);
        }
        case 2:
        {
            format(a, sizeof(a), "%d", i);
            strdel(a, 1, 2);
        }
        case 3:
        {
            format(a, sizeof(a), "%d", i);
            strdel(a, 0, 1);
        }
    }

    format(b, sizeof(b), "%d", c);
    switch (strlen(b))
    {
        case 1:
        {
            format(b, sizeof(b), "0%d", c);
        }
        case 2:
        {
            format(b, sizeof(b), "0%d", c);
            strdel(b, 1, 2);
        }
        case 3:
        {
            format(b, sizeof(b), "%d", c);
            strdel(b, 0, 1);
        }
    }

    format(str, sizeof(str), "%s:%s:%s", q, a, b);
    return str;
}
Başlık: Ynt: Foksiyon hatası
Gönderen: squarepants - 02 Ekim 2021, 23:38:11
Rica ederim, bu arada fazla uzun bir çözüm yolu gibi görünüyor ^.^ Birkaç öneride bulunmak gerekir ise fazladan switch case kullanmamaya calis, 32*3 = 96 hücre her hüce ortalama 4 byte ise 96*4 = 384 byte yer işgal ettiği için fazladan boş hücre bulundurma, birkaç strdel fonksiyonunun hatalı kullanımı (' - ' karakteri her zaman 0. hücrede strdel(str, 0, 1) her durum için çalışır). İyi forumlar dilerim tekrardan ^.^.
Başlık: Ynt: Foksiyon hatası
Gönderen: Murat Budak - 03 Ekim 2021, 00:05:00
Sorun çözüldüğü için konu kilit arşive alınabilir.