Çaydanlıktan gelen sorular - sayfa 125

 
MetaDriver :

Ah, şimdi anlaşıldı.

Renat, teklifim uzun zamandır olgunlaşıyor, sadece konuyla ilgili. Lütfen diziler için, en azından statik olanlar için adlandırılmış yazım yapın (diğer tüm türler için zaten var).

Örneğin, beyan etme yeteneği: typedef Int8 = int[8]; .

Bu, yapılar aracılığıyla kolayca yapılır. Olayları birdenbire karmaşıklaştırmayalım.

 struct Int8 { int arr[ 8 ]; };
 
Renat :

Bu, yapılar aracılığıyla kolayca yapılır. Olayları birdenbire karmaşıklaştırmayalım.

Pekala, incin. Kolayca. Öyle yapıyoruz! İhtiyacı olan tek ben miyim?? Düz zeminde??

Sizin Occam'ınızın usturası ile bizim (kullanıcının) Occam'ın usturasının tamamen farklı iki ustura olduğunu düşünmüyor musunuz? Minimalizminizle , kullanıcılar arasında o kadar aşırılıklar yaratmaya meyillisiniz ki, Ockham'ın kendini en yakındaki çite asması doğru.

Basitlik konusunda endişeniz varsa - o zaman sıradan alt dizileri işlevlere geçirmeyi mümkün kılın! Herkes iyi olacak ve minimalistler mutlu olacak.

// bu arada dördünde çok iyi çalışıyor. Dinamik için dahil. :)

 
Renat :
Kesinlikle statik.
İyi. Kontrol için geç kaldım :/
 
MetaDriver :

Pekala, incin. Kolayca. Öyle yapıyoruz! İhtiyacı olan tek ben miyim?? Düz zeminde??

Benim tarafımdan sunulan yapıların varyantı, yeni varlıklar yaratmanın standart bir olasılığıdır.

Birdenbire heyecanlanmaya gerek yok.

 
MetaDriver :

Şimdi mql5'te alt dizileri fonksiyonlara geçirmenin imkansızlığından dolayı bir çok gereksiz hareketler yapmak ve çarpık kodlar yazmak zorunda kalıyorsunuz.

MQL5'te tamamen yasak olan kontrolsüz bellek parçalarına yönelik işaretçilerden bahsediyorsunuz.

MQL5'te her nesne/tip kontrol edilmelidir - bu, dilin güvenliği için doğrudan bir gerekliliktir.

Bir dizinin bir bölümünü iletmeniz gerekiyorsa, dizinin kendisine ve dizideki konumuna bir başvuru iletmeyi kullanın. Böylece dizinin kendisi üzerinde tam kontrol çalışacaktır.

 
Renat :

1. MQL5'te tamamen yasak olan, kontrolsüz bellek parçalarına yönelik işaretçilerden bahsediyorsunuz.

MQL5'te her nesne/tip kontrol edilmelidir - bu, dilin güvenliği için doğrudan bir gerekliliktir.

2. Dizinin bir bölümünü iletmeniz gerekiyorsa, dizinin kendisine ve dizideki konuma bir başvuru aktarımını kullanın. Böylece dizinin kendisi üzerinde tam kontrol çalışacaktır.

1. Bu yüzden bir adlandırma ve bu nedenle zor bir yazım eklemeyi önerdim. Ayrıca, bu, nominal tiplemenin kapsamadığı tek yerdir, bu nedenle dil varlıklarının evrenselleştirilmesi ideolojisine iyi uyum sağlar.

2. Ben de aynısını yapıyorum. Hepsi aynı: birincisi, çarpık, ikincisi, asla evrensel değil. Yapıları gereksiz yere yeniden yazmadan ve sarmadan iki boyutlu bir mql dizisini OpenCL arabelleğine kopyalamanın bir yolu ( 1 ). Veya ( 2 ) tek boyutlu olmayan diziler için (hız amacıyla) kendi ArrayCopy(..) işlevinizi kullanarak.

// Önceki gönderinin sertliği için özür dilerim. Gerçekten gereksiz. "Hadi karmaşıklaştırmayalım" konusunda heyecanlı. Çünkü bu sadece zorluklara yol açar.

2a. Çoğu durumda, ArrayCopy() gibi işlevler için "tek boyutlu kısıtlamanızın", yorumlardaki tek bir temel sorumluluk reddi ile ağrısız bir şekilde gevşetilebileceğini düşünüyorum: "İşlev ayrıca , tüm çok boyutlu dizinin kopyalanması koşuluyla çok boyutlu dizilerle de çalışır."

Birçok sorun ortadan kalkacaktı. // Ama elbette hepsi değil.

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
MetaDriver :

1. Bu yüzden bir adlandırma ve dolayısıyla zor bir yazım eklemeyi önerdim. Ayrıca, bu, nominal tiplemenin kapsamadığı tek yerdir, bu nedenle dil varlıklarının evrenselleştirilmesi ideolojisine iyi uyum sağlar.

Korkarım ki açıklamanın tesadüfünü fark etmek istemediniz:

typedef Int8 = int [ 8 ];
struct    Int8 { int arr[ 8 ]; };

İkinci seçenek çok daha temiz, daha güçlü ve daha kontrol edilebilir. Mevcut yöntemle daha zayıf başka bir varlık icat etmek için hiçbir neden yoktur.

2. Ben de aynısını yapıyorum. Hepsi aynı: birincisi, çarpık, ikincisi, asla evrensel değil. Yapıları gereksiz yere yeniden yazmadan ve sarmadan iki boyutlu bir mql dizisini OpenCL arabelleğine kopyalamanın bir yolu ( 1 ). Veya ( 2 ) tek boyutlu olmayan diziler için (hız amacıyla) kendi ArrayCopy(..) işlevinizi kullanarak.

Birincisi, eğri değil. İkincisi, güvenlik, doğrudan kontrolsüz bellek erişimi tarzında herhangi bir optimizasyon yönteminden daha yüksektir. Yani, "bir ikili bloğu doğrudan kontrol edilen bir varlığa nasıl dökebilirim" sorusu, yönetilen diller için genel ve temel (zayıf çözülmüş) bir sorudur.

Farklı sistemler arasında (OpenCL'de) dizi geçişi ile uğraşmanız gerekiyorsa, basit ve doğrudan uyumlu bir veri yapısı düşünmek önemlidir.

Veri aktarımının rahatlığı için, CLBufferWrite işlevlerinin çoklu tip bağlaması ile en basit sınıfa bakın.

Dosyalar:
 
Renat :

MQL5'te tamamen yasak olan kontrolsüz bellek parçalarına yönelik işaretçilerden bahsediyorsunuz.

Ve bu arada, yoğunlaşıyorsun. Derleyici, parametreyi geçirme noktasında, geçirilen dizinin boyutunu çok iyi bilir.

Hatta denerken hata veriyor. :) Başka bir şey de, her bir işlev çağrısına ek örtük parametreleştirme eklemek gerekecek olmasıdır (yaklaşık olarak bana açıkça yapmamı önerdiğiniz gibi). Ancak sizin tarafınızdaki çözüm çok daha evrensel olacaktır - örneğin, kendi standart işlev ve nesne kitaplığınızı kullanmak. Aynı ArrayCopy() ve FileWriteArray() sorunsuz çalışır.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
papaklass :
Benim gibiler için açıklamalarınıza basit örneklerle eşlik edebilirsiniz. MetaDriver sizi anlıyor ama benim gibi insanlar, örneksiz, neden bahsettiğimizi anlamıyor mu? Ve neler olduğunun farkında olmak istiyorum.

Korkarım bu, belgelerin yerini alacak. Aramaya bakın - sadece bir ton bilgi var.

Bazı dizi üyelerine güvenli erişim:

 void MyFunc( double & array[], uint pos, uint size)
  {
   while (size> 0 )
     {
       Print ( "[" ,pos, "] = " ,array[pos]);
      pos++;
      size--;
     }
  }

Derleyicinin satır içi işlevler için ciddi keskinliği göz önüne alındığında, aslında işlevin tamamen çağrı sitesinde yerleşik olduğu ve tüm genel maliyetlerin sıfıra ineceği ortaya çıkabilir.

Yani, MQL5'te küçük "doğru" işlevler yazmaktan korkmazsınız - bunlar, eşlik eden optimizasyonla birlikte standart tam satır içi kaderine sahiptir.

Bu, parametre geçiş ve indeksleme maliyetlerinin azaldığı anlamına gelir.

 
MetaDriver :

Ve bu arada, yoğunlaşıyorsun. Derleyici, parametreyi geçirme noktasında, geçirilen dizinin boyutunu çok iyi bilir.

Ve ne zamandan beri tüm diziler ve tüm indeksler ve boyutlar da statik hale geldi?

Diziler neredeyse her zaman dinamik olduğundan, dizinler değişken olduğundan, çağrı sırasında ciddi statik kontroller yapılamaz. Geriye yalnızca meta bilgi / rtti'ye dayalı kontroller yapmak kalıyor ve bu nedenle tüm nesneye / açıklamaya erişim sahibi olmak ve bir bellek parçasıyla rastgele çalışmamak çok önemlidir.


Aynı ArrayCopy() ve FileWriteArray() sorunsuz çalışır.

Endişelenme, her şey uzun zamandır düşünüldü.

Koruma ilkelerini ihlal etmenin sonuçlarının çok iyi farkındayız - bu, "Nisan ayında, sanal makineden çıkmanıza ve sistem üzerinde kontrol sahibi olmanıza izin veren 12 kritik hata daha düzeltildi" yoludur.