Turli xillarni qabul qiladigan vazifani qanday qilib bajaraman?

Ushbu qabariq sort funktsiyasi bor:

void bubble_sort(float* array, int length)
{
    int c, d;
    float temp;

    for (c = 0; c < (length - 1); c++) {
        for (d = 0; d < length - c - 1; d++) {
            if (array[d] > array[d + 1]) {
                temp = array[d];
                array[d] = array[d + 1];
                array[d + 1] = temp;
            }
        }
    }
}

Uni double uchun ham ishlatishim uchun qanday o'zgartirish mumkin? Bir marta float arrayini bir marta va ikkilamchi qatordan boshqa vaqt o'tkazish imkoniyatiga ega bo'lishni xohlayman, lekin u bir xil vazifani bajarishi kerak. Shunga o'xshash narsa:

float farr[SIZE];
double darr[SIZE];
...
bouble_sort(farr, SIZE);
bouble_sort(darr, SIZE);

EDIT: Sortlashtirish funktsiyasini qayta yozdim va hozirda yaxshi ishlayotgan ko'rinadi. Siz nima deb o'ylaysiz?

void bubble_sort(void* generalArray, int lenght_row, char type) 
{ 
int column_sort;
int sorting_process = 0;
if (type == 'f')
{
    float temp; 
    float* array = (float *) generalArray; 
    while (sorting_process == 0)
    {
        sorting_process = 1;
        for (column_sort = 0; column_sort < lenght_row - 1; column_sort++)
        {
            if (array[column_sort] > array[column_sort + 1])
            {
                temp = array[column_sort + 1]; 
                array[column_sort + 1] = array[column_sort];
                array[column_sort] = temp;
                sorting_process = 0;
            }

        }
    }
}
else if (type == 'd') 
{
    double temp;//added
    double* array = (double *) generalArray;
    while (sorting_process == 0)
    {
        sorting_process = 1;
        for (column_sort = 0; column_sort < lenght_row - 1; column_sort++)
        {
            if (array[column_sort] > array[column_sort + 1])
            {
                temp = array[column_sort + 1]; 
                array[column_sort + 1] = array[column_sort];
                array[column_sort] = temp;
                sorting_process = 0;
            }
        }
    }
  }
}
3
Kabi; singari; qsort uchun hujjatlarni ko'rib chiqing. Ehtimol, siz ikkita funktsiyani amalga oshirishingiz mumkin.
qo'shib qo'ydi muallif Ry-, manba
Kabi; singari; qsort uchun hujjatlarni ko'rib chiqing. Ehtimol, siz ikkita funktsiyani amalga oshirishingiz mumkin.
qo'shib qo'ydi muallif Ry-, manba
bouble_sort (farr, SIZE) kabi echim; bouble_sort (darr, SIZE); faqat mumkin emas. Funktsiyani haddan tashqari yuklashga C (C11dan oldin) ruxsat berilmaganligi uchun siz void * kabi "neytral" argumentli turini qo'llashingiz kerak. Lekin keyinchalik vazifa nima o'tganingizni taxmin qila olmaydi.
qo'shib qo'ydi muallif Yves Daoust, manba
bouble_sort (farr, SIZE) kabi echim; bouble_sort (darr, SIZE); faqat mumkin emas. Funktsiyani haddan tashqari yuklashga C (C11dan oldin) ruxsat berilmaganligi uchun siz void * kabi "neytral" argumentli turini qo'llashingiz kerak. Lekin keyinchalik vazifa nima o'tganingizni taxmin qila olmaydi.
qo'shib qo'ydi muallif Yves Daoust, manba
bu
qo'shib qo'ydi muallif BLUEPIXY, manba
bu
qo'shib qo'ydi muallif BLUEPIXY, manba
Siz aralashmalar bilan to'plashni rejalashtirasizmi? Agar siz faqat juftlarni tartiblashni xohlasangiz, funktsiya imzosini o'zgartiring.
qo'shib qo'ydi muallif Tim Biegeleisen, manba
Siz aralashmalar bilan to'plashni rejalashtirasizmi? Agar siz faqat juftlarni tartiblashni xohlasangiz, funktsiya imzosini o'zgartiring.
qo'shib qo'ydi muallif Tim Biegeleisen, manba
Array bir hil ma'lumotlar tarkibi. Siz qila olmaysiz da float -s va double -slarni aralashtiradigan bir qatorga ega bo'lasiz. Agar siz ikkalasini ham aralashtirishingiz kerak bo'lsa, ba'zi bir etiketli birlashma turini belgilashingiz mumkin. mumkin emas).
qo'shib qo'ydi muallif Basile Starynkevitch, manba
Array bir hil ma'lumotlar tarkibi. Siz qila olmaysiz da float -s va double -slarni aralashtiradigan bir qatorga ega bo'lasiz. Agar siz ikkalasini ham aralashtirishingiz kerak bo'lsa, ba'zi bir etiketli birlashma turini belgilashingiz mumkin. mumkin emas).
qo'shib qo'ydi muallif Basile Starynkevitch, manba
@underscore_d - Xo'sh, bu funktsiyani turli xil ma'lumotlar turlari uchun yaratish uchun makrodan foydalanishingiz mumkin, keyin uni umumiy tanlovda saralab olaman. Lekin shablonlar yana ham yaxshi: R
qo'shib qo'ydi muallif StoryTeller, manba
@underscore_d - Xo'sh, bu funktsiyani turli xil ma'lumotlar turlari uchun yaratish uchun makrodan foydalanishingiz mumkin, keyin uni umumiy tanlovda saralab olaman. Lekin shablonlar yana ham yaxshi: R
qo'shib qo'ydi muallif StoryTeller, manba
Savolingizga tahrir qilishni buyurdim. Siz xohlaganmi?
qo'shib qo'ydi muallif klutt, manba
Agar ikkala float va juftlik bilan qatorga ega bo'lishingiz mumkinmi? "Bir vaqtning o'zida" degani nimani anglatadi?
qo'shib qo'ydi muallif klutt, manba
Agar ikkala float va juftlik bilan qatorga ega bo'lishingiz mumkinmi? "Bir vaqtning o'zida" degani nimani anglatadi?
qo'shib qo'ydi muallif klutt, manba
To'g'ri, har ikkala usul ham xuddi shu funktsiyada @ Klutt bo'lishi kerak
qo'shib qo'ydi muallif Unbuckle, manba
To'g'ri, har ikkala usul ham xuddi shu funktsiyada @ Klutt bo'lishi kerak
qo'shib qo'ydi muallif Unbuckle, manba
@klutt Yo'q, bu dasturda men foydalanmayapman, lekin baribir faqat yuzma-yuz keladi. Biroq, funktsiyaning o'zi, undan keyingi foydalanish uchun ikkala ma'lumot turlarini boshqarish imkoniyatiga ega bo'lishi kerak.
qo'shib qo'ydi muallif Unbuckle, manba
@klutt Yo'q, bu dasturda men foydalanmayapman, lekin baribir faqat yuzma-yuz keladi. Biroq, funktsiyaning o'zi, undan keyingi foydalanish uchun ikkala ma'lumot turlarini boshqarish imkoniyatiga ega bo'lishi kerak.
qo'shib qo'ydi muallif Unbuckle, manba
Uni bir vazifada bajarishim kerak. Men C dasturlashda faqat boshlang'ichmani ko'rmoqdaman va bu mashqlardan biridir. @Ryan Va bu holda u faqat suzuvchi turlarga ega bo'ladi, lekin nazariy jihatdan algoritmlar suzuvchi va ikkilamchi ishlov berishi kerak.
qo'shib qo'ydi muallif Unbuckle, manba
Uni bir vazifada bajarishim kerak. Men C dasturlashda faqat boshlang'ichmani ko'rmoqdaman va bu mashqlardan biridir. @Ryan Va bu holda u faqat suzuvchi turlarga ega bo'ladi, lekin nazariy jihatdan algoritmlar suzuvchi va ikkilamchi ishlov berishi kerak.
qo'shib qo'ydi muallif Unbuckle, manba

9 javoblar

Edit: Limitation to C99 was not clear at the time the answer below was written. With that limitation, it is quite likely the instructor expects a solution mimicking qsort(), with a "compare" function and the sizeof for the data type passed as parameters. So I wrote a "C99" answer as well.

Bu faqat bir nechta "fokuslar" ni oladi. Arrayni void * , qabul qilingan turdagi o'lcham va parametr sifatida solishtirish funktsiyasi sifatida olasiz.

void bubble_sort( void * array, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) )

array kodini to'g'ri (noma'lum) turga o'tkaza olmagani kabi, katalog ko'rsatkichlari o'rniga ko'rsatkich arifmetiklarini bajarishingiz kerak.

Buning uchun unsigned char * (kerak bo'lsa, void * belgisi arifmetikasi mumkin emas) va size Keyingi element.

unsigned char * array_ = (unsigned char *)array;

O'zingizni taqqoslash o'rniga solishtirish vazifasini chaqirasiz.

// instead of...
if (array[d] > array[d + 1])
// ...you call...
if ( compar( array_[d * size], array_[(d+1) * size] > 0 ) 

Va memswp ​​ o'z turiga ishlov berish o'rniga ikki element kerak:

static inline void memswp( unsigned char * i, unsigned char * j, size_t size )
{
    unsigned char tmp;
    while ( size )
    {
        tmp = *i;
        *i++ = *j;
        *j++ = tmp;
        --size;
    }
}

// instead of...
temp = array[d];
array[d] = array[d + 1];
array[d + 1] = temp;
// ...you call:
memswp( array[ d * size ], array[ ( d + 1 ) * size ], size );

Bu C99 ning avvalgi talabidir. Men hali tayyorlangan so'zlar bilan turaman.

Yo'q, bu mumkin emas, hech bo'lmaganda yaxshi uslubda emas. float float va double o'rtasidagi uchun qo'shimcha parametr mavjud birinchi parametrni void * kod> foydalanish, lekin yomon dizayni bir necha tatlar bo'lishi mumkin. Yoki funksiyani ko'rsatuvchi sifatida berilgan boshqa funktsiyaga taqqoslashingiz mumkin: Qsort() buni bajaradi, lekin men bu yaxshi dizayn deb o'ylamayman.

Biroq bubble_sort_float() funktsiyasi va bubble_sort_double() funktsiyasini yaratishingiz mumkin, keyin _Generic so'l :

#define bubble_sort(X, length) _Generic((X), \
                               double: bubble_sort_double, \
                               default: bubble_sort_double,  \
                               float: bubble_sort_float  \
)(X, length)
8
qo'shib qo'ydi
@Unbuckle: Javobni "qsort how-to" bilan kengaytirdi.
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: U sizni qsort() ning xatti-harakatini takrorlashni kutadi.
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Yaxshi ... o'qituvchini yangilash uchun vaqt kerakmi? ;-)
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Agar qatorni float * orqali olsangiz, funktsiyangiz float ni ko'rishingiz mumkin. Agar qatorni double * orqali olgan bo'lsangiz, funktsiyangiz double 'ni ko'radi. Agar qatorni void * orqali olgan bo'lsangiz, sizning funktsiyangiz har qanday aniq turni "ko'rmaydi". Ya'ni void * ga o'tishingiz va qo'shimcha parametr orqali qanday funktsiyani qabul qilishi kerakligini aytib, javobimda ko'rsatilganidek, _Generic ga o'ting yoki C ++ ga o'ting, shablonlar ushbu turdagi narsalar juda oson. ;-)
qo'shib qo'ydi muallif DevSolar, manba
@TheophileDano: Menimcha, qayta ko'rib chiqilgan standart kiritilgandan keyin olti yil o'tgach, bu o'n sakkiz yil avval chiqarilgan avvalgi standartning bir qismi emasligini aniq ko'rsatish kerak emas ...
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Ba'zan o'qituvchining nimani anglatishini taxmin qilish qiyin. Men "C99 faqat" talabini o'qituvchingizning bir oz bo'lishi mumkinligini ko'rsatadigan kuchli belgisi deb hisoblayman. Ehtimol, u so'lni so'rayapti (u erda bunday muammo bo'lmaydi), lekin bu chiziqni «yaxshi dizayndan» «juda yomon dizayni» ga aylantiradi ...
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Qani. Meni. Men Mening o'zim qsort() amalga oshirish va u erda memswp ​​() menda qulaylik funktsiyasi bo'lganini bilmasdi. Javob uchun javob beradi.
qo'shib qo'ydi muallif DevSolar, manba
Eslatma: _Generic - C11 kengaytmasi.
qo'shib qo'ydi muallif Theophile Dano, manba
Sizga germaniyalik ekanligingizni ko'rganimdek sizga aniq ko'rsatmalar berishi mumkin edi. Yana bir ko'rsatma shundaki, siz faqat bilmasligingiz mumkin bo'lgan standart libosni ishlatishimiz mumkin. Memswp ​​standart libaryning tarkibiy qismi emas, men tashvishlantiradigan narsa emas :(
qo'shib qo'ydi muallif Unbuckle, manba
Men berilgan barcha ma'lumotlardan g'azablandim. Ishonchli emasmi, o'qituvchi buni anglatmaydi, chunki biz, albatta, ko'rsatgichlardan o'tib ketmadik. Balandlik tartibida ko'rsatgichlardan ham foydalanish ^^
qo'shib qo'ydi muallif Unbuckle, manba
Yuqoridagi boshqa echimni qo'shdim
qo'shib qo'ydi muallif Unbuckle, manba
Im faqat C99 standartidan foydalanishga ruxsat berilgan bo'lsa ham: /
qo'shib qo'ydi muallif Unbuckle, manba
Hm, menimcha, bu yaxshi fikr. Agar raqamning ma'lumot turi float YoKI ikkilamchi yoki yo'qligini tekshirsangiz va qaysi turdagi bu turga ishlov beradigan funksiyaning qismiga qarab harakat qilsa. Men programmalarga yangi qo'shilaman, shuning uchun o'zimni to'g'ri shakllantirishga qodir emasman. Umid qilamanki, nimani nazarda tutganimni tushunasan.
qo'shib qo'ydi muallif Unbuckle, manba

Edit: Limitation to C99 was not clear at the time the answer below was written. With that limitation, it is quite likely the instructor expects a solution mimicking qsort(), with a "compare" function and the sizeof for the data type passed as parameters. So I wrote a "C99" answer as well.

Bu faqat bir nechta "fokuslar" ni oladi. Arrayni void * , qabul qilingan turdagi o'lcham va parametr sifatida solishtirish funktsiyasi sifatida olasiz.

void bubble_sort( void * array, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) )

array kodini to'g'ri (noma'lum) turga o'tkaza olmagani kabi, katalog ko'rsatkichlari o'rniga ko'rsatkich arifmetiklarini bajarishingiz kerak.

Buning uchun unsigned char * (kerak bo'lsa, void * belgisi arifmetikasi mumkin emas) va size Keyingi element.

unsigned char * array_ = (unsigned char *)array;

O'zingizni taqqoslash o'rniga solishtirish vazifasini chaqirasiz.

// instead of...
if (array[d] > array[d + 1])
// ...you call...
if ( compar( array_[d * size], array_[(d+1) * size] > 0 ) 

Va memswp ​​ o'z turiga ishlov berish o'rniga ikki element kerak:

static inline void memswp( unsigned char * i, unsigned char * j, size_t size )
{
    unsigned char tmp;
    while ( size )
    {
        tmp = *i;
        *i++ = *j;
        *j++ = tmp;
        --size;
    }
}

// instead of...
temp = array[d];
array[d] = array[d + 1];
array[d + 1] = temp;
// ...you call:
memswp( array[ d * size ], array[ ( d + 1 ) * size ], size );

Bu C99 ning avvalgi talabidir. Men hali tayyorlangan so'zlar bilan turaman.

Yo'q, bu mumkin emas, hech bo'lmaganda yaxshi uslubda emas. float float va double o'rtasidagi uchun qo'shimcha parametr mavjud birinchi parametrni void * kod> foydalanish, lekin yomon dizayni bir necha tatlar bo'lishi mumkin. Yoki funksiyani ko'rsatuvchi sifatida berilgan boshqa funktsiyaga taqqoslashingiz mumkin: Qsort() buni bajaradi, lekin men bu yaxshi dizayn deb o'ylamayman.

Biroq bubble_sort_float() funktsiyasi va bubble_sort_double() funktsiyasini yaratishingiz mumkin, keyin _Generic so'l :

#define bubble_sort(X, length) _Generic((X), \
                               double: bubble_sort_double, \
                               default: bubble_sort_double,  \
                               float: bubble_sort_float  \
)(X, length)
8
qo'shib qo'ydi
@Unbuckle: Javobni "qsort how-to" bilan kengaytirdi.
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: U sizni qsort() ning xatti-harakatini takrorlashni kutadi.
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Yaxshi ... o'qituvchini yangilash uchun vaqt kerakmi? ;-)
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Agar qatorni float * orqali olsangiz, funktsiyangiz float ni ko'rishingiz mumkin. Agar qatorni double * orqali olgan bo'lsangiz, funktsiyangiz double 'ni ko'radi. Agar qatorni void * orqali olgan bo'lsangiz, sizning funktsiyangiz har qanday aniq turni "ko'rmaydi". Ya'ni void * ga o'tishingiz va qo'shimcha parametr orqali qanday funktsiyani qabul qilishi kerakligini aytib, javobimda ko'rsatilganidek, _Generic ga o'ting yoki C ++ ga o'ting, shablonlar ushbu turdagi narsalar juda oson. ;-)
qo'shib qo'ydi muallif DevSolar, manba
@TheophileDano: Menimcha, qayta ko'rib chiqilgan standart kiritilgandan keyin olti yil o'tgach, bu o'n sakkiz yil avval chiqarilgan avvalgi standartning bir qismi emasligini aniq ko'rsatish kerak emas ...
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Ba'zan o'qituvchining nimani anglatishini taxmin qilish qiyin. Men "C99 faqat" talabini o'qituvchingizning bir oz bo'lishi mumkinligini ko'rsatadigan kuchli belgisi deb hisoblayman. Ehtimol, u so'lni so'rayapti (u erda bunday muammo bo'lmaydi), lekin bu chiziqni «yaxshi dizayndan» «juda yomon dizayni» ga aylantiradi ...
qo'shib qo'ydi muallif DevSolar, manba
@Unbuckle: Qani. Meni. Men Mening o'zim qsort() amalga oshirish va u erda memswp ​​() menda qulaylik funktsiyasi bo'lganini bilmasdi. Javob uchun javob beradi.
qo'shib qo'ydi muallif DevSolar, manba
Eslatma: _Generic - C11 kengaytmasi.
qo'shib qo'ydi muallif Theophile Dano, manba
Sizga germaniyalik ekanligingizni ko'rganimdek sizga aniq ko'rsatmalar berishi mumkin edi. Yana bir ko'rsatma shundaki, siz faqat bilmasligingiz mumkin bo'lgan standart libosni ishlatishimiz mumkin. Memswp ​​standart libaryning tarkibiy qismi emas, men tashvishlantiradigan narsa emas :(
qo'shib qo'ydi muallif Unbuckle, manba
Yuqoridagi boshqa echimni qo'shdim
qo'shib qo'ydi muallif Unbuckle, manba
Men berilgan barcha ma'lumotlardan g'azablandim. Ishonchli emasmi, o'qituvchi buni anglatmaydi, chunki biz, albatta, ko'rsatgichlardan o'tib ketmadik. Balandlik tartibida ko'rsatgichlardan ham foydalanish ^^
qo'shib qo'ydi muallif Unbuckle, manba
Im faqat C99 standartidan foydalanishga ruxsat berilgan bo'lsa ham: /
qo'shib qo'ydi muallif Unbuckle, manba
Hm, menimcha, bu yaxshi fikr. Agar raqamning ma'lumot turi float YoKI ikkilamchi yoki yo'qligini tekshirsangiz va qaysi turdagi bu turga ishlov beradigan funksiyaning qismiga qarab harakat qilsa. Men programmalarga yangi qo'shilaman, shuning uchun o'zimni to'g'ri shakllantirishga qodir emasman. Umid qilamanki, nimani nazarda tutganimni tushunasan.
qo'shib qo'ydi muallif Unbuckle, manba

Whatever you do, there must be a place with a typed comparison array[d] > array[d + 1], or a promotion from float to double. So there needs to be a minimum of customization per type. For such a tiny code, it is not a very good idea to pack this in a single function. And passing an external comparison function will add undesirable overhead.

Kodni takrorlashga yo'l qo'ymaslik uchun men oldingi protsessordan foydalanib, shablon vazifani takrorlab, masalani hal qilardim:

Fayl bubblesort.h :

#define function_name(type) type##_bubble_sort
void function_name(type)(type* array, int length)
{
    int c, d;
    type temp;

    for (c = 0; c < (length - 1); c++) {
        for (d = 0; d < length - c - 1; d++) {
            if (array[d] > array[d + 1]) {
                temp = array[d];
                array[d] = array[d + 1];
                array[d + 1] = temp;
            }
        }
    }
}
#undef function_name
#undef type

Asosiy fayl:

#define type float
#include "bubblesort.h"

#define type double
#include "bubblesort.h"

Bu vazifalarni belgilaydi

void float_bubble_sort(float* array, int length);
void double_bubble_sort(double* array, int length);
1
qo'shib qo'ydi

Whatever you do, there must be a place with a typed comparison array[d] > array[d + 1], or a promotion from float to double. So there needs to be a minimum of customization per type. For such a tiny code, it is not a very good idea to pack this in a single function. And passing an external comparison function will add undesirable overhead.

Kodni takrorlashga yo'l qo'ymaslik uchun men oldingi protsessordan foydalanib, shablon vazifani takrorlab, masalani hal qilardim:

Fayl bubblesort.h :

#define function_name(type) type##_bubble_sort
void function_name(type)(type* array, int length)
{
    int c, d;
    type temp;

    for (c = 0; c < (length - 1); c++) {
        for (d = 0; d < length - c - 1; d++) {
            if (array[d] > array[d + 1]) {
                temp = array[d];
                array[d] = array[d + 1];
                array[d + 1] = temp;
            }
        }
    }
}
#undef function_name
#undef type

Asosiy fayl:

#define type float
#include "bubblesort.h"

#define type double
#include "bubblesort.h"

Bu vazifalarni belgilaydi

void float_bubble_sort(float* array, int length);
void double_bubble_sort(double* array, int length);
1
qo'shib qo'ydi

qsort interfeysini o'rganing. Sizni ilhomlantiradi.

Funktsiyalarning turi va imzosi nodavlat konventsiyalari va ABI s. Amalda deylik, derleyici, double -s va long -s uchun yana bir variant uchun tartiblash vazifasini chaqirish uchun turli kod ishlab chiqaradi.

O'qituvchingiz funktsiya ko'rsatkichlari dan foydalanishingizni xohlaydi. Ehtimol, ularga ba'zi qo'shimcha mijozlar ma'lumotlarini berishni xohlaysizmi (ushbu funktsiyani ko'rsatuvchi belgilarni " qo`ng'iroqlar ) standart bo'lmagan qsort_r (3) qiladi.

C afsuski, yopish (muhim ahamiyatga ega bo'lgan anonim funksiyalar va bepul va bog'langan o'zgaruvchilar ). Men qanchalik muhimligini tushunish uchun SICP ni tavsiya qilaman.

Shu bilan bir qatorda, dastlabki protsessor yordamida ba'zi kambag'al odamning metaprogramming . Bir necha o'nta qatordan iborat bo'lgan DEFINE_BUBBLE_SORT (Horizontal Type, Name) so'lini aniq belgilashingiz mumkin (ularning har biri oxirgi koddan tashqari \ bilan yakunlandi) va u qabariqning ta'rifiga turi qatorlari ustida ishlaydigan Name nomi berilgan saralash funktsiyasi. SGLIB ning manba kodiga ilhom izlang. int -s-da ishlaydigan muntazam my_int_bubble_sort ni aniqlash uchun DEFINE_BUBBLE_SORT (int, my_int_bubble_sort) dan foydalanasiz va DEFINE_BUBBLE_SORT (er-xotin, my_double_bubble_sort) kodi bilan ikki marta ishlaydigan my_double_bubble_sort .

(you could even mix both approaches: code a my_bubble_sort taking a function pointer, and a shorter DEFINE_BUBBLE_SORT macro internally using that function)

Boshqa bir yondashuv (ikkinchisiga tegishli) C ning metafrogramini kodlashdir. Ba'zi bir faylda C kodini ishlab chiqaruvchi dasturni kodlaysiz va bu dastur Tip ham turi, ham funktsiya nomi DEFINE_BUBBLE_SORT dastur argumentlari sifatida ishlaydi. Keyin siz avtomatlashtirishni yaratish vositasini (masalan, sizning Makefile ) mos kelishi kerak.

BTW, operatsion tizim va uning tashqi kompilyatori yordamida siz buni "dinamik ravishda" bajarishingiz mumkin: ish vaqtida ba'zi bir C kodlarini yaratish, vaqtinchalik plaginini va dinamik ravishda yuklanadigan , masalan, plaginni ishlatish POSIX da dlopen ; Lekin bu boshlang'ich uchun juda ham uzoqqa ketadi.

1
qo'shib qo'ydi

Funktsiyani amalga oshirish uchun turli xil parametrlarni o'tkaza olmaysiz, lekin siz bunday o'zgarishlarni qayta yozish funksiyasidan qochishingiz mumkin.

#include

#define bubble_sort(type) type##_bubble_sort (type* array, int length)      \
{                                                                   \
    int c, d;                                                       \
    type temp;                                                      \
    for (c = 0; c < (length - 1); c++) {                            \
        for (d = 0; d < length - c - 1; d++) {                      \
            if (array[d] > array[d + 1]) {                          \
                temp = array[d];                                    \
                array[d] = array[d + 1];                            \
                array[d + 1] = temp;                                \
            }                                                       \
        }                                                           \
    }                                                               \
}

bubble_sort(int)        //This will create function named int_bubble_sort(int* array, int length)
bubble_sort(char)       //char_bubble_sort(char* array, int length)
bubble_sort(float)      //float_bubble_sort(float* array, int length)


int main()
{
    char array[] = {"edcba"};

    char_bubble_sort(array,5);
    puts(array);
    return 0;   
}
0
qo'shib qo'ydi

Funktsiyani amalga oshirish uchun turli xil parametrlarni o'tkaza olmaysiz, lekin siz bunday o'zgarishlarni qayta yozish funksiyasidan qochishingiz mumkin.

#include

#define bubble_sort(type) type##_bubble_sort (type* array, int length)      \
{                                                                   \
    int c, d;                                                       \
    type temp;                                                      \
    for (c = 0; c < (length - 1); c++) {                            \
        for (d = 0; d < length - c - 1; d++) {                      \
            if (array[d] > array[d + 1]) {                          \
                temp = array[d];                                    \
                array[d] = array[d + 1];                            \
                array[d + 1] = temp;                                \
            }                                                       \
        }                                                           \
    }                                                               \
}

bubble_sort(int)        //This will create function named int_bubble_sort(int* array, int length)
bubble_sort(char)       //char_bubble_sort(char* array, int length)
bubble_sort(float)      //float_bubble_sort(float* array, int length)


int main()
{
    char array[] = {"edcba"};

    char_bubble_sort(array,5);
    puts(array);
    return 0;   
}
0
qo'shib qo'ydi

DevSolar aytganidek. Buni bekor belgisi bilan qilishingiz mumkin. Masalan:

    void bubble_sort(void* array, int length, int sizeItem)
    {
        int c, d;
        double temp_d;
        float  temp_f
        float* array_f;
        double* array_d;

        if (sizeItem == sizeof(float)){
            array_f = (float*)array;
            for (c = 0; c < (length - 1); c++) {
              for (d = 0; d < length - c - 1; d++) {
                if (array_f[d] > array_f[d + 1]) {
                  temp_f = array_f[d];
                  array_f[d] = array_f[d + 1];
                  array_f[d + 1] = temp_f;
                }
              }
           }
       } else if (sizeItem == sizeof(double)){
          array_d = (double*)array;
          for (c = 0; c < (length - 1); c++) {
            for (d = 0; d < length - c - 1; d++) {
              if (array_d[d] > array_d[d + 1]) {
                temp_d = array_d[d];
                array_d[d] = array_d[d + 1];
                array_d[d + 1] = temp_d;
              }
            }  
          }
       } else {
       //unknown type ->your errorhandling goes here
       }
    }

// function call:   
bubble_sort((void*)your_array, length, sizeof(your_array[0]));  
0
qo'shib qo'ydi

DevSolar aytganidek. Buni bekor belgisi bilan qilishingiz mumkin. Masalan:

    void bubble_sort(void* array, int length, int sizeItem)
    {
        int c, d;
        double temp_d;
        float  temp_f
        float* array_f;
        double* array_d;

        if (sizeItem == sizeof(float)){
            array_f = (float*)array;
            for (c = 0; c < (length - 1); c++) {
              for (d = 0; d < length - c - 1; d++) {
                if (array_f[d] > array_f[d + 1]) {
                  temp_f = array_f[d];
                  array_f[d] = array_f[d + 1];
                  array_f[d + 1] = temp_f;
                }
              }
           }
       } else if (sizeItem == sizeof(double)){
          array_d = (double*)array;
          for (c = 0; c < (length - 1); c++) {
            for (d = 0; d < length - c - 1; d++) {
              if (array_d[d] > array_d[d + 1]) {
                temp_d = array_d[d];
                array_d[d] = array_d[d + 1];
                array_d[d + 1] = temp_d;
              }
            }  
          }
       } else {
       //unknown type ->your errorhandling goes here
       }
    }

// function call:   
bubble_sort((void*)your_array, length, sizeof(your_array[0]));  
0
qo'shib qo'ydi