BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C örnek kodlar > c_ornek00025

C örnek kodlar

Fonksiyonlardan 4 farklı yöntemle dizi değeri döndürme

C programlama dilinde bir fonksiyondan bir dizi değerini doğrudan geri döndürmek için herhangi bir yöntem bulunmamaktadır.

Ancak, aşağıda sırasıyla ele alacağımız 4 farklı yöntemle fonksiyonların dolaylı olarak dizi geri döndürmelerini sağlayabiliriz.

İlk yöntemde, çağıracağımız fonksiyona bir dizi adres yoluyla geçirildiğinden, fonksiyon içinde dizi üzerinde gerekli işlemleri yaptıktan sonra dizi geri döndürülür.

İkinci yöntemde, fonksiyon tarafından geri döndürülecek dizi fonksiyon içinde static olarak tanımlanır ve gerekli işlemler yapıldıktan sonra, fonksiyon diziyi geri döndürür. Ancak, fonksiyon sona ermesine rağmen, dizi static olarak tanımlandığından program sona erene kadar, bellekte kalır. Ancak, bu yöntemde fonksiyonu her çağırmamızda, fonksiyon aynı static dizini ve işaretçi değişkenini kullanır. Fonksiyonu ikinci kez çağırdığınızda, bir önceki fonksiyon çağrısında elde ettiğiniz dizi değerlerinin üzerine yazılır. İlk fonksiyon çağrısında geri döndürülen dizinin adresini alan işaretçi değişkeni ile ikinci fonksiyon çağrısında geri döndürülen dizinin adresini alan işaretçi değişkeni aynı bellek adresini gösterecektir. Bu nedenle, bu fonksiyonu bir defadan fazla kullandığımızda, istediğimiz sonucu elde edemeyiz.

Üçüncü yöntemde, fonksiyon tarafından geri döndürülecek dizi için fonksiyon içinde malloc() fonksiyonu ile bellekten dinamik olarak yer tahsis edilerek, ayrılan belleğin başlangıç adresi int bir işaretçi değişkene atanır. Eğer bellek ayırma işlemi başarısız olursa, fonksiyon NULL bir değer geri döndürür. Bu işaretçiyi indeksleyerek, ayrılan belleğe integer değerler atanır. Sonra, fonksiyon tahsis edilen belleğin başlangıç adresini geri döndürür. Fonksiyonun geri döndürdüğü adres değerinin atandığı işaretçi bir değişken yoluyla değerler ekrana yazılır. Ayrılan bellek boşaltılır.

Dördüncü yöntemde, içinde int bir dizi içeren global bir yapı oluşturulur. Fonksiyon içinde bir yapı değişkeni oluşturularak, yapı içindeki dizine değerler atandıktan sonra yapı değişkeni fonksiyon tarafından geri döndürülür. Geri döndürülen değer main() fonksiyonu içinde oluşturulmuş olan bir yapı değişkenine atanarak değişkenin içindeki diizi değerleri ekrana yazılır.


#include <stdio.h>
#include <stdlib.h>

struct yapdizi {
  int idizi[10];
};

int *fonk1 (int ildizi[]);
int *fonk2 (int fark);
int *fonk3 (void);
struct yapdizi fonk4 (void);

int main(void)
{
  int id, idizi[10], *ip;
  struct yapdizi yp;

  // Geri döndürülecek diziyi fonksiyona argüman olarak geçirme
  for (id=0; id<10; id++) idizi[id]=id+1;
  ip = fonk1 (idizi);
  for (id=0; id<10; id++) printf("%d ", *ip++);
  printf("\n");

  // Geri döndürülecek diziyi fonksiyon içinde static olarak tanımlama
  ip = fonk2 (2);
  for (id=0; id<10; id++) printf("%d ", *ip++);
  printf("\n");

  // Geri döndürülecek dizi için fonksiyon içinde malloc() fonksiyonu ile dinamik bellek tahsis etme
  if((ip = fonk3())!=NULL){
     for (id=0; id<10; id++) printf("%d ", *ip++);
     free(ip);
  }
  printf("\n");

  // Yapı yoluyla fonksiyondan dizi geri döndürme
  yp = fonk4();
  for (id=0; id<10; id++) printf("%d ", yp.idizi[id]);
}

int *fonk1 (int ildizi[])
{
  int id;

  for (id=0; id<10; id++) {
       ildizi[id] = ildizi[id] * 2;
  }

  return ildizi;
}

int *fonk2 (int fark)
{
  static int idizista[10];
  int id;

  for (id=0; id<10; id++) {
       idizista[id] = (id+1)*fark;
  }

  return idizista;
}

int *fonk3 (void)
{
  int *idizi = malloc(10 * sizeof(int));
  int id;
  if(idizi==NULL) return NULL;

  for (id=0; id<10; id++) {
       idizi[id] = id+1;
  }

  return idizi;
}

struct yapdizi fonk4 (void)
{
  struct yapdizi ypfonk;
  int id;

  for (id=0; id<10; id++) {
       ypfonk.idizi[id] = id+1;
  }

  return ypfonk;
}

Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:

2 4 6 8 10 12 14 16 18 20
2 4 6 8 10 12 14 16 18 20
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10