defacer Δημοσ. 28 Νοεμβρίου 2013 Δημοσ. 28 Νοεμβρίου 2013 Ας πούμε ότι το ouput στο stdout το καταλαβαίνω...αλλά το DidiastatosPinakasTyxaionArithmon πραγματικά απαράδεκτο... Τα ονόματα των types και members είναι ξερατά στο σύνολό τους. Η σωστή ονοματολογία είναι πάρα μα πάρα πολύ σημαντική γιατί είναι άμεσα συνδεδεμένη με τη σωστά σχεδιασμένη αρχιτεκτονική μιας εφαρμογής. Βεβαίως στο επίπεδο αυτών των ασκήσεων δε διδάσκεται αρχιτεκτονική, αλλά όταν ο καθηγητής που έχει την ευχέρεια να επιλέξει οποιοδήποτε όνομα επιλέγει κάτι τέτοια τότε είναι άμεσα κατανοητό πως πέρα από τα "μηχανικά" μέρη του προγραμματισμού δεν πρόκειται να περάσει τίποτα άλλο στους φοιτητές του. Θλίβομαι πάντα όταν βλέπω τέτοιες "δημοσιοϋπαλληλικές" νοοτροπίες σε δασκάλους. Και μ' όποιον δάσκαλο καθήσεις... 3
Rorsach Δημοσ. 28 Νοεμβρίου 2013 Δημοσ. 28 Νοεμβρίου 2013 Α και κάτι τελευταίο. Το workaround που πήγες να κάνεις για να αποφύγεις τα malloc είναι έξυπνη σκέψη αλλά δε δουλεύει. Αργά ή γρήγορα θα πρέπει να τα μάθεις, αν και δε θα σε αποθάρρυνα από το να μπλέψεις με λίγη modulo αριθμητική για να το κάνεις να δουλέψει. Όσο για τα ονόματα και τα comments, δίκιο έχετε ρε παιδιά, πρέπει να είναι στα αγγλικά, αλλά μην τον παίρνετε από τα μούτρα newbie είναι. Πρέπει να δειτε τον κώδικα που έγραφα εγώ στην αρχή (χώρις στοίχιση, σχόλια και ονόματα μεταβλητών a,b,c).
billydot Δημοσ. 28 Νοεμβρίου 2013 Μέλος Δημοσ. 28 Νοεμβρίου 2013 το εφτιαξα το προγραμμα μεχρι και την δευτερη συναρτηση την εκανα ,εκανα τελικα μονοδιαστατο τον πινακα τον τα3ινομησα και ενταξει πιστευω τωρα το προβλημα μου ειναι με την 3 συναρτηση.ζηταω το λ απ τον χρηστη το δινει και μετα στην συναρτηση μπαινει ως παραμετρο.λοιπον ξανακανω μονοδιαστατο τον πινακα τον πολλαπλασιαζω με λ και μετα τον ξανακανω δισδιαστατο και τον επιστρεφω.ομως οταν παει να τον εμφανισει μου εμφανιζει αλλα νταλων .γιατι συμβαινει αυτο? καμια καλυτερη προταση κανεις για το πως να το κανω ? ευχαριστω για ολα τ μηνυματα.
migf1 Δημοσ. 28 Νοεμβρίου 2013 Δημοσ. 28 Νοεμβρίου 2013 το εφτιαξα το προγραμμα μεχρι και την δευτερη συναρτηση την εκανα ,εκανα τελικα μονοδιαστατο τον πινακα τον τα3ινομησα και ενταξει πιστευω τωρα το προβλημα μου ειναι με την 3 συναρτηση.ζηταω το λ απ τον χρηστη το δινει και μετα στην συναρτηση μπαινει ως παραμετρο.λοιπον ξανακανω μονοδιαστατο τον πινακα τον πολλαπλασιαζω με λ και μετα τον ξανακανω δισδιαστατο και τον επιστρεφω.ομως οταν παει να τον εμφανισει μου εμφανιζει αλλα νταλων .γιατι συμβαινει αυτο? καμια καλυτερη προταση κανεις για το πως να το κανω ? ευχαριστω για ολα τ μηνυματα. Η άσκηση έχει αρκετά tricky parts, όπως όλοι οι κώδικες που κάνουν εκτεταμένη διαχείριση δυναμικής μνήμης.Ιδιαίτερα στα σημεία που πρέπει να κάνεις αποδέσμευση όσης μνήμης έχεις δεσμεύσει χειροκίνητα. Πάντως για το συγκεκριμένο που ρωτάς, δηλαδή τον πολλαπλασιασμό όλων των στοιχείων με το λ, δεν ξέρω γιατί μετατρέπεις σε μονοδιάστατο τον πίνακά σου. Τι πρόβλημα υπάρχει στο να πολλαπλασιάζεις απευθείας κάθε στοιχείο του 2D πίνακα με λ; Όπως και να 'χει, χωρίς να δούμε κώδικα είναι αδύνατον να απαντήσουμε στην ερώτησή σου. Παρεμπιπτόντως, προσωπικά τον πίνακα Α θα τον όριζα εξαρχής ως double ** αντί για int ** που τον ορίζεις στον κώδικα που έχεις δώσει στο 1ο ποστ.
migf1 Δημοσ. 29 Νοεμβρίου 2013 Δημοσ. 29 Νοεμβρίου 2013 Βρήκα λίγο χρόνο σήμερα, οπότε σου έγραψα 2 γενικής χρήσης συναρτήσεις που κατά την άποψή μου φωτίζουν κάποια από τα tricky parts που ανέφερα χτες το βράδυ. Είναι μάλλον αχρείαστα λεπτομερείς για τα πλαίσια της εργασίας σου (δεν γνωρίζω τι ακριβώς έχετε μάθει και τι όχι) αλλά επειδή είναι κάτι που πολλοί αρχάριοι το κάνουν λάθος, θεώρησα καλό να ποστάρω τον κώδικα για να υπάρχει γενικώς. Σημείωσε πως ενδέχεται να περιέχει bugs, διότι τον έγραψα ημί-βιαστικά χωρίς εξαντλητικές δοκιμές. Νομίζω πως είναι οκ, αλλά δοκίμασέ τον κι εσύ, αν φυσικά θεωρείς πως θα σου χρησιμεύσει (έβαλα και πολλά σχόλια). Κώδικας: /* -------------------------------------------------- * Free the memory previously reserved for a 2d dynamic array of doubles. * * Return NULL, so as an extra precaution, the caller can optionally assign * the NULL return value of the function to the freed pointer. For example, * pp = double_free( pp, count_of_total_rows ); * * PARAMETERS: * double **double2d: The 2d array to be freed. * size_t nrows : The total count of rows to be freed. * The lower bound is checked to be at least 1. The * upper bound is the sole responsibility of the caller. * TO DO: * A way to distinguish the return value of NULL between a sanity check failure * and a normal completion of the function (possibly using errno.h). * -------------------------------------------------- */ double **double2d_free( double **double2d, size_t nrows ) { size_t i; // sanity checks if ( !double2d || nrows < 1 ) { return NULL; } // free all rows of the 2d array for (i=0; i < nrows; i++ ) { free( double2d[i] ); } // free the initial pointer free( double2d ); return NULL; } /* -------------------------------------------------- * Create dynamically an 1d array of doubles from a 2d dynamic array of doubles. * * PARAMETERS * double **double2d: The 2d dynamic array to be copied. * size_t nrows : Total count of rows in the 2d array. The lower bound is * checked to be at least 1, but the upper bound is the sole * responsibility of the caller. * size_t ncols : Total count of columns in the 2d array. The lower bound * is checked to be at least 1, but the upper bound is the * sole responsibility of the caller. * RETURN * The created 1d array of doubles, or NULL on error. * Errors include the passing of the 2d array as NULL, the passing of nrows * and/or ncols as 0 and the case where malloc() fails. * On success, it is the caller's repsonsibility to assign the return value * to a appropriate pointer and also to free that pointer when it's done with it. * * ALGORITHM * First the 1d array is created dynamically, then its contents are populated * according to the contents of the 2d array (they are copied sequentially). * Finally the created 1d array is returned to the caller. * * TO DO: * A way to distinguish a return value of NULL among the several types of errors * (possibly using errno.h). * -------------------------------------------------- */ double *double2d_to_1d( double *const *const double2d, size_t nrows, size_t ncols ) { double *ret = NULL; // the dynamic 1d array to be returned size_t i,j; // sanity checks if ( !double2d || nrows < 1 || ncols < 1 ) return NULL; // create the 1d array dynamically ret = malloc( nrows * ncols * sizeof(double) ); // populate ret with the elements of double2d if ( ret ) { for (i=0; i < nrows; i++) for (j=0; j < ncols; j++) ret[i*ncols+j] = double2d[i][j]; } // return the created 1d array (it will be NULL if malloc() failed ) return ret; }
Rorsach Δημοσ. 29 Νοεμβρίου 2013 Δημοσ. 29 Νοεμβρίου 2013 migf1 μην του δίνουμε και μασημένη τροφή. Ας τον να το λύσει μόνος του. Γενικά εγώ κατάλαβα ότι χρησιμοποιεί το 1d array γιατί δεν ξέρει να δεσμεύει χώρο για 2d και να τα περνάει σε συναρτήσεις (το οποίο λογικά είναι και ο σκοπός της άσκησης.)
billydot Δημοσ. 29 Νοεμβρίου 2013 Μέλος Δημοσ. 29 Νοεμβρίου 2013 οντως δεν ξερω .6 μαθηματα C εχουμε κανει και ουτε ειπα οτι ξερω ουτε κατι τετοιο.αν ηξερα δεν θα ζητουσα βοηθεια,το πρωτο μου προγραμμα ειναι και το παλευω ,δοκιμαζω και ψαχνομαι και ουτε και πηρα κανενα ολοκληρο κομματι απ εσας απλα ιδεες και προτασεις ζηταω.επισης δεν μπορω να ανεβασω το προγραμμα μου και της συναρτησης μου γιατι μπορει να τις δει καποιος και να τις αντιγραψει και να εχουμε τ ιδιο προγραμμα ακριβως.
παπι Δημοσ. 29 Νοεμβρίου 2013 Δημοσ. 29 Νοεμβρίου 2013 Βρήκα λίγο χρόνο σήμερα, οπότε σου έγραψα 2 γενικής χρήσης συναρτήσεις που κατά την άποψή μου φωτίζουν κάποια από τα tricky parts που ανέφερα χτες το βράδυ. Είναι μάλλον αχρείαστα λεπτομερείς για τα πλαίσια της εργασίας σου (δεν γνωρίζω τι ακριβώς έχετε μάθει και τι όχι) αλλά επειδή είναι κάτι που πολλοί αρχάριοι το κάνουν λάθος, θεώρησα καλό να ποστάρω τον κώδικα για να υπάρχει γενικώς. Σημείωσε πως ενδέχεται να περιέχει bugs, διότι τον έγραψα ημί-βιαστικά χωρίς εξαντλητικές δοκιμές. Νομίζω πως είναι οκ, αλλά δοκίμασέ τον κι εσύ, αν φυσικά θεωρείς πως θα σου χρησιμεύσει (έβαλα και πολλά σχόλια). Κώδικας: /* -------------------------------------------------- * Free the memory previously reserved for a 2d dynamic array of doubles. * * Return NULL, so as an extra precaution, the caller can optionally assign * the NULL return value of the function to the freed pointer. For example, * pp = double_free( pp, count_of_total_rows ); * * PARAMETERS: * double **double2d: The 2d array to be freed. * size_t nrows : The total count of rows to be freed. * The lower bound is checked to be at least 1. The * upper bound is the sole responsibility of the caller. * TO DO: * A way to distinguish the return value of NULL between a sanity check failure * and a normal completion of the function (possibly using errno.h). * -------------------------------------------------- */ double **double2d_free( double **double2d, size_t nrows ) { size_t i; // sanity checks if ( !double2d || nrows < 1 ) { return NULL; } // free all rows of the 2d array for (i=0; i < nrows; i++ ) { free( double2d[i] ); } // free the initial pointer free( double2d ); return NULL; } /* -------------------------------------------------- * Create dynamically an 1d array of doubles from a 2d dynamic array of doubles. * * PARAMETERS * double **double2d: The 2d dynamic array to be copied. * size_t nrows : Total count of rows in the 2d array. The lower bound is * checked to be at least 1, but the upper bound is the sole * responsibility of the caller. * size_t ncols : Total count of columns in the 2d array. The lower bound * is checked to be at least 1, but the upper bound is the * sole responsibility of the caller. * RETURN * The created 1d array of doubles, or NULL on error. * Errors include the passing of the 2d array as NULL, the passing of nrows * and/or ncols as 0 and the case where malloc() fails. * On success, it is the caller's repsonsibility to assign the return value * to a appropriate pointer and also to free that pointer when it's done with it. * * ALGORITHM * First the 1d array is created dynamically, then its contents are populated * according to the contents of the 2d array (they are copied sequentially). * Finally the created 1d array is returned to the caller. * * TO DO: * A way to distinguish a return value of NULL among the several types of errors * (possibly using errno.h). * -------------------------------------------------- */ double *double2d_to_1d( double *const *const double2d, size_t nrows, size_t ncols ) { double *ret = NULL; // the dynamic 1d array to be returned size_t i,j; // sanity checks if ( !double2d || nrows < 1 || ncols < 1 ) return NULL; // create the 1d array dynamically ret = malloc( nrows * ncols * sizeof(double) ); // populate ret with the elements of double2d if ( ret ) { for (i=0; i < nrows; i++) for (j=0; j < ncols; j++) ret[i*ncols+j] = double2d[i][j]; } // return the created 1d array (it will be NULL if malloc() failed ) return ret; } Διαφωνω με αυτη την προσεγγιση (malloc, malloc, free free free... ). Το πιο *πρακτικο εινσι να φτιαξεις εναν "allocator" που θα σου κανει manipulate τα data πχ *πρακτικο με την ενοια οτι δεν θα χρειαστει να γραψεις αλλες συναρτησεις για common δουλειες, πχ μπορεις απευθειας να χρησιμοποιησεις memcpy, sort κλπ κλπ
migf1 Δημοσ. 30 Νοεμβρίου 2013 Δημοσ. 30 Νοεμβρίου 2013 @Rorsach: Τον κώδικα τον έδωσα με την ελπίδα πως θα φανεί χρήσιμος σε αρχάριους ως kick-start για να συμπληρωθεί το υπόλοιπο "παζλ" της εργασίας. Έχει κι άλλα tricky parts η εργασία, π.χ. συνειδητά δεν έδωσα κώδικα για το allocation του 2d πίνακα, ή κώδικα ταξινόμησης (προσωπικά θα χρησιμοποιούσα απευθείας την qsort()) ή κώδικα που εντοπίζει τα second smallest και second largest elements. @παπι: Δεν είμαι σίγουρος ότι κατάλαβα τι εννοείς (υποθέτω εννοείς κάτι σαν κι αυτό: http://stackoverflow.com/a/12273760). Ο κώδικας που έδωσα αποτελεί την τυπική προσέγγιση στο συγκεκριμένο πρόβλημα της εργασίας (αν ήμουν ελεύθερος να επιλέξω υλοποίηση, θα έκανα τα πάντα με μονοδιάστατο πίνακα... το θεωρώ το πιο πρακτικό από όλα). 2
Rorsach Δημοσ. 30 Νοεμβρίου 2013 Δημοσ. 30 Νοεμβρίου 2013 @migf1: Ναι συμφωνώ ότι του έδωσες μόνο λίγα utilities για να ξεκινήσει αλλά ξέρεις πώς είναι τα forums. Μόλις γραφτεί ο πρώτος κώδικας.... Πάντως δεν το εννοούσα προσωπικά για σένα. Συγγνώμη αν φάνηκε διαφορετικά @billydot:Πάντως εγώ θα έλεγα να ψάξεις πώς κάνουμε malloc ένα 2d array για να το δεις τουλάχιστον, αν όχι για να το χρησιμοποιήσεις. Και πιάσε χαρτί και μολύβι να σχεδιάσεις κουτάκια για να καταλάβεις πώς δομούνται οι πίνακες στη μνήμη με βάση τη συνάρτηση του migf1. Άντε να σε γλιτώσω και από το google search: http://www.cs.dartmouth.edu/~chris/cs23/summit-intermediate/sx9b.html Διάβασε αυτό, πάρε χαρτί και μολύβι όπως σου είπα και έλα με απορίες.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα