Dinamik iletim
Programlama Dilleri ve Dinamik İletim > C

Kabarcık sıralaması algoritmasının C programlama dilindeki soysal gerçekleştirimini içeren aşağıdaki kabarcik_siralama fonksiyonunun imzasında iki nokta dikkat çekiyor: fonksiyon göstericisi ve eleman türü olarak void* ile eşanlamlı ilan edilmiş olan Object. Bunlardan ilki dizinin eleman türüne ve/veya sıralama fonksiyonunun kullanılış bağlamına göre farklı biçimlerde sıralanmasını olanaklı kılarken, ikincisi dizinin herhangi bir türden eleman tutabilmesini—yani, dizinin soysal olmasını—sağlıyor.
#ifndef KABARCIK_H
#define KABARCIK_H

typedef void* Object;
typedef int (*KARSILASTIRMA_FONK)(Object, Object);

extern void kabarcik_siralama(Object dizi[], int boy, KARSILASTIRMA_FONK kar_fonk);
#endif
Yukarıda sağlanan imzaya uygun gerçekleştirime göz atıldığında ise, işin püf noktasının fonksiyon göstericisinin kullanıldığı içteki döngünün ilk satırında olduğu görülür. Her ne kadar kar adındaki bir fonksiyonun çağrılması ile aynı görünse de, aslında bu satırda kar adlı fonksiyon göstericisinin sahip olduğu değerin işaret ettiği bellek konumunda başlayan bir fonksiyon çağrılmaktadır; kabarcik_siralama fonksiyonunun çağrıldığı noktalarda kar parametresine değişik değerlere sahip göstericilerin geçirilmesi, farklı karşılaştırma ölçütlerinin kullanılması ve dolayısıyla sıralamanın farklı türler ve/veya biçimlerde yapılması anlamına gelecektir.
#include <stdio.h>
#include "Kabarcik.h"

#define BOOL char
#define FALSE 0
#define TRUE 1

static void takas_et(Object dz[], int sol_indis, int sag_indis) {
  Object gecici = dz[sol_indis];
  dz[sol_indis] = dz[sag_indis];
  dz[sag_indis] = gecici;
} /* void takas_et(Object[], int, int) sonu */

void kabarcik_siralama(Object dz[], int boy, KARSILASTIRMA_FONK kar) {
  int gecis, j;

  for(gecis = 1; gecis < boy; gecis++) {
    BOOL takas_var = FALSE;

    for (j = 0; j < boy - gecis; j++)
      if (kar(dz[j], dz[j + 1]) > 0) { 
        takas_et(dz, j, j + 1);
        takas_var = TRUE;
      } /* if sonu */
    if (!takas_var) return; 
  } /* for(gecis = 1; gecis < boy; gecis++) sonu */
} /* void kabarcik_siralama(Object[], int, KARSILASTIRMA_FONK) sonu */
Aşağıda sağlanan sınama programının incelenmesi olup bitenin daha iyi anlaşılmasını sağlayacaktır. kabarcik_siralama fonksiyonunun ilk kullanılışı Integer türlü elemanları olan bir diziyi karşılaştırma amacıyla int_kars fonksiyonundan yararlanarak sıralarken, ikinci kullanılış komut satırında geçirilen karakter katarı dizisini karşılaştırmak için karakter_katarı_kars fonksiyonundan yararlanarak sıralıyor.
#include <stdio.h>
#include <string.h>
#include "Kabarcik.h"

typedef int* Integer;

void ksa_bas(char *ksa[], int boy) { ... }

void intleri_bas(Integer dz[], int boy) { ... }

int karakter_katar_kars(Object sol, Object sag) {
  return(strcmp((char*) sol, (char *) sag));
} /* int karakter_katar_kars(Object, Object) sonu */

int int_kars(Object sol, Object sag) {
  Integer ig1 = (Integer) sol;
  Integer ig2 = (Integer) sag;

  if (*ig1 > *ig2) return 1;
    else if (*ig1 < *ig2) return -1;
      else return 0;   
} /* int int_kars(Object, Object) sonu */

int main(int args, char *ksa[]) {
  int dizi[] = {1, 3, 102, 6, 34, 12, 35}, i;
  Integer int_dz[7];
  for (i = 0; i < 7; i++) int_dz[i] = &dizi[i];

  printf("\nTAMSAYI DIZISI SINANIYOR\n\nSiralama oncesi\n"); 
  intleri_bas(int_dz, 7); 
  kabarcik_siralama((Object*) int_dz, 7, &int_kars); 
  printf("\nSiralama sonrasi\n"); intleri_bas(int_dz, 7);
  
  printf("\nKARAKTER KATARI DIZISI SINANIYOR\n\nSiralama oncesi\n"); 
  ksa_bas(&ksa[1], args - 1);
  kabarcik_siralama((Object*) &ksa[1], args - 1, karakter_katari_kars);
  printf("Siralama sonrasi\n"); ksa_bas(&ksa[1], args - 1);

  return(0);
} /* int main(int, char **) sonu */