MErhaba rakdaşlar ben bir sayına bölününen diğer sayıları bulan bir fonksyon prototipi hazırlamaya çalışyorum fakat yapamıyoum.Sizce buradaki hata nedir ?
#include<stido.h> int *bul (int a) { int b,c,d; int *goster; goster = bolunenler; int bolunenler[60]; /* Küçük sayılarla çalışmak istiyorum o yüzden bölünen sayısı zaten 60 a kadar gelemeyecek */ for(b=0;b<a/2;b++) { if(a%b == 0) { bolunenler[b] = b; } } return bolunenler; } main() { int k;
bul(60) = k; printf("%d",k); getchar(); /* program hemen açılıp kapanmasın diye */ system("PAUSE"); /* program hemen açılıp kapanmasın diye*/
cok dikkatli incelemedim kodunu ama ilk gozume carpan integer 'k' initialize etmeden bir degere esitlemissin ' bul(60) = k; diyemessin k nin bi degeri yokken
#include<stdio.h> #include <conio.h> //getch() 'nin çalışması için
int *bul (int a) { int b,c,d=0; //int *goster; //goster = bolunenler; int bolunenler[60]; /* Küçük sayılarla çalışmak istiyorum o yüzden bölünen sayısı zaten 60 a kadar gelemeyecek */ for(b=1;b<(a/2);b++) //burda b'yi sıfırdan başlatırsan a%b dediğin yerde a'nın 0'a bölümünden kalanı bulmaya çalışacağı için yanlış olacak. { if(a%b == 0) { bolunenler[d] = b; //bolunenler[d] yerine b yazarsan da mesela b=7 olduğunda bu kısma gelmiyor ama 10 olduğunda geliyor o zaman b[10]=10 //olacak ama aradaki b[7], b[8],b[9] değerleri atanmamış olacak bu yüzden başka değişken kullanman gerekiyor d++; } } printf("\n"); return bolunenler; } main() { int *k; //pointer kullanarak diziden değer döndürülüyor.http://www.yazilimogren.com/2009/03/c-programlama-fonksiyondan-dizi-dondurmek/ k=bul(60); //bul(60)=k şeklinde bir atama yapamazsın k'yı bul(60)'a atamaya çalışıyor gibi oluyor ama senin k'ya bul(60)'dan dönen sayıyı ataman gerek. for(int i=0;i<10;i++){ printf("%d",*(k+i)); printf("\n"); } getch(); /* program hemen açılıp kapanmasın diye */ return 0; }
Çok hata var. Belki eğitici olur diyerek bunları sıralayalım.
Kodlar yukarıdan aşağıya derlendiği için sırayı şaşırmamalısın. int *goster; goster = bolunenler; int bolunenler[60]; Burada 2. satırda hata verecek çünkü bolunenler diye birşey henüz tanınmıyor.
bul(60) = k; C'de bu şekilde atama yapılamaz, fonksiyon sağ tarafta olmalı ve türler uyuşmalı. Burada türler de uyumsuz. Şu şekilde olabilir: int *k = bul(60);
Döngüde algoritma hatası var. Bu şekilde yaparsan sayılar sırayla gitmez, karmakarışık olur. demirdöven arkadaş tarif etmiş sanırım. En iyi yol indeks için ayrı bir değişken ayırıp (mesela n olsun) şu şekilde kullanmak: int n = 0; bolunenler[n++] = b; Yapılması gereken bir işlem daha var ki diziye bir sonlandırma sembolü eklemek. Biz bu diziyi aldık diyelim. Kaça kadar gideceğiz, yani kaç tane bolunen olduğunu nereden bileceğiz?
Ve geldik en büyük ve gizli hataya. bul fonksiyonunda bir bölünenler dizisi oluşturup bunu döndürmek hiçbir derleme hatasına yol açmaz ama program çalışırken hata verir, vermesede sapıtır. Bunun sebebi fonksiyonun çalışması bittikten sonra dizinin kapsam dışına çıkması yani yokolması. Bunu önlemenin en kolay yolu diziyi durağan hale getirmek, şu şekilde: static int bolunenler[60]; Bol keseden static değişken kullanmanın bellek israfına yol açacağını söylemeden geçmeyelim.
Aslına bakarsan bir fonksiyon içinde dizi oluşturup bunu döndürmek iyi bir yöntem değil. Bunun yerine dışarıdan boş dizi alıp doldurmak daha iyi olur. Fonksiyon başlığı bir fikir verebilir.
Anladım yani fonskyonun bir çıktısı yok ama içeriğindeki diziyi etkiliyor ve biz de zaten o diziyi yazdırıyoruz.UMarım doğru anlamışımdır.Yardımlarınız için çok teşekkürler.
bul(60) = k; diyemessin k nin bi degeri yokken
Bu mesaja 1 cevap geldi. Cevapları Gizle
örneğin
....
int a[3];
if( bul(6) < a[3] )
{
printf("a büyük");
}
....
gibi
Bu mesaja 1 cevap geldi. Cevapları Gizle
< Bu mesaj bu kişi tarafından değiştirildi demirdöven -- 28 Ocak 2011; 19:17:27 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
Kodlar yukarıdan aşağıya derlendiği için sırayı şaşırmamalısın.
int *goster;
goster = bolunenler;
int bolunenler[60];
Burada 2. satırda hata verecek çünkü bolunenler diye birşey henüz tanınmıyor.
bul(60) = k;
C'de bu şekilde atama yapılamaz, fonksiyon sağ tarafta olmalı ve türler uyuşmalı. Burada türler de uyumsuz. Şu şekilde olabilir: int *k = bul(60);
Döngüde algoritma hatası var. Bu şekilde yaparsan sayılar sırayla gitmez, karmakarışık olur. demirdöven arkadaş tarif etmiş sanırım. En iyi yol indeks için ayrı bir değişken ayırıp (mesela n olsun) şu şekilde kullanmak:
int n = 0;
bolunenler[n++] = b;
Yapılması gereken bir işlem daha var ki diziye bir sonlandırma sembolü eklemek. Biz bu diziyi aldık diyelim. Kaça kadar gideceğiz, yani kaç tane bolunen olduğunu nereden bileceğiz?
Ve geldik en büyük ve gizli hataya.
bul fonksiyonunda bir bölünenler dizisi oluşturup bunu döndürmek hiçbir derleme hatasına yol açmaz ama program çalışırken hata verir, vermesede sapıtır. Bunun sebebi fonksiyonun çalışması bittikten sonra dizinin kapsam dışına çıkması yani yokolması. Bunu önlemenin en kolay yolu diziyi durağan hale getirmek, şu şekilde:
static int bolunenler[60];
Bol keseden static değişken kullanmanın bellek israfına yol açacağını söylemeden geçmeyelim.
Aslına bakarsan bir fonksiyon içinde dizi oluşturup bunu döndürmek iyi bir yöntem değil. Bunun yerine dışarıdan boş dizi alıp doldurmak daha iyi olur. Fonksiyon başlığı bir fikir verebilir.
void bolunen_bul(int sayi, int *bolunenler);
Bu mesaja 1 cevap geldi. Cevapları Gizle
burada fonksyonun parametrelerine diziyi yazınca program hata veriyor bu kodu yazdım
fonksyonun parametresine ilk önce dizinin kendi ismini yazdım.Sonra da onu bir göstericiye aktarıp yazdım ama ikisinde de hata verdi.
Bu mesaja 1 cevap geldi. Cevapları Gizle
Fonksiyon tam olarak şöyle birşey.
Kullanımıda şu şekilde:
int sayi = 100;
int b[30];
bul(sayi, b);
Şimdide yazdıralım.
int n;
for(n = 0; b[n]; n++) printf("%d\n", b[n]);
Dikkat edersen döngü dizide sıfırı görene kadar ilerliyor.
< Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 29 Ocak 2011; 23:33:34 >
Bu mesaja 1 cevap geldi. Cevapları Gizle