MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 599
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Merhaba!
Lütfen bana imleci nasıl hareket ettireceğimi söyleyin, örneğin bir metin belgesinde 7. satıra, bu konumdan zaten bir alt dize çıkarmak için ...
Hangisi daha hızlı olacak - tek satırlı birçok metin dosyası mı yoksa çok satırlı bir dosya mı?
Bir satırda kaç bayt olduğunu bilmeniz ve işaretçiyi dosyanın başlangıcından itibaren bu tür 6 değerle hareket ettirmeniz gerekir.
Merhaba!
Hangisi daha hızlı olacak - tek satırlı birçok metin dosyası mı yoksa çok satırlı bir dosya mı?
Algoritmanın özel uygulamasına ve çözülmesi gereken soruna bağlıdır. Belki senin durumunda ilk seçenek daha hızlı olacak, ama senin yerinde olsam performansı düşünmezdim.
Lütfen bana imleci nasıl hareket ettireceğimi söyleyin, örneğin bir metin belgesinde 7. satıra, bu konumdan zaten bir alt dize çıkarmak için ...
Standart belgeleri okuyun. " Dosya İşlemleri " bölümü. Örneğin, doğrudan belgelerden bir örnek olan FileReadString'i kullanarak bir dosyayı satır satır okuyabilirsiniz:
Grafikteki fare düğmesini tıklamanın değerini fiyatın değerine nasıl dönüştüreceğimi ya da tam tersini söyle.
Grafikteki fare düğmesini tıklamanın değerini fiyatın değerine nasıl dönüştüreceğimi ya da tam tersini söyle.
ChartXYToTimePrice işlevini kullanın. Belgelerin "Grafik İşlemleri" bölümüne bakın.
ChartXYToTimePrice işlevini kullanın. Belgelerin "Grafik İşlemleri" bölümüne bakın.
Sayesinde.
Böylece CArrayObj ile işleri batırdılar. Bunun yerine: CArrayObj test_objects; Yazdılar: CArrayObj* test_objects , ancak bunun için bir yıkıcı yapmayı unuttular ; Belki de bellek modeli, CArrayObj ile çalışacak şekilde yanlış yapılandırılmıştır. Belki de sadece işaretçiler ile abarttılar. Teşhis kesindir: gerekli olmayanişaretçilerin kullanılması genellikle sızıntılara yol açar.
Bazı sınıflarda bir fonksiyon var. İçinde, bir dizi CArrayObj nesnesi ilan ediyorum. Buna global sınıf nesneleri ekliyorum. İşlev sona erdi, nesne dizisinin kendisine gerek yok. Nesneler, elbette gereklidir.
CArrayObj *test_objects işaretçisi olarak bir dizi oluşturursam, günlükte silinmemiş nesneler alıyorum ve bu da sonunda bellek yetersiz hatasına yol açacaktır.
Bu CArrayObj test_objects gibi bir dizi bildirirsem, ona nesneler eklersem, işlevin sonunda ortaya çıkar ve nesneler erişilemez hale gelir, çünkü nesneler içeren dizi silinmiş gibiydi ...
Bu CArrayObj test_objects gibi bir dizi bildirirsem, ona nesneler eklersem, işlevin sonunda ortaya çıkar ve nesneler erişilemez hale gelir, çünkü nesneler içeren dizi silinmiş gibi görünüyor ...
Bu doğru, çünkü bu durumda, işlevin adres alanına değil, yığına CArrayObj test_objects tahsis ediyorsunuz. Bir işlev çıktığında, CArrayObj test_nesneleriniz de dahil olmak üzere işlevin adres alanının üzerine yazılır.
İşlev sona erdi, nesnelerin dizisine gerek yok. Elbette nesnelere ihtiyaç vardır.
Bir kez ve herkes için unutmayın - eğer CArrayObj içindeki nesnelere ihtiyacınız varsa, o zaman CArrayObj'nin kendisine de ihtiyaç vardır. CarrayObj gerekli sarma. O olmadan hiçbir şey, nokta.
CArrayObj *test_objects işaretçisi olarak bir dizi oluşturursam, günlükte silinmemiş nesneler alıyorum ve bu da sonunda bellek yetersiz hatasına yol açacaktır.
Bu durumda, öbek üzerindeki bazı CArrayObj nesnesine bir işaretçi oluşturulur. Yığın, programın adres alanının, ilgili yeni ve silme operatörlerini kullanarak belleğin manuel olarak ayrıldığı ve silindiği bir bellek bölümüdür. Bu, yeni yazarsanız, bir yerde silmenin ayna ikizi olması gerektiği anlamına gelir. Ayrıca, yeni ve silme, programın farklı bölümlerinde, örneğin farklı yöntemlerde bulunabilir:
Foo_analize çağrıldıktan sonra nesnelere hala ihtiyaç duyuluyorsa, silme operatörü, nesnelerin ihtiyaç duyulacağının garanti edildiği başka bir konuma taşınabilir. Böyle genel bir yer, örneğin program kapanmadan önce çağrılan OnDeinit olabilir.
Ana şeyi unutmayın, eğer yeni bir operatör varsa, bunun için her zaman bir silme operatörü olmalıdır . Aksi takdirde, bellek sızıntıları olacaktır. Aynı nesne üzerinde çalışan yeni ve silme operatörlerinin aynı "yakındaki" yöntemde bulunması gerekmez. Sil, öbek üzerinde tahsis edilen nesneye bir referansı olduğu sürece, belleğin tahsis edildiği yerden uzakta herhangi bir yerde olabilir.
** Yukarıdakilerin doğru olmasına rağmen, bu tür yapılardan kaçınmanın daha iyi olduğunu not ediyorum, çünkü her zaman açık olmayan silme operatörünü nerede ve hangi koşullar altında arayacağınıza her zaman çok dikkatli bakmanız gerekir. Bunun yerine, sadece nasıl kullanılacağını öğrenmeniz gerekir . Sınıf, yeni ve silme operatörlerini kullanmadan öbek üzerindeki nesneleri otomatik olarak ayırmanıza ve silmenize olanak tanır:
Bu sınıf açıkça işaretçiler içermez. Yani hem new hem de delete kullanmanıza gerek yok. Programdan çıktıktan sonra sınıf, tüm CItem ve CArrayObj nesnelerini otomatik olarak yayınlayacak ve bu da geliştiricinin ömrünü büyük ölçüde basitleştirecektir.
Bu doğru, çünkü bu durumda, işlevin adres alanına değil, yığına CArrayObj test_objects tahsis ediyorsunuz. Bir işlev çıktığında, CArrayObj test_nesneleriniz de dahil olmak üzere işlevin adres alanının üzerine yazılır.
Bir kez ve herkes için unutmayın - eğer CArrayObj içindeki nesnelere ihtiyacınız varsa, o zaman CArrayObj'nin kendisine de ihtiyaç vardır. CarrayObj gerekli sarma. O olmadan hiçbir şey, nokta.
Bu durumda, öbek üzerindeki bazı CArrayObj nesnesine bir işaretçi oluşturulur. Yığın, programın adres alanının, ilgili yeni ve silme operatörlerini kullanarak belleğin manuel olarak ayrıldığı ve silindiği bir bellek bölümüdür. Bu, yeni yazarsanız, bir yerde silmenin ayna ikizi olması gerektiği anlamına gelir. Ayrıca, yeni ve silme, programın farklı bölümlerinde, örneğin farklı yöntemlerde bulunabilir:
Foo_analize çağrıldıktan sonra nesnelere hala ihtiyaç duyuluyorsa, silme operatörü, nesnelerin ihtiyaç duyulacağının garanti edildiği başka bir konuma taşınabilir. Böyle genel bir yer, örneğin program kapanmadan önce çağrılan OnDeinit olabilir.
Ana şeyi unutmayın, eğer yeni bir operatör varsa, bunun için her zaman bir silme operatörü olmalıdır . Aksi takdirde, bellek sızıntıları olacaktır. Aynı nesne üzerinde çalışan yeni ve silme operatörlerinin aynı "yakındaki" yöntemde bulunması gerekmez. Sil, öbek üzerinde tahsis edilen nesneye bir referansı olduğu sürece, belleğin tahsis edildiği yerden uzakta herhangi bir yerde olabilir.
** Yukarıdakilerin doğru olmasına rağmen, bu tür yapılardan kaçınmanın daha iyi olduğunu not ediyorum, çünkü her zaman açık olmayan silme operatörünü nerede ve hangi koşullar altında arayacağınıza her zaman çok dikkatli bakmanız gerekir. Bunun yerine, sadece nasıl kullanılacağını öğrenmeniz gerekir . Sınıf, yeni ve silme operatörlerini kullanmadan öbek üzerindeki nesneleri otomatik olarak ayırmanıza ve silmenize olanak tanır:
Bu sınıf açıkça işaretçiler içermez. Böylece hem new hem de delete kullanmanıza gerek kalmaz. Programdan çıktıktan sonra sınıf, tüm CItem ve CArrayObj nesnelerini otomatik olarak yayınlayacak ve bu da geliştiricinin ömrünü büyük ölçüde basitleştirecektir.
Teşekkür ederim. Sadece özel soruma bir cevap bulamadım. Bir işaretçi bildirirsem, silmeyi nereye koymalıyım. İşlevde bildirilen CArrayObj nesnesini tekrar ediyorum... Deinit()'te onu nasıl silebilirim?
Ama önce sorunu şu şekilde çözdüm. İşlev sona ermeden önce:
Teşekkür ederim. Sadece özel soruma bir cevap bulamadım. Bir işaretçi bildirirsem, silmeyi nereye koymalıyım. İşlevde bildirilen CArrayObj nesnesini tekrar ediyorum... Deinit()'te onu nasıl silebilirim?
Burası bir telepat kulübü değil. Kodunuzu eklemediniz, bu nedenle silme işlemini nereye yapacağınızı düşünün.
Doğru değil.