Arama butonu
Bu konudaki kullanıcılar: 1 misafir
7
Cevap
2694
Tıklama
0
Öne Çıkarma
C de geri dönüş değeri dizi olan bir fonksyon
F
15 yıl
Onbaşı
Konu Sahibi

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*/

return 0;
}



H
15 yıl
Çavuş

cok dikkatli incelemedim kodunu ama ilk gozume carpan integer 'k' initialize etmeden bir degere esitlemissin '
bul(60) = k; diyemessin k nin bi degeri yokken


Bu mesaja 1 cevap geldi.
F
15 yıl
Onbaşı
Konu Sahibi

peki onu herhangibir kontrole sokmak için ne yapmalıyım ?
örneğin

....
int a[3];
if( bul(6) < a[3] )
{
printf("a büyük");
}
....
gibi


Bu mesaja 1 cevap geldi.
D
15 yıl
Yüzbaşı

#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;
}





< Bu mesaj bu kişi tarafından değiştirildi demirdöven -- 28 Ocak 2011; 19:17:27 >
Bu mesaja 1 cevap geldi.
G
15 yıl
Yarbay

Ç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.

void bolunen_bul(int sayi, int *bolunenler);


Bu mesaja 1 cevap geldi.
F
15 yıl
Onbaşı
Konu Sahibi

fonksyonu değiştirip void bul(int a,int*bolunenler) yaptım fakat

burada fonksyonun parametrelerine diziyi yazınca program hata veriyor bu kodu yazdım

#include<stdio.h> 
void *bul (int a,int *bolunenler)
{
int b;
int c = 0;
int *goster;
goster = bolunenler;
for(b=0;b<a/2;b++)
{
if(a%b == 0)
{
bolunenler[c] = b;
c++;
}
}
return bolunenler;
}
main()
{
int *k;
int a;
int b[30];
int *m;
m = b;
k = bul(20,m);
for(a=0;a<20;a++)
{
printf("%d",b[a]);
}





getchar(); /* program hemen açılıp kapanmasın diye */
system("PAUSE"); /* program hemen açılıp kapanmasın diye*/

return 0;
}


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.
G
15 yıl
Yarbay

Fonksiyon hiçbirşey döndürmeyecek. Dönüş tipi void olacak, void* değil. Tabiki return deyimide olmayacak.
Fonksiyon tam olarak şöyle birşey.
 
void bul(int sayi, int *bolunenler)
{
int i = 0, bol = 1, son = sayi / 2;
for(; bol <= son; bol++) {
if(sayi % bol == 0)
bolunenler[i++] = bol;
}
bolunenler[i] = 0; // Bu 0 sonlandırma işareti.
}

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.
F
15 yıl
Onbaşı
Konu Sahibi

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.



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.