PDA

Tam Sürümünü Görmek İçin : c++ da bir dizi sorun..


eGeMx
14/04/2006, 01:37
Bir programı yapmaktan daha zor olan şey, bitti diye düşündüğünüzde karşınıza hata çıkmasıdır. Kafanızda bitmiştir ama program ondan ilginizi çekmenizi istemez..
Bütünüyle çalışması gerek program en sona yaptığım ufak bir ilaveden ötürü windows hatası veriyor. Ben bunu ram a bağladım sizce de doğru olabilir mi??
Başlangıçta tanımladığım değerler çok büyük.. [7000][7000] gibi.. Bu degerlerin tamamının kullanılacağını düşünmüyorum fakat vaz geçemem.. Şöyle birşey yapmayı hayal ediyorum; mainden sonra kaçtane bana gerekliyse ben giricem, ona göre sınırlandıracak. Yani başta kapladığı ram ı boşaltacak ?? Bir türlü işin içinden çıkamadım..
Birde program içinde de acaba farkında olmadan çok fazla işgal ettiğim yerler olabilir mi? Yani acaba tanımladığım değer, fonksiyondan çıkınca kendisini kapatsa??
Kısaca bu ram le ilgili söyleyebileceğiniz birşeyler varsa çok programı bitirebilcem :utangac: Adress yada kaynak gösterirseniz yada yada aratmam geren bir başlangıç kelimesi..:garip:


acehreli
14/04/2006, 03:04
eGeMx, hatanin ne oldugu konusunda en ufak bir bilgi vermiyorsun. Tahmindan oteye gidemeyiz. :(

Soyledigin diger sorunlar da hep olasi. Ornegin bellek sizintisi olabilir veya artik gecerli olmayan bir nesneye erismeye calisiyor olabilirsin (senin "kendisini kapatsa" dedigin olay).

Ali

eGeMx
14/04/2006, 13:01
#include <iostream>
using namespace std;
int uzay[7000][7000];
char bosluk[7000][7000];
int i,s,j,z,d,k,l,t,o,m,n,a,y,u,v,b,c;
main()
{
cout<<"uzayin sinirlarinizi giriniz";
cin<< s;

Artık sınırları biliyoruz. Sınırlar çok ufakta olsa biz 7000 e 7000 lik yer açmış durumdayız.. Bundan kazanç sağlamanın bir yolu ver mı?
Mesela;
main den sonra {
int uzay[s][s]; diyip yeni bir tanımlama yapsam olmuyor,,?
Birde bu tanımı acaba class seklinde yapsam daha mı hızlı çalışır??
ve ufak gibi gözüken "i,s,j,s,z,d,k,l,t,o,m,n,a,y,u,v,b,c" tanımlamalarıda çok yer harcıyor olabilir mi??

ceeyt
14/04/2006, 13:59
int uzay[s][s]; diyip yeni bir tanımlama yapsam olmuyor

int **uzay; olarak tanimlayip dizini dinamik olarak duzenleyebilirsin.

Baska bir secenekde std::vector gibi akilli bir dizi kullanmak olabilir.

Birde bu tanımı acaba class seklinde yapsam daha mı hızlı çalışır??

hiz ve bellek harcama konusunda ne kadar kullaniciya yakinlasirsan genelde o kadar yavaslarsin ve o kadar daha fazla bellek harcarsin. asm rulz :)
Denemeden kesin bisey soyleyemiyorum ama sinif icinde bu tanimlamayi yapsan bile daha hizli calisacagini, ozelliklede hissedilir bicimde daha hizli calisacagini sanmiyorum.

eGeMx
14/04/2006, 15:26
Teşekkür Ederim, sorunum bir nebze de olsa çözüldü:super:
Çözülmeyen kısmı ise, sonuç kısmına normalde verileri yazıp bastırıyorum.
cozum[t]=n;
t++;
gibi.. Fakat bunun altına bir tane daha koyunca;
cozum[t]=n;
t++;
coum[t]=m;
t++;
deyince hata veriyor.. Denklemi içi içede yaptım, gene hata.. Herşeyi denetledim hatayı bulmak için, herşey doğru.(2 gündür hata aranıyorum).. Kütüphane olarak:
#include <iostream>
using namespace std;
kullanıyorum, acaba çözüm için başka bir kütüphane yada ek bir tane daha önerebilir misiniz? :rolleyes:

eGeMx
14/04/2006, 21:08
Hala araştırmaya devam ediyordum ki sorunun kesin nedeni saptandı... Bellek sızıntısı..(Memory Leak, MLK) php den sonra c++ rüya gibi gelmişti ama galiba c++ da yeterli değil.. Java da bu tip sorunlar olmuyormuş, içerisinde çöp toplayıcısı varmış ve bu işi elle yapmak çok zormuş..
Ben yapmak zorundayım, lütfen elinizde bu konu ile ilgili kaynak varsa yardımcı olun:(

Sabahi
14/04/2006, 22:15
@eGeMx, php bir scripting language C++ ise bir programlama dili. Ikisini karsilastirmaniz manasiz. Birde yukarda verdiginiz kod parcasina bakarak sorununuzun memory leak olmasi uzak bir ihtimal gibi geliyor. Eger programinizin baska bolumlerinde dynamic hafiza kullanimi varsa belki derim. Ayrica memory leak kolayca farkina varilacak hatalara yol acmaz. Memory leak yaratan programin uzunca bir sure calismasi lazim problem yaratabilmesi icin.

eGeMx
15/04/2006, 11:36
Php ile c++ karşılaştırmıyorum tabiki,, orada php nin de sınırsız olduğunu ve bana eskiden yettiğini, şimdi ise c++ ın bile yetmediğini anlatmaya çalıştım.. Bellek sızıntısı olması muhtemel çückü dinamik hafıza kullanmadı.. Dinamik hafızada belleği rahatlatmak için. Ayrıca kod uzun süre ardı ardına işlem yapan bir kod,, öyle ki şahıs yerine mustafa diye tanımlayınca bile saçmaladı..(ki mustafa en uzun karakterli isim değil). Normal çalışan bir programın sadece bir isim değişikliğiyle, yada ufacık bir parçacık eklemesiyle sapıtmasının başka bir açıklaması olabilir mi?
Tüm yardım eden, okuyupta araştıran bütün arkadaşlata teşekkürler :) Pazartesi bölüm hocamızla konuşucam,, çözümü herkezin faydalanması adına buraya yazarım :)

ceeyt
15/04/2006, 18:23
Bellek sızıntısı olması muhtemel çückü dinamik hafıza kullanmadı.. Dinamik hafızada belleği rahatlatmak için.

ne anlatilmak istendigi cok belli degil ama programda dinamik bellek kullanilmadigi icin bellek sizintisi oldu mu diyorsun ???


Normal çalışan bir programın sadece bir isim değişikliğiyle, yada ufacık bir parçacık eklemesiyle sapıtmasının başka bir açıklaması olabilir mi?

olabilir

şimdi ise c++ ın bile yetmediğini anlatmaya çalıştım

- cok sinirli bir sistem icin program yaziyorum C++ exe leri malesef biraz daha buyuk oluyor bu nedenle, C++ yetmedi

- program yazdigim cihaz sadece ansi C derleyicisine sahip, bu nedenle C++ yetmedi

- islemciye bir cycle bile fazladan islem yaptirtmak isime gelmiyor, bu nedenle C++ yetmedi

- bir byte bile fazladan alan kullanilmamasi gerekiyor, bu nedenle C++ yetmedi

- programi cok hizli gelistirmem gerekiyor iki buton koysam yeter, zaten sistemle ilgili hicbir islem yapmiyorum bu nedenle C++ yetmedi

C++ sana neden yetmedi ?

cout<<"uzayin sinirlarinizi giriniz";
cin<< s;

int uzay[s][s];

yukaridaki kodu deneyecek kadar yenisin ama C++ yetmedi diyorsun.Cok iddialisin. Yillarini bu ise veren bir suru insan bunca zamandir bosa ugrasiyorlarmis, tuh yazik olmus.

eGeMx
15/04/2006, 20:05
c++ da iddalı değilim,, hatta o kadar yeniyim ki sizlerin kullandığı kütüphaneleri soruyorum.. Sadece tasarladığım programcık çok basit bir algoritmaya sahip ve herbir parçacık kendi içinde doğru olarak çalışıyor. Herşey bu kadar sorunsuz iken bütününde sorun çıkıyor..
Evet dinamik bellek ismini önceden sadece duymuştum, sen söyleyince araştırmaya başladım fakat 2 gündür öylesine araştırıyorum ki denemesemde pek çok konuda ön bilgim oldu. Ve bu bilgilerden yola çıkarak sorunumun bellek sızıntısı olduğunu söyleyebiliyorum.(Çözümünü hala bilmiyorum) Ve php ile c++ karşılaştırdığım cümleleri bulamıyorum...

eGeMx
18/04/2006, 01:52
Problemi hocalara söyledim onlarda asistanlarına devrettiler :p Sorun bellek sızıntısıymış,, tanımladığım pointerlar fazla ve uzun süreli tekrarlandığından en bilinen sızıntı türü ortaya çıkıyormuş. Önlemenin yolu ise, pointer ı new komudu ile tanımlayıp, işlam çıkışı kullanmayacaksam delete ile silmek..
Yardımı dokunan arkadaşlara teşşekkür ederim :ginginn:

Revne
18/04/2006, 12:47
Yazılım en onemli adımlarından biri bir birinden bagımsız calisan modullerin birlikte calisabilmesini saglamak... Hatta bundan dolayı ciddi paralar kazanan insanlar var... 5.000 YTL gibi :)...

Neyse Acıkcası soylediklerinden bir sey anlamadım. Dizi kullaniyorsun daha sonra Memory Leak diyorsunn.. Bence bununla alakalı deil bu... (eger New ve malloc lu işlemlerin yoksa....)

Bence problemin diziden kaynaklanıyor her nasıl oluyorsa gosterdigin index dizi sinirini asıyor...
yani asagidaki kodda oldugu gibi...
int dizi[10];
for( int i=0;i<11;i++)
dizi[i]=i*i;