bxenos Δημοσ. 26 Ιουνίου 2009 Δημοσ. 26 Ιουνίου 2009 και ποιός είναι ο ορισμός του "καθαρού" και της "ταρζανιάς":-) ; ...ειδικά όταν η αρχιτεκτονική των σημερινών υπολογιστών δεν επιβάλει ιδιαίτερους (ουσιαστικούς) περιορισμούς που ήταν απαραίτητοι πριν 15 ή 20 χρόνια οπότε είμαι έτοιμος να διαπραγματευτώ μεταξύ ενός ευανάγνωστου κώδικα και ενδεχομένως λίγο πιο αργού ή λίγο μεγαλύτερου εκτελέσιμου ο parsifal έθεσε το θέμα των "μικρών συστημάτων" όπου εκεί η απλότητα δεν είναι πάντα επιλογή. πχ: αν δουλεύεις για ένα project σε ένα εργοστάσιο που παράγει τηλεκοντρόλ και χρειαστεί να κάνεις κάτι τέτοιο, υπάρχουν οι επιλογές: α) μικροελενκτης με 0,5ευρω και αποτελεσματικός κωδικας που απαιτεί περισσότερο χρόνο σκέψης/προετοιμασίας απο σενα β) μικροελενκτης με 0,9 ευρω με δυνατοτητα sprintf ή log (και την επιπλέον μνήμη που απαιτείται) Τι απο τα δυο πιστεύεις θα εκτιμούσαν οι μέτοχοι του εργοστασίου σε σχέση με τον υπάρχοντα ανταγωνισμό; Φυσικά για τους σημέρινους υπολογιστές (αλλα και τους δεκαπενταετίας) δεν υπάρχει λόγος για οτιδήποτε πιο πολύπλοκο απο το sprintf/atoi
Directx Δημοσ. 26 Ιουνίου 2009 Δημοσ. 26 Ιουνίου 2009 και ποιός είναι ο ορισμός του "καθαρού" και της "ταρζανιάς" ; Νομίζω ότι έχεις ήδη απαντήσει αφ’ εαυτού, αλλά δεν πειράζει καθώς πρόκειται για microcontrollers οπότε συγχωρείσαι ο parsifal έθεσε το θέμα των "μικρών συστημάτων" όπου εκεί η απλότητα δεν είναι πάντα επιλογή. Και εγώ έθεσα το ζήτημα επί της βάσης του σχολίου: Νομίζω πως είναι πιο ευκολοχώνευτος τρόπος από κάποιον που είναι αρχάριος στη C. Που μου έδωσε έτσι την ευκαιρία να αναπτύξω την άποψη μου επί της αξίας της απλότητας, οπότε τα υπόλοιπα που αναπτύσσεις αν και εύστοχα, είναι μάλλον irrelevant. Γενικά είμαστε από δυο διαφορετικούς κόσμους, εσύ στα embedded systems (από όσο φαίνεται - οπότε συνηθισμένος στις πατέντες) εγώ στις εμπορικές εφαρμογές (ταχύτητα & αποτελεσματικότητα) οπότε «διάσταση απόψεων» και προγραμματιστικού στυλ Όπως και να έχει, καλή συνέχεια. Υ.Γ. Αν θες να το συζητήσουμε περαιτέρω, pm.
Evgenios1 Δημοσ. 26 Ιουνίου 2009 Δημοσ. 26 Ιουνίου 2009 <ασχετος> Το unsigned τι ειναι? Απλα πραματα θελω, bits και ως τι χρησιμοποιειται. </ασχετος>
bxenos Δημοσ. 26 Ιουνίου 2009 Δημοσ. 26 Ιουνίου 2009 Γενικά είμαστε από δυο διαφορετικούς κόσμους, εσύ στα embedded systems (από όσο φαίνεται - οπότε συνηθισμένος στις πατέντες) ... μπά, παίζω και στα δύο ταμπλό (υποθέτω ότι το ένα έχει επηρεάσει και το άλλο ). Πάντως σοβαρά δεν μου φάνηκε κανένας τρόπος ταρζανιά. Μου άρεσε και το log βέβαια. Φυσικά θεωρώ το sprintf πιο απλό. @Engenios: το int είναι προσημασμένος ακέραιος, το unsigned (ή unsigned int) είναι μη προσημασμένος ακέραιος (δηλαδη ίδιος αριθμός bytes αλλά διαφορετικός τρόπος απεικόνησης για τους αρνητικούς αριθμούς (στους θετικούς είναι πανομοιότοιποι και στα bit τους).
Evgenios1 Δημοσ. 26 Ιουνίου 2009 Δημοσ. 26 Ιουνίου 2009 <ασχετος> Ααα το unsigned ειναι το defualt του unsigned int,οκ thx </ασχετος>
dop Δημοσ. 3 Ιουλίου 2009 Δημοσ. 3 Ιουλίου 2009 Στην περίπτωση της sprintf/atoi το buffer πρέπει να είναι τόσο μεγάλο όσο 2 integers της μηχανής (σε δεκαδική αναπαράσταση) +1 byte για το '\0'. Το παραπάνω είναι 1) δύσκολο να το υπολογίσεις και 2) σαφέστατα πιο επηρρεπές σε λάθη από την λύση με log. Ακόμα προτιμάτε την sprintf;
we_will_rise Δημοσ. 3 Ιουλίου 2009 Δημοσ. 3 Ιουλίου 2009 υπάρχει και η άλλη λύση, να αποθηκεύεις τα νούμερα σαν strings και να τα κολλάς με την strcat() νομίζω
we_will_rise Δημοσ. 3 Ιουλίου 2009 Δημοσ. 3 Ιουλίου 2009 όπως προείπα, η strcat() σου κάνει μια χαρά την δουλειά σου... Για του λόγου το αληθές,
bokarinho Δημοσ. 3 Ιουλίου 2009 Δημοσ. 3 Ιουλίου 2009 όπως προείπα, η strcat() σου κάνει μια χαρά την δουλειά σου...Για του λόγου το αληθές, Όχι ακριβώς, αν βάλεις ένα πολύ μεγάλο integer μαζί με έναν άλλο δεν θα δουλέψει, πρέπει να γνωρίζεις πόσα ψηφία είναι ο κάθε integer για να δημιουργήσεις ένα string με βάση τους αριθμούς αυτούς δυναμικά και όχι στατικά με 10 bytes αυθαίρετα. Επίσης η gets δεν είναι καλή συνάρτηση να την αποφεύγεις αν είναι δυνατόν. Δοκίμασε fgets ή ακόμα και scanf με προσοχή το πόσα πράγματα διαβάζεις.
ippo00 Δημοσ. 3 Ιουλίου 2009 Δημοσ. 3 Ιουλίου 2009 "ψάχνω να βρω στην C έναν τρόπο να ενώσω δυο μεταβλητές τύπου int σε μια τρίτη τύπου int παλι." Εσύ έδωσες έναν τρόπο να ενώσεις δυο strings ως string...
bokarinho Δημοσ. 3 Ιουλίου 2009 Δημοσ. 3 Ιουλίου 2009 "ψάχνω να βρω στην C έναν τρόπο να ενώσω δυο μεταβλητές τύπου int σε μια τρίτη τύπου int παλι." Εσύ έδωσες έναν τρόπο να ενώσεις δυο strings ως string... > #include <stdio.h> #include <stdlib.h> #include <string.h> #define snprintf _snprintf /* Calculate number of digits in a number. */ unsigned int CalculateDigitNumber(unsigned int N) { unsigned int Cnt = 0; do { Cnt++; if(!(N/=10)) break; }while(1); /* Return. */ return Cnt; } /* Create the concatenation of two numbers. */ int IntConcat(unsigned int X, unsigned int Y) { int nValue = 0; unsigned int ConcatNumber; unsigned int TotalLen = CalculateDigitNumber(X) + CalculateDigitNumber(Y); char *IntConc = (char*)calloc(TotalLen+1, sizeof(char)); if(!IntConc) { perror("CALLOC:"); return -1; } else { if((nValue = snprintf(IntConc,TotalLen+1, "%u%u", X,Y)) != TotalLen) { perror("SNPRINTF"); free(IntConc); return -1; } else { if(sscanf(IntConc, "%u", &ConcatNumber) != 1) { perror("SSCANF"); free(IntConc); return -1; } /* Return the number. */ free(IntConc); return ConcatNumber; } } } /* Main Code. */ int main(int argc, char *argv[]) { printf("Result=%u\n", IntConcat(123,456)); printf("Hit enter to continue...\n"); getchar(); return 0; } Μην το κάνουμε θέμα... Εκτυπωμένα αποτελέσματα: Result=123456 Hit enter to continue...
we_will_rise Δημοσ. 4 Ιουλίου 2009 Δημοσ. 4 Ιουλίου 2009 "ψάχνω να βρω στην C έναν τρόπο να ενώσω δυο μεταβλητές τύπου int σε μια τρίτη τύπου int παλι." Εσύ έδωσες έναν τρόπο να ενώσεις δυο strings ως string... Ωπ, σόρρυ δεν το πρόσεξα !
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.