[]
matlab (java, c++ vs) programlama
programda bir foksiyon cagirildi, return ile veri dönüsü olmadi ama.
simdi o programda bir baska fonksiyon daha cagirmak istiyorum, ama bu sefer daha önce cagirilmis olandaki degiskenleri kullanmak istiyorum. onlara nasil ulasirim?
mesela
levrek(sukadartuttum, gecenaybukadarsattim) dedim, levrek icerisinde fiyat=[1,2,3,4,5] diye bir matris olustu.
sonra
balikkaclira(mevsimlerdenne) diye fonksiyon cagirdim, burda fiyatin üzerinde bazi etkenler koyacagim, kar yagdiysa artacak, levregin sezonuysa düsecek vesaire. ama fiyati sifirdan tekrar hesaplatmak istemiyorum. nasil cagiririm?
workspace ya da global degiskenlerde cikmiyor fonksiyon calistiktan sonra fiyat. nasil yapiliyor?
java ve c++ ekleme nedenim temelde benzesiyor olmalari. c bilgim yetmedi. örnegimin garabetligi icin de özür dilerim, orjinali cok daha komplike olacakti.
edit:cözüldü. olasi cözümler ile soruyu güncelleyecegim bir iki güne. ileride arayanlara yardimi dokunur umarim.
simdi o programda bir baska fonksiyon daha cagirmak istiyorum, ama bu sefer daha önce cagirilmis olandaki degiskenleri kullanmak istiyorum. onlara nasil ulasirim?
mesela
levrek(sukadartuttum, gecenaybukadarsattim) dedim, levrek icerisinde fiyat=[1,2,3,4,5] diye bir matris olustu.
sonra
balikkaclira(mevsimlerdenne) diye fonksiyon cagirdim, burda fiyatin üzerinde bazi etkenler koyacagim, kar yagdiysa artacak, levregin sezonuysa düsecek vesaire. ama fiyati sifirdan tekrar hesaplatmak istemiyorum. nasil cagiririm?
workspace ya da global degiskenlerde cikmiyor fonksiyon calistiktan sonra fiyat. nasil yapiliyor?
java ve c++ ekleme nedenim temelde benzesiyor olmalari. c bilgim yetmedi. örnegimin garabetligi icin de özür dilerim, orjinali cok daha komplike olacakti.
edit:cözüldü. olasi cözümler ile soruyu güncelleyecegim bir iki güne. ileride arayanlara yardimi dokunur umarim.
Tam çözemedim demek istediğini ama anlamaya ve yardımcı olmaya çalışayım.
balikkaclira'nın çıktısını nedir? Bu çıktıyı globale mi kaydetmek istiyorsun?
function [ciktilarblabla] = balikkaclira(mevsimlerdenne)'yı [baskabaskaciktilar] = levrek(sukadartuttum, gecenaybukadarsattim) 'in içinde çalıştırıyorsun sanırım. Fiyat hangi fonksiyonun değişkeni ve buna yapılan değişiklikler nereye kaydedilecek?
balikkaclira'nın çıktısını nedir? Bu çıktıyı globale mi kaydetmek istiyorsun?
function [ciktilarblabla] = balikkaclira(mevsimlerdenne)'yı [baskabaskaciktilar] = levrek(sukadartuttum, gecenaybukadarsattim) 'in içinde çalıştırıyorsun sanırım. Fiyat hangi fonksiyonun değişkeni ve buna yapılan değişiklikler nereye kaydedilecek?
- aychovsky (02.05.16 19:45:08 ~ 19:45:29)
Madem cözüldü sadece bu yapinin nasil calisitigini özetleyeyim, belki birinin ihtiyaci olur:
bir fonksiyon icinde hesaplama yaparsaniz ve o hesaplama sonucunda olusan veriyi bir yere kaydederseniz yani bir degiskene atarsaniz o degisken "local" degisken olur. java icin konusursam o fonksiyon bittigi anda "garbage collector" tarafindan isi bittigi gerekcesi ile temizlenir. yani fonksiyon icinde üretilen data sonsuza kadar tutulmaz. peki fonksiyon icinde üretilen bir dataya ihtiyacimiz olursa ne yapmamiz gerekir? iki temel secenek var
1. fonksiyondan datayi döndürmek ve global degiskene atamak
2. fonksiyon icinden direkt olarak global bir degiskene deger atamak.
(javada asla tam global yoktur ama bir üst erisim alani vardir, yine de global diyebiliriz)
Benim kisisel önerim yöntem 1 uygulanmali cünkü bir yazilimi mimari acidan ele alirsak bir fonksiyon sadece bir output olusturmali yani sadece bir atomic görevi olmali. birden fazla datayi degistiren bir fonksiyon yazilimin karmasasini arttirir, ilerki dönemlerde bircok soruna neden olur.
her bir fonksiyonun, methodun bir "scope" yani etki alani vardir. degiskenler o "scope" icinde yasarlar ve bittigine ölürler(ya da öldürülürler). bu nedenle daha fazla alanda kullanilacak degiskenler/datalar bir üst belki de en üst "scope" icine atilip kullanilirlar. bu mantik matlab, c++ veya java farketmez hepsinde benzerdir, sadece kücük nüans farklari vardir.
peki programlama dilleri bunu niye yapiyor?
- mimari acidan amac bir datanin her yerden erisilir olmasi onu kimin degistirdiginin, su anda senin fonksiyonun onu kullanirken baska bir fonksiyonun o anda onu degistirip degistirmesini önlemek icin önemli. örnegin bir x degiskeni icine bakiyorsun ve degeri 2. sonra x ile x i topluyorsun bir de bakiyorsun deger 6 olmus. neden oldu, cükü sen baktiktan sonra toplayincaya kadar gecen mili saniye icinde baska bir fonksiyon onu 3 olarak degistirdi. tam bir karmasa.
- ikinci önemli neden ise bu degiskenlerin hafizada yer kapliyor olmasi. program calistigi sürede yasayan ve silinmeyen her degisken kullanilmayacak olsalar bile yer kaplayacaklardir. bunlar programi yavaslatir, kaynaklari tüketir. bir programi kullanirken bir süre sonra "cok yavasladi bu, bir kapatip acalim" dememiz aslinda programcinin gereksiz yere global degisken olusturmasi, gelistiricinin mimari hatasi sonucu iyi temizlenmeyen (bunu temizlik isini javada garbage collector otomatik yapar) degikenlerin gereksiz kaynak tüketmesi nedeniyle oluyor.
bir fonksiyon icinde hesaplama yaparsaniz ve o hesaplama sonucunda olusan veriyi bir yere kaydederseniz yani bir degiskene atarsaniz o degisken "local" degisken olur. java icin konusursam o fonksiyon bittigi anda "garbage collector" tarafindan isi bittigi gerekcesi ile temizlenir. yani fonksiyon icinde üretilen data sonsuza kadar tutulmaz. peki fonksiyon icinde üretilen bir dataya ihtiyacimiz olursa ne yapmamiz gerekir? iki temel secenek var
1. fonksiyondan datayi döndürmek ve global degiskene atamak
2. fonksiyon icinden direkt olarak global bir degiskene deger atamak.
(javada asla tam global yoktur ama bir üst erisim alani vardir, yine de global diyebiliriz)
Benim kisisel önerim yöntem 1 uygulanmali cünkü bir yazilimi mimari acidan ele alirsak bir fonksiyon sadece bir output olusturmali yani sadece bir atomic görevi olmali. birden fazla datayi degistiren bir fonksiyon yazilimin karmasasini arttirir, ilerki dönemlerde bircok soruna neden olur.
her bir fonksiyonun, methodun bir "scope" yani etki alani vardir. degiskenler o "scope" icinde yasarlar ve bittigine ölürler(ya da öldürülürler). bu nedenle daha fazla alanda kullanilacak degiskenler/datalar bir üst belki de en üst "scope" icine atilip kullanilirlar. bu mantik matlab, c++ veya java farketmez hepsinde benzerdir, sadece kücük nüans farklari vardir.
peki programlama dilleri bunu niye yapiyor?
- mimari acidan amac bir datanin her yerden erisilir olmasi onu kimin degistirdiginin, su anda senin fonksiyonun onu kullanirken baska bir fonksiyonun o anda onu degistirip degistirmesini önlemek icin önemli. örnegin bir x degiskeni icine bakiyorsun ve degeri 2. sonra x ile x i topluyorsun bir de bakiyorsun deger 6 olmus. neden oldu, cükü sen baktiktan sonra toplayincaya kadar gecen mili saniye icinde baska bir fonksiyon onu 3 olarak degistirdi. tam bir karmasa.
- ikinci önemli neden ise bu degiskenlerin hafizada yer kapliyor olmasi. program calistigi sürede yasayan ve silinmeyen her degisken kullanilmayacak olsalar bile yer kaplayacaklardir. bunlar programi yavaslatir, kaynaklari tüketir. bir programi kullanirken bir süre sonra "cok yavasladi bu, bir kapatip acalim" dememiz aslinda programcinin gereksiz yere global degisken olusturmasi, gelistiricinin mimari hatasi sonucu iyi temizlenmeyen (bunu temizlik isini javada garbage collector otomatik yapar) degikenlerin gereksiz kaynak tüketmesi nedeniyle oluyor.
- emrahday (03.05.16 11:40:20 ~ 11:41:00)
1