Star_Light Δημοσ. 27 Ιανουαρίου 2013 Δημοσ. 27 Ιανουαρίου 2013 Για πολυπλοκοτητες εχω βρει αυτο εδω : http://www.contentedcoder.com/2012/04/big-o-notation-explained-survival-kit.html migf1 ποια η σκοπιμοτητα να χρησιμοποιεις μια συναρτηση που επιστρέφει εναν δεικτη ενω μπορουσαμε να κανουμε την ιδια δουλεια με τυπο void στο προ-προηγουμενο ποστ ?
bird Δημοσ. 27 Ιανουαρίου 2013 Δημοσ. 27 Ιανουαρίου 2013 Για πολυπλοκοτητες εχω βρει αυτο εδω : http://www.contentedcoder.com/2012/04/big-o-notation-explained-survival-kit.html migf1 ποια η σκοπιμοτητα να χρησιμοποιεις μια συναρτηση που επιστρέφει εναν δεικτη ενω μπορουσαμε να κανουμε την ιδια δουλεια με τυπο void στο προ-προηγουμενο ποστ ? Δεν είμαι σίγουρος σε ποιο post αναφέρεσαι, όμως όταν χρησιμοποιείς μια συνάρτηση που παίρνει κάποιον δείκτη και αλλάζει τα περιεχόμενά του, καλό είναι να επιστρέφει το αποτέλεσμα έτσι ώστε να χρησιμοποιηθεί κατευθείαν κάπου αλλού. Είτε σε μία if, είτε σαν όρισμα σε κάποια άλλη συνάρτηση κτλ... π.χ. char* func(char *input, ...); void print_string(char* input); ... char *foo; if ( func(foo,...) == NUL ) { ... ή printf("%s\n", func(foo,...); ή print_string(func(foo,...)); func(func(foo,...),...); 1
migf1 Δημοσ. 27 Ιανουαρίου 2013 Δημοσ. 27 Ιανουαρίου 2013 Αυτό που είπε ο bird! Πρέπει κάποια στιγμή να αρχίσεις να σκέφτεσαι σε πιο γενικό context, ώστε οι συναρτήσεις που φτιάχνεις να είναι επαναχρησιμοποιήσιμες σε διάφορα projects.
Star_Light Δημοσ. 27 Ιανουαρίου 2013 Δημοσ. 27 Ιανουαρίου 2013 μιγφ1 δωσε ενα παραδειγμα επαναχρησιμοποιησιμης συνάρτησης (οχι μεγαλη σε εκταση) αν μπορεις... α δεν απαντησες σε αυτο με τον δισδιαστατο αν έχω εναν και αποθηκευω μεσα strings μήκους LENWORD γιατι θα πρέπει να βάλω +1 και στο MAXWORDS ? Πχ > ....#define MAXWORDS 30 + 1#define LENWORDS 20 + 1.... char arr2d[MAXWORDS][LENWORDS] = { {'\0'}};
Re4cTiV3 Δημοσ. 27 Ιανουαρίου 2013 Δημοσ. 27 Ιανουαρίου 2013 Έχω μια ερώτηση που πιο πολύ είναι γενική. αν έχω έναν πίνακα [256][16] θα σαρώνατε ανα γραμμή για κάθε στήλη; ή το αντίστροφο αν θέλατε καλύτερη απόδοση(μειώνοντας τα miss rate στην cache). #include <stdio.h> int main(void ) { int a[256][16]; int i = 0; int j = 0; for(i = 0; i < 25; i++) { for(j = 0; j < 3; j++) { //do something...e.g. printf("%p\n", &a[i][j]); } printf("---\n"); } return 0; } Ανα γραμμή ε; ή εξαρτάται απο την γλώσσα και πως δεσμεύει την μνήμη;
pmav99 Δημοσ. 27 Ιανουαρίου 2013 Δημοσ. 27 Ιανουαρίου 2013 Εξαρτάται από τη γλώσσα. Στη C ανά γραμμή, στη Fortran ανά στήλη.
ChRis6 Δημοσ. 28 Ιανουαρίου 2013 Δημοσ. 28 Ιανουαρίου 2013 Έχω μια ερώτηση που πιο πολύ είναι γενική. αν έχω έναν πίνακα [256][16] θα σαρώνατε ανα γραμμή για κάθε στήλη; ή το αντίστροφο αν θέλατε καλύτερη απόδοση(μειώνοντας τα miss rate στην cache). #include <stdio.h> int main(void ) { int a[256][16]; int i = 0; int j = 0; for(i = 0; i < 25; i++) { for(j = 0; j < 3; j++) { //do something...e.g. printf("%p\n", &a[i][j]); } printf("---\n"); } return 0; } Ανα γραμμή ε; ή εξαρτάται απο την γλώσσα και πως δεσμεύει την μνήμη; Ναι. Αν τα δεδομενα σου δε χωρανε σε ενα φυσικο πλαισιο μνήμης και γραφεις κωδικα C, μπορεί να είσαι τόσο άτυχος που σε κάθε προσπέλαση μνήμης να έχεις page fault.
bird Δημοσ. 29 Ιανουαρίου 2013 Δημοσ. 29 Ιανουαρίου 2013 Ας κάνω κι εγώ μια μάλλον χαζή ερώτηση. typedef struct { /* .... */ } My_struct; My_struct compute1(int x, int y, ...) { My_struct var; // computations... changing var... return(var); } My_struct* compute2(My_struct *var, int x, int y, ...) { // computations... changing var... return(var); } Εδώ η compute2 είναι "οικονομικότερη" σε σχέση με την cοmpute1 έτσι δεν είναι; (από πλευράς ταχύτητας και μνήμης) ή δε θα έχουν ιδιαίτερη διαφορά;
παπι Δημοσ. 29 Ιανουαρίου 2013 Δημοσ. 29 Ιανουαρίου 2013 Ειναι ετσι κι ετσι. μπορει o compiler να σου μεταφρασει το compute1 σα το compute2, δηλαδη να αγνοησει το My_struct var και να παρει την διευθυνση του απο τον caller. Βεβαια αυτο για c++, για c δεν ειμαι σιγουρος. Τεσπα, το πρωτο ειναι λαθος οπως και να το παρεις. Διοτι φτιαχνεις δυο δομες MyStruct, μαλιστα κανεις και copypaste.
ZAKKWYLDE Δημοσ. 29 Ιανουαρίου 2013 Δημοσ. 29 Ιανουαρίου 2013 Σαφώς και το 2ο είναι πιο οικονομικό(εκτός αν το struct σου είναι μικρότερο απο pointer). Υποτίθεται ότι στη πρώτη περίπτωση έχεις φτιάξει ένα struct στη main το οποίο περνάς στο function - άρα φτιάχνεις αντίγραφο, οπότε σπαταλάς περισσότερη μνήμη. Τώρα βέβαια αν ο compiler κάνει μόνος του optimize άλλη ιστορία.
bird Δημοσ. 29 Ιανουαρίου 2013 Δημοσ. 29 Ιανουαρίου 2013 Για αυτό ακριβώς είπα ότι είναι χαζή η ερώτηση από τη στιγμή που η απάντηση είναι προφανής. Ήθελα να δω μόνο αν υπάρχει κάποια άλλη περίπτωση (όπως πχ για το optimize που μπορεί να κάνει ο compiler όπως είπατε ...) Thanx πάντως!
migf1 Δημοσ. 30 Ιανουαρίου 2013 Δημοσ. 30 Ιανουαρίου 2013 Για αυτό ακριβώς είπα ότι είναι χαζή η ερώτηση από τη στιγμή που η απάντηση είναι προφανής. Ήθελα να δω μόνο αν υπάρχει κάποια άλλη περίπτωση (όπως πχ για το optimize που μπορεί να κάνει ο compiler όπως είπατε ...) Thanx πάντως! Δεν είμαι σίγουρος αν οι compilers εσωτερικά επιστρέφουν by-value ή by-reference τα struct ως return values συναρτήσεων (και βαριέμαι να το ψάξω κιόλας τώρα). Αν εσωτερικά τα κάνουν handle by-reference (με ή χωρίς optimization flags) τότε δεν υπάρχουν σημαντικές διαφορές μεταξύ των δυο προσεγγίσεων. Προσωπικά όταν θέλω να είμαι σίγουρος & portable χρησιμοποιώ την 2η μέθοδο. ... α δεν απαντησες σε αυτο με τον δισδιαστατο αν έχω εναν και αποθηκευω μεσα strings μήκους LENWORD γιατι θα πρέπει να βάλω +1 και στο MAXWORDS ? Πχ .... #define MAXWORDS 30 + 1 #define LENWORDS 20 + 1 .... char arr2d[MAXWORDS][LENWORDS] = { {'\0'}}; Για να είμαι ειλικρινής βαριέμαι να κάνω trace τον κώδικα αυτόν, αφενός γιατί δεν τον βρίσκω χρήσιμο (λόγω του 2D) κι αφετέρου επειδή θεωρώ πως αυτό που ρωτάς είναι πολύ εύκολο να το βρεις μόνος σου τρέχοντάς το με διάφορα test-cases.
Star_Light Δημοσ. 2 Φεβρουαρίου 2013 Δημοσ. 2 Φεβρουαρίου 2013 Aν έχω >char s[100]={'\0'}; Τοτε το > putchar( (int) s[0] ); ειναι εντάξει??????? στεκει ?
Star_Light Δημοσ. 3 Φεβρουαρίου 2013 Δημοσ. 3 Φεβρουαρίου 2013 Δεν υπαρχει λογος για casting Μα δεν ειναι το ιδιο με την getchar που ειχαμε συζητησει παλια??? οτι δηλαδη ειναι πιο σωστο να λες int c getchar( c ) παρα char c .
Προτεινόμενες αναρτήσεις