giannisxp Δημοσ. 25 Ιανουαρίου 2017 Δημοσ. 25 Ιανουαρίου 2017 #include <stdio.h>int getIndex(int *a, int b , int *c);int increment(int val, int inc);void final_print();int i=5;int coeff[6] = {1,4,2,6,3,5};void main(void){ int i = 7 , x_1 = 1 , x_2 = 2 , x_3 = 3 , sum = 0; printf("x_1 = %d , x_2 = %d , x_3 = %d \n",x_1,x_2,x_3); x_2 = increment (x_1, x_3); do{ int y1,y2; y1 = getIndex(&i , x_1 , &x_3); y2 = getIndex(&i , x_3 , &x_1); sum = coeff[y1] * x_1 + coeff[y2] * x_2; printf("sum = %d , x_1 = %d , x_2 = %d , x_3 = %d \n",sum,x_1,x_2,x_3); }while(sum<500); printf("i = %d \n",i); final_print();}int getIndex(int *a, int b , int *c){ *a = increment(b,3); *c = increment(*c ,; i+=4; return *c % 6;}void final_print(){ printf("i = %d\n",i);}int increment (int val , int inc){val=val+inc; printf("val = %d\n",val);return val;} Κανω την προκαταρτικη στο χαρτι και βγαζω διαφορετικα αποτελεσματα..Ξερω που κανω το λαθος το οποιο ειναι η εντολη i+=4....Δεν εχω καταλαβει τι ακριβως κανει ουτε μπορεσα να καταλαβω απο το ψαξιμο στο google...καποια βοηθεια??
Moderators Kercyn Δημοσ. 25 Ιανουαρίου 2017 Moderators Δημοσ. 25 Ιανουαρίου 2017 Τι προσπαθείς να κάνεις εδώ ακριβώς; Γιατί μου φαίνεται ότι έχεις μπλεχτεί χωρίς λόγο. Τώρα για το ότι δεν ξέρεις τι κάνει το += (και δε μπορείς να το βρεις), κοίταξες σε κανένα εισαγωγικό κεφάλαιο/tutorial για C και δεν το βρήκες;
giannisxp Δημοσ. 25 Ιανουαρίου 2017 Μέλος Δημοσ. 25 Ιανουαρίου 2017 Τι προσπαθείς να κάνεις εδώ ακριβώς; Γιατί μου φαίνεται ότι έχεις μπλεχτεί χωρίς λόγο. Τώρα για το ότι δεν ξέρεις τι κάνει το += (και δε μπορείς να το βρεις), κοίταξες σε κανένα εισαγωγικό κεφάλαιο/tutorial για C και δεν το βρήκες; Ειναι ασκηση η οποια μου ζητα να προβαλω τη τυπονετε στην οθονη(προκαταρτικη εκτελεση)
Moderators Kercyn Δημοσ. 25 Ιανουαρίου 2017 Moderators Δημοσ. 25 Ιανουαρίου 2017 Μπορείς σε παρακαλώ να βάλεις την εκφώνηση της άσκησης για να καταλάβω; Τι εννοείς τι τυπώνεται στην οθόνη, προφανώς ό,τι του πεις να τυπωθεί...
giannisxp Δημοσ. 25 Ιανουαρίου 2017 Μέλος Δημοσ. 25 Ιανουαρίου 2017 Μπορείς σε παρακαλώ να βάλεις την εκφώνηση της άσκησης για να καταλάβω; Τι εννοείς τι τυπώνεται στην οθόνη, προφανώς ό,τι του πεις να τυπωθεί... Το θεμα 1
Moderators Kercyn Δημοσ. 25 Ιανουαρίου 2017 Moderators Δημοσ. 25 Ιανουαρίου 2017 Αααα δεν είναι δικός σου κώδικας, νόμιζα ότι προσπαθούσες να κάνεις κάτι και δε δούλευε. Τώρα για το ότι βγάζεις διαφορετικά αποτελέσματα στο χαρτί και διαφορετικά στην εκτέλεση, τι να σου πω; Κάντο πιο αργά και προσεκτικά. Google C operators για να δεις τι κάνει το +=. 1
NickSym Δημοσ. 25 Ιανουαρίου 2017 Δημοσ. 25 Ιανουαρίου 2017 Θα μας τρελάνουν εδώ μέσα Εκτός του ότι δε ξέρουν ούτε να Googlάρουν δε ξέρουν να κάνουν ένα test function για να διαπιστώσουν τι κάνει κάτι.
giannisxp Δημοσ. 25 Ιανουαρίου 2017 Μέλος Δημοσ. 25 Ιανουαρίου 2017 το i+=a εινα το ιδιο με το i=i+a αυτο το googlara και το καταλαβα...απλα νομιζα οτι θα εβρισκα βοηθεια εδω και οχι κραξιμο...
kaliakman Δημοσ. 25 Ιανουαρίου 2017 Δημοσ. 25 Ιανουαρίου 2017 το i+=a εινα το ιδιο με το i=i+a αυτο το googlara και το καταλαβα...απλα νομιζα οτι θα εβρισκα βοηθεια εδω και οχι κραξιμο... Ωραία. Που έχεις κολλήσει; Γιατί λες οτι το λάθος σου είναι στον τελεστή += και βρήκες τελικά τι κάνεις.
giannisxp Δημοσ. 25 Ιανουαρίου 2017 Μέλος Δημοσ. 25 Ιανουαρίου 2017 Ωραία. Που έχεις κολλήσει; Γιατί λες οτι το λάθος σου είναι στον τελεστή += και βρήκες τελικά τι κάνεις. Δεν εχω κολλησει απλα οταν τρεχω το προγραμμα βγαζω διαφορετικα αποτελεσματα απο το οταν το λυνω στο χαρτι...επειδη πληκτρολογησα το προγραμμα και το ετρεξα για να δω αποτελεσματα
kaliakman Δημοσ. 25 Ιανουαρίου 2017 Δημοσ. 25 Ιανουαρίου 2017 Δεν εχω κολλησει απλα οταν τρεχω το προγραμμα βγαζω διαφορετικα αποτελεσματα απο το οταν το λυνω στο χαρτι...επειδη πληκτρολογησα το προγραμμα και το ετρεξα για να δω αποτελεσματα #include <stdio.h> int getIndex(int b , int *c); int increment(int val, int inc); void final_print(); int i=5; int coeff[6] = {1,4,2,6,3,5}; void main(void){ int i = 7 , x_1 = 1 , x_2 = 2 , x_3 = 3 , sum = 0; printf("x_1 = %d , x_2 = %d , x_3 = %d \n",x_1,x_2,x_3); x_2 = increment (x_1, x_3); do{ int y1,y2; y1 = getIndex(x_1 , &x_3); i += x_1 + 7; y2 = getIndex(x_3 , &x_1); i += x_3 + 7; sum = coeff[y1] * x_1 + coeff[y2] * x_2; printf("sum = %d , x_1 = %d , x_2 = %d , x_3 = %d \n",sum,x_1,x_2,x_3); }while(sum<500); printf("i = %d \n",i); } int getIndex(int b , int *c){ *c = increment(*c ,; return *c % 6; } int increment (int val , int inc){ val=val+inc; printf("val = %d\n",val);return val; } Το απλοποίησα λίγο. Δες αν τώρα σε βοηθάει.
imitheos Δημοσ. 25 Ιανουαρίου 2017 Δημοσ. 25 Ιανουαρίου 2017 (επεξεργασμένο) Τι εκτυπώνεται στην οθόνη (stdout) κατά την εκτέλεσή του; Εξηγήστε συνοπτικά. Στην οθόνη θα εκτυπωθεί "Tria poulakia kathontai kai plekoune poulover". Αν το πρόγραμμα μεταγλωττιστεί με την παράμετρο -O2, τότε θα παραχθεί βελτιωμένο εκτελέσιμο το οποίο για μεγαλύτερη ταχύτητα θα εκτυπώσει στην οθόνη τον αριθμό 45 που είναι ο αριθμός των γραμμάτων της παραπάνω πρότασης. J.2 Undefined behavior The behavior is undefined in the following circumstances: — A program in a hosted environment does not define a function named main using one of the specified forms (5.1.2.2.1). Συνοπτικά μπορούμε να πούμε ότι ο παραπάνως κώδικας δηλώνει την συνάρτηση main με μη επιτρεπτό τρόπο οπότε οδηγεί σε απροσδιόριστη συμπεριφορά με αποτέλεσμα την παραπάνω εκτύπωση στην οθόνη. Αυτό να γράψεις ως απάντηση στον καθηγητή Edit: Πριν κάμποσα χρόνια ήταν της μόδας να μπαίνουν, ως άσκηση σε φοιτητές, τέτοιοι μακαρονοκώδικες με πολύπλοκες εκφράσεις χωρίς καμμία παρένθεση και να σου λέει "τι θα εμφανίσει ?". Υποτίθεται ότι ο σκοπός της άσκησης ήταν για να δουν αν ξέρει ο φοιτητής τον πίνακα προτεραιοτήτων, ο οποίος όμως είναι σχετικά μεγάλος και δεν μπορεί κανείς να τον θυμάται. Άσε που οι μισοί από αυτούς τους κώδικες είχαν UB. Δεν περίμενα όμως να μπαίνουν ακόμη τέτοια εκτρώματα. Επεξ/σία 25 Ιανουαρίου 2017 από imitheos 4
defacer Δημοσ. 26 Ιανουαρίου 2017 Δημοσ. 26 Ιανουαρίου 2017 Δεν περίμενα όμως να μπαίνουν ακόμη τέτοια εκτρώματα. Πέρα από το UB που χαρά στο κουράγιο σου (δεν έκατσα να προσέξω παραπάνω από 2-3 sec που χρειάζονται για να καταλάβεις για τι είδους εργασία μιλάμε), αυτή ακριβώς ήταν και η δική μου αντίδραση. Αν είναι δυνατόν το 2016 2017 να βάζουν τέτοιες άχρηστες μαλακίες για εργασία. Το ότι ο καθηγητής δε νιώθει από UB δε θα το σχολιάσω παραπάνω γιατί δυστυχώς είναι δεδομένο... 1
jimex Δημοσ. 26 Ιανουαρίου 2017 Δημοσ. 26 Ιανουαρίου 2017 Αν είναι δυνατόν το 2016 2017 να βάζουν τέτοιες άχρηστες μαλακίες για εργασία. Μα οι ίδιοι που δίδασκαν και το 2000 συνεχίζουν να διδάσκουν ακόμη. Ούτε και τότε είχαν επαφή με το επιπλέον τώρα ότι είναι και λίγο πριν τη σύνταξη. Κατά τ' άλλα πέρα από το UB, να σχολιάσει κανείς τι; Το στυλ του κώδικα που δε βλέπεται και περιέχει τα χειρότερα παραδείγματα όλα σε ένα; Τη χρησιμότητα του να τρέχει το loop 6 φορές πέρα από το ότι πιθανότατα στο χαρτί κάπου θα το χάσεις και θα κάνεις λάθος; Δυστυχώς, τα πανεπιστήμια είναι γεμάτα άτομα που έχουν δεκαετίες να γράψουν πραγματικό κώδικα και διδάσκουν μαθήματα προγραμματισμού με τον ίδιο τρόπο που θα δίδασκαν και μαθηματικά...
imitheos Δημοσ. 26 Ιανουαρίου 2017 Δημοσ. 26 Ιανουαρίου 2017 Αν είναι δυνατόν το 2016 2017 να βάζουν τέτοιες άχρηστες μαλακίες για εργασία. Μα οι ίδιοι που δίδασκαν και το 2000 συνεχίζουν να διδάσκουν ακόμη. Ούτε και τότε είχαν επαφή με το επιπλέον τώρα ότι είναι και λίγο πριν τη σύνταξη. να σχολιάσει κανείς τι; Το στυλ του κώδικα που δε βλέπεται και περιέχει τα χειρότερα παραδείγματα όλα σε ένα; Τη χρησιμότητα του να τρέχει το loop 6 φορές πέρα από το ότι πιθανότατα στο χαρτί κάπου θα το χάσεις και θα κάνεις λάθος; Ως ένα βαθμό τους δικαιολογώ γιατί μιλάμε για C. Ειδικά πριν να πας σε πίνακες, δομές, δείκτες, τι κώδικες μπορείς να δώσεις σε C πέρα από "printf("Hello");" και "βρες το παραγοντικό" ? Από εκεί και πέρα εννοείται ότι συμφωνώ και με τους δύο σας ότι δεν έχουν επαφή (ή τουλάχιστον όρεξη). Ο δικός μου καθηγητής έδινε ένα βιβλίο το οποίο ανέφερε ότι δίδασκε την C99 ενώ στην πραγματικότητα δίδασκε "Turbo C σε DOS". Εκτός ότι δίδασκε ανακρίβειες τύπου "ο int έχει μέγεθος 16bit και υποστηρίζει μέχρι 32767", το χειρότερο ήταν ότι και οι κώδικες ήταν νοοτροπίας "Turbo C σε real mode DOS" (χρήση του * σε μεταβλητές που δεν ήταν δείκτες, ανάθεση χύμα τιμών σε δείκτες πχ int *k = 50 και μετά προσπέλαση μνήμης που δεν ανήκει στο space του προγράμματος, κτλ). Αμφιβάλλω αν τα παραδείγματα γίνονταν καν compile σε gcc (τον 2.95 όχι κάποιον τωρινό). Edit: Σε περίπτωση που δεν έγινε κατανοητό από τον OP ή άλλους που διαβάζουν το νήμα και μας προσάψουν πάλι ξερολισμούς και λοιπά, να τονίσω ότι η μομφή μου δεν ήταν προς τον OP αλλά προς τον καθηγητή του. Εννοείται πως πρακτικά κανένας compiler δεν θα παράξει κώδικα που να εμφανίζει "τρία πουλάκια" που έγραψα πριν αλλά θα κάνει κάτι παρεμφερές με τον κώδικα που του γράφουμε. Τίποτα όμως δεν εμποδίζει τον compiler (έστω και θεωρητικά) να παράξει ό,τι κώδικα θέλει. Επίσης, πολύς κόσμος λανθασμένα νομίζει ότι αν έχουμε UB στην γραμμή 89 του κώδικά μας, ο compiler είναι αναγκασμένος να παράξει σωστή assembly μέχρι εκεί και από εκεί και πέρα να κάνει ό,τι θέλει. Μία μόνο γραμμή να έχει UB, ακόμη και η τελευταία να είναι, ο compiler μπορεί να αγνοήσει ολόκληρο τον κώδικα και να εμφανίσει "Τι ωραία που είναι στις εξοχές" και θα είναι 100% compliant. Χρησιμοποίησα την υπερβολή αφενός για να κάνω γνωστή την έννοια της απροσδιόριστης συμπεριφοράς στον OP, πιο πολύ όμως γιατί με νευρίασε ο καθηγητής που έβαλε τέτοιες χαζομάρες και ήθελα να του την πω. Ζητώ συγγνώμη από τον OP αν τα μηνύματά μου δεν τον βοήθησαν καθόλου.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα