Neden Uygulama Açılmıyor (Crash) [C++]
-
#include <Windows.h> #include <iostream> #include <fstream> #include <stdio.h> #include <string> #include <conio.h> #pragma comment(lib,"user32.lib"); using namespace std; int main(int argc, char* argv[]) { if ( argc != 2 ) { return EXIT_SUCCESS; } string args = argv[1]; if((args == "/?") || (args == "-?")) { return EXIT_SUCCESS; } string DosyaKonumu = args; string SplitY[100000],SplitX[100000],BTus[100000],Kontrol,TikSayi,KoordinatlarX,KoordinatlarY,BTik,Dongu,SureAl,ZamAl; unsigned short don_tekrar,sur_bekle; ifstream Dosya (DosyaKonumu); getline(Dosya,Kontrol); getline(Dosya,TikSayi); getline(Dosya,KoordinatlarX); getline(Dosya,KoordinatlarY); getline(Dosya,BTik); getline(Dosya,Dongu); getline(Dosya,SureAl); Dosya.close(); don_tekrar = atoi((char*)Dongu.c_str()); sur_bekle = atoi((char*)SureAl.c_str()); return 0; }
Bu uygulamada neden açıldığı anda uygulama çöküyor?
IDE -> Codeblocks
Derleyici -> VC++ 10Bloktaki kodlar silinince çalışıyor.
-
Sorun
SplitY[100000]
buradaymış ancak neden crash oluyor? RAM de yeteri kadar ram de var aslında
-
İşletim sistemi, programın ilk açılırken istediği bellek boyutuna bakar. Eğer değer çok büyükse o alanı vermek istemeyebilir diyebiliriz yüzeysel olarak. http://forum.ceviz.net/c-c/121877-dev-cde-buyuk-matrislerde-karsilastigim-hata.html adresinde de bu konu geçmişti. Araştırmanız gereken anahtar sözcükler "dinamik bellek yönetimi".
-
Fatih54 bunu yazdı
Sorun
SplitY[100000]
buradaymış ancak neden crash oluyor? RAM de yeteri kadar ram de var aslında
Stack bölümünden istediğin içindir. İşletim sisteminde yeterince bellek olsada stack kısmı ile heap kısmını işletim sistemi ayrı ayrı programlara tahsis eder.
new, malloc, calloc gibi dinamic yöntemler kullanırsan sıkıntın kalmaz.
DrKill tarafından 09/Nis/13 21:42 tarihinde düzenlenmiştir -
linker'a stack size'imi ( su boyutlarda[reserve,commit] ) yaz dedigin zaman, linker 'da pe yapisi icinde ki
DWORD SizeOfStackReserve
The amount of virtual memory to reserve for the initial thread's stack. Not all of this memory is committed, however (see the next field). This field defaults to 0x100000 (1MB). If you specify 0 as the stack size to CreateThread, the resulting thread will also have a stack of this same size.DWORD SizeOfStackCommit
The amount of memory initially committed for the initial thread's stack. This field defaults to 0x1000 bytes (1 page) for the Microsoft Linker while TLINK32 makes it two pages.
guru tarafından 11/Eki/13 11:22 tarihinde düzenlenmiştir
elemanlari set eder. boylece exe bellege yuklenirken isletim sistemi gereksinimleri yerine getirir ve sorun cikarmaz :)
http://msdn.microsoft.com/en-us/library/8cxs58a6.aspx -
C ödevi yaparken aynı muhabbeti ben de yaşamıştım. 1000*1000 lik bir sürü array almıştım. Programın alabileceği static memory'yi aştığım için main fonksiyonuna girmeden segmentation fault verip kaptıyordu. Dinamik kullan sorun çözülür.
-
İşletim sistemi stack olarak vermediğinden olmuş guru nun dediği yapılırsa düzelecektir büyük ihtimalle.
-
Fatih54 bunu yazdı
İşletim sistemi stack olarak vermediğinden olmuş guru nun dediği yapılırsa düzelecektir büyük ihtimalle.
Bence o tip seyler yapma
vector<string> ya da link list yaz ne bileymi dinamik birseyler kullan
vector<string> SplitY;
vector<string> SplitX;
vector<string> BTus;
ya da olmadi istersen Boostunkilere bak vs vs.
-
dinamik bellek kullanmak elbette ki daha akilci bi yontem olurdu
fakat ben, sorunun gercekten neden kaynaklandigini belirtmek istedim