C Lua: Functions
Kaynaklar
İkili modüller oluşturmak için IDE'nizi henüz kurmadıysanız, aşağıdaki sayfalardan birine bakın:
- İkili Modüller Oluşturma: Premake (Önerilir)
- İkili Modüller Oluşturma: CMake
- İkili Modüller Yapmak İçin Visual Studio'yu Ayarlama (Kullanımdan Kaldırıldı)
Daha önce hiç C++ kullanmadıysanız, temel bilgileri edinmenize yardımcı olacak bir eğitim mevcuttur.
Lua C API Dokümantasyonu, Lua'nın C API'sini anlamak için son derece faydalı bir kaynaktır.
Ek faydalı fonksiyonlar için LuaBase.h dosyasına başvurabilirsiniz.
Gezinme
Bu, daha kolay gezinmenizi sağlamak için bu sayfadaki tüm bölümleri içeren bir listedir.
- Yığınları (stack) anlama
- Lua için C++ fonksiyonları oluşturma
- C++ İçinde Lua Fonksiyonu Çağırma
- Bir Lua Tablosu Üzerinde Yineleme.
- Okunabilirlik ve kolaylık için C++ fonksiyonları oluşturma
- Userdata ve metatablolar hakkında bir not
Yığınları (stack) anlama
Lua'nın C API'si yığınlar (stack) üzerine kuruludur ve bunları anlamak kritik öneme sahiptir.
Yığın, kendisine elemanların "pushed" (itilebildiği) ve ondan "popped" (çekilebildiği) bir tür dizidir.
Bir elemanı itmek (pushing) onu yığının en üstüne koyarken, yığından çekmek (popping) en üstteki elemanı kaldırır.
Yığınların kısıtlayıcı doğasını atlayarak, yığındaki belirli konumlara değer eklemek ve kaldırmak için Remove ve Insert fonksiyonlarını kullanmak da mümkündür, ancak bunları idareli kullanmalısınız.
Yığın konumlarını alırken sık sık negatif sayılar göreceksiniz. 1 yığının en altını veya ilk elemanı ifade ederken, -1 yığının en üstünü veya son/en yeni elemanı ifade eder. -1 genellikle yığının en üstüne yeni itilmiş değeri almak için kullanılır. -2 en üstten ikinci veya sondan ikinci değeri alır.
Lua'nın C API'sindeki belirli fonksiyonların yığınla potansiyel olarak beklenmedik şekillerde etkileşime girdiğini ve hatalarla karşılaşıp yığının takibini kaybederseniz, kullandığınız fonksiyonları araştırmanız gerektiğini unutmamak önemlidir.
Güçlü bir örnek Call fonksiyonudur. C API'sinden bir fonksiyonu çağırmak, fonksiyonu ve her argümanı yığından çeker (pop).
Aşağıdaki kod parçacığı math.floor(5.6) fonksiyonunu çağırır ve geri dönüş değerini bir double MyDouble içinde saklarken, mevcut yığının bir görselleştirmesini tanıdık bir dizi formatında yorum olarak gösterir:
Lua için C++ fonksiyonları oluşturma
Lua için C++ fonksiyonları yapmak, ikili dosyalarınız (binary) için kesinlikle gereklidir. Bu olmadan, modülleriniz o kadar da kullanışlı olmaz. Bu bölümde, Lua'da kullanılmak üzere C++'da fonksiyonlar oluşturmayı, argümanları kontrol etmeyi ve değerleri döndürmeyi ele alacağım.
Fonksiyonumuzu C++'da Tanımlama
Yapacağımız ilk şey C++ fonksiyonumuzu tanımlamaktır.
Şimdi boş bir fonksiyonumuz olduğuna göre, bir değer döndürmesini sağlayalım. Bunu yapmak için yığına bir şey iteriz ve ardından döndürmek istediğimiz değer sayısını geri döndürürüz. Yani bu durumda bir bool, true, iteceğiz ve sonra 1 döndüreceğiz.
Şimdi bu fonksiyonu Lua'da çağırsaydık, ki henüz yapamayız çünkü sadece C++'da tanımladık, o zaman her zaman true döndürürdü.
Pekala, şimdi nasıl çalıştığına dair temel bir anlayışa sahip olduğunuza göre, onu daha karmaşık hale getirelim. Bir parametre ekleyelim ve belirli bir değerin üzerindeyse true, aksi takdirde false döndürelim.
C++ Fonksiyonumuzu Lua'da Tanımlama
Şimdi fonksiyonumuzu oluşturduğumuza göre, onu Lua'da çağırmanın bir yoluna ihtiyacımız var. Bu kolay kısım.
Bu, Lua'daki "MyFirstFunction" değişkenini C++'daki "MyFirstFunction" fonksiyonuna ayarlar, böylece Lua'da şu şekilde çağırabilirsiniz:
C++ İçinde Lua Fonksiyonu Çağırma
Lua C kullanarak Lua fonksiyonlarını nasıl çağıracağınızı bilmek çok faydalıdır. Bu bölümde, fonksiyonları çağırmayı ve geri dönüş değerlerini almayı ele alacağım. Şimdi Call'un nasıl çalıştığına dair kısa bir açıklama. Aşağıdakini yapsaydım:
O zaman fonksiyonumu 0 argümanla çağırır ve bir geri dönüş değeri almazdı. Bir sonraki örnek 1 argümanla çağırır ve yine geri dönüş değeri almazdı:
Bir sonraki örneğim 3 argüman geçirir ve 1 geri dönüş değeri alırdı:
Son olarak son örneğim 2 argüman geçirir ve 4 geri dönüş değeri alırdı:
Call ve PCall
Call ve PCall arasındaki tek fark, PCall'un korumalı çağrı (protected call) anlamına gelmesidir. Başka bir deyişle, bir şeyler ters giderse, PCall panik yapmaz ama Call yapar. Dolayısıyla argümanlarınız sabit değilse PCall kullanmak iyi bir alışkanlıktır, ancak bu örneklerde Call kullanacağız.
Global Tablodan Çağırma
Yani global tablodan çağırma muhtemelen en çok kullanacağınız şeydir. Global tablodan çağırmak çok basit ve kolaydır. Sadece çok güzel görünmüyor.
Bu, konsola "Swag" çıktısı verirdi. Aşağıda birden fazla argüman kullanma örneği bulunmaktadır.
Bu, konsola "Swag 1337" çıktısı verirdi. Aşağıda sözde-pratik bir kullanım örneği bulunmaktadır.
Birden fazla fonksiyon çağırmak isteseydiniz, aşağıdakini yapardınız:
Argüman Olarak Geçirilen Fonksiyonları Çağırma
Argüman olarak geçirilen fonksiyonları çağırmak çok faydalıdır. Başka bir bölümde bir fonksiyonu nasıl saklayacağınızı ve daha sonra nasıl çağıracağınızı ele alacağım, ama şimdilik temel bilgilerle başlayacağız.
Şimdi Lua'da aşağıdaki gibi bir şey yapsaydınız, konsola "Hey... swag swag swag swag" çıktısı verirdi.
Geri Dönüş Değerini Alma
Yani fonksiyonları nasıl çağıracağınızı biliyorsunuz, sadece geri dönüş değerini nasıl alacağınızı bilmiyorsunuz. Bunu sizin için düzelteceğim. Aşağıda math.abs'in geri dönüş değerini alma örneği bulunmaktadır:
Şimdi iReturnValue içinde math.abs( -666 ) fonksiyonunun geri dönüş değerine sahibiz. Yani iReturnValue 666'ya eşittir. Aşağıdaki örnekte, math.abs( 1337 ) sonucunu alıp konsoluma yazdırıyorum.
Bu, konsoluma "666" çıktısı verirdi.
Bir Lua Tablosu Üzerinde Yineleme.
Bir noktada, LUA'dan geçirilen bir tablo üzerinde yineleme yapmak isteyeceksiniz. Bunu yapabileceğiniz yollardan biri aşağıda gösterilmiştir.
LUA->GetString çağırmak bir bellek sızıntısına neden olur!Okunabilirlik ve kolaylık için C++ fonksiyonları oluşturma
Dahili olarak, LUA_FUNCTION() LUA değişkenini ortaya çıkaran ve içerdiği fonksiyonu Lua ile kullanılmak üzere hazırlayan bir makrodur.
Yalnızca C ortamında var olan fonksiyonlar oluşturmak için bu LUA değişkenini kendi fonksiyonlarımıza geçirebiliriz.
Bir fonksiyon aşağıdaki gibi tanımlanabilir:
...ve sonra bir LUA_FUNCTION veya hatta GMOD_MODULE_OPEN içinden çağrılabilir:
Verimlilik için, fonksiyonlarda ne zaman inline kullanılacağını anlamak önemlidir.
Userdata ve metatablolar hakkında bir not
Userdata ve metatablolar Garry's Mod'da farklı şekilde ele alınır. Bu, motorun userdata türünü çok daha hızlı belirlemesine yardımcı olur.
Önce metatablonuzu oluşturun (ideal olarak GMOD_MODULE_OPEN içinde), ardından ona bir referans oluşturun ve bunu global olarak bir değişkende saklayın.
Userdata'nızı yığına itmek için:
Userdata'nızı yığından almak için:
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord