Dr.Fuzzy Δημοσ. 21 Μαρτίου 2009 Δημοσ. 21 Μαρτίου 2009 Λοιπον μου ηρθε να φτιαξω εναν VHDL Code Generator application σε C και...χρειαζομαι την βοηθεια των ειδικων! Πολυ συντομα, το TrigCore function απλα παραγει εναν κωδικα VHDL αναλογα τις παραμετρους που δεχεται (απλα το αναφερω για να μην το κοιτατε περιεργα). Θεωρησα σωστο να χρησιμοποιησω dynamic memory allocation για τα strings καθως ο κωδικας αναλογα με τις παραμετρους αυξανει εκθετικα (2^n) αλλα καπου κατι δεν ειναι σωστο...για παραμετρους μεχρι (8,7) δουλευει μια χαρα, με (8,8) ΚΑΠΟΥΤ, που λογικα δειχνει οτι δεν υπαρχει η διαθεσιμη μνημη που χρειαζεται. > /* Trigonometric VHDL Core Generator */ /* by Dr. Fuzzy */ #include <stdio.h> #include <string.h> #include <math.h> char* TrigCore(int dataWidth,int addrWidth) { char s1[]="library ieee;\n" "use ieee.std_logic_1164.all;\n\n" "package sin_pkg is\n\n" " constant max_data_value: integer :=%d ;\n" " subtype data_value_type is integer range 0 to max_data_value;\n\n" " constant max_address: integer := %d;\n" " subtype address_type is integer range 0 to max_address;\n\n" " function get_sin (address: address_type) return data_value_type;\n\n" "end;\n\n" "package body sin_pkg is\n\n" " function get_sin (address: address_type) return data_value_type is\n" " variable data_value: data_value_type;\n" " begin\n" " case address is\n "; char s2[]=" when %d =>\n"; char s3[]=" data_value := %d;\n"; char s4[]=" end case;\n\n" " return data_value;\n\n" " end;\n\n" "end;"; char *ps1,*ps2,*ps3,*ps4; /* Dynamically allocate memory */ ps1=(char *) malloc (sizeof(char) * (strlen(s1) + ((strlen(s2) + strlen(s3)) * pow(2,addrWidth)))); ps2=(char *) malloc (sizeof(char) * (strlen(s2) * pow(2,addrWidth))); ps3=(char *) malloc (sizeof(char) * (strlen(s3) * pow(2,addrWidth))); ps4=(char *) malloc (sizeof(char) * strlen(s4)); sprintf(ps1,s1,(int) pow(2,dataWidth)-1,(int) pow(2,addrWidth)-1); int i; for (i=0;i<pow(2,addrWidth);i++) { sprintf(ps2,s2,i); strcat(ps1,ps2); sprintf(ps3,s3,i); strcat(ps1,ps3); } sprintf(ps4,s4); strcat(ps1,ps4); return ps1; free(ps1,ps2,ps3,ps4); ps1,ps2,ps3,ps4 = NULL; } int main(int argc, char *argv[]) { char *x = TrigCore(8,8); printf("%s\n",x); return 0; } Ριχτε του μια ματια και οποιος μπορει ας βοηθησει να βρω το λαθακι (ή λαθαρα!). Επισης θα χαρω πολυ να μου προτεινετε πιθανες βελτιωσεις. PS Το function δεν ειναι ολοκληρωμενο ως προς το functionality του!
PCharon Δημοσ. 21 Μαρτίου 2009 Δημοσ. 21 Μαρτίου 2009 Dr.Fuzzy δε νομίζω να έχεις και πολύ τυχαίο ψευδώνυμο... fuzzy τα γράφεις! Αυτό που συνέβαινε είναι buffer overflow στο ps1. Δεν είχες υπολογίσει καλά τα μεγέθη των ps2, ps3 και συγκεκριμένα το κομματάκι %d που όταν π.χ. τυπωθεί ως 100 είναι +1 στο μήκος του ps2, όταν τυπωθεί 1000 είναι +2 κ.ο.κ. Επίσης κάποια λάθη στη σύνταξη (C είναι αυτό, πρόσεξέ το λίγο). Το παρακάτω θα είναι εντάξει για τα τωρινά δεδομένα... > /* Trigonometric VHDL Core Generator */ /* by Dr. Fuzzy */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> char *ps1,*ps2,*ps3,*ps4; char* TrigCore(int dataWidth,int addrWidth) { char s1[]="library ieee;\n" "use ieee.std_logic_1164.all;\n\n" "package sin_pkg is\n\n" " constant max_data_value: integer :=%d ;\n" " subtype data_value_type is integer range 0 to max_data_value;\n\n" " constant max_address: integer := %d;\n" " subtype address_type is integer range 0 to max_address;\n\n" " function get_sin (address: address_type) return data_value_type;\n\n" "end;\n\n" "package body sin_pkg is\n\n" " function get_sin (address: address_type) return data_value_type is\n" " variable data_value: data_value_type;\n" " begin\n" " case address is\n "; char s2[]=" when %d =>\n"; char s3[]=" data_value := %d;\n"; char s4[]=" end case;\n\n" " return data_value;\n\n" " end;\n\n" "end;"; ps1= malloc (sizeof(char) * (strlen(s1) + ((16 + strlen(s2) + strlen(s3)) * pow(2,addrWidth)) + strlen(s4))); ps2= malloc (sizeof(char) * (8 + strlen(s2))); ps3= malloc (sizeof(char) * (8 + strlen(s3))); ps4= malloc (sizeof(char) * strlen(s4)); sprintf(ps1,s1, pow(2,dataWidth)-1, pow(2,addrWidth)-1); int i; for (i=0;i<pow(2,addrWidth);i++) { sprintf(ps2,s2,i); strcat(ps1,ps2); sprintf(ps3,s3,i); strcat(ps1,ps3); } sprintf(ps4,s4); strcat(ps1,ps4); free(ps2); ps2 = NULL; free(ps3); ps3 = NULL; free(ps4); ps4 = NULL; return ps1; } int main(int argc, char *argv[]) { char *x = TrigCore(8,8); printf("%s\n",x); free(ps1); ps1 = NULL; return 0; }
Directx Δημοσ. 21 Μαρτίου 2009 Δημοσ. 21 Μαρτίου 2009 Με πρόλαβε ο PCharon Παρόλα αυτά πρόσθεσε και ένα + 1 στην ps4= (char*)malloc (sizeof(char) * strlen(s4)); -> ps4= (char*)malloc (sizeof(char) * strlen(s4) + 1); ώστε να μην χτυπά η ανάλογη sprintf μιας και η strlen δεν επιστρέφει το \0 και είσαι έτοιμος. Καλή συνέχεια!
Dr.Fuzzy Δημοσ. 21 Μαρτίου 2009 Μέλος Δημοσ. 21 Μαρτίου 2009 Παιδια ευχαριστω πολυ! Το ηξερα οτι το προβλημα ειναι οι τιμες που γεμιζω τους πινακες, αλλα ειχα κολλησει με το πως να τους προσθεσω στα malloc(). Εμ, γιαυτο ειπα οτι θελω την βοηθεια των ειδικων! Επισης, ειναι δυνατο (καπως) ολα τα free να γινονται μεσα στην function() και οχι μεσα στην main(). Ας πουμε οτι θελουμε την main() να μην εχει τετοιες εξαρτησεις;
ippo00 Δημοσ. 21 Μαρτίου 2009 Δημοσ. 21 Μαρτίου 2009 Καλό practise θα ήταν να κάνεις ένα check άμα είναι NULL κανένα pointer μετά από το allocation
parsifal Δημοσ. 21 Μαρτίου 2009 Δημοσ. 21 Μαρτίου 2009 Επισης, ειναι δυνατο (καπως) ολα τα free να γινονται μεσα στην function() και οχι μεσα στην main(). Ας πουμε οτι θελουμε την main() να μην εχει τετοιες εξαρτησεις; Χμμμ...πώς θα ενσωματώσεις την free(ps1); που καλείς στη main μέσα στην TrigCore όταν η τελευταία εντολή της δεύτερης είναι η "return ps1;" ; Αυτό που μπορείς να κάνεις για να φαίνεται πιο «συμμαζεμένος» ο κώδικας στη main είναι να φτιάξεις μία επιπλέον συνάρτηση που θα κάνει το cleanup και θα την καλείς αμέσως μετά την printf της main (αν και βρίσκω καλύτερη πρακτική το να καλείς τις free το συντομότερο δυνατόν)...
PCharon Δημοσ. 21 Μαρτίου 2009 Δημοσ. 21 Μαρτίου 2009 Ας πουμε οτι θελουμε την main() να μην εχει τετοιες εξαρτησεις; Ο parsifal σου είπε για ποιο λόγο αυτό δεν είναι δυνατόν να γίνει. Αν θες να γράφεις πιο "καθαρό" κώδικα που να μπορείς να μοιραστείς περνάς στις κλάσεις της C++ ...
Dr.Fuzzy Δημοσ. 21 Μαρτίου 2009 Μέλος Δημοσ. 21 Μαρτίου 2009 Ναι εχεις δικιο με OOP σιγουρα ειναι πολυ πιο ευκολα και συμμαζεμενα τα πραγματα οπως το βλεπω τωρα. Για να ειμαι ειλικρινης το συγκεκριμενο app το εχω υλοποιησει σε MATLAB+GUI (αναγκη που προεκυψε απο κατι αλλο) και πιο πολυ η ιδεα μου ηρθε για να "ξεσκουριασω" την C μου στον ελευθερο χρονο μου. Αντε να το κανω και σε C++ να μου πειτε παρατηρησεις.
Dr.Fuzzy Δημοσ. 23 Μαρτίου 2009 Μέλος Δημοσ. 23 Μαρτίου 2009 Οτι παρατηρησεις, σχολια, βελτιωσεις, bad practices μπορειτε να επισημανετε, θα το εκτιμησω ιδιαιτερα! Σε OO/C++ λοιπον. > //#include <stdlib.h> //#include <stdio.h> //#include <string.h> #include <math.h> #include <iostream> using namespace std; class TrigCore // Trigonometric VHDL Core Generator Class { private: int dataWidth, addrWidth; char s1[],s2[],s3[],s4[]; char *ps1,*ps2,*ps3,*ps4; public: TrigCore(int a, int //Constructor { dataWidth = a; addrWidth = b; } ~TrigCore() //Destructor { delete ps1; ps1 = NULL; delete ps2; ps2 = NULL; delete ps3; ps3 = NULL; delete ps4; ps4 = NULL; } char* getCode() //Getter { genCode(); return ps1; } void genCode() // Code Generator { char s1[] = "library ieee;\n" "use ieee.std_logic_1164.all;\n\n" "package sin_pkg is\n\n" " constant max_data_value: integer :=%d ;\n" " subtype data_value_type is integer range 0 to max_data_value;\n\n" " constant max_address: integer := %d;\n" " subtype address_type is integer range 0 to max_address;\n\n" " function get_sin (address: address_type) return data_value_type;\n\n" "end;\n\n" "package body sin_pkg is\n\n" " function get_sin (address: address_type) return data_value_type is\n" " variable data_value: data_value_type;\n" " begin\n" " case address is\n "; char s2[] = " when %d =>\n"; char s3[] = " data_value := %d;\n"; char s4[] = " end case;\n\n" " return data_value;\n\n" " end;\n\n" "end;"; ps1 = new char[(strlen(s1) + ((16 + strlen(s2) + strlen(s3)) * (int) pow(2,addrWidth)) + strlen(s4))]; ps2 = new char[(8 + strlen(s2))]; ps3 = new char[(8 + strlen(s3))]; ps4 = new char[strlen(s4) + 1]; sprintf(ps1,s1, pow(2,dataWidth)-1, pow(2,addrWidth)-1); for (int i=0;i<pow(2,addrWidth);i++) { sprintf(ps2,s2,i); strcat(ps1,ps2); sprintf(ps3,s3,i); strcat(ps1,ps3); } sprintf(ps4,s4); strcat(ps1,ps4); } }; int main() { TrigCore trigCore(8,8); cout << trigCore.getCode() << endl; return 0; }
Directx Δημοσ. 23 Μαρτίου 2009 Δημοσ. 23 Μαρτίου 2009 Σε C++ μπορείς να εκμεταλλευτείς το STL stringstream (και STL string) το οποίο σου επιτρέπει να χτίσεις τα strings σου όπως επιθυμείς, προσθέτοντας σε αυτά αυτόματα διάφορους τύπους για παράδειγμα αριθμούς, δίχως την ανάγκη char*, malloc, delete, sprintf. Ακολουθεί μια μετατροπή βασισμένη στο stringstream: > #include <math.h> #include <iostream> #include <sstream> using namespace std; class TrigCore // Trigonometric VHDL Core Generator Class { private: int dataWidth, addrWidth; public: TrigCore(int a, int //Constructor { dataWidth = a; addrWidth = b; } string getCode() //Getter { return genCode(); } string genCode() // Code Generator { stringstream SS1; SS1<< "library ieee;\n" "use ieee.std_logic_1164.all;\n\n" "package sin_pkg is\n\n" " constant max_data_value: integer :=" << pow(2,dataWidth)-1 << ";\n" << " subtype data_value_type is integer range 0 to max_data_value;\n\n" " constant max_address: integer :=" << pow(2,addrWidth)-1 << ";\n" << " subtype address_type is integer range 0 to max_address;\n\n" " function get_sin (address: address_type) return data_value_type;\n\n" "end;\n\n" "package body sin_pkg is\n\n" " function get_sin (address: address_type) return data_value_type is\n" " variable data_value: data_value_type;\n" " begin\n" " case address is\n "; for(int i=0; i < pow(2,addrWidth); i++) { stringstream SS2; SS2 << " when " << i << "=>\n" << " data_value := " << i << ";\n"; SS1 << SS2.str(); } SS1 << " end case;\n\n" " return data_value;\n\n" " end;\n\n" "end;"; return SS1.str(); } }; int main() { TrigCore trigCore(8,12); cout << trigCore.getCode() << endl; return 0; } Και καθώς δεν έχω ασχοληθεί με VHDL δες την έξοδο (για 8, 5): > library ieee; use ieee.std_logic_1164.all; package sin_pkg is constant max_data_value: integer :=255; subtype data_value_type is integer range 0 to max_data_value; constant max_address: integer :=31; subtype address_type is integer range 0 to max_address; function get_sin (address: address_type) return data_value_type; end; package body sin_pkg is function get_sin (address: address_type) return data_value_type is variable data_value: data_value_type; begin case address is when 0=> data_value := 0; when 1=> data_value := 1; when 2=> data_value := 2; when 3=> data_value := 3; when 4=> data_value := 4; when 5=> data_value := 5; when 6=> data_value := 6; when 7=> data_value := 7; when 8=> data_value := 8; when 9=> data_value := 9; when 10=> data_value := 10; when 11=> data_value := 11; when 12=> data_value := 12; when 13=> data_value := 13; when 14=> data_value := 14; when 15=> data_value := 15; when 16=> data_value := 16; when 17=> data_value := 17; when 18=> data_value := 18; when 19=> data_value := 19; when 20=> data_value := 20; when 21=> data_value := 21; when 22=> data_value := 22; when 23=> data_value := 23; when 24=> data_value := 24; when 25=> data_value := 25; when 26=> data_value := 26; when 27=> data_value := 27; when 28=> data_value := 28; when 29=> data_value := 29; when 30=> data_value := 30; when 31=> data_value := 31; end case; return data_value; end; end; --- Όσον αφορά το προηγούμενο πρόγραμμα σε C++, άλλαξε τα delete σε delete[] καθώς κάνεις new σε array. Επίσης πρόσεξε το format-specifier του s1[] διότι ορίζεις %d αλλά στην sprintf περνάς pow που επιστρέφει double οπότε υπάρχει πρόβλημα στο conversion. Αντί για %d δοκίμασε %.0f που είναι συμβατό με double το ".0" ζητά από τον compiler να κόψει την υποδιαστολή -rounding- (δηλαδή 12.0 -> 12). Εναλλακτικά μπορείς να ζητήσεις cast των pow της sprintf σε int: sprintf(ps1,s1, (int)pow(2,dataWidth)-1, (int)pow(2,addrWidth)-1); αφήνοντας τα %d στο S1. --- Καλή συνέχεια. Υ.Γ. Ο κώδικας σε C++ δοκιμάσθηκε σε CodeGear C++ Builder, μπορεί να περιέχει παραλήψεις ή άλλες αβλεψίες και δεν εγγυώμαι ότι μπορεί να λειτουργήσει σε άλλους compilers.
Dr.Fuzzy Δημοσ. 23 Μαρτίου 2009 Μέλος Δημοσ. 23 Μαρτίου 2009 Καταρχας σε ευχαριστω πολυ για τις υποδειξεις και τον χρονο που αφιερωσες. Kαποιες ερωτησεις που προκυπτουν (ισως τετριμμενες), αν εχεις τον χρονο: 1. Κανοντας χρηση των STL stringstream (και STL string), περαν τις προφανους ευκολιας που ειναι ενα πλεονεκτημα, υπαρχουν ισως καποια μειονεκτηματα σε σχεση με τον κλασσικο τροπο (char, new, delete, κλπ). Χαζη ερωτηση, αλλα η μνημη που δεσμευουν τα strings, γινεται αυτοματα freed. Η αληθεια ειναι οτι μου παραφαινεται high-level (για C++) με μεγαλο βαθμο abstraction ο τροπος αυτος (παντα και με βαση το background μου) και με ξενιζει καπως. Θα με ενδιεφερε η γνωμη σου πανω σε αυτο. 2. To (int) casting πραγματι το εβαλα μονο στην ps1 που γινεται assigned η μνημη, στην sprintf το ξεχασα εντελως! Βεβαια στην συγκεκριμενη εφαρμογη το rounding error δεν εχει μαθηματικα καμια σημασια διοτι ο η βαση και ο εκθετης ειναι παντα ακεραιοι αριθμοι. Θα περιμενα ομως o compiler να πεταει καποιο warning, πραγμα το οποιο δεν συμβαινει. 3. Για το delete εχεις απολυτο δικιο, τελειως λαθος μου, αλλα και παλι δεν θα επρεπε να πεταει καποιο warning; 4. To getter function που εχω φτιαξει ( getCode() ) μου φανηκε σαν καλη πρακτικη, αλλα εδω εχει οντως καποιο νοημα ή απλα θα μπορουσα να γυρναω το char* απο την genCode(); 5. ΤΕΛΟΣ... Αντι για setter function περναω τις παραμετρους μεσω του constuctor. Αν και μου φαινεται πιο σωστο, γιατι ειναι καλυτερη τακτικη (αν ειναι); Ελπιζω να μην σε κουραζω αφανταστα!
Directx Δημοσ. 23 Μαρτίου 2009 Δημοσ. 23 Μαρτίου 2009 1) Κοίταξε υπάρχουν δυο δρόμοι στην C++, ο πρώτος είναι η εκμετάλλευση της STL και όλων των εργαλείων που παρέχει ώστε να γράψουμε γρήγορα τον κώδικα μας. Ο δεύτερος δρόμος είναι να δούμε την C++ δίχως την χρήση της STL και να την αντιμετωπίσουμε ως μια C με new, delete και classes. Μεταξύ των δυο δρόμων, προσωπικά προτιμώ τον πρώτο. Κλασσικός τρόπος δεν υπάρχει, όταν γράφεις σε C++ το κάνεις διότι θέλεις να αναπτύξεις γρήγορα το λογισμικό σου, αν ασχοληθείς με την STL θα βρεις εξαιρετικά εργαλεία που θα σε βοηθήσουν να αναπτύξεις με σχετική ευκολία κώδικα που σε C θα ήθελε αρκετή προσπάθεια και το όπιο κέρδος θα ήταν ελάχιστον σε υπολογιστές σύγχρονης τεχνολογίας. Ένα πρόβλημα βέβαια που υπάρχει εδώ είναι ότι αρκετοί C programmers δυσανασχετούν με την εκμάθηση της STL οπότε τελικά την προσπερνούν και προσπαθούν να εφεύρουν ξανά και ξανά και ξανά τον τροχό (κατά βάθος το γουστάρουν τρελά, νιώθουν «προγραμματιστές» έτσι –είναι ψυχαναγκαστικό ζήτημα), εδώ βέβαια έχουν εν μέρει δίκιο, πράγματι η STL είναι δύστροπη σε ορισμένα σημεία και εύκολη σε άλλα, απλά θέλει ενασχόληση, διαφορετικά αν πετάξεις την STL στα σκουπίδια, ε τότε δεν κερδίζεις τίποτα την C++, δεν είναι μόνο να φτιάξεις classes ... Προσωπική γνώμη πάντα. 2 & 3) Ναι ένα warning δεν θα ήταν άσχημο αλλά .. 4) Εξαρτάται, αν είσαι σίγουρος ότι δεν θα χρειασθείς post-processing των αποτελεσμάτων σου τον βγάζεις αν όχι τον αφήνεις Just-in case για το μέλλον ( ; ) 5) Εξαρτάται από τον σκοπό της class, νομίζω ότι δεν χρειάζεται να υποχρεώνεις συνεχώς τον χρήστη να δημιουργεί νέα class instances αλλά όπως είπα εξαρτάται από το τι κάνει η class σου τελικά. Γενικά πριν γράψει κανείς ένα class πρέπει να σκεφτεί .. αν χρειάζεται πράγματι class (εδώ πρόκειται για έναν ψυχαναγκασμό των C++ programmer -υπέρ OOP όταν δεν υπάρχει λόγος). Καλή συνέχεια!
bokarinho Δημοσ. 23 Μαρτίου 2009 Δημοσ. 23 Μαρτίου 2009 1) Κοίταξε υπάρχουν δυο δρόμοι στην C++, ο πρώτος είναι η εκμετάλλευση της STL και όλων των εργαλείων που παρέχει ώστε να γράψουμε γρήγορα τον κώδικα μας. Ο δεύτερος δρόμος είναι να δούμε την C++ δίχως την χρήση της STL και να την αντιμετωπίσουμε ως μια C με new, delete και classes. Μεταξύ των δυο δρόμων, προσωπικά προτιμώ τον πρώτο. Κλασσικός τρόπος δεν υπάρχει, όταν γράφεις σε C++ το κάνεις διότι θέλεις να αναπτύξεις γρήγορα το λογισμικό σου, αν ασχοληθείς με την STL θα βρεις εξαιρετικά εργαλεία που θα σε βοηθήσουν να αναπτύξεις με σχετική ευκολία κώδικα που σε C θα ήθελε αρκετή προσπάθεια και το όπιο κέρδος θα ήταν ελάχιστον σε υπολογιστές σύγχρονης τεχνολογίας. Ένα πρόβλημα βέβαια που υπάρχει εδώ είναι ότι αρκετοί C programmers δυσανασχετούν με την εκμάθηση της STL οπότε τελικά την προσπερνούν και προσπαθούν να εφεύρουν ξανά και ξανά και ξανά τον τροχό (κατά βάθος το γουστάρουν τρελά, νιώθουν «προγραμματιστές» έτσι –είναι ψυχαναγκαστικό ζήτημα), εδώ βέβαια έχουν εν μέρει δίκιο, πράγματι η STL είναι δύστροπη σε ορισμένα σημεία και εύκολη σε άλλα, απλά θέλει ενασχόληση, διαφορετικά αν πετάξεις την STL στα σκουπίδια, ε τότε δεν κερδίζεις τίποτα την C++, δεν είναι μόνο να φτιάξεις classes ... Προσωπική γνώμη πάντα. 2 & 3) Ναι ένα warning δεν θα ήταν άσχημο αλλά .. 4) Εξαρτάται, αν είσαι σίγουρος ότι δεν θα χρειασθείς post-processing των αποτελεσμάτων σου τον βγάζεις αν όχι τον αφήνεις Just-in case για το μέλλον ( ; ) 5) Εξαρτάται από τον σκοπό της class, νομίζω ότι δεν χρειάζεται να υποχρεώνεις συνεχώς τον χρήστη να δημιουργεί νέα class instances αλλά όπως είπα εξαρτάται από το τι κάνει η class σου τελικά. Γενικά πριν γράψει κανείς ένα class πρέπει να σκεφτεί .. αν χρειάζεται πράγματι class (εδώ πρόκειται για έναν ψυχαναγκασμό των C++ programmer -υπέρ OOP όταν δεν υπάρχει λόγος). Καλή συνέχεια! Άλλωστε τι είναι η STL, ένα framework είναι και προς Θεού, χρησιμοποιούμε τα frameworks έχουν τα πάντα έτοιμα μέσα και με λίγη προσπάθεια και λιγότερες γραμμές κώδικα φτιάχνεις παπάδες. Πραγματικά η δύναμη της STL είναι πολύ μεγάλη, φανταστείτε μόνο τις ομοιότητες της μοντέρνας C# .ΝΕΤ framework με την STL και θα διαπιστώσετε πως όχι μόνο η STL σχεδόν υπερτερεί αλλά για κάποιον που γνωρίζει αρκετά καλά C++, πάει κατευθείαν σε STL κσι όχι σε C sharp.
dop Δημοσ. 24 Μαρτίου 2009 Δημοσ. 24 Μαρτίου 2009 Η συγκεκριμένη κλάση δεν είναι στο critical path της εφαρμογής. Αν ήταν, θα σου έλεγα πιάσε την STL και άλλαξέ της τα φώτα (που πολλές φορές χρειάζεται και επιβάλλεται). Εφόσον όμως κάνεις κάτι το οποίο είναι σχετικά απλό, άσε την STL implementation του compiler σου να ανησυχεί για την αποδόση - και εσύ να έχεις το κεφάλι σου ήσυχο πως όλα πάνε καλά και αύριο θα μπορείς να διαβάσεις τον κώδικά σου.
3c0r1z Δημοσ. 24 Μαρτίου 2009 Δημοσ. 24 Μαρτίου 2009 Μιας και γίνεται λόγος για την stl θα έλεγα ότι κανείς θα πρέπει να πάει ένα βήμα παραπέρα και μετά απο κάποιο χρόνο ενασχόλησης με την stl να αρχήσει να κάνει εκτεταμένη χρήση της boost library. Για να καταλάβετε πολλές βελτιώσεις που περιλαμβάνονται στο C++ Technical Report 1 (TR1) και πιθανόν να συμπεριληφθούν στο επόμενο c++ standard είναι απευθείας απη την boost library. Η δυνατότητες της συγκεκριμένης βιβλιοθήκης είναι τόσο πολλές ώστε γίνεται χρήση σε ανάπτυξη εφαρμογών όπως το adope photoshop. Απο την άλλη βέβαια αν είναι κάποιος σε διαδικασία εκμάθησης καλό είναι να αναπτύσσει κάποιους αλγόριθμους απο μόνος του. Και περισσότερη εμπειρία θα αποκτήση και δεν θα του έρθει η ιδέα να χρησιμοποιήσει εναν random iterator για να προσπελάσει μια συνδεδεμένη λίστα .
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.