Şimdi Ara

C de geri dönüş değeri dizi olan bir fonksyon

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
8
Cevap
0
Favori
2.620
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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;
    }







  • cok dikkatli incelemedim kodunu ama ilk gozume carpan integer 'k' initialize etmeden bir degere esitlemissin '
    bul(60) = k; diyemessin k nin bi degeri yokken
  • 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
  • #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 >




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




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




  • 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 >
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • 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.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.