[Çözüldü] Segmentation fault (core dumped) hatası

Başlatan erdemakin09, 24 Mart 2016 - 13:12:08

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

erdemakin09

İyi günler arkadaşlar. Pointerlardan kaynaklanan bir sorun olduğunu biliyorum. Fakat bir sorunda göremedim açıkcası bir danışayım dedim.

Kodu Silmek Zorundaydım. Proje tesliminde kontrol ediliyor. Birisi buradan kopyalayıp kendi projesine yazara benim için orun olur :)
Her Can Bir Gün Ölümü Tadacaktır!

unixmania


int * dugumRenkleri;


diyemessin.


int dugumRenkleri[5];


falan diyecen. Array'ın boyutunu belirticen.

erdemakin09

Peki ya dizinin boyutu belirli degilse nasil tanimlama yapmam gerek
Her Can Bir Gün Ölümü Tadacaktır!

unixmania

#3
Alıntı Yap
Peki ya dizinin boyutu belirli degilse nasil tanimlama yapmam gerek

"kruskal"  fonksiyonunu çağırdığın anda dizinin boyutu belli değil mi?

Aksi halde belirlediğin bir üst limiti boyut diye ataman gerek.

Ayrıca "CAST"  ta yapabilirsin. Burada göstermiş.

http://stackoverflow.com/questions/17937623/initializing-c-dynamic-arrays

erdemakin09

Alıntı yapılan: unixmania - 25 Mart 2016 - 10:04:06
Alıntı Yap
Peki ya dizinin boyutu belirli degilse nasil tanimlama yapmam gerek

"kruskal"  fonksiyonunu çağırdığın anda dizinin boyutu belli değil mi?

Aksi halde belirlediğin bir üst limiti boyut diye ataman gerek.

Ayrıca "CAST"  ta yapabilirsin. Burada göstermiş.

http://stackoverflow.com/questions/17937623/initializing-c-dynamic-arrays

Dediğin herşeyi yaptığım halde derlerken bir sorun yokken yine debug yaptığımda aynı satırlardan sorun var diye gösteriyor.
Her Can Bir Gün Ölümü Tadacaktır!

unixmania

Alıntı Yap
Dediğin herşeyi yaptığım halde derlerken bir sorun yokken yine debug yaptığımda aynı satırlardan sorun var diye gösteriyor.


int dugumRenkleri[dugumSay];


olacak o. Sen ne yaptın ki?

Adam gibi debug yapmak için "printf" ekle döngünün içine:


printf("%d\n", i);
dugumRenkleri[i] = i;


Ayrıca döngünün üstüne de:


printf("dugumSay :%d\n", dugumSay);

erdemakin09

Alıntı yapılan: unixmania - 25 Mart 2016 - 14:32:28
Alıntı Yap
Dediğin herşeyi yaptığım halde derlerken bir sorun yokken yine debug yaptığımda aynı satırlardan sorun var diye gösteriyor.


int dugumRenkleri[dugumSay];


olacak o. Sen ne yaptın ki?

Adam gibi debug yapmak için "printf" ekle döngünün içine:


printf("%d\n", i);
dugumRenkleri[i] = i;


Ayrıca döngünün üstüne de:


printf("dugumSay :%d\n", dugumSay);


int dugumRenkleri[dugumSay];
Yaptım bu şekilde yapınca o satırdaki sorun kalkıyor.

if ( dugumRenkleri[d1] == dugumRenkleri[d2] ){
                cevrimYok = 0;
            }


bu satırda "if" yapısının tanımladığı satırda hata veriyor.
hatada şu Building to ensure sources are up-to-date
Selecting target:
Debug
Adding source dir: /home/erdem/Masaüstü/C++ Projelerim/Kruskal/
Adding source dir: /home/erdem/Masaüstü/C++ Projelerim/Kruskal/
Adding file: /home/erdem/Masaüstü/C++ Projelerim/Kruskal/bin/Debug/Kruskal
Changing directory to: "/home/erdem/Masaüstü/C++ Projelerim/Kruskal/."
Set variable: LD_LIBRARY_PATH=.:
Starting debugger: /usr/bin/gdb -nx -fullname  -quiet  -args "/home/erdem/Masaüstü/C++ Projelerim/Kruskal/bin/Debug/Kruskal"
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
At /home/erdem/Masaüstü/C++ Projelerim/Kruskal/main.cpp:44
Continuing...
Program received signal SIGSEGV, Segmentation fault.
At /home/erdem/Masaüstü/C++ Projelerim/Kruskal/main.cpp:44

Her Can Bir Gün Ölümü Tadacaktır!

Amenofis

Bu yazdığın kod giriş çıkış fonksiyonları haricinde c++'a özel hiçbir özellik içermiyor. Yani cin ve cout nesnelerini printf ve scanf ile değiştirirsen kodu C derleyicisi ile derleyebilirsin.

erdemakin09

Alıntı yapılan: Amenofis - 25 Mart 2016 - 22:51:37
Bu yazdığın kod giriş çıkış fonksiyonları haricinde c++'a özel hiçbir özellik içermiyor. Yani cin ve cout nesnelerini printf ve scanf ile değiştirirsen kodu C derleyicisi ile derleyebilirsin.

Dediğini yaptım yine aynı hata fakat debug yapınca sorun şöle bişey oldu bu sefer
#0 0x4008db ?? () (??:??)
#1 0x4006ec ?? () (??:??)
#2 0x7ffff7a36ec5 __libc_start_main(main=0x400580, argc=1, argv=0x7fffffffe3e8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe3d8) (libc-start.c:287)
#3 0x400778 ?? () (??:??)
Her Can Bir Gün Ölümü Tadacaktır!

Amenofis

Ben sadece bilgi amaçlı söylemiştim. Bu kod için c++ derleyicisine gerek yok, tamamen C kodu bu.

Neyse kodu denedim. 1. sorun şu;
int * dugumRenkleri;  <------   İşaretçiler bu şekilde kullanılmaz. Ya statik ya dinamik olarak bellek tahsisi yapacaksın. Ben deneme amaçlı statik olarak 500 eleman ayırdım şu şekilde;

int dugumRenkleri[500];
Ama yine hata verdi. Hata verdiği satır şu: if ( dugumRenkleri[d1] == dugumRenkleri[d2] )...

Hata ayıklayıcıda d1 değişkeninin değerine baktım ve 538982953 sayısını gördüm. Bu programın kadar büyük boyutlu belleğe ihtiyacı olmayacağını varsayarak algoritmik bir hata yaptığını söyleyebilirim.

Debugger ile adım adım çalıştırarak nerede hata yaptığını bulmaya çalış. kenarlar.d1 değişkeni hatalı bir değer alıyor, ona odaklanabilirsin.

erdemakin09

Alıntı yapılan: Amenofis - 27 Mart 2016 - 16:01:29
Ben sadece bilgi amaçlı söylemiştim. Bu kod için c++ derleyicisine gerek yok, tamamen C kodu bu.

Neyse kodu denedim. 1. sorun şu;
int * dugumRenkleri;  <------   İşaretçiler bu şekilde kullanılmaz. Ya statik ya dinamik olarak bellek tahsisi yapacaksın. Ben deneme amaçlı statik olarak 500 eleman ayırdım şu şekilde;

int dugumRenkleri[500];
Ama yine hata verdi. Hata verdiği satır şu: if ( dugumRenkleri[d1] == dugumRenkleri[d2] )...

Hata ayıklayıcıda d1 değişkeninin değerine baktım ve 538982953 sayısını gördüm. Bu programın kadar büyük boyutlu belleğe ihtiyacı olmayacağını varsayarak algoritmik bir hata yaptığını söyleyebilirim.

Debugger ile adım adım çalıştırarak nerede hata yaptığını bulmaya çalış. kenarlar.d1 değişkeni hatalı bir değer alıyor, ona odaklanabilirsin.

Teşekkür Ederim dediğin kısma odaklanayım eğer çözemezsem kodu tekrar yeniden yazıcam başka çarem kalmadı
Her Can Bir Gün Ölümü Tadacaktır!