migf1 Δημοσ. 7 Απριλίου 2012 Δημοσ. 7 Απριλίου 2012 Η αναδρομή είναι η αχίλλειος πτέρνα μου, δεν τα πάω καθόλου καλά με... δαύτην (και μάλιστα έχω καταφέρει και την έχω αποφύγει ). Για πες όμως τι προσπαθείς να κάνεις, μήπως το βγάλουμε αλλιώς. EDIT: Έχω επίσης την εντύπωση πως υπάρχουν προβλήματα με αναδρομές υλοποιημένες στον προ-επεξεργαστή (αλλά δεν θυμάμαι καθόλου λεπτομέρειες).
Timonkaipumpa Δημοσ. 7 Απριλίου 2012 Δημοσ. 7 Απριλίου 2012 Ένα παράδειγμα απλό θέλω... απλά να δω πώς στην ευχή, και εάν γίνεται, να έχεις αναδρομή με γενικό προγραμματισμό σε C. Π.χ., να διαιρεί έναν αριθμό με το δύο μέχρι να μην μπορεί άλλο. Δλδ: > #define myTestMacro(a) do{ \ if ((a/2) < 1) \ { \ //OK \ } else { \ //? \ } while(0) Εκεί που είναι τα ερωτηματικά, τι θα πρέπει να μπει έτσι ώστε να ξανακληθεί το ίδιο το macro myTestMacro; Ξέχασα να πω.. Δεν θέλω να κάνω κάτι... απλά να δω εάν μπορεί να γίνει recursion με "templates" σε C
migf1 Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 Νομίζω πως δεν γίνεται ρε συ. Σε ANSI C δεν γίνεται σίγουρα, δεν ξέρω αν το έχουν αλλάξει στην C99.
Timonkaipumpa Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 χμμμ Με "stub" macro; Δηλαδή.. > #define macro1(a) do{.... macro2(a)}while(0) και > #define macro2(a) do{ macro1(a)}while(0)
παπι Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 Σιγουρα δεν γινεται. Για να κανεις αναδρομη πρεπει να καλεσεις τη συναρτηση καπου μεσα στον εαυτο της. Τα macro δεν καλουνται, απλα γινονται replace
Timonkaipumpa Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 Σιγουρα δεν γινεται. Για να κανεις αναδρομη πρεπει να καλεσεις τη συναρτηση καπου μεσα στον εαυτο της. Τα macro δεν καλουνται, απλα γινονται replace Ναι βρε... Έστω ότι έχεις το macro (δεν βάζω defines κτλ για συντομία) > macro2(a) do{macro1(a)}while(0) και έχεις το: > macro1(a) do{if(a<2){/*do something*/\ }else{a=a/2;macro2(a);} }while(0) Στο macro1, το macro2 θα γίνει replace από το macro1. Αυτό περνάει; Δεν θα είναι αναδρομή με την έννοια της "συνάρτησης"/"κλασική αναδρομή", αλλά θα έχεις μία "συνάρτηση" που θα εμπεριέχει τον εαυτό της όσες φορές το θέλεις... Μιας και δεν μπορείς να γυρίσεις τιμή πίσω με τα macro, τότε την "κλασική" αναδρομή δεν έχει και νόημα να την "αναπαράγεις" (νομίζω).
Timonkaipumpa Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 edit: εδώ βέβαια κανείς μπορεί να πει γιατί να μην χρησιμοποιήσει κάποιος ένα while... και δίκιο θα έχει! Αλλά είναι από εκείνες τις "ηλίθιες" απορίες που καρφώνονται μερικές φορές ωραια, και το macro2 που θα κανει αναδρομη; Έχεις ένα point.... Δεν ξέρω! Προσπαθώ να βρω κάποιο τρόπο που να μπορεί να γίνει με macros.... edit: Ίσως εάν ήταν χωρίς else αλλά ως: > if (a>2) {macro2(a)} //do here smth και > #define macro2(a) do{a = a/2;macro1(a);}while(0) edit: Αλλά και πάλι... χάνεις την "πρώτη κλήση".... Καμιά ιδέα άλλος κανείς;
migf1 Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 (Σορυ παίδες, έβλεπα ένα έργο) Ένα πρόχειρο googling που έκανα μόλις, επιβεβαιώνει σε διάφορα μέρη πως δεν γίνεται. Κάπου πήρε το μάτι μου πως και σε C++ δεν γίνεται (εκτός αν χρησιμοποιήσει κανείς Boost). Αυτό που περιγράφεις στο τέλος timon το εξηγούν π.χ. εδώ: http://stackoverflow.com/questions/824639/variadic-recursive-preprocessor-macros-is-it-possible/893684 (αν και δεν το διάβασα όλο).
παπι Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 Αλλά και πάλι... χάνεις την "πρώτη κλήση".... Μα αυτο ειναι το θεμα, δεν κανεις κληση συναρτησης. Τεσπα, ας υποθεσουμε οτι γινεται, τοτε το παρακατω >#define anadromh(a) \ if(a > 100) \ /*do somthing*/ \ else\ {\ anadromh(a)\ }\ θα γινει > if(a > 100) \ /*do somthing*/ \ else\ {\ if(a > 100)\ /*do somthing*/ \ else\ {\ if(a > 100)\ /*do somthing*/ \ else\ {\ if(a > 100)\ /*do somthing*/ \ else\ {\ if(a > 100)\ /*do somthing*/ \ else\ /* και παει λεγοντας */
Timonkaipumpa Δημοσ. 8 Απριλίου 2012 Δημοσ. 8 Απριλίου 2012 ΟΚ. Δεν γίνεται... (busted κατά τους mythbusters; ) Thnx!
Star_Light Δημοσ. 10 Απριλίου 2012 Δημοσ. 10 Απριλίου 2012 Τα %ld , %lu αναφερονται στον ιδιο τυπο δεδομενων που ειναι ο unsigned long ? Επειδη δεν μου "κτυπαει" καθολου αμα βαλω και τα 2 μεσα στην printf > #include<stdio.h> int main(void) { printf(" int type is : %lu bytes \n short type is: %lu bytes \n long type is : %ld bytes " , sizeof(int), sizeof(short) , sizeof(long)); printf("\n float type is: %ld bytes \n double type is: %ld bytes \n long double is : %ld bytes " , sizeof(float) , sizeof(double) , sizeof(long double)); return 0; }
migf1 Δημοσ. 10 Απριλίου 2012 Δημοσ. 10 Απριλίου 2012 Τα %ld , %lu αναφερονται στον ιδιο τυπο δεδομενων που ειναι ο unsigned long ? Επειδη δεν μου "κτυπαει" καθολου αμα βαλω και τα 2 μεσα στην printf > #include<stdio.h> int main(void) { printf(" int type is : %lu bytes \n short type is: %lu bytes \n long type is : %ld bytes " , sizeof(int), sizeof(short) , sizeof(long)); printf("\n float type is: %ld bytes \n double type is: %ld bytes \n long double is : %ld bytes " , sizeof(float) , sizeof(double) , sizeof(long double)); return 0; } Δεν χτυπάει γιατί τα μετατρέπει. Το %ld αναφέρεται σε long int και το %lu σε unsigned long ("χτυπάει" warnings όμως άμα το έχεις ενεργοποιημένα, ως οφείλεις).
Προτεινόμενες αναρτήσεις