Merhaba
Elimde c adında bir char* var. ve bunun son elemanı da size adında char*.
İsteğim c ile size arasında string find işlemi yapmak. Bunu nasıl yapabilirim
Zekeriya
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Thread overview | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
February 09, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Merhaba Elimde c adında bir char* var. ve bunun son elemanı da size adında char*. İsteğim c ile size arasında string find işlemi yapmak. Bunu nasıl yapabilirim Zekeriya -- |
February 09, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) | Veya başka bir soru sorarsam eğer. Bir for döngüsü içerisinde tek tek karakterleri kontrol ettirmekten bir farkı var mı? Zekeriya -- |
February 09, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | /* yorum alanı */ Ali hocam aslında yapmak istediğim üstteki */ yazan yere kadarki yorum alanı yazısını almak. Bunu her karakteri tek tek kontrol ederek de yapabilirim ama find fonksiyonunu kullanmak kadar hızlı olur mu sorusu kafamı karıştırıyor. Zekeriya -- |
February 09, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Bu konuda sana yardımcı olabilirim. Çünkü bir dönem bitFind üzerinde yoğun bir şekilde çalıştım. Eğer veriyi 2 char olacak şekilde uint dizisi içine yerleştirirsek ben sana çok hızlı bir şekilde /* ile */ ifadelerini temizleyip saf metin olarak geri döndürebilirim. Hocamın dediği gibi denemek lazım...:) Gerçi RegExp var ama hızlı bulursan onu kullanırsın... -- |
February 09, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) |
Ali -- |
February 09, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) | Denemeden bilemeyiz tabii ama senin yöntemin de olur. Sonuçta find da sırayla arıyor. Asıl önemli olan, char'ın UTF-8 kod birimi olduğunu hatırlamak. Eğer yorumlarda ASCII dışında karakter kullanılıyorsa find daha kolay olur. Ali -- |
February 09, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Hocam lexer da birkaç iyileştirme yapıyordum. Bu onun için gerekli oldu.
şeklinde bir kod yazdım. Ne kadar doğrudur ne kadar başarılıdır orasını tartışabiliriz sanırım :) Aranılan metinler
şeklinde oluşturduğum yapıdan geliyor. Alıntı: >Bu konuda sana yardımcı olabilirim. Çünkü bir dönem bitFind üzerinde yoğun bir şekilde çalıştım. Eğer veriyi 2 char olacak şekilde uint dizisi içine yerleştirirsek ben sana çok hızlı bir şekilde /* ile */ ifadelerini temizleyip saf metin olarak geri döndürebilirim. Hocamın dediği gibi denemek lazım... Salih hocam mümkünse bunun basit bir örneğini hazırlayabilir misiniz? Ve bir sorum var üstteki yapıdan daha mı hızlı? Alıntı: >Gerçi RegExp var ama hızlı bulursan onu kullanırsın... Burada RegExp kullanamam maalesef. Zekeriya -- |
February 10, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Talha Zekeriya Durmuş (zekeriyadurmus) | Merhaba Zekeriya, Öncelikle kusura bakma, senin soruyla çok ilgilenemedim ve günün büyük bir çoğunluğu gereksiz işlerle geçti, gitti! Hatta ifadelerin bit karşılıkları aranırken uint türe çevrilmesi gerektiğinden bahsetmiştim; yanılmışım çünkü, 16 bit ushort demek olduğunu bir an için unutmuşum. Şimdi benim şurada bitDerle isminde basit bir proje (http://ddili.org/forum/post/5433) var. Elektronikçi olduğum için bitler ile oynaşmak (evet, oynaşmak!) hoşuma gidiyor. Üniversitede diğer bölümler, bizim bölümdeki arkadaşlar sayısal elektronik sınavlarına çalışıyorlarken (hep 1 ve 0'ları telafuz ettiklerinden!) bir garip bakarlardı. Bu dünyada adeta uzaylı havası hakim...:) Neyse, az önce aşağıdaki çalışan işlevleri pratik bir şekilde yazıp deneme fırsatım oldu. Eniyileştirme (optimization) yapılabilir, hatalar olabilir, hatta işimize yaramayacak kadar kötü ve gereksiz de olabilir! Şimdi senin ve geleneksel sözcük arama yöntemelerini inceleyeceğim. Bakalım bitDerle hızlı bir çözüm olabilecek mi?
Dip Not: Eğer, bitDerle ilgini çekerse ve kullanımı zor gelmezse, lütfen denemelerini yorumÖrneği2 ile yapalım. Çünkü yapının içindeki print() işlevi uzun verilerde işlevsiz kalabiliyor. Tabi konsol ekranını genişletebiliyorsun ama 80 satırlı standartlarda garip gelebilir. Çünkü görsel bir şekilde verinin bulunduğu yeri, alt satırda oklu şekilde gösterebiliyor. Hatta bu sistem script dillerde hatanın olduğu yeri göstermekte çok kullanılır. Belki ileride Rhodeus Script de bu olayı destekler, ne dersin? Başarılar... -- |
February 10, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Tekrar merhaba..:) Şimdi önce D'nin std/algorithm sınıfındaki find işlevlerine bir bakalım. Eğer işimize yarıyorsa, sonrasını gerektiği kadar hızlı mı diye test ederiz, hepsi o kadar...
Yukarıda, herhangi bir yerde çalışabilecek iki işlem görmekteyiz. İşlevler, çokuzlu (Tuples) olarak sonuç döndürüyor ama tıpkı bir diziymiş gibi her bir elemana (string) erişebiliyoruz. Belki tek satırda da yazılabilirdi ama açık şekilde yazarak anlaşılır olmasını istedim. İlk sonuçtan görüleceği üzere, aranan ifade dahil öncesini s1[0]'a bölüyor ki diğer parçası s1[1]'de kalıyor. Böylece kesmek istediğimiz bölümün fazlasıyla birlikte ekranda görüyoruz. Elbette, dilim mahareti ile sondan ikisini kesebilirdik ama aranan metnin boyutlarını ve kesilecek bölümün sonda olup olmadığını bilmiyoruz...:) O halde, ikincisin de bu sefer findSplitBefore()'u kullanarak aranan ifade hariç bir şekilde dizgeyi tekrar bölüyoruz. Bu sefer ilk parçayı aldığımızda istediğimizi elde etmiş oluyoruz. Hızı ne olur, onu bilemiyorum ama ileride alternatiflerini tartışarak anlarız inşaallah. Bu arada Zekeriya'nın yazdığını şu şekilde denedim ama bir sonuç elde edemedim. Nerede hata yapıyoruz?
|
February 10, 2013 char* dizisi içinde find işlemi yapmak | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Sanırım artık teste ve hız karşılaştırmalarına geçebiliriz. Çünkü aynı sonucu (tabi görünüşe göre çok çok fazla basamak ile!) alabiliyorum...:) Aşağıdaki kodun çalışması için bitDerle sınıfı sdb.algorithm içerisine yerleştirilmesi gerekiyor. Ancak dilerseniz sınıfı, main()'nin bulunduğu yere kopyalayabilirsiniz:
Notlar:
-- |