Bakıyorum da Sanki Doğrudan kod yazıyoruz yani oturup düşünmüyoruz, veri yapısı nedir, en uygun ne olmalı, bu fonksiyon en optimize nasıl çalışır ?
Evet Dökülelim Bakalım, Zekat Vakti.
"Algoritma bir işin yapılması için gerekli adımların belirlenmesidir" tanımıyla başlayıp programlamada kullanılan iki yaklaşımı yazarak "araştırmak" üzere vereyim.
Algoritmik ve Heuristik.
Muhittin hocam selamlar,
Genellikle Güç elektroniği ile uğraştığımdan ADC/PWM birimlerinin cycle cycle kesme gecikmeleri benim için çok kritik olduğundan daha ortada donanım yokken ben algoritmayı ortaya koyarım. Özellikle bu kontrol (PID - Vector) fonksiyonlarında kritik bir öneme sahip.
Bundan sonra ise donanım uyumlulukları göz önüne alırım. Özellikle işlemciyi ona göre seçerim: ADC biriminin sample işlemi, PWM ile tetiklenebilir olması vb. Buna göre Init. ayarlarını da yaparım.
Daha sonrası ise OKUNABİLİR kod yazımıdır ki burada struct union vb. kavramları önemli bir hal alır.
Mottom şudur, benden başka bir adam da benim projemi ele aldığında commentsiz dahi benim yazılımımı okuyabilmeli.
Bir problemin cozum yolunu adim adim aciklamaya algoritma diyebiliriz.
Algoritma bu haliyle cok yalindir bilimsel tekniklerle (matematik/sayi teorisi/fizik vs) optimize edilir ve ortaya optimize edilmis algoritmalar cikar.
Burada adi gecen problem kuskusuz ciddi problemlerdir. Herkesin cozebilecegi turden problemlerin cozumunu kodlamak basit algoritma yazimidir ve bu cogu zaman heuristik yaklasimla yapilir.
Algoritma yalin haliyle anlasilirdir fakat optimize edilmis algorimalar anlasilirliktan cok uzaktir. Oyle uzaktirki program kodlarinin yanina isterseniz sayfalar dolusu aciklama yapin gene de isin derinlerinde olmayanlar anlayamaz.
Optimize algoritma gelistirmek dahilerin isidir. Akademik calisanlarin adlarini literature gecirdigi turden calismalardir.
Isin icinde hiz varsa algoritma kutuphanelerinde arastirma yapip mevcut algoritmalari kullanmak gerekir. Aksi takdirde ayni isi yapan kodlari yazabilirsiniz fakat hiz acisindan yavas olacaktir.
Heuristik yaklasim acemilerin lojik devre tasariminda izledikleri yaklasima benzer. Sezgiler onplandadir. Sonucta yari senkron yari asenkron bir tasarim ortaya cikar.
Optimizasyon denince aklıma bu geliyor. http://en.wikipedia.org/wiki/Fast_inverse_square_root (http://en.wikipedia.org/wiki/Fast_inverse_square_root)
Tabi bu @z hocanın dedigi gibi üzerinde çalışılarak geliştirilmiş. Bu denli olmasada günlük hayattaki kodları optimize yazmak için donanımı ve programlama dili hakimiyeti ve tecrübe ön plana çıkıyor. Ustadlar burada günlük kod yazımında kullanabilecegimiz basit optimizasyonlardan bashsederlerse faydalı olacaktır.
Kod optimizasyounu ile ilgili göz attığım bazı yazılarda "volatie" karşıma çıkmakta. Nedir bu volatile?
Volatile belirtecini kullanarak, derleyiciye " Sen bu değişkenin değerinin değişmediğini veya değişmeyeceğini zannediyorsun. Ama bu değişkenin değeri senin bilmediğin başka bir yerden değiştiriliyor. Bu yüzden bu değişkeni optimize etmeye çalışma. Gördüğün gibi derle" diyoruz.
Aslinda derleyici biraz akilli olsa kimin volatile olmasi gerektigine kendisi karar verebilir. Butun ipuclari zaten kodlarin icinde var.
Derleyeci kodları hex koduna çevirirken kodu çalıştırıyor mu? Mesela kodda çalışma zamanlı sıfıra bölme hatası varsa derleyici bunu bilecek kabiliyete sahip olabilir mi? En basit durumu
while(1)
{
i--
bolum /= i;
}
Hayır, bu hata derleme sırasında farkedilemez.
İşlemcilerdeki Divison by Zero bayrağı, kesmesi, registeri de işte buna hizmet eder.
Doğru, DZ bayrağı o iş içindir.
volatile derleme esnasında yaptığınız tanımlı bölgeyi "burayı optimize etme, elleşme kardeşim ne görüyorsan öyle compile et" anlamına gelir. Bir adresi değişkene bağlamış olabilirsiniz, konuyla alakalı güzel bir yazı http://ozgurmurat.blogspot.com/2009/05/c-dilinde-volatile-anahtar-kelimesi.html (http://ozgurmurat.blogspot.com/2009/05/c-dilinde-volatile-anahtar-kelimesi.html)
Neyse Devam Edelim.
Algoritmik Yaklaşım: Daha önce test edilip kullanılmış, doğru çalıştığı bilinen çözümlerden herhangi biri seçilerek Probleme Çözüm Bulmaya Algoritmik yaklaşım denir. Tüm Adımların çok kecin ve net bir şekilde ortada olması gerekir.
Heuristik yaklaşım: Problem algoritmik olarak çözülmemiştir. problem tam olarak tanımlanmamıştır da diyebiliriz. problemin çözümü tam olarak ortada değildir.
bir programcı algoritmik olarak çözümlemediği bir problemi farkında olmadan Heuristik olarak çözüyordur. aslında Heuristik olarak çözdüğü anda artık algoritmik olarak da çözebilir.
algoritmik çözüm Heuristik den daha hızlı sonuca ulaştırır.
--------------------------------0---------------------------------0--------------------------------0----------------------------------0-----------------------------------0------------------------------------0---------
Algoritmik Çözüm yöntemini kullanarak ilk yaptığınız nedir Üstadlar ? Ben ilk önce pseudo code yazarım siz ? Sonrasında ister PBP,CCS, C yada Vb.net yada C# fark eder mi ? bundanrır ki arkdşlra "dil üzrnde fzl durmyn bnlr brr arç dyrm (burayı bilerek böyle yadzım çoğunluk anlamıştır. dil-iletişim aracıdır.)
merak edenler için http://tr.wikipedia.org/wiki/S%C3%B6zde_kod (http://tr.wikipedia.org/wiki/S%C3%B6zde_kod)
Alıntı yapılan: gerbay - 06 Ekim 2013, 20:52:13
Hayir, bunu asla bilemez... örnegin bir degisken "memory mapped io" bölgesinde tanimli olabilir. Pci karti taktiniz sisteme, uygun bir base adresten itibaren yerleşti kart. Kartin registerlarini okuyacaksiniz, bunu derleyici asla bilemez. Hatta verdigim senaryoda hem volatile kullanmalisiniz hem de islemciye/isletim sistemine bu alani 'keşleme' demelisiniz. yani memory mapped io bölgelerinin keşlenmemesi de gerekir.
Volatile in optimize edilmemesi disinda bir özelliği daha var. Dereyici volatile tanimli degiskenler icin mümkün oldugunca atomik islem yapmaya çalisir.
Hocam bastan asagi kendimizin yazacagi kodlardan bahsediyorum.
Derleyici nasil bilir?
Adresleri Ram alani disindaki degiskenler volatile tanimli olmalidir. Heleki I/O port alaninda olanlarin alayi kafadan volatile yapilailir.
Interrupt rutinleri icinde kullanilan degiskenler ayni zamanda diger rutinlerde de kullaniliyorsa volatile degiskendir.
Bunlarin icinden volatile olmamasi gereken degiskenler cikabilir. Olsa ne olur ki?
Mesela Ram alani icinde olmayan bos yerlerden birisine harici Ram takildi diyelim. Bu alanin bastan sona volatile olmasi gerekmez. Bunun da cozumu var. Kardesim volatile degiskenleri benim Ram alanindan sec denebilir.
Ram alani: Belli.
Haricten Map edilen Alan da tanimlanacak.
Bu alanlar Keil'deki gibi tanimlandiginda is bitiyor. Task ve Threadler icin bir sey diyemeyecegim ama bunlarin da C derleyici tarafindan anlasilacagi ipuclari (anahtar kelimeler ne bileyin Init Task vs) olmasi lazim.
Belki bu akillilik C derleyiciye değil de oncu derleyiciye devredilebilir. Keilde bile var bu ozellik.
Simdi Ram alanina map edilen I/O alani vs deyince isler karisiyor detaylari bilmedigim icin fazla eselemek istemiyorum.
PCI vs ile calismadim ama hala sunu iddia ediyorum.
RTOS dahil isletim sistemi yapisi icermeyen klasik usulde yazilmis icinde bilincli sekilde volatile on eki kullanilmadan hatali yazilmis bir C programini oncu yorumlayicidan gecirerek surada surada surada kullandiginiz degiskenler volatile olmaliydi dedirtebilirim.
Bu o kadar da zor değil.
Interrupt rutinlerini diger rutinlerden ayirmak ARM islemcilerde cok kolay degil ama imkansiz da degil (vektor tablosundan yola cikilabilir). Cevre birimlerini okuyup/yazan okuduklarini degiskene aktaran noktalar, bu degiskenden yeni verileri turetip bir baska degiskene aktaran noktalar volatile degiskenler icin hayati ipuclari olacaktir.
Hocam laf olsun diye geyik yapiyoruz. Ama elin oglu rom kodlarindan source kod uretecek kodlara kafa yoruyor. Cok ciddi bir durum olsa gorev verilse usenmem bir iki core icin abuk sabuk kodlar yazarim.
algoritmanın şekilsel gösterimi ne akış diagramı diyoruz.
çoğunluğun bildiği UML şemaları
http://en.wikipedia.org/wiki/Unified_Modeling_Language (http://en.wikipedia.org/wiki/Unified_Modeling_Language)
Alıntı yapılan: muhittin_kaplan - 07 Ekim 2013, 12:54:50
algoritmanın şekilsel gösterimi ne akış diagramı diyoruz.
çoğunluğun bildiği UML şemaları
http://en.wikipedia.org/wiki/Unified_Modeling_Language (http://en.wikipedia.org/wiki/Unified_Modeling_Language)
Çok büyük çaplı uygulama yapmadım. En fazla bir kaç bin satırdan ibaret işlerle ilgilenme fırsatım oldu.
Bu projelerde şu yolları izledim.
- Kafadan düşünerek bir kaç kısmı modüler şekilde hayal edip yapabiliyorsam ve modüller 3-5 tane ise direk kodlamaya başladım.
- Sistemi tam olarak kavrayamadıysam önce istenenleri, olması gereken durumları ve bunları bölebileceğim parçaları oluşturdum.
- Bu parçaları ufak ufak ele alarak tabiri caizse böl parçala yönet mantığı ile ele alarak Akış Diyagramı çizdim.
- Modülleri parça parça yazdım.
- Sonrasında bunları bir top module ile birleştirdim.
- Debug yapıp eksikleri giderdim.
Hangisi doğru - yanlış ? Emin değilim. Ama genellikle yaz-çiz yaptığım işlerde, işler daha kolay oluyor. Sanırım anlaması, kavraması ve hatırlaması daha kolay oluyor.
Düzeltme: Eğer yapılan işlem belirli bir matematiksel fonksiyonsa tabiki ilk yaptığım işlem kritik durumları hesaplamak.
Veri Modeli Nedir ?
veri modeli, bilgiler arasındaki bağlantının şeklidir diyebiliriz. Genelde Veri yapısı (byte, int vs vs) ile karıştırılır.
konuyla ilgili güzel bir yazı.
http://www.bilgius.com/veri-modelleri/ (http://www.bilgius.com/veri-modelleri/)
lütfen veri modellerini araştırınız..
https://www.youtube.com/watch?v=kPRA0W1kECg#t=34 (https://www.youtube.com/watch?v=kPRA0W1kECg#t=34)
salih nedir bu ?
Alıntı yapılan: muhittin_kaplan - 06 Ekim 2013, 23:20:59
Doğru, DZ bayrağı o iş içindir.
volatile derleme esnasında yaptığınız tanımlı bölgeyi "burayı optimize etme, elleşme kardeşim ne görüyorsan öyle compile et" anlamına gelir. Bir adresi değişkene bağlamış olabilirsiniz, konuyla alakalı güzel bir yazı http://ozgurmurat.blogspot.com/2009/05/c-dilinde-volatile-anahtar-kelimesi.html (http://ozgurmurat.blogspot.com/2009/05/c-dilinde-volatile-anahtar-kelimesi.html)
Neyse Devam Edelim.
Algoritmik Yaklaşım: Daha önce test edilip kullanılmış, doğru çalıştığı bilinen çözümlerden herhangi biri seçilerek Probleme Çözüm Bulmaya Algoritmik yaklaşım denir. Tüm Adımların çok kecin ve net bir şekilde ortada olması gerekir.
Heuristik yaklaşım: Problem algoritmik olarak çözülmemiştir. problem tam olarak tanımlanmamıştır da diyebiliriz. problemin çözümü tam olarak ortada değildir.
bir programcı algoritmik olarak çözümlemediği bir problemi farkında olmadan Heuristik olarak çözüyordur. aslında Heuristik olarak çözdüğü anda artık algoritmik olarak da çözebilir.
algoritmik çözüm Heuristik den daha hızlı sonuca ulaştırır.
--------------------------------0---------------------------------0--------------------------------0----------------------------------0-----------------------------------0------------------------------------0---------
Algoritmik Çözüm yöntemini kullanarak ilk yaptığınız nedir Üstadlar ? Ben ilk önce pseudo code yazarım siz ? Sonrasında ister PBP,CCS, C yada Vb.net yada C# fark eder mi ? bundanrır ki arkdşlra "dil üzrnde fzl durmyn bnlr brr arç dyrm (burayı bilerek böyle yadzım çoğunluk anlamıştır. dil-iletişim aracıdır.)
merak edenler için http://tr.wikipedia.org/wiki/S%C3%B6zde_kod (http://tr.wikipedia.org/wiki/S%C3%B6zde_kod)
Hocam aşağıdaki cümlenin tam olarak açıklaması nedir?
Alıntı YapInterrupt servis rutinleri içerisinde değiştirilen bir alan kesme dışındaki kodda okunuyorsa (ya da tam tersi) söz konusu alanın değeri programın çalışması süresince her an değişebilir. Derleyici bundan haberdar olmadığı için bir kere değeri okuyup/yazdıktan sonra tekrar aynı işlemi yapmayabilir. Bu tip alanların bu yüzden volatile olarak tanımlanması gerekir (ve haliyle atomik olarak okunup/yazılabilmesi gerekir).
Şimdi aşağıdaki gibi kodum olsun
char a;
int main(void)
{
send_char(a);
}
void UART1_IRQHandler(void)
{
a=get_char();
}
burada a yı volatile tanımlamazsam ne olur?
hocam fonksiyona parametre vermiş ve dönen değer olarak a yı göstermişsiniz. derleyicinin ürettiği kodu görmek gerekir (optimizasyonda önemlidir). ama ben düzgün derleyeceğini düşünüyorum.
yani send char(0) gibi bir durum olur bilgi alana kadar (bilgi aldığımız anda durum değişir.)
ama
int rutini içerisinde usartın RX reg ın bilgisini aldığımız yerdeki değişken volatile olmalı. Çünki reg içeriğini "0" kabul edebilir.
void rx_int{
char RxValue;
RxValue=RX_reg;
Return RxValue;
}
Burayı RxValue=0 olarak derleyebilir.
dolayısıyla a da devamlı 0 görülür.
(Yanlışım varsa lütfen düzeltin. Emin değilim. Yorum Yaptım Sadece)
Hocam dediğiniz doğru olabilir ama adamın anlattığından benim anladığım şu:
Eğer bi değişiken intterrup servis rutininin içinde değeri değişiyo ve daha sonra programın başka yerlerinde kullanılıyorsa bu değişken volatile tanımlanmalı.Bu durumda böyle bi değişkenin global olarak tanımlanmış olması gerekir.Ama bence sizin yazdığınız kodda da RxValue volatile tanımlanması gerekir çünkü derleyici o değişkenin programın çalışması esnasında değişeceğini bilemez.
aslında ben
Duğrudan işlemcinin Registerleriyle ile bilgi alışverişi yapan değişkenlerimi VOLATILE tanımlıyorum.
Kabaca http://tr.wikipedia.org/wiki/Ak%C4%B1%C5%9F_%C5%9Femas%C4%B1 (http://tr.wikipedia.org/wiki/Ak%C4%B1%C5%9F_%C5%9Femas%C4%B1) budur :)
Alıntı yapılan: muhittin_kaplan - 24 Ekim 2013, 23:11:26
aslında ben
Duğrudan işlemcinin Registerleriyle ile bilgi alışverişi yapan değişkenlerimi VOLATILE tanımlıyorum.
Hocam aslında derleyici optimizasyonlarını detaylı bi şekilde açıklayan bi döküman bulsak daha iyi anlaşılabilir.Kaan Arslan sitesinde açıklamış bazılarını ama açıklamdıkları da var galiba.
hocam global değişkenlerde mi kullanılır bu volatile ?
Hocam atomic erişimden kastettiğiniz tam olarak nedir?Biraz açıklayabilir misiniz?
atom maddenin bolunemiyen en kucuk parcasidir tarif olarak.
atomic erisimide (turkcesi biraz icat bir terim oldugu icin uzun uzun aciklamak lazim gelebilir) cok basit olarak, kesintiye ugramadan bir hamlede (1 instruction) yapilan erisim denebilir.
ornegin i++;
i degiskenini registira al,
registiri bir arttir
registiri i degiskenine yaz olarakda yapilabilir
yada
inc i
diyede yapilabilir. tabiiki, i degiskenin oldugu yere hw olarak (ornegin dma ile) erisim varsa vede buda cycle stealing gibi instruction fetch cycleda yapiliyorsa (yada uniprocessor degilde multi processor/cekirdek yada shared memory yada ... filan falan diye konu uzaaar gider)
daha iyi anlamak icin en azindan "critical section" aciklamalarini okumaniz tavsiye edilir
Erişimin dışarıdan bozulamaması anlamına geliyor. Örneğin 8 bitlik bir işlemci ile x = x + 1 işlemini yapacağımızı varsayalım. Eğer x 8 bitlik bir sayı ise (mesela char türünden) bu erişim atomiktir çünkü tek komutla yapılır. Ama x 16 bitlik bir sayı ise bu iş tek seferde yapılamaz. Önce küçük byte 1 arttırılır, ardından taşma biti kontrol edilir. Eğer taşma biti 1 ise büyük byte da 1 arttırılır. Bu da fazladan birkaç komut daha olacağı anlamına gelir. Diyelim ki 16 bitlik x'in küçük byte'ını bir attırdık ama taşma olacak (mesela x = 255 iken x = x + 1 dedik). Taşma olduğu için büyüğü de arttıracağız ama tam o sırada kesme geldi, ve kesme kodu x'i okudu. Bu noktada işler karışıyor. Kesme kodu okuduğunda küçük byte sıfırlandı ama büyük byte arttırılmadı. Bu durumda kesme kodu x'i 255 veya 256 değil, 0 olarak okur.
Not: Ben yazarken mufitsozen hocam da cevaplamış.
Mufit hocam ben birsey anlamadim taniminizdan,
Atomic
Baska bir komut yada donanim isteginden dolayi kesilemeyen islemdir. dersek yanlis yapmis olmayiz sanirim
Alıntı yapılan: muhittin_kaplan - 25 Ekim 2013, 11:27:05
Mufit hocam ben birsey anlamadim taniminizdan,
maalesef tanim benim değil. Keske o kadar alim olsaydim :(
Herhangi bir isletim sistemi ile ilgili kitaba bakilirsa daha dogru olur (turkceye cevirirken anlam kaybi cok fazla oluyor)
Ben sahsen tanenbaum'un kitaplarini tercih ederim.
mesaj birleştirme:: 25 Ekim 2013, 11:34:13
Alıntı yapılan: muhittin_kaplan - 25 Ekim 2013, 11:31:29
Atomic
Baska bir komut yada donanim isteginden dolayi kesilemeyen islemdir. dersek yanlis yapmis olmayiz sanirim
prensip olarak dogru kabul edilebilir. Zaten picprojeyi ilgilendirecek mimarilerde bu tanim dogru kabul edilebilir.
aslında başlığı açmamdaki sebep bunları konuşmak değildi.
programlamanın ne olduğunu bilmeden kod yazmaya başlıyoruz onu biraz sıraya sokmaktı.
böylede güzel oldu.
Alıntı yapılan: muhittin_kaplan - 25 Ekim 2013, 11:45:12
...............
programlamanın ne olduğunu bilmeden kod yazmaya başlıyoruz onu biraz sıraya sokmaktı.
böylede güzel oldu.
cok haklisiniz, +100
Aslinda delik o kadar buyuk ki, neresinden baksak (yaklassak) hep icine dusuyoruz.
:D
Tabii yinede su kitapi oku filan demekten hala imtina ediyorum. nedense hic kimsenin okumaya/arastirmaya vakti yok, ama herseyide hap gibi bilmek istiyorlar (ogrenmeden/uygulamadan)
O kodumu kullansam boylemi yapsam dan ziyade programlamayi bilmek gerek gerisi
İhtiyac duydugumda ogrenecegim komutlar dile ait kisitlar. Bugun float kullanamiyorken yarin kullanabiliyor oluyorum.
Şimdi ustadlar kafam karıştı. @tagli hocam sizin verdiginiz örneği ele alalım. x=255 ve x++; komutu icara edilirken low byte 0 oldu high byte arttırılamadan kesme geldi. Bu durum olumsuzluğundan kurutulmak için değişkeni volatile mi tanımlamamız lazım??
Yoksa zaten bu durum derleyici tarafından algılanarak atomik olarak işlem görüp işlemi bitirp mi kesmeye gidiliyor? 8 bitlik bir mcu da yukarıdaki işin bitip bitmediği nasıl anlaşılıyor?
Alıntı yapılan: mufitsozen - 25 Ekim 2013, 11:19:37
atom maddenin bolunemiyen en kucuk parcasidir tarif olarak.
atomic erisimide (turkcesi biraz icat bir terim oldugu icin uzun uzun aciklamak lazim gelebilir) cok basit olarak, kesintiye ugramadan bir hamlede (1 instruction) yapilan erisim denebilir.
ornegin i++;
i degiskenini registira al,
registiri bir arttir
registiri i degiskenine yaz olarakda yapilabilir
yada
inc i
diyede yapilabilir. tabiiki, i degiskenin oldugu yere hw olarak (ornegin dma ile) erisim varsa vede buda cycle stealing gibi instruction fetch cycleda yapiliyorsa (yada uniprocessor değilde multi processor/cekirdek yada shared memory yada ... filan falan diye konu uzaaar gider)
daha iyi anlamak icin en azindan "critical section" aciklamalarini okumaniz tavsiye edilir
Hocam bu durumda değişkeni volatile olarak tanımladığımızda değişken direkt işlmecinin genel amaçlı registerlarından birinde mi saklanmış oluyo.Doğru anlamış mıyım?
PIC için konuşursak, ++x'ten önce kesmeleri kapatıp, arttırımdan sonra kesmeleri tekrar açmak gerekir. volatile tek başına yeterli olmaz.
Bilgisayarda multi-thread uygulama yazarken ise mutex kullanımı gerekir. Arka planda süreç nasıl işliyor bilmiyorum. Araştırılırsa internetten yeterli bilgi bulunabilir sanırım.
Volatile bildiğim kadarıyla sadece bazı optimizasyonları kapatıyor. Yani değişkenin saklanma yeriyle ilgisi yok. Pek gerçekçi değilse de şöyle bir örnek verebiliriz: Örneğin arka arkaya b = a + b ve c = a + c işlemleri yapılacak olsun. Bu işi PIC ile yaparsak ASM kullanarak, a'yı bir kez W'ye atarız, ardından W'yi önce b ile toplayarak kendi üzerine yazarız, sonra da aynısını c için yaparız (a zaten W içinde olduğundan ikinci bir kez a'yı okumayız yani). Bu arada bir kesme gelip a'yı güncellerse, c = a + c işlemi a'nın eski değeri ile yapılmış olur. Veya a dediğimiz şey belki de PORTB register'ı ve biz girişlerin en güncel değerine göre işlem yapmak istiyor olabiliriz ve bu iki komut arasında fiziksel ortamdaki bir değişiklik sebebiyle a değişmiş olabilir. Volatile kullanılırsa a iki kez W'ye kopyalanır. Bunları örnek olarak yazdım, süreç daha farklı işliyor olabilir.
Bu arada pek çok register adı (Yoksa hepsi miydi? Unuttum) ilgili header dosyasında volatile olarak tanımlıdır.
İlişkisel veritabanında VERI MODELI nedir ?
Wikipedia'da böyle yazmış:
Alıntı YapVeritabanında asıl önemli kavram, kayıt yığını ya da bilgi parçalarının tanımlanmasıdır. Bu tanıma Şema adı verilir. Şema veritabanında kullanılacak bilgi tanımlarının nasıl modelleneceğini gösterir. Buna Veri Modeli (Data Model) yapılan işleme de Veri modelleme denir. En yaygın olanı, İlişkisel Model' dir (relational model), bu modelde veriler tablolarda saklanır. Tablolarda bulunan satırlar (row) kayıtların kendisini, sütunlar (column) ise bu kayıtları oluşturan bilgi parçalarının ne türden olduklarını belirtir. Başka modeller (Sistem Modeli ya da Ağ Modeli gibi) daha belirgin ilişkiler kurarlar.
Veritabanlarını az çok biliyorum ama terimlere çok aşina değilim. Ben veritabanı şemasına "Entity - Relationship (E-R) Diagram" deniyor diye öğrenmiştim.
evet ilişkisel dir - eğer veritabanı diyebiliyorsak en azından onu desteklemelidir-.
nedir bu ilişkisel veri yapısı ? genelde duyulur ama pek bilinmez. örnek üzerinden açıklamaya çalışayım.
bir cihaz yapacaksınız ve (yada PC de program) personel bilgisi gibi birşey.
kaydetmemiz gereken bilgiler;
adı,soyadı,kimlik no, eşinin adı, çocuklarının adı ve araçlarının plakası olsun.
nasıl yaparız ?
bir tabloda hepsini kaydederiz değilmi ?
eğer öyle yaparsak kendini tekrarlayan bilgilerden dolayı (5 çocuğu olan personel için her çocuk kaydında diğer bilgileride yazmanız gerekir.)ya veritabanımız gereksiz şişer yada, bir araba için açtığınız alan 2. arabası olan için yetersiz kalır.
bunu aşmanın yolu her çoklu kayıt olabilecek alan için tablo oluşturup bunları birbirleriyle (kimlik no) ilişkilendirmektir.
Alıntı yapılan: muhittin_kaplan - 25 Ekim 2013, 16:38:14
evet ilişkisel dir - eğer veritabanı diyebiliyorsak en azından onu desteklemelidir-.
nedir bu ilişkisel veri yapısı ? genelde duyulur ama pek bilinmez. örnek üzerinden açıklamaya çalışayım.
bir cihaz yapacaksınız ve (yada PC de program) personel bilgisi gibi birşey.
kaydetmemiz gereken bilgiler;
adı,soyadı,kimlik no, eşinin adı, çocuklarının adı ve araçlarının plakası olsun.
nasıl yaparız ?
bir tabloda hepsini kaydederiz değilmi ?
HAYIR! ;)
Hemen uygulamamiza SQLite ekleriz! ;D
SqlLite,SqlServer yada MySql Nasıl Çalışıyor ki Hocam ?
Fakat kod optimasyonunda eğer pointerler havada uçuşuyorsa ilk aklıma gelen yapı Restrict'tir.Sonrasında uygun değişkenler,en az kod ve en az koddur en iyi çalışan program.Bunuda algoritmada ki yalancı kod kavramıyla akıcı şekilde yazınca algoritma kendiliğinden çıkıyor ortalığa.
Alıntı yapılan: muhittin_kaplan - 25 Ekim 2013, 16:46:37
SqlLite,SqlServer yada MySql Nasıl Çalışıyor ki Hocam ?
Sqlserver yada MySQL icin OS lazim, PC lazim, disk lazim lazim oglu lazim.
Halbuki Sqlite embedded, duzgun bir arm cortex m3/m4e applicationa ekleyebilirsin.
neyse yine acilmaya basladikmi nedir? :)
Devam edelim soruyla...
Mesela sayi(99999) adinda bir dizimiz olsun. Bu diziden istedigim sayinin indexini bana donduren fonksiyonu nasil yaparsiniz?
Not dizi icindeki sayilar karisiktir ama siralanmistir.(orng 0-3-6-11-12-15-22 gibi)
Aklımdan bir sayı tuttum, 0 ile 128 arasında. Her tahminden sonra tahmin edilen sayının, tuttuğum sayıdan büyük mü yoksa küçük mü olduğunu söyleyeceğim. En fazla 8 tahminde bu sayıyı bulabilir misiniz?
Bu sorunun cevabı muhittin_kaplan'ın sorusunun da cevabı.
Bu arada, böyle şeyler için genelde diziler değil ikili ağaçlar kullanılıyor.
Alıntı yapılan: muhittin_kaplan - 27 Ekim 2013, 16:15:21
Devam edelim soruyla...
Mesela sayi(99999) adinda bir dizimiz olsun. Bu diziden istedigim sayinin indexini bana donduren fonksiyonu nasil yaparsiniz?
Not dizi icindeki sayilar karisiktir ama siralanmistir.(orng 0-3-6-11-12-15-22 gibi)
binary-search
mesaj birleştirme:: 27 Ekim 2013, 17:20:12
Alıntı yapılan: Tagli - 27 Ekim 2013, 17:16:08
Aklımdan bir sayı tuttum, 0 ile 128 arasında. Her tahminden sonra tahmin edilen sayının, tuttuğum sayıdan büyük mü yoksa küçük mü olduğunu söyleyeceğim. En fazla 8 tahminde bu sayıyı bulabilir misiniz?
Bu sorunun cevabı muhittin_kaplan'ın sorusunun da cevabı.
Bu arada, böyle şeyler için genelde diziler değil ikili ağaçlar kullanılıyor.
8 degil 7 tahmin olacak.....mi acaba? :)
eger sayilar sirali ise ekleme ckarma yapilmiyorsa agac yapmaya gerek yok
Alıntı yapılan: mufitsozen - 27 Ekim 2013, 17:17:21
binary-search
mesaj birleştirme:: 27 Ekim 2013, 17:20:12
8 değil 7 tahmin olacak.....mi acaba? :)
eger sayilar sirali ise ekleme ckarma yapilmiyorsa agac yapmaya gerek yok
Ben de binary-search diyorum geçen derste gördük:)
Evet dogru 7 olacak. Aslinda bana da oyle gelmisti ama bir deneme yapayim dedim ve o sirada yaptigim tahminleri yanlis saymisim. :-[
müfit hocam binary i açıklarmısınız nedir ne değildir ?
Neden Teker Teker ile sormuyoruzda bu binary search i kullanayım.
Teker teker sormus olsaydik daha uzun surerdi. Benim verdigim ornekte mesela aklimdan 95 tutmus olsaydim, bastan baslarsak ancak 95'inci tahminde sonuc bulunabilirdi. Ama binary search ile en fazla 7 hamlede bulunuyor.
Bilgisayar terminolojisinde O() gosterimi denen bir olay var. Bir islemin girdi sayisina bagli olarak ne kadar zaman alacagini veya karmasik oldugunu ifade etmek icin kullaniliyor. Soz konusu ornekte bastan baslayip sayilari tek tek deneseydik ifade O(n) olacakti. Yani arama suresi toplam veri sayisi ile orantili olarak artacakti. Binary search ile ise ifade O(log(n)). Yani bulma suresi veri sayisinin 2 tabaninda logaritmasiyla orantili olarak artacak.
Alıntı yapılan: muhittin_kaplan - 27 Ekim 2013, 19:28:58
müfit hocam binary i açıklarmısınız nedir ne değildir ?
Neden Teker Teker ile sormuyoruzda bu binary search i kullanayım.
http://video.franklin.edu/Franklin/Math/170/common/mod01/binarySearchAlg.html (http://video.franklin.edu/Franklin/Math/170/common/mod01/binarySearchAlg.html)
O(logn) kismi benden once aciklanmis.
c ile yazilmis code icin: http://www.programmingsimplified.com/c/source-code/c-program-binary-search (http://www.programmingsimplified.com/c/source-code/c-program-binary-search)
hashtable ile O(1) de bulunabilir mesela, yani sabit zamanda.. ama hashtable'a atmak icin O(n) harcanir en basta.. Kac kere arama yapcagimiz da onemli. Coksa, 1 kere n harcamak muhim değil. Mutemelen bu sayilari array'e atarken de bi yerden okuyup atacaksiniz, yani O(n)'i harciyosunuz zaten..
Alıntı yapılan: gerbay - 27 Ekim 2013, 18:36:16
Logaritma 2 tabaninda 128....
Muhittin hocam, en iyisi programlama dillerine kitaptan çalistiginiz gibi bir 'veri yapilari ve algoritmalar' kitabi bulup okuyun. Çok faydasi olacagini düşünüyorum
Hocam özellikle önerdiğiniz bir kitap var mı?
Algoritma geliştirmek için kitap tavsiyesini bende bekliyorum.
Wikipedia'da faydalı başlıklar var:
http://en.wikipedia.org/wiki/List_of_data_structures (http://en.wikipedia.org/wiki/List_of_data_structures)
http://en.wikibooks.org/wiki/Data_Structures (http://en.wikibooks.org/wiki/Data_Structures)
Alıntı yapılan: yamak - 28 Ekim 2013, 09:51:55
Hocam özellikle önerdiğiniz bir kitap var mı?
rifat çölkesen
Alıntı yapılan: muhittin_kaplan - 28 Ekim 2013, 11:34:34
rifat çölkesen
Hocam vasif vagifoğlu nabiyev in kitabının iyi olduğunu duymuştum.Acaba nasıl bi bilginiz var mı?
hocam incelemedim. ama iyi olduğunu duyduğum ve küt. almayı planladığım kitaplardan biri.
Algoritma geliştirmeyi kitapla öğrenerek bir yere kadar geliştirebilirsiniz.Bence algoritma geliştirmek zekayla orantılı oraya çözüm bulmak gerek
musti,
büyükler bak nedemiş.
"Çalışmak Zekadan Daha Üstün bir Kıymettir"
"Yatan Arslandansa, Gezen Tilki makbuldür
Alıntı yapılan: musti463 - 28 Ekim 2013, 12:15:16
Algoritma geliştirmeyi kitapla öğrenerek bir yere kadar geliştirebilirsiniz.Bence algoritma geliştirmek zekayla orantılı oraya çözüm bulmak gerek
sayin musti463, kac yasindasiniz ve egitiminiz nedir (tecrubeniz ne kadar?) yada IQnuz nedir(ne kadar zekisiniz?) bilemiyorumm bununla beraber benim tecrube, bilgim, egitimime gore her iki onermenizde dogru degil.
Hocam arkadasin tamamen haksiz oldugunu dusunmuyorum.
Kisilerin adlariyla anilan algoritmalar var. Anlamasi bile gucken boyle bir algoritmayi herkesin yazabilecegine inanmiyorum.
Mesela mevcut olanlardan etkilenmeden yep yeni bir bolme algoritmasi yazabilirmisiniz?
dediğinizi yapabilmek için temel gerekli bu temel ancak "çalışmayla" olur. Zeka sadece pudra şekeridir.
O zaman, sadece calisarak icat yapilabiliyorsa cok unlu algoritma da gelistirebilirsin.
Bilgisayar algoritmasi gelistirebilmek icin zaten sayi teorisine hakim olmak gerekiyor. Matematik alt yapinin guclu olmasi gerekiyor. Fakat matematik profesorleri neden ha bire algoritma gelistiremiyorlar.
FFT icin reverse cary addition yapmak nasil bir zekanin urunu acaba?
icat yapmak için önce ihtiyacın belirlenmesi ve orada bir boşluk olması gerekir.
Mesela hizli bolme islemi bilgisayar dunyasi icin hala bir ihtiyac.
Yeni bir algoritma yazabilmen icin var olan algolari zaten biliyor olman gerekiyor.
Ortada bosluk olmasina gerek yok. Herhangi bir algoritmadan daha hizlisini yapmayi dusunebilirsin mesela.
Alıntı yapılan: z - 28 Ekim 2013, 14:56:55
Kisilerin adlariyla anilan algoritmalar var. Anlamasi bile gucken boyle bir algoritmayi herkesin yazabilecegine inanmiyorum.
+1
Alıntı yapılan: z - 28 Ekim 2013, 15:54:08
sayi teorisine hakim olmak gerekiyor. Matematik alt yapinin guclu olmasi gerekiyor.
+1
Hocam size katiliyorum.. Hali hazirda var olan bilgi birikiminin uzerine devam etmemiz gerektigini dusunuyorum.. Bizim bugun karsilastigimiz problemlerle, baskalari daha once karsilasmis ve guzel cozumler getirmisler.. Algoritmalari incelerken matematik onemli bir arac. Ornegin derste, karsilastirmaya dayali siralama algoritmalarinin (n.log n)'den daha kisa zamanda yapilamayacaginin ispatini matematiksel olarak yapmistik. Bu bilgi ile hala daha hizli bir algoritmayi ayni yontemle gelistirmeye calismaya gerek bence. Zaten bunu gorenler, karsilastirmadan yapalim o zaman diyerek O(n) zamanda siralama algoritmalar gelistirebilmisler. Newton'un hareket kanunlarini ogrenmeye gerek yok, kendimiz bir seyler uydurup cozeriz demek gibi geliyor bana. Yazilim bir bilim ve muhendislik dali olarak ele alinmali.
Algoritma yazilim ile ortaya cikmis bir kavram degil.. Matematigin var olusundan beri olan bir kavram. Euler'in zamaninda bilgisayar yoktu ama algoritmalarini suan yazilimlarimizda uyguluyoruz..
Bir de alinti yapayim:
"I like the way computer scientists think because they combine some of the best features of Mathematics, Engineering, and Natural Science. Like mathematicians, computer scientists use formal languages to denote ideas (specifically computations). Like engineers, they design things, assembling components into systems and evaluating tradeoffs among alternatives. Like scientists, they observe the behavior of complex systems, form hypotheses, and test predictions."
Alan Downey
Mesela 32 bit ARM islemciler icin donanimsal bolme 1..12 clk da islem yapiyor ve eminim ki en iyi algoritmayi kullanmislardir.
Eee adamlar yapmis daha hizlisina ne gerek var denilebilir. Hatta matematiksek olarak 1..12 clkdan daha kisa surede bolme yapilamaz sonucuna da ulasilmis olabilir.
Bu sonuc bizi hic ama hic ilgilendirmiyor. Desem ki ARM islemcide 128 bitlik sayilari bolecegim bana hizli bir algoritma verin.
Bu durumda bolme algoritmalarini sular seller gibi bilmek yaninda ARM islemcinin ASM dilini de sular seller gibi bilmek gerekiyor. Olay sadece bir dili optimize etmek olayi degil.
Ayni algoritma farkli islemcilerde cok farkli performans sergileyebilir.
çok zeki olduğumu iddia etmiyorum IQ da ortalama seviyede ukalalık yapmıyorum.Fakat herşeyde sadece çalışmak ile olmuyor! Bilgi birikimi tabiki olacak fakat bir sürü profumuz var nedense teknolojiyi geliştirenler değilde kopyalayanlarız.Ben şahsen ne kadar çalışsamda her sorunu çözemem.Bilgi önemli tabi ama bilgiyi anlamakta zeka ister,Siz her gördüğünüz bilgiyi anlayabiliyormusunuz?.Sizin teorinize göre gerizekalı bir insan da çok çalışarak profesör olabilir o zaman.
Benim görüşüm şu: Teorikte insan zekası, her problemi, ne kadar zor olursa çözer.Fakat muhtemelen o problemi çözebilecek kadar ömrü olmaz.Zeka seviyemize göre sorunları çözme hızımız doğru orantılıdır.Ne kadar zekiysek problemleri o derece hızlı çözeriz.Mesela Tesla icatlarına bakabiliriz! Kendisi 700 den fazla patent ile bu alandaki rekorun sahibi.Zeka seviyesi çok yukarılarda olduğu için bu kadar problemi çözebilmeyi yaşam süresi içerisine sığdırabilmiş.Benim zeka seviyem ile bu kadar çözümü hayatıma sığdırabilmem pek mümkün görünmüyor :) .
musti,
Alıntı YapBilgi birikimi tabiki olacak fakat bir sürü profumuz var nedense teknolojiyi geliştirenler değilde kopyalayanlarız
ile
Alıntı YapSizin teorinize göre gerizekalı bir insan da çok çalışarak profesör olabilir o zaman.
soruyu sormuş ve cevaplamışsın.
Teknoloji, bilgi piramit gibidir. Matematik bilmezsen Fizik, dolayısıyla Astronomi yapamazsın.
Sayma Sayılarını Öğrenmeden Kesirli Sayıları Öğrenemediğin gibi.
Alıntı yapılan: muhittin_kaplan - 28 Ekim 2013, 18:06:51
musti,ile
soruyu sormuş ve cevaplamışsın.
Teknoloji, bilgi piramit gibidir. Matematik bilmezsen Fizik, dolayısıyla Astronomi yapamazsın.
Sayma Sayılarını Öğrenmeden Kesirli Sayıları Öğrenemediğin gibi.
Ben bizim profesörlerimizin gerizekalı olduğunu düşünmüyorum. Yurtdışındaki teknolojiyi okuyup anlayıp kopyalamak da zeka ister.Geliştirmek ise bambaşka bir zeka ister.Problemlere çözüm bulmak için %60 Zeka,%30 Çalışma,%10 Bilgi ister.Yüzdeleri değiştirebilirsiniz belki ama sadece birisinede bağlayamazsınız sonucu.Ben meşhur bir bilim adamı veya bir mucid olmadığımdan sözlerime itibar etmeyebilirsiniz.Size Einstein'ın şu sözünü hatırlatmak istiyorum "Hayal gücü bilgiden daha önemlidir"
Musti Konumuz Bunlar Değil. Bence Konumuza Dönelim.
"Hayal gücü bilgiden daha önemlidir" demiş ama.
İnsan Bilmediği birşeyi hayal edemez.
bunuda yazın bir köşeye.
Ben bilginin önemsiz olduğunu söylemedim zaten ama sen bilginin zeka dan daha önemli olduğunu söylüyorsun.Zeki adam isterse her bilgiye ulaşabilir.Kafasını çalıştırarak!
Musti tekrar söylüyorum Konuyu Dağıtmak İstemiyorum.
"çalıştırarak" demişsin. Bir adam istediği kadar zeki olsun. Yattıktan sonra ancak karpuz olur.
Alıntı yapılan: muhittin_kaplan - 29 Ekim 2013, 13:36:42
Musti tekrar söylüyorum Konuyu Dağıtmak İstemiyorum.
"çalıştırarak" demişsin. Bir adam istediği kadar zeki olsun. Yattıktan sonra ancak karpuz olur.
sayin muhittin hocam, cok fazla tekrar yapmaya ne gerek var, batililarin yaptigi gibi "Lets agree to disagree" der tartismayi bitiririz bence daha dogru olur.
sayin @musti463un dedigi gibi zeki olanlar hayal ederek, aklini calistirip algorithmalar icat eder, benim gibi cok akilli olmayanlar da calisarak, ogrenerek, uygulayarak.
Allah, herkesi esit yaratmamis, herhalde sayin@musit463'un bildigi bizim bilmedigimiz birsey vardir.
Belkide sayin @musit463 ben bundan sonra soru sormiyacagim, biraz hayal, biraz kafayi calistirip zaten herseyi yapiyorum demek istiyordur.
ortada birşey yoksa yoktur. :D
varsa herkes yorum yapar.
@musti
Hani aileler der ya 'bizim çocuk çok zeki ama çalışmıyor' :) Bunu nasıl anladıklarını hep merak etmişimdir. Bana göre zeka oyle test, bakış karar verilecek bir şey değil. Çözülen probleme göre düşünülmeli.
Kasabada buyudum, (oldukça yada yeterince) zeki oldugum söylendi. Ama birinin zeki olduğunu söylemesi tatmin edebilir belki bazılarını ama benim için bir şey değişmemişti dediklerinde.
Belki kara delik- solucan delikleri, ışınlanma gibi uç şeylerin çözümü 1000 seviyesinde IQ gerektiriyor ama 10-200 seviyesindeki bu konuda uğraşan insanlar mücadeleyi bıraksın mı? Ya da IQ' ya çok takıyor millet başka örnek ::)
İnsanlar arası dini, kültürel çatışma, hoşgörüsüzlük vs.. çoğaltılabilir, sorunların çözümü 1000'li seviyelerde EQ vb. türden zeka gerektiriyor diye mücadeleyi bırakalım mı?
İnsan karşı koyma cüreti gösterdiği olay kadar zekidir, sen elindeki 150lik derecenle istersen multi thread-proc. işi yap. Ona 100 yeter, demekki sen bir aptalsın ve zekanı "verimli" kullanamıyorsun demektir.
Velhasılı olay mücadele sırasında nerede pes ettiğin ile alakalı bana göre.. (Bazen sınırları zoruyorum , başım ağrıyor. Ama vazgeçmiyorum zeki değilim diye:)
Aklima Forrest Gump geldi =) 75 IQ ile baya bir sey basariyordu.. =)
@atioky_216
Tekrar söylüyorum zeka fışkıran birisi değilim öyle algılandı galiba :) .Benim demek istediğim zeka seviyesi yüksek insanlar çözümlere daha hızlı ve kolay ulaşırlar.Benim gibi orta zekalı olanlar ise yavaş ve zorlanarak çözüme ulaşırlar.Eğer ben,yaşam sürem boyunca, zeka seviyemin, çözüme ulaşmaya yetmeyeceği bir problemle uğraşıp, çözümü anca bir yere kadar getirip sonra hakkın rahmetine kavuşursam ve benden sonrakilerde kaldığım yerden devam ediyorlarsa buna da bilim denir zaten.
Bir cok dilde kullanilan
Struct nedir union nedir? Aralarindaki fark, kullanim yerleri nedir ?
☢ Saka gibisin.
:D
Evet Hocam Nedir Açıklarmısınız ?
Kendimce tanımlayayım;
Birden fazla değişkeni tek çatı altında toplayan yapıya structure denir.
Union ise, bir değişkeni daha alt boyuttaki değişkenlere parçalamaya yarayan yapıya denir.
Alıntı yapılan: z - 17 Kasım 2013, 17:42:56
☢ Saka gibisin.
Felsefi sorular soran baslik açmak kimsenin tekelinde degildir.
Konu iyice sarpa sarmis.
Zannettim ki MIT'deki "Algoritma" veya "Intro to computer science" da islenen konular anlatilacak.
DFS, BFS , A*, heuristic, CSP, Kmin, Bayes network vs..
Edx, de Berkeley Yapay zeka dersini tavsiye ederim.
Alıntı yapılan: z - 18 Kasım 2013, 17:31:14
Kendimce tanımlayayım;
Birden fazla değişkeni tek çatı altında toplayan yapıya structure denir.
Union ise, bir değişkeni daha alt boyuttaki değişkenlere parçalamaya yarayan yapıya denir.
Hocam Örnek Verirmisin ?
mesaj birleştirme:: 18 Kasım 2013, 18:46:02
union paylas{
float f;
int i;
char kr;
};
ile
struct paylas{
float f;
int i;
char kr;
};
nin farkı nedir?
Struct tanımında Paylaş adındaki değişken topluluğunun 3 tane üyesi var. Üyelerin her birisi kendi başına bir değişken. Ama paylaş adındaki gruba üyeler.
Union tanımında ise Paylaş adındaki değişken öyle bir değişken ki sen bu değişkene istersen float bir değer, istersen integer bir değer istersen char bir değer yükleyebilirsin.
3 üyesi varmış gibi görünüyor ama aslında bunlar aynı değişkenin farklı isimlendirilmesinden oluşuyor.
https://www.picproje.org/index.php/topic,35908.msg257079.html#msg257079 (https://www.picproje.org/index.php/topic,35908.msg257079.html#msg257079) Buradaki renkli anlatıma bir bak.
Bu arkadaşların Hafızadaki Durumu Nasıl Olur ?
union paylas{
float f;
int i;
char kr;
};
Bu arkadaş hafızada 4 byte tutar en büyük elemanı int veya floattır.
(Keil C Arm Compiler:http://www.keil.com/support/man/docs/armccref/armccref_Babfcgfc.htm)
struct paylas{
float f;
int i;
char kr;
};
Bu ise eğer packed edilmişse 4+4+1=9 byte tutmaktadır.
Arm adresleri 32-bit veri tutuyor diye biliyorum eğer öyleyse packed edilmemişse 4+4+4=12 byte olacaktır. Not:Burayı şimdilik çok kafanıza takmayın.
ARM işlemcide değişkenler boyutlarına göre ramda özel adreslere yerleştirilirler.
Char değişkenler için herhangi bir sınırlama yok.
Short değişkenler daima çift adreslere yerleşirler.
Integer değişkenler ise daima 0 dahil 4 ün katları adreslere yerleştirilirler.
C buna dikkat eder.
Değişkenler bu sıralamaya uymadan rama yerleştirilirse rama erişim performansı çok düşer hatta bazı cpu komutları fault ile sonuçlanır.
Alıntı yapılan: z - 18 Kasım 2013, 22:01:17
ARM işlemcide değişkenler boyutlarına göre ramda özel adreslere yerleştirilirler.
Char değişkenler için herhangi bir sınırlama yok.
Short değişkenler daima çift adreslere yerleşirler.
Integer değişkenler ise daima 0 dahil 4 ün katları adreslere yerleştirilirler.
C buna dikkat eder.
Değişkenler bu sıralamaya uymadan rama yerleştirilirse rama erişim performansı çok düşer hatta bazı cpu komutları fault ile sonuçlanır.
O zaman struct packed etmek tehlikeli midir hocam ARM'da ?
Tehlikeli degil. C structure uyelerini bahsettigim kurala gore yerlestiriyor.
Bu durumda ornegin char short int siralamasi varsa
char, bos char, short, int seklinde dizilis yapiyor. Yani kurali bozan adreslere kullanilmayan char karakterler yerlestiriyor. Bu durumda structure boyu tek tek degiskenlerin uzunluklari toplamindan daha fazla yer kapliyor.
Dolayisi ile herhangi bir tehlike yok.
Bu siralamayi progma direktifi ile degistirebiliyorduk ama neydi hatirlamiyorum.
Alıntı yapılan: z - 18 Kasım 2013, 22:44:51
Tehlikeli değil. C structure uyelerini bahsettigim kurala gore yerlestiriyor.
Bu durumda ornegin char short int siralamasi varsa
char, bos char, short, int seklinde dizilis yapiyor. Yani kurali bozan adreslere kullanilmayan char karakterler yerlestiriyor. Bu durumda structure boyu tek tek degiskenlerin uzunluklari toplamindan daha fazla yer kapliyor.
Dolayisi ile herhangi bir tehlike yok.
Bu siralamayi progma direktifi ile degistirebiliyorduk ama neydi hatirlamiyorum.
#pragma pack(1) değil anladığım kadarıyla. :)
Oyle bir sey yok derken?
Alıntı yapılan: gerbay - 18 Kasım 2013, 23:54:39
@z
Oyle birsey yok. Packed struct yapip istediginiz sirada dizip gorun..
Align etmek tüm platformlarda performans artirir. 32-bit platforma 4-byte align etmek daha uygundur, 16-bit platformda 2-byte a..
gerbay hocam sonuç olarak #pragma pack(1) structı birbirine yapıştırıyor mu ?
AsHes
Sanirim Gerbayin itiraz sebebini anladim.
Benim yaptigim aciklama kuru structure kurulumu yapilirsa olan duruma aitti. Aciklamamin sonunda "Bu siralamayi progma direktifi ile degistirebiliyorduk ama neydi hatirlamiyorum" dedigim kisim (aradaki fazlalik ve kullanilmayan alanlari kaldirirsaniz) bahsettiginiz paketleme durumu olusuyor.
Fakat bu durumda bu tip "structure"lara erisirken dedigim performans sorunu ortaya cikiyor. Daha da kotusu bu tip align edilmemis alanlara bazi makine kodlari ile erisemiyorsunuz.
Bu C acisindan sorun degil cunku C zaten bu durumlarda o tip komutlari kullanmaz.
Fakat bazi ozel cpu komutlariyla bu alanlara asm ile erismek isterseniz o zaman makine fault durumuna dusecektir.
Ne işte ne de hobi olarak ASM kullanmadığıma sevindim o zaman :).
Programi C ile de yazsan ASM ile de yazsan sonucta CPU nun VDD sine - , VSS'sine + voltaj verirsek CPU bozulur. :)
"ASM"de hersey klavyeyi parmaklayanin sorumlulugunda.
Kaç kişi bir fonksiyonları yazarken Fchart kullanıyor ?
bu akış diyagramlarının kaç çeşidini biliyoruz ?
android için geliştirilmiş app inventör bir çeşit akış diyagramı yöntemini mi kullanıyor ?
Tasarim asamasinda yazilmak istenen fonksyon karmasiksa, pek cok durum arasinda gecis yapilacaksa akis diyagrami cizmeden zaten kod yazamazsin.
Fakat gecis durumlari aklinda tutabilecegin kadar az sayida ise akis diyagrami zaten kafanda olusmus demektir.
Aslini sorarsan program yazarken beynimizdeki pencerelerden birisinde akis diyagramini olusturuyoruz. Bir diger pencerede ise bu akis diyagramina uygun dil kodlamasini yapiyoruz. Fakat proje karmasiksa beynimizdeki akis diyagram penceresinde stack overflow vs oldugu icin mecburen kagit kaleme donuyoruz.
Bilgisayar programlari kullanarak bu gune kadar hic akis diyagrami cizmedim. Dokumantasyon icin gerektiginde ise "paint"de resim cizer gibi akis diyagramlari olusturdum.
Eger bu is icin PC programi kullanirsam bana ne gibi kolayliklar saglar?
Normalde @z hocanın dediği gibi kafada kalıyorsa kağıt kaleme pek ihtiyaç olmuyor. Bana göre çok karmaşık gelen bir projede akış diyagramı kullandım kodlarken inanılmaz kolaylık sağladı. Bu iş için microsoft Visio kullanıyorum çok kullanışlı bir program.
ben visio yu veritabanı tasarımı yaparken kullanıyordum. tablolar arası ilişki, wievler vb arasındaki sorgulamalar falan filan sorasında büyük kolaylık sağlıyor.
Ben genelde bir program yazmadan önce kağıt üzerinde epey bir karalama yapıyorum, akış ve nesne şemaları çiziyorum. Hatta bazen kodları bile kağıda yazdığım oluyor, kafamda olay netleşince bilgisayara geçiriyorum.
Bende genelde karışık bir işlem için algooritma yürütmem gerekirken yapılacak işlemi exel de tabloya dökerim. Sonra tablo üzerine çalışmak, mantık yürütmek ve yapılacak işlem içerisinde matematiksel bağlantılar kurmak daha kolay oluyor.