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

Başlatan edge35, 04 Nisan 2017 - 00:11:14

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

edge35

Yazdığım kodda "Segmentation fault (core dumped)" hatasını alıyorum, bir kaç yere baktım ama nedenini bulamadım, yardımcı olursanız sevinirim.

Kod:

#include<stdio.h>
int matris[10][10];
void printMatris(int matris, int str, int stn);

int main(){
int str, stn ,i ,j;
printf("matris için sınırları giriniz: "); scanf("%d%d",&str, &stn);
printf("matris'i girin: ");
for (int i = 0; i < str; ++i) //matris scanf ile alınıyor.
{
for (int j = 0; j < stn; ++j)
{
scanf("%d",&matris[i][j]);
}
}
printMatris(matris[i][j] ,str ,stn);
return 0;
}

void printMatris(int matris, int str, int stn){
for (int i = 0; i < str; ++i)
{
for (int j = 0; j < stn; ++j)
{
printf("%d ",matris);
}
printf("\n");
}
}


Çıktı:
$ ./a
matris için sınırları giriniz: 2 2
matris'i girin: 1 2 3 4
Segmentation fault (core dumped)


gdb çıktısı:
$ gdb ./fault core
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
./fault: No such file or directory.
[New LWP 24630]
Core was generated by `./a'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000400719 in ?? ()
(gdb) q


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

Amenofis

int str, stn ,i ,j;

i ve j yi sıfırlamayı unutmuşsun.

Death Pro

#include<stdio.h>

int matris[10][10];

void printMatris(int matris[][10], int str, int stn);

int main(){
    int str, stn ,i ,j;
    printf("matris için sınırları giriniz: "); scanf("%d %d",&str, &stn);
    printf("matris'i girin: ");
    for (int i = 0; i < str; ++i) //matris scanf ile alınıyor.
    {
        for (int j = 0; j < stn; ++j)
        {
            scanf("%d",&matris[i][j]);
        }
    }
    printMatris(matris ,str ,stn);
    return 0;
}

void printMatris(int matris[][10], int str, int stn){
    for (int i = 0; i < str; ++i)
    {
        for (int j = 0; j < stn; ++j)
        {
            printf("%d ",matris[i][j]);
        }
        printf("\n");
    }
}


Kodu düzenledim bu şekilde çalışıyor...

edge35

#3
[mention=622115]@Amenofis[/mention] hocam sıfırlayıp tekrar denedim. Sadece matris[1][1]'i yazdırıyor hepsine.
$ ./b
matris için sınırları giriniz: 2 2
matris'i girin: 1 2 3 4
1 1
1 1



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 04 Nisan 2017 - 21:16:17

[mention=622129]@Death Pro[/mention] hocam teşekkür ederim, o şekilde çalışıyor fakat array'in ikinci boyutunu neden 10 diye belirliyoruz, onu da kullanıcıdan alsak olmaz mı? Bir de 4 yeri değiştirdiğinizi gördüm, nedenlerini söyleyebilir misiniz, mantığı ne yani? ve hatanın nedeni?


[eklenti yönetici tarafından silindi]


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

Archaeopteryx

#4
Alıntı yapılan: edge35 - 04 Nisan 2017 - 21:12:32
[mention=622115]@Amenofis[/mention] hocam sıfırlayıp tekrar denedim. Sadece matris[1][1]'i yazdırıyor hepsine.
$ ./b
matris için sınırları giriniz: 2 2
matris'i girin: 1 2 3 4
1 1
1 1



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 04 Nisan 2017 - 21:16:17

[mention=622129]@Death Pro[/mention] hocam teşekkür ederim, o şekilde çalışıyor fakat array'in ikinci boyutunu neden 10 diye belirliyoruz, onu da kullanıcıdan alsak olmaz mı? Bir de 4 yeri değiştirdiğinizi gördüm, nedenlerini söyleyebilir misiniz, mantığı ne yani? ve hatanın nedeni?


Merhaba,

Siz printMatris fonksiyonuna iki boyutlu dizi parametre geçtiğinizi söylemiyorsunuz doğrudan 'int' tipinde parametre geçiyorsunuz. Sonra da o fonksiyona matristeki tek bir değeri gönderiyorsunuz. Dolayısıyla hangi değeri gönderiyorsanız onu matris boyutu kadar tekrar yazmaktan başka bir şey yapmıyor fonksiyon. Matrisin tamamını gönderip, fonksiyonun içinde matrisi dolaşmanız gerekiyor.

Öncelikle fonksiyona tek bir 'int' değer değil, tüm matrisi geçeceğinizi belirtin.

void printMatris(int arr[][10], int str, int stn);     //10 yerine matrisin sınırları ne ise onları yazabilirsiniz.
veya
void printMatris(int arr[10][10], int str, int stn);


Sonrasında ise fonksiyona bir matris geldiğinin bilincinde olarak içeride o matrisi dolaşın. Sizin versiyonunuzda i ve j hiçbir şey yapmıyor.

C'de parametre geçtiğiniz dizinin boyutuyla ilgili bir bilgi vermeniz gerekiyor. O yüzden enazından sütun sayısını yukarıdaki gibi belirtmeniz gerek eğer doğrudan dizi geçirecekseniz.

edge35

[mention=622140]@Archaeopteryx[/mention] benim yapmak istediğim yukarıda tanımlanan matris[10][10] için özel bir fonksiyondan ziyade yukarıda 2 boyutlu tanımlanan herhangi bir array'i yazdırması. O yüzden bu şekilde yapmaya çalıştım fakat anladığım kadarıyla böyle olmuyor. Peki anlatmaya çalıştığım şeyi nasıl yapabilirim, eğer void printMatris(int arr[][10], int str, int stn); olarak girersem sadece sınırları 10 olan bir array olur.


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

Archaeopteryx

#6
Alıntı yapılan: edge35 - 04 Nisan 2017 - 22:10:16
[mention=622140]@Archaeopteryx[/mention] benim yapmak istediğim yukarıda tanımlanan matris[10][10] için özel bir fonksiyondan ziyade yukarıda 2 boyutlu tanımlanan herhangi bir array'i yazdırması. O yüzden bu şekilde yapmaya çalıştım fakat anladığım kadarıyla böyle olmuyor. Peki anlatmaya çalıştığım şeyi nasıl yapabilirim, eğer void printMatris(int arr[][10], int str, int stn); olarak girersem sadece sınırları 10 olan bir array olur.

'Pointer' kullanmayı biliyorsan dizinin adresini kullanarak yapabilirsin.

void print(int *matrix, int str, int stn)
{
    int i, j, *k;
    for (i = 0; i < str; ++i){
        k = matrix + (i * stn);
        for (j = 0; j < stn; ++j){
            printf("%d ", *(k + j));
        }
        printf("\n");
    }
}

int main() {

    int matrix[3][3] = {{1, 2, 3},    //Rastgele bir matris
                                {4, 5, 6},
                                {7, 8, 9}};
   
    print(matrix, 3, 3);
   
    return 0;
}

edge35

[mention=622149]@Archaeopteryx[/mention] teşekkür ederim :)
Herkese yardımlar ıiçin teşekkür ederim.


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)