Yeni MQL4 sözdizimi - sayfa 3

 

int, uint, char, short ushort vb. değişken türleri hakkında bir sorum var. Yeni derleyici, tür dönüştürme nedeniyle olası veri kaybı hakkında uyarılar veriyor, bu nedenle en iyi uygulama;

a) değişkenin gereksinimlerine en uygun olanı kullanın veya,

b) türler arasında dönüşüm yapmaktan kaçının ve bu nedenle her şey için int kullanın. (pekala, kayan noktaya ihtiyaç duymayan her şey)

 
SDC :

int, uint, char, short ushort vb. değişken türleri hakkında bir sorum var;

a) değişkenin gereksinimlerine en uygun olanı kullanın veya

b) türler arasında dönüşüm yapmaktan kaçının ve bu nedenle her şey için int kullanın. (pekala, kayan noktaya ihtiyaç duymayan her şey)

İmzasız bir uzunluğa ihtiyacınız varsa, bir int onu kesmez. . . doğru türü ve açık tür dönüştürmeyi kullanın. IMO
 

açık tür dönüştürme ile, farklı türler arasında herhangi bir hesaplama yapmadan önce dönüştürmeyi mi yapmak istiyorsunuz?

 
RaptorUK :
İmzasız bir uzunluğa ihtiyacınız varsa, bir int onu kesmez. . . doğru türü ve açık tür dönüştürmeyi kullanın. IMO

Katılıyorum.
 
SDC :

açık tür dönüştürme ile, farklı türler arasında herhangi bir hesaplama yapmadan önce dönüştürmeyi mi yapmak istiyorsunuz?

Buraya bakın: https://www.mql5.com/en/docs/basis/types/casting
 

Güzel yazı teşekkürler angevoyageur işten eve gidince düzgünce okuyacağım.

 
SDC :

açık tür dönüştürme ile, farklı türler arasında herhangi bir hesaplama yapmadan önce dönüştürmeyi mi yapmak istiyorsunuz?

Hayır, yani bir ulong'u böyle bir int'ye dönüştürebilirsiniz. . .

 ulong VariableUlong;

int VariableInt;

VariableUlong = 100 ;

VariableInt = ( int ) VariableUlong;   // explicit typecasting . . .   
 

Tamam evet demek istediğini düşündüm.

Ama gerçekten ulong hakkında soru sormadım. 32 bitlik bir tamsayı tarafından karşılanamayacak kadar büyük değerlerle çalışmam gerekirse, nadiren olurdum. 64 bit bir tamsayının lol tutabileceği sayıyı nasıl söyleyeceğimi bile bilmiyorum ...

Muhtemelen daha spesifik olmam gerekirdi, bu sabah sorumu düzgün bir şekilde yazacak vaktim olmadı ama şimdi evdeyim, yapacağım.

Eski mql4'te her şey için tamsayı kullanırdık. for(int i=0; i<100; i++) yazardık Negatif değerlere ihtiyacımız yok ve 100'den büyük bir değere ihtiyacımız yok, bu yüzden bunun için bir uchar kullanabiliriz. Bu, yapmamız gereken şeyin bu olduğu anlamına mı geliyor?

Diğer programcıların kodlarına baktığımda, birçoğunun pano genelinde 32 bit tamsayı türleri kullandığı görülüyor. Bunun için geçerli bir sebep var mı? Benim henüz öğrenemediğim ne biliyorlar? Bir program boyunca en küçük ayak izine sahip değişken türlerini kullanmak, dosya boyutunun biraz daha küçük olması dışında hiçbir neden olmaksızın tiplendirme sorunlarının baş ağrısına neden olur mu? Yoksa çok fazla RAM tasarrufu mu sağlıyor? Bir türün değeri başka bir tür tarafından karşılanabildiği sürece, bunu yapmanın uygun olduğunu varsaymak güvenli midir? Farklı türler arasında yazım yapmak, aynı türü kullanmaktan çok daha fazla CPU kullanıyor mu?

Güncelleme: Bunu araştırıyordum stackoverflow.com'da benzer bir soruya verilen bu yanıtı okudum

"Performans açısından, bir int neredeyse her durumda daha hızlıdır. CPU, 32 bit değerlerle verimli çalışacak şekilde tasarlanmıştır.

Daha kısa değerlerle başa çıkmak karmaşıktır. Tek bir baytı okumak için, örneğin, CPU'nun onu içeren 32 bitlik bloğu okuması ve ardından üstteki 24 biti maskelemesi gerekir.

Bir bayt yazmak için, hedef 32-bit bloğu okuması, istenen bayt değeriyle alttaki 8 bitin üzerine yazması ve 32-bit bloğun tamamını yeniden yazması gerekir.

Uzay açısından, elbette, daha küçük veri türleri kullanarak birkaç bayt tasarruf edersiniz. Bu nedenle, birkaç milyon satırlık bir tablo oluşturuyorsanız, daha kısa veri türleri dikkate alınmaya değer olabilir. (Aynı şey, veritabanınızda daha küçük veri türleri kullanmanız için de iyi bir neden olabilir)

Ve doğruluk açısından, bir int kolayca taşmaz. Değerinizin bir bayta sığacağını düşünüyorsanız ve daha sonra gelecekte bir noktada kodda zararsız görünen bir değişiklik, daha büyük değerlerin koda kaydedileceği anlamına gelirse?

Bunlar, tüm integral veriler için int'nin varsayılan veri türünüz olmasının nedenlerinden bazılarıdır. Yalnızca makine baytlarını gerçekten depolamak istiyorsanız bayt kullanın. Yalnızca, aslında 16 bit tamsayı değerlerini belirten bir dosya biçimi, protokol veya benzeriyle uğraşıyorsanız, şort kullanın. Genel olarak tamsayılarla uğraşıyorsanız, onları ints yapın."

 
SDC :

Tamam evet demek istediğini düşündüm.

Ama gerçekten ulong hakkında soru sormadım. 32 bitlik bir tamsayı tarafından karşılanamayacak kadar büyük değerlerle çalışmam gerekirse, nadiren olurdum. 64 bit bir tamsayının lol tutabileceği sayıyı nasıl söyleyeceğimi bile bilmiyorum ...

Muhtemelen daha spesifik olmam gerekirdi, bu sabah sorumu düzgün bir şekilde yazacak vaktim olmadı ama şimdi evdeyim, yapacağım.

Eski mql4'te her şey için tamsayı kullanırdık. for(int i=0; i<100; i++) yazardık Negatif değerlere ihtiyacımız yok ve 100'den büyük bir değere ihtiyacımız yok, bu yüzden bunun için bir uchar kullanabiliriz. Bu, yapmamız gereken şeyin bu olduğu anlamına mı geliyor?

uchar - İmzasız Karakter, bunu neden bir döngü için kullanasınız? bana mantıklı gelmiyor. . . bir int kullanın. Ulonglarla çalışacaksınız, yeni bir tarihsaati budur. . . ve gelecekte hiç düşünmeden daktilo yazdığınızda uyarılacaksınız. . . uyarıyla ilgilenin veya görmezden gelin. Yine de en iyisini ummayın, şimdi yaptığınız gibi yapın, öğrenin ve anlayın.

Stackoverflow'tan gönderdiğiniz şeyler bana mantıklı geliyor, bence bu iyi bir tavsiye.

 
SDC : Farklı türler arasında yazım yapmak, aynı türü kullanmaktan çok daha fazla CPU kullanıyor mu?

Farklı boyutlar arasında çok daha fazla değil, daha fazla CPU kullanılır. Bir yapıdaki char'ı değiştirirken bahsedilen 32 bit getirme, ayırma, çalıştırma, yerleştirme, yazma gibi sadece farklı komutlar. Tıpkı 0,5 ile çarpmak gibi, 2,0 ile bölmekten biraz daha az CPU kullanır

GB makinelerde dizi elemanı başına 16 bit kaydetmek mantıklı değil, bunu uygulama, veritabanı, GUI (vt100) 8 KB (sic.) uyguladığımda yaptım (sic.) 128 bit platformlar yaygın olana kadar mantıklı.

İmzalı ile imzasız arasında fark yoktur. Bu sadece bir görevdir, hiçbir bit değiştirilmez. Fark, değişkeni kullanan koddur. Örneğin A[index], artının işaretli veya işaretsiz bir ekleme olduğu Address(a) + index * sizeof(a[0]) işlevini yapar.

Kodlama netliği için, A[-1] hiçbir anlam ifade etmediğinden dizileri indekslemek için uint kullanırdım ama sonra geri sayım sorunlu FOR(uint iA=n; iA >= 0; iA--){} iA>=0 herzaman doğru.

Başka nedenlerle gerekmedikçe int (veya uint) kullanın.