Şimdi Ara

C takıldığım hata

Bu Konudaki Kullanıcılar:
2 Misafir - 2 Masaüstü
5 sn
21
Cevap
0
Favori
1.244
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Dinamik bellek yönetimi ile bir matris tanımladım ve bu matrisi yazdırmak isterken hata alıyorum. Konsol açılıyor ve bir süre bekledikten sonra kapanıyor. Kodun tamamını paylaşıyorum bilenler yardımcı olursa sevinirim. Teşekkürler..
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    void matrisOlustur();
    void bubbleSort(int **matris,int x,int y);

    int main()
    {
    matrisOlustur();
    return 0;
    }
    void matrisOlustur(){
    int satir,sutun;
    printf("Lutfen Satir Giriniz:");
    scanf("%d",&satir);
    printf("Lutfen Sutun Giriniz:");
    scanf("%d",&sutun);
    int **matris;
    matris = (int **)malloc(satir*sizeof(int));
    if(matris == NULL) {
    printf("Yeterli hafiza yok!");
    }
    for(int i=0;i<sutun;i++) {
    matris[i] = malloc(sutun*sizeof(int));
    }
    srand(time(NULL));
    for(int i=0;i<satir;i++) {
    for(int j=0;j<sutun;j++) {
    matris[i][j] = rand()%1000000 + 1;
    }
    }
    for(int i=0;i<satir;i++) {
    for(int j=0;j<sutun;j++) {
    printf("%d\t",matris[i][j]);
    }
    printf("
    ");
    }
    bubbleSort(matris,satir,sutun);
    printf("
    ");
    for(int i=0;i<satir;i++) {
    for(int j=0;j<sutun;j++) {
    printf("%d\t",matris[i][j]);
    }
    printf("
    ");
    }
    for(int i=0;i<satir;i++) {
    free(matris[i]);
    }
    free(matris);


    }
    void bubbleSort(int **matris,int x,int y) {
    int gecici;
    for(int i=0;i<x;i++) {
    for(int j=0;j<y;j++){
    for(int k=0;k<y-1-j;k++){
    if(matris[i][k]>matris[i][k+1]) {
    gecici = matris[i][k];
    matris[i][k] = matris[i][k+1];
    matris[i][k+1] = gecici;

    }
    }
    }
    }
    }



    < Bu mesaj bu kişi tarafından değiştirildi yukto -- 19 Nisan 2020; 14:16:34 >



  • hem pointer hem de neden matris kullanıyorsunuz onu anlamadım.
  • I0SER_b0y kullanıcısına yanıt
    Ödev yapıyorum da ödevde dinamik bellek yönetimi ile matris tanımlamam istenmiş bende bu şekilde yapıldığını biliyorum o işlemin.

    < Bu ileti DH mobil uygulamasından atıldı >
  • yukto Y kullanıcısına yanıt
    ödev metnini paylaşabilir misiniz?
  • I0SER_b0y kullanıcısına yanıt
    1- Dinamik bellek yönetimi ile bir matris oluşturulmalı.(15P) Boyutları kullanıcı girmeli Ve Bu matrisin içini 1 ile 1Milyon arasında rastgele sayılarla doldurmalı. Oluşturulan matris Kabarcık sıralama(Bubble Sort) metodu ile sıralanmalı.

    < Bu ileti DH mobil uygulamasından atıldı >
  • yukto Y kullanıcısına yanıt
    https://docplayer.biz.tr/42891446-Cok-boyutlu-diziler-ve-dinamik-bellek-yonetimi-ile-ilgili-ornekler.html


    buraya göz attınız mı?


    çogu şey dogru gibi.peki derlerken herhangi bir şey hata veriyor mu ? bir de freeleri kaldırıp dener misiniz suanlık geregi yok.


    Segmentation fault (core dumped) bence erişim olmayan bir yere atama yapılıyor.



    < Bu mesaj bu kişi tarafından değiştirildi I0SER_b0y -- 19 Nisan 2020; 8:53:12 >
  • Derlerken herhangi bir hata vermiyor. Freeleri kaldırdım denedim yine aynı şekilde. Konsol açılıyor satır sütun istiyor giriyorum girdikten sonra donup kalıyor ve kendiliğinden kapanıyor. Bazen de sorunsuz çalışıyor ama. Genelde satır sayısı sütun sayısından büyük olduğunda bu şekilde oluyor. Bir fotoğraf yüklüyorum.
    Peki bu Segmentation fault'un herhangi bir çözümü çaresi var mıdır?
    C takıldığım hata



    < Bu mesaj bu kişi tarafından değiştirildi yukto -- 19 Nisan 2020; 9:2:18 >
  • yukto Y kullanıcısına yanıt
    debug etmelisiniz exit code 139 diyor.
    https://prnt.sc/s258tb



    < Bu mesaj bu kişi tarafından değiştirildi I0SER_b0y -- 19 Nisan 2020; 9:1:33 >
  • I0SER_b0y kullanıcısına yanıt
    Şu anda ne yapmam gerekiyor peki? Geceden beri kodu inceliyorum herhangi bir hata mı var diye. Bu Segmentation fault'un herhangi bir çözümü çaresi var mıdır?
  • yukto Y kullanıcısına yanıt
    https://stackoverflow.com/a/19641654/12996425 söyle bir durum varmış

    https://prnt.sc/s25gzm sorun srand de olabilir.



    < Bu mesaj bu kişi tarafından değiştirildi I0SER_b0y -- 19 Nisan 2020; 9:26:24 >
  • sanırım srand içine degeri atayamıyor bu sefer de içi boş oluyor.Null pointer durumuna düşüyor.
  • Hocam yazdığınız kodu benim makinede çalıştırdım, fikir vermesi amacıyla atayım dedim.

    (Sağ tarafta sizin kod var)

    C takıldığım hata



    < Bu mesaj bu kişi tarafından değiştirildi Focke-Wulf -- 19 Nisan 2020; 9:45:51 >
  • I0SER_b0y kullanıcısına yanıt
    Evet dediğiniz gibi sanırım sorun random atama kısmında. O noktada kopma oluyor anladığım kadarıyla. Size de çok teşekkür ederim yakından ilgilendiğiniz için.
  • Focke-Wulf kullanıcısına yanıt
    output paylaşabilir misiniz ?
  • Matrise ilk hafıza allocate ederken * sizeof(int) yapmışsın, * sizeof(int*) yaparsan daha doğru olacaktır. Bazı sistemde boyutları aynı olsa da mantık olarak int* daha doğru.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Sorun random fonksiyonunda değil.

    for(int i=0;i<sutun;i++) { 
    matris[i] = (int*)malloc(sutun*sizeof(int));
    }


    Şu koda bakarsanız üstteki mallocda satır kadar int* oluşturmanıza rağmen sadece sutun tanesine hafıza atıyorsunuz. Şu şekilde düzeltirseniz kod sorunsuz çalışır.

    for(int i=0;i<satir;i++) { 
    matris[i] = (int*)malloc(sutun*sizeof(int));
    }



    < Bu mesaj bu kişi tarafından değiştirildi empire1530 -- 19 Nisan 2020; 11:38:15 >
  • empire1530 E kullanıcısına yanıt
    derler misiniz.

    evet bende de çalıştı.2 saattir nasıl göremedim.



    < Bu mesaj bu kişi tarafından değiştirildi I0SER_b0y -- 19 Nisan 2020; 12:11:45 >
  • sadece empire'ın değişikliği yapınca bende çalıştı:
    C takıldığım hata

    < Bu ileti mini sürüm kullanılarak atıldı >
  • empire1530 E kullanıcısına yanıt
    Çok çok teşekkür ederim sorunsuz çalışıyor.
  • Alternatif olarak şöyle de yapılabilir.


    int *dizi = malloc(satir * sutun * sizeof(int));
    int **matris = malloc(satir * sizeof(int *));

    for(int i = 0; i < satir; i++)
    matris[i] = dizi + (i * sutun);


    Bunun avantajı dizinin ister tek boyutlu ister iki boyutlu olarak kullanılabilir olması. Mesela satırları kendi aralarında sıralayabileceğiniz gibi diziyi bütün halde de sıralayabilirsiniz.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.