Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Η αναδρομή είναι η αχίλλειος πτέρνα μου, δεν τα πάω καθόλου καλά με... δαύτην (και μάλιστα έχω καταφέρει και την έχω αποφύγει ). Για πες όμως τι προσπαθείς να κάνεις, μήπως το βγάλουμε αλλιώς.

 

EDIT:

 

Έχω επίσης την εντύπωση πως υπάρχουν προβλήματα με αναδρομές υλοποιημένες στον προ-επεξεργαστή (αλλά δεν θυμάμαι καθόλου λεπτομέρειες).

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Ένα παράδειγμα απλό θέλω... απλά να δω πώς στην ευχή, και εάν γίνεται, να έχεις αναδρομή με γενικό προγραμματισμό σε C.

 

Π.χ., να διαιρεί έναν αριθμό με το δύο μέχρι να μην μπορεί άλλο.

 

Δλδ:

 

>
#define myTestMacro(a)    do{        \
           if ((a/2) < 1)                       \
           {                                         \
             //OK                                \
           } else {                                \
             //?                                   \
           } while(0)

 

Εκεί που είναι τα ερωτηματικά, τι θα πρέπει να μπει έτσι ώστε να ξανακληθεί το ίδιο το macro myTestMacro;

 

Ξέχασα να πω..

 

 

Δεν θέλω να κάνω κάτι... απλά να δω εάν μπορεί να γίνει recursion με "templates" σε C

Δημοσ.

Σιγουρα δεν γινεται. Για να κανεις αναδρομη πρεπει να καλεσεις τη συναρτηση καπου μεσα στον εαυτο της. Τα macro δεν καλουνται, απλα γινονται replace

Δημοσ.

Σιγουρα δεν γινεται. Για να κανεις αναδρομη πρεπει να καλεσεις τη συναρτηση καπου μεσα στον εαυτο της. Τα 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, τότε την "κλασική" αναδρομή δεν έχει και νόημα να την "αναπαράγεις" (νομίζω).

Δημοσ.

edit: εδώ βέβαια κανείς μπορεί να πει γιατί να μην χρησιμοποιήσει κάποιος ένα while...

 

και δίκιο θα έχει!

 

 

Αλλά είναι από εκείνες τις "ηλίθιες" απορίες που καρφώνονται μερικές φορές :P

 

ωραια, και το 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:

 

Αλλά και πάλι... χάνεις την "πρώτη κλήση"....

 

Καμιά ιδέα άλλος κανείς;

Δημοσ.

(Σορυ παίδες, έβλεπα ένα έργο)

 

Ένα πρόχειρο googling που έκανα μόλις, επιβεβαιώνει σε διάφορα μέρη πως δεν γίνεται. Κάπου πήρε το μάτι μου πως και σε C++ δεν γίνεται (εκτός αν χρησιμοποιήσει κανείς Boost).

 

Αυτό που περιγράφεις στο τέλος timon το εξηγούν π.χ. εδώ: http://stackoverflow.com/questions/824639/variadic-recursive-preprocessor-macros-is-it-possible/893684 (αν και δεν το διάβασα όλο).

Δημοσ.

Αλλά και πάλι... χάνεις την "πρώτη κλήση"....

 

 

Μα αυτο ειναι το θεμα, δεν κανεις κληση συναρτησης.

 

Τεσπα, ας υποθεσουμε οτι γινεται, τοτε το παρακατω

>#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\
				/* και παει λεγοντας */

Δημοσ.

Τα %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 , %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 όμως άμα το έχεις ενεργοποιημένα, ως οφείλεις).

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...