Şimdi Ara

Kodlarımdaki sorun ne ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
5
Cevap
0
Favori
636
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 2 foksyondan oluşan ve bu fonksyonlardan bir tanesinin ortalamayı hesapladığı bir tanesininde en büyüğünü bulduğu dizilerle bi program yazmaya çalışıyorum ama programı çalıştırınca segmentation fault veriyor.sorunum nedir nerde hata yapıyorum ?











    #include<stdio.h>

    int main()

    {
    int k,i,A[k];
    puts("bir sayı gir");
    scanf("%d",&k);
    puts("Sayıları girin");
    for(i=0;i<k;i++)
    scanf("%d",&A);
    ortalama(k,A[k]);



    return 0 ;

    }



    int ortalama(int k,int A[k])
    {
    int i ;
    float sum=0,aver;



    for(i=0;i<k;i++)
    {
    sum=sum+A;
    }
    aver=sum/k;
    printf("%.3lf",aver);
    }


    int enbuyuk(int k,int A[k])
    {
    int i,enbuyuk=0;

    for(i=0;i<k;i++)

    {
    if(enbuyuk<A)
    enbuyuk=A;
    }
    printf("%d",enbuyuk);



    }







  • Bilmiyorum ben mi yanlış hatırlıyorum da neden main fonksiyonunda giriş yaparken A[k] ve ortalama fonksiyonunda toplama yaparken A olarak yapmadın, dizinin hangi elemanına ulaşacağını nereden bilecek program? enbuyuk fonksiyonu için de geçerli aynı durum, ayrıca parametre olarak gönderirken A[8] şeklinde göndermene gerek yok, A[0] desen yeter, başlangıç adresini göndermen lazım, sen A[k] diyerek en son elemanı gönderiyorsun sonra bir üst bellek bloğuna bakınca dizinin dışına çıkmış oluyorsun.
  • 1-) scanf çağırıldığında değişkene değer atarken onun adresinin verilmesi gerekir. Burada ise &A değerini gönderiyorsun ki bu şu demek: A zaten yukarıda tanımladığın, içinde de k eleman olsun dediğin array'in başlangıç adresi. Başına & koyarak da bir adresin adresini argüman olarak vermiş oluyorsun. Yani ikinci for döngüsünde olan şey, k defa array'in başlangıç adresini kullanıcının girdiği sayı ile değiştirmekten başka bir şey değil. Onun için değişikliği görmek istediğin array elemanının adresini vermen gerekiyor.

    2-) Henüz k'ya bir değer atamamışken -yani k'nın değeri herhangi bir değer olabilecek iken- A[k] diye eleman tanımlaman doğru değil. Onun için k sayısını kullanıcıdan aldıktan sonra array'i tanımlaman gerekiyor.

    3-) Array'in ortalamasının alınmasını istiyorsan yazdığın fonksiyona array'in tamamını göndermen icab eder fakat şu aşamada sen sadece A[k] değerini gönderiyorsun. (Seg fault ya burada ya da 2. sebepten ötürü kaynaklanıyor)

    4-) ortalama fonksiyonunun içindeki for döngüsünde sum=sum+A; şeklinde toplam almaya çalışmışsın fakat yukarıda da belirttiğim gibi salt A değeri sadece array'in başlangıç adresini ifade eder. Senin bütün elemanlara ulaşmak adına -döngü i değişkeni ile ilerlediği için- A[ i ] ile ulaşman gerekir.

    5-) ortalama fonksiyonunu int döndürecek şekilde yazmışsın fakat dönen bir değer yok.

    6-) ortalama fonksiyonu mainden sonra yazılmış durumda. Böyle bir durumda ortalama diye bir fonksiyonun varlığından haberdar olmayan main fonksiyonu hata döndürecektir. Böyle bir durumda main illa en üstte olacaksa fonksiyon prototipi include ile main arasına yazılmalı, ya da main fonksiyonu fonksiyonların arasında en aşağıda olanı olmalı. Bu son yazdığım kullandığın C compiler'ına göre değişebilecek bir durum, yani sende bu hata bile vermeyebilir ama olması gerekeni söyleyeyim dedim.

    Benim şimdilik gördüğüm hatalar bunlar. Şu şekilde yapman durumunda sorun ortadan kalkacaktır:

      
    void ortalama(int k, int* A)
    {
    int i;
    float sum=0, aver;

    for(i=0;i<k;i++)
    {
    sum=sum+A[ i ];
    }
    aver=sum/k;
    printf("%.3lf",aver);
    }

    int main()
    {
    int k, i;
    puts("bir sayı gir");
    scanf("%d", &k);
    int A[k];
    puts("Sayıları girin");
    for(i=0;i<k;i++)
    scanf("%d", &A[ i ]);
    ortalama(k, A);

    return 0 ;
    }


    ortalama fonksiyonundaki düzeltmeleri enbuyuk fonksiyonunda da yapman gerektiğini de söyleyeyim.

    İyi çalışmalar...



    < Bu mesaj bu kişi tarafından değiştirildi therev -- 11 Nisan 2014; 10:18:07 >




  • çok teşekkür ederim sanırım hallettim
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.