Thread overview
İşlev ve çıktılarının kaç byte yer tuttuğunu öğrenebilir miyiz?
Aug 23, 2013
agora
Aug 23, 2013
agora
Aug 23, 2013
agora
Aug 23, 2013
agora
August 23, 2013

Merhaba.

Selam bi işlev yazdım. Şimdi işlev diyorum doğru mu bilmiyorum diğer dillerde metoddu neyse :)

Bu işlevin kaç byte yer tuttuğu öğrenilebiliyor mu? Ayrica bu işlevin verdiği çıktının da?

Örnek olarak

Sifreleme();

adinda bi islevim var. Bu islevin bellektte tuttugu yer ile verdiği çıktının bellekte tuttuğu yer aynı mı?

Örnek Giriş: şlküğipoafc
Çıktısı: n1471065822w011D10BEEE58FCFE0790BB3F03FCF8F39223372036854775808w

Burada 64 karakter var. Bunu 64 karakter'e sabitleyebildim o mutlu etti :)

MD5 128 bit oluyordu sanirim. Su an bu cikti ise MD5 degil kendi uretimim olan bi cikti. Yani bu ciktinin kac bit oldugunu ogrenme sansimiz var mi? Kod bazli yazdirmak mumkun mu? Konsolumda soyle bi durum var

TABLOLAR => KOLONLAR => VERILER => UyeSifresi

UyeSifresi'ne ekleme yapiyorum iste bana MD5, SHA1, TEXT, VARCHAR gibi turler gosteriyorken bir de AGORA yazan bi tur gosteriyor :) Ama ben istiyorum ki bu yazanin yaninda ornegin MD5 => 128 bit, SHA1 => 256 bit, AGORA => 256 bit gibi yazsin kac bit oldugunu bunu da ogrenme sansimiz var mi?

Not duseyim bir de programda isterseniz koskoca makale'nin metnini ekleyin yine de verdigi cikti 64 karakter oluyor :) Sanirim bu da bit anlaminda onu sabitliyor. Ama hala kac bit bi sifreleme oldugunu anlayamadim orada kafami karistirdi.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 23, 2013

Hocam assert isleminde soyle bir hata verdi

test deneme bu metin doğru yazılırsa şifrelenecektir. yani program hata vermezse // eklenen şifrelenmesi gereken mesaj bu. Buyuk ihtimal sizin verdiğiniz işlev örneğindeki gibi belirli bi sabiti belirtmediğimden olabilir.

core.exception.AssertError@main(38): Assertion failure
----------------
0x0040CB1B in onAssertError
0x00402046 in _Dmain at C:\Users\admin\Desktop\NeOss\NeOss\main.d(38)
0x0040CA5C in extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int f
unction(char[][])*).void runMain()
0x0040CA97 in extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int f
unction(char[][])*).void runAll()
0x0040C695 in _d_run_main
0x00409AB4 in main
0x76568543 in BaseThreadInitThunk
0x771EAC69 in RtlInitializeExceptionChain
0x771EAC3C in RtlInitializeExceptionChain

Şu işlemi nasil yapabilirim hemen altta verdiğiniz örnekle mi?

Alıntı:

>

Eğer string ise tam emin olamazsın çünkü işlev farklı sayıda char içeren dizgi döndürebilir. Eğer işlevin hep aynı sayıda char döndürdüğünden eminsen bir kere program başında çağırarak öğrenebilirsin.

Hocam, sizin verdiginiz

char[64] işlev(string giriş)
{
   char[64] sonuç;
   return sonuç;
}

Bu kod ile sanirim ki artik donus degerinin uzunlugu daima 64. Bunu da sizeof ile anliyoruz sanirim. Ben char[64] olarak yapinca tipini bu tip bi hata aldim

C:\Users\admin\Desktop\NeOss\NeOss\utd\crypt.d(0,0): Error: function utd.crypt.Sifreleme has no return statement, but is expected to return a value of type char[64u] (NeOss)

Bu yani ana main dosyasinda olmayan bi islev. crypt.d dosyasindaki bi islev. Islemleri de biraz karisik. Ama islevi 64 olarak sabitleyince bu hata'yi aliyorum

Test surusu

deneme icin bir deger
object.Error: lengths don't match for array copy, 64 = 1
----------------
0x00409C57 in _d_arraycopy
0x00402046 in _Dmain at C:\Users\admin\Desktop\NeOss\NeOss\main.d(34)
0x0040B590 in extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int f
unction(char[][])*).void runMain()
0x0040B5CB in extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int f
unction(char[][])*).void runAll()
0x0040B1C9 in _d_run_main
0x004092A8 in main
0x76568543 in BaseThreadInitThunk
0x771EAC69 in RtlInitializeExceptionChain
0x771EAC3C in RtlInitializeExceptionChain

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 23, 2013

Evet hocam.sizin yazdiginiz asserti kendi islevim icin uygulamistim.

Evet islevin en sonunda return vardi.
Bu kendi yazdigim islevi simdilik kullanmayayim tam manasiyla ogrenince ona gore duzenleyip yeniden yapilandiririm.

Tesekkur ederim hocam :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 23, 2013

evet hocam :-)

return sonuc; olarak vardi sonra herhangi bi islem yapmadan islev bitiyordu

--

AndroForum uygulamasi ile gonderildi

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 23, 2013

Alıntı (agora):

>

işlev diyorum doğru mu bilmiyorum diğer dillerde metoddu neyse :)

Bazı Türkçe belgelerde function'ın karşılığı olarak işlev kullanılıyor; biz de ona karar vermiştik. method'u ise yalnızca üye işlev anlamında duyuyorum ama C++ ve D'de method yerine member function deniyor; onun için ona da üye işlev diyoruz.

Alıntı:

>

Bu işlevin kaç byte yer tuttuğu öğrenilebiliyor mu?

Soruyu öyle okuyunca işlevin kendisinin, yani derlendiği kodların ne kadar yer tuttuğunu sorduğunu sanmıştım. Ama aşağıdakileri okuyunca döndürdüğü değerin büyüklüğünü soruyormuşsun. :)

İşlevin kodları için obj2asm veya başka bir araçla assembly çıktısına bakabilirsin. Şimdi baktım, nm programı da söylüyormuş. Onun çıktısında adı 'işlev' olan bir işlevin 35 bayt yer tuttuğunu öğreniyorum:

'$ nm --print-size deneme.o | grep işlev
0000000000000000 0000000000000035 T _D6deneme6işlevFdZd
'

Oradaki 35 onaltılı, yani asıl uzunluk 3*16+5.

Alıntı:

>

Bu islevin bellektte tuttugu yer ile verdiği çıktının bellekte tuttuğu yer aynı mı?

Aynı değil. İşlev, program işletilmek üzere belleğe okunduğunda belirli bir adrese yerleşiyor ve hep orada duruyor. Döndürdüğü değerler ise her çağrıda program yığıtının o değeri tutmak için geçici olarak ayrılan bir yerine yerleşiyor.

Alıntı:

>

Örnek Giriş: şlküğipoafc
Çıktısı: n1471065822w011D10BEEE58FCFE0790BB3F03FCF8F39223372036854775808w

Burada 64 karakter var.

Onun string (yani char dilimi) olduğunu varsayıyorum:

string işlev(string giriş)
{
   string sonuç = "0123456789";
   return sonuç;
}

Her string nesnesinin uzunluğu aynıdır (.sizeof ile görülebilir). İçerdiği char adedi ise .length ile bilinebilir.

Alıntı:

>

yazsin kac bit oldugunu bunu da ogrenme sansimiz var mi?

Eğer string ise tam emin olamazsın çünkü işlev farklı sayıda char içeren dizgi döndürebilir. Eğer işlevin hep aynı sayıda char döndürdüğünden eminsen bir kere program başında çağırarak öğrenebilirsin.

Başka bir yöntem, char[N] gibi sabit-uzunluklu dizgi döndürmektir:

char[64] işlev(string giriş)
{
   char[64] sonuç;
   return sonuç;
}

İşte şimdi dönüş değerinin uzunluğu her zaman 64 bayttır:

   assert(işlev("merhaba").sizeof == 64);

char[64] öyle çıplak durmak yerine bir yapının parçası da olabilir:

struct Sonuç
{
   char[64] baytlar;
   // ... belki başka üyeler ...
}

Sonuç işlev(string giriş)
{
   Sonuç sonuç;
   return sonuç;
}

Başka çözümler de bulunabilir...

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 23, 2013

Alıntı (agora):

>

Hocam assert isleminde soyle bir hata verdi

Benim yazdığım assert'ten bahsediyorsun, değil mi? string döndüren işleve uygulamadın, değil mi? Çünkü string.sizeof'un 64 döndürmediğini biliyoruz. (Her zaman için tek void* ve tek size_t uzunluğu kadardır.)

Alıntı:

>

C:\Users\admin\Desktop\NeOss\NeOss\utd\crypt.d(0,0): Error: function utd.crypt.Sifreleme has no return statement, but is expected to return a value of type char[64u] (NeOss)

Hata mesajına güvenirsek Sifreleme adlı işlevin içinde return deyimi yokmuş. İşlevin en sonunda da var mı?

Alıntı:

>

object.Error: lengths don't match for array copy, 64 = 1

Bir atama işlemi mi? Dilimlerin uzunluklarının eşit olduklarından emin olmalısın. Bu arada, kendi karmaşık işlevini şimdilik bir kenara bırakıp bu denemeleri küçücük işlevler ve programlarla yapmaya ne dersin? Böylece kodu buraya da kopyalayabilirsin ve hepimiz aynı kodu görmüş oluruz. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 23, 2013

Alıntı (agora):

>

Evet islevin en sonunda return vardi.

Bazen yanlışlıkla garip şeyler yazdığım oluyor. Acaba seninki de 'return sonuç;' yerine tek 'return;' müydü? :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]