Arama butonu
Bu konudaki kullanıcılar: 1 misafir
3
Cevap
639
Tıklama
0
Öne Çıkarma
Kodlarımdaki sorun ne ?
C
10 yıl
Yüzbaşı
Konu Sahibi

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);



}



M
10 yıl
Binbaşı

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.


Bu mesaja 1 cevap geldi.
T
10 yıl
Binbaşı

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 >
Bu mesaja 1 cevap geldi.
C
10 yıl
Yüzbaşı
Konu Sahibi

çok teşekkür ederim sanırım hallettim




Bu mesajda bahsedilenler: @therev , @Mr. Pink
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.