Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

#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 ,B); 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
Δημοσ.

Τι προσπαθείς να κάνεις εδώ ακριβώς; Γιατί μου φαίνεται ότι έχεις μπλεχτεί χωρίς λόγο. Τώρα για το ότι δεν ξέρεις τι κάνει το += (και δε μπορείς να το βρεις), κοίταξες σε κανένα εισαγωγικό κεφάλαιο/tutorial για C και δεν το βρήκες;

Δημοσ.

Τι προσπαθείς να κάνεις εδώ ακριβώς; Γιατί μου φαίνεται ότι έχεις μπλεχτεί χωρίς λόγο. Τώρα για το ότι δεν ξέρεις τι κάνει το += (και δε μπορείς να το βρεις), κοίταξες σε κανένα εισαγωγικό κεφάλαιο/tutorial για C και δεν το βρήκες;

Ειναι ασκηση η οποια μου ζητα να προβαλω τη τυπονετε στην οθονη(προκαταρτικη εκτελεση)

  • Moderators
Δημοσ.

Μπορείς σε παρακαλώ να βάλεις την εκφώνηση της άσκησης για να καταλάβω; Τι εννοείς τι τυπώνεται στην οθόνη, προφανώς ό,τι του πεις να τυπωθεί...

Δημοσ.

Μπορείς σε παρακαλώ να βάλεις την εκφώνηση της άσκησης για να καταλάβω; Τι εννοείς τι τυπώνεται στην οθόνη, προφανώς ό,τι του πεις να τυπωθεί...

Το θεμα 1

post-205724-0-00869500-1485360165_thumb.jpg

  • Moderators
Δημοσ.

Αααα δεν είναι δικός σου κώδικας, νόμιζα ότι προσπαθούσες να κάνεις κάτι και δε δούλευε. Τώρα για το ότι βγάζεις διαφορετικά αποτελέσματα στο χαρτί και διαφορετικά στην εκτέλεση, τι να σου πω; Κάντο πιο αργά και προσεκτικά. Google C operators για να δεις τι κάνει το +=.

  • Like 1
Δημοσ.

Θα μας τρελάνουν εδώ μέσα

Εκτός του ότι δε ξέρουν ούτε να Googlάρουν δε ξέρουν να κάνουν ένα test function για να διαπιστώσουν τι κάνει κάτι.

Δημοσ.

το i+=a εινα το ιδιο με το i=i+a αυτο το googlara και το καταλαβα...απλα νομιζα οτι θα εβρισκα βοηθεια εδω και οχι κραξιμο...

Δημοσ.

το i+=a εινα το ιδιο με το i=i+a αυτο το googlara και το καταλαβα...απλα νομιζα οτι θα εβρισκα βοηθεια εδω και οχι κραξιμο...

Ωραία. Που έχεις κολλήσει; Γιατί λες οτι το λάθος σου είναι στον τελεστή += και βρήκες τελικά τι κάνεις.

Δημοσ.

Ωραία. Που έχεις κολλήσει; Γιατί λες οτι το λάθος σου είναι στον τελεστή += και βρήκες τελικά τι κάνεις.

Δεν εχω κολλησει απλα οταν τρεχω το προγραμμα βγαζω διαφορετικα αποτελεσματα απο το οταν το λυνω στο χαρτι...επειδη πληκτρολογησα το προγραμμα και το ετρεξα για να δω αποτελεσματα

post-205724-0-60151500-1485364778_thumb.jpg

post-205724-0-22402000-1485364786_thumb.png

Δημοσ.

Δεν εχω κολλησει απλα οταν τρεχω το προγραμμα βγαζω διαφορετικα αποτελεσματα απο το οταν το λυνω στο χαρτι...επειδη πληκτρολογησα το προγραμμα και το ετρεξα για να δω αποτελεσματα

#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;
}

Το απλοποίησα λίγο. Δες αν τώρα σε βοηθάει.

Δημοσ. (επεξεργασμένο)

Τι εκτυπώνεται στην οθόνη (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.

 

Δεν περίμενα όμως να μπαίνουν ακόμη τέτοια εκτρώματα.

Επεξ/σία από imitheos
  • Like 4
Δημοσ.

Δεν περίμενα όμως να μπαίνουν ακόμη τέτοια εκτρώματα.

 

Πέρα από το UB που χαρά στο κουράγιο σου (δεν έκατσα να προσέξω παραπάνω από 2-3 sec που χρειάζονται για να καταλάβεις για τι είδους εργασία μιλάμε), αυτή ακριβώς ήταν και η δική μου αντίδραση.

 

Αν είναι δυνατόν το 2016 2017 να βάζουν τέτοιες άχρηστες μαλακίες για εργασία.  :mad:

 

Το ότι ο καθηγητής δε νιώθει από UB δε θα το σχολιάσω παραπάνω γιατί δυστυχώς είναι δεδομένο...

  • Like 1
Δημοσ.

Αν είναι δυνατόν το 2016 2017 να βάζουν τέτοιες άχρηστες μαλακίες για εργασία.  :mad:

 

Μα οι ίδιοι που δίδασκαν και το 2000 συνεχίζουν να διδάσκουν ακόμη. Ούτε και τότε είχαν επαφή με το επιπλέον τώρα ότι είναι και λίγο πριν τη σύνταξη.

 

Κατά τ' άλλα πέρα από το UB, να σχολιάσει κανείς τι; Το στυλ του κώδικα που δε βλέπεται και περιέχει τα χειρότερα παραδείγματα όλα σε ένα; Τη χρησιμότητα του να τρέχει το loop 6 φορές πέρα από το ότι πιθανότατα στο χαρτί κάπου θα το χάσεις και θα κάνεις λάθος;

 

Δυστυχώς, τα πανεπιστήμια είναι γεμάτα άτομα που έχουν δεκαετίες να γράψουν πραγματικό κώδικα και διδάσκουν μαθήματα προγραμματισμού με τον ίδιο τρόπο που θα δίδασκαν και μαθηματικά...

Δημοσ.

Αν είναι δυνατόν το 2016 2017 να βάζουν τέτοιες άχρηστες μαλακίες για εργασία.  :mad:

 

Μα οι ίδιοι που δίδασκαν και το 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 αν τα μηνύματά μου δεν τον βοήθησαν καθόλου.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...