Salih hocam öncelikle teşekkür ederim.
Alıntı:
>dünyada adeta uzaylı havası hakim...
haklısınız :)
bitderle projesini biraz inceledim ama bit işlemlerine hazır olmadığımı fark ettim :( Bit kavramlarına aşina olmam için biraz daha zaman geçmesi gerekiyor sanıım. (Foruma ilk geldiğimde bana yazdığınız kodları o zaman hiç anlamamam gibi :) ) Biraz vakit alacak ama anlayacağım :)
ve her nedense aşağıdaki kodu yazınca hata veriyor bir bug olabilir.
typeof(bit.xData) searchData = [ 1 ];//, 137, 137, 137, 3, 143 ];
immutable keyword1 = 0b0001;
Alıntı:
>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?
Şu anda dilin hata sınıfı vasat seviyede :) Böyle birşeye kesinlikle ihtiyaç var.
Alıntı:
>Bu arada Zekeriya'nın yazdığını şu şekilde denedim ama bir sonuç elde edemedim. Nerede hata yapıyoruz?
Sanırım biraz hatalı anlattım. Kodu biraz düzenledim. Orada foreach içerisine soktuğumuz s değişkeni aranılan metnin içeriğini tutuyor. Ve tür uyumsuzluğuyla ilgili olarak ilk ve son elemanın adreslerini karşılaştırarak çözüm getirmiştim buna. Belki de bu şekilde yapmak yanlıştır. Gereksiz yere büyük matematiksel işlem yaptırıyoruzdur belki de yaptırmıyoruzdur :) bilemiyorum. Ama şunu itiraf etmeliyim bu konularla uğraştığımdan beri web programcılığı artık ilgimi çekmiyor. Yeni birşey öğrenmek yerine sadece kodunu optimize etmekle uğraşıyorsun ama burada ise bambaşka birşey var :)
import std.stdio;
void main(){
char[] yorumÖrneği2 = cast(char[]) "/* abc */";
string s = "*/";
char* c = yorumÖrneği2.ptr;
char* size = yorumÖrneği2.ptr + yorumÖrneği2.length;//Size değişkeni için en son elemanın adresini aldım
string tmp;
atla:
while(c < size){
foreach(i,l; s){
if(*(c+i) != l) {
tmp ~= *c;
c++;
goto atla;
}
}
c += s.length-1;
goto atla2;
}
atla2:
writeln(tmp);
while(1){}
}
Alıntı:
>bit.xData[++offset1..offset2].ushort2str.writeln;
++ yerine aranılan metnin uzunluğunu toplamak gerekiyor. Aksi takdirde araya gereksiz bir karakter kaçıyor.
Alıntı:
>>
> import std.stdio, std.algorithm;
> import std.datetime;
> import std.string;
>
> class bitDerle {
> // BS (BiR SIFIR ~ One Zero)
> struct BS (data_t = ubyte) {
> data_t[] xData;
>
> immutable bl = data_t.sizeof * 8; // bit length (ubyte => 8)
> immutable lb = (data_t.max / 2) + 1; // last bit (ubyte => 128)
>
> auto mask(data_t rol, data_t lOffset, data_t mLength) {
> auto maske = data_t.max;
>
> maske >>= bl - mLength;
> maske <<= lOffset;
>
> // partial masking (offset/rolling 2/3 => 0b11100111)
> // if (rol) maske = ~maske; // invert mask
> for (; rol>0; rol--) {
> maske <<= 1;
> maske |= 1;
> }
>
> return maske;
> }
>
> auto reverse(data_t n) {
> data_t x = 0;
>
> for(auto i = 0; i < bl; ++i) {
> x <<= 1;
> x += n % 2;
> n >>= 1;
> }
>
> return x;
> }
>
> auto invert(data_t xPattern, data_t pLength = 0) {
> // !!! BAKILACAK !!!
>
> return ~xPattern;
> }
>
> void init(data_t[] data) {
> xData ~= data;
> }
>
> bool read(size_t n) {
> return (xData[n / bl] & (lb >> n % bl)) != 0;/*
>
> if((xData[n / bl] & (lb >> n % bl)) != 0) return true;
> return false;//*/
> }
>
> data_t find(data_t xBit) {
> data_t xHead, xMask, x, xSay = xBit;
>
> for (x = 0; x <= bl; ++x, xSay >>= 1) if (xSay == 0) {
> xMask = mask(0, 0, x);
> for (auto bs = 0; bs < (xData.length * bl); ++bs, xHead <<= 1) {
> if ((xData[bs / bl] & (lb >> bs % bl)) != 0) xHead |= 1;
> xHead &= xMask;
> if (xHead == xBit) return cast(data_t)(bs - x + 1);
> }
> }
>
> return 0; // not found!
> }
>
> data_t write(data_t xOffset, data_t xPattern, data_t pLength) {
> auto pOffset = cast(data_t)(bl - (xOffset % bl)); // pattern offset
> auto sOffset = cast(data_t)(pLength - pOffset); // secondary offset
> auto lOffset = cast(data_t)(bl - sOffset); // left offset
> auto rOffset = cast(data_t)(pOffset - pLength); // right offset
> auto xByte = cast(size_t)(xOffset / bl);
>
> if (xOffset) {
> if (pOffset >= pLength) {
> if (pOffset == pLength) {
> xData[xByte] &= mask(0, pLength, bl);
> xData[xByte] |= xPattern;
> return 1; // shift masking
> } else {
> xData[xByte] &= mask(rOffset, pLength, bl);
> xData[xByte] |= xPattern << rOffset;
> return 2; // rotate masking
> }
> } else {
> xData[xByte] &= mask(0, pOffset, bl);
> xData[xByte] |= xPattern >> sOffset;
>
> xByte++; // next byte...
>
> xData[xByte] &= mask(lOffset, sOffset, bl);
> xData[xByte] |= (xPattern & mask(0, 0, sOffset)) << lOffset;
> return 3; // partial masking
> }
> }
>
> return 0; // no change...
> }
>
> void print(data_t sb, data_t sr = bl) {
> for (size_t i = 0; i < xData.length * bl; i++) {
> if ((i != 0) && (i % sr == 0)) writef("_");
> writef(read(i) ? "1" : "0");
> }
> writef("\n");
>
> for (size_t i = 0; i < sb + (sb / sr); i++) writef("-");
> if (sb) writef("^\n");
> }
> }
> }
>
>
> void a1(){
> auto z = std.string.indexOf("qwe/* abc */qwe", "/*");
> }
> bitDerle.BS!(ushort) bit;
>
> void a2(){
> auto offset1 = bit.find(12074);
>
> }
> // bitDerle sınıfının, BS yapısı, ushort türü ile tanımlanır:
>
> void main() {
> bit.init(str2ushort("qwe/* abc */qwe"));
> writeln(benchmark!(a1,a2)(10_000));
> while(1){
> }
> }
>
> union ushort2char {
> ushort bilgi;
> char[2] p;
> }
>
> auto ushort2str (ushort veri[]) {
> string rslt;
> auto veriler = ushort2char(0);
> // veriyi parçalayıp ters sırada birleştirir:
> foreach(v; veri[]) {
> veriler.bilgi = v;
> rslt ~= veriler.p[1];
> rslt ~= veriler.p[0];
> }
> return rslt;
> }
>
> auto str2ushort (string veri) {
> ushort[] rslt;
>
> for(size_t i; i < veri.length - 2; i+=2) {
> rslt ~= cast(ushort)veri[i] << 8;
> rslt[$-1] |= cast(ushort)veri[i+1];
> }
>
> if(veri.length % 2 == 0) {
> rslt ~= cast(ushort)veri[$-2] << 8;
> rslt[$-1] |= cast(ushort)veri[$-1];
> } else { // veri uzunluğu tek ise son bitleri 0 ile doldur:
> rslt ~= cast(ushort)veri[$-1] << 8;
> }
> return rslt;
> }
> ```
>
Benchmark testi yaptığımda bitDerle biraz yavaş kaldı belki de kodu eniyileştirmek gerekiyordur.
Yazdığım kod da indexOf fonksiyonuna göre yavaş kaldı. (2 kat). Ama aslında sıkıntı bence burada her seferinde tmp ~= *c; kodunun çalıştırılması.
Bir sorum var elimizde 2 tane char* arasında slice yapabilr miyiz? Aslında yapılacak işlem basit gibi görünüyor.
dizi başlangıcı olarak 1.char* daha sonra 2si arasındaki fark çıkartılıp dizi uzunluğu olarak yazılırsa yapılabilir gibi geldi.
Zekeriya
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]