Merhaba,
Şurada (http://ddili.org/forum/thread/931) başlayan bir tartışma, beni bir bug macerası (http://ddili.org/forum/thread/932)nın öğrettiği bilgiler ile tanıştırdı. Belki std.array içinde benzer algoritmalar vardır. Ancak bir şeyi kendin yapma, keşfetme ve öğrenme gibisi yok. İşte başlığın konusu olan kod:
import std.stdio;
auto araBul(char[] kaynak, string aranan) {
size_t dizin;
char[] dilim;
while(dizin < kaynak.length-aranan.length) { // kaynak'ın sonuna kadar aranan'ı bul
dilim = kaynak[dizin..dizin+aranan.length];
if(dilim == aranan) return dilim; // bulduysa bu dilim'i aktarır,
++dizin;
}
return null; // bulamadıysa boş döndür...
}
void birebirAktar(T)(T[] hedef, T[] aktar) {
size_t SINIR = hedef.length <= aktar.length ?
hedef.length-1 : // hedef büyükse =>
aktar.length-1;
while(SINIR+1) {
hedef[SINIR] = aktar[SINIR];
SINIR--;
}
}
int main() {
char[] deneme = "C Dili".dup;
deneme.writeln; // C Dili
//araBul(deneme, "Dil") = "Pir".dup;/* TOGGLE CODE
birebirAktar!char(araBul(deneme, "Dil"), "Pir".dup);//*/
deneme.writeln; // C Piri
birebirAktar!char(araBul(deneme, "C"), "D".dup);
deneme.writeln; // D Piri
return 0;
}
Çıktısı:
'C Dili
C Piri
D Piri
'
Ancak bir sorun daha var! O da 'birebirAktar()' isminde bir işleve ihtiyaç duymam. Çünkü doğrudan eşitleyince gizlediğim satırın "'...is not an lvalue'" hatasını veriyor. Aşağıdak şekilde de denediğimizde, aslında dilim başka bir bellek bölgesini (.dup olan yeri) gösterdiği için bir işe yaramıyor. Başka çözüm bilen var mı?
auto dilim = araBul(deneme, "Dil");
dilim = "Pir".dup;
Teşekkürler...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]