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

Kaprekar's Constant


SpirosLouis

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

Πολύ καλησπέρα σας,

 

Μετά από πολύ καιρό ξέθαψα τον παρακάτω κώδικα.

 

(θα τον βρείτε εδώ)

 

http://www.eyrhka.gr/kap.c

 

Το πολύ πολύ περίεργο είναι ότι σε linux (όπου είχε φτιαχτεί αρχικά) δουλεύει κανονικά. Όταν όμως το βάζω στο code::blocks κάτι γίνεται και δεν δουλεύει. Βασικά αυτό που παρατήρησα είναι ότι κάτι δεν πάει καλά από την αρχή κιώλας με το scanf αφού αν βάλω 1234 ως είσοδο μου βγάζει ότι βρήκε 1233.

 

Τι γίνεται;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στο code::blocks χρησιμοποιείς τον MinGW ? Πήγαινε στις build options του project σου και δοκίμασε να κάνεις build μία φορά με -O0 και μία με -O3 και πες μας αν παίζει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι όντως. Με το O3 δουλεύει κανονικά!

 

Μπορείς παρακαλώ να μου πεις περίπου τι γίνεται; Έστω κάποια keywords που μπορώ να ψάξω στο internet.

 

Ευχαριστώ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι όντως. Με το O3 δουλεύει κανονικά!

 

Μπορείς παρακαλώ να μου πεις περίπου τι γίνεται; Έστω κάποια keywords που μπορώ να ψάξω στο internet.

 

Ευχαριστώ

Το θέμα είναι ότι με Ο3 μπορεί να κάνει compile αλλά να μην δουλεύει όπως πρέπει. Έχω 1rst hand experoience από αυτό..... Δοκίμασε με O2. Αν δεν τρέχει τότε ίσως να θέλει λίγο code tweaking.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι όντως. Με το O3 δουλεύει κανονικά!

 

Μπορείς παρακαλώ να μου πεις περίπου τι γίνεται; Έστω κάποια keywords που μπορώ να ψάξω στο internet.

 

Ευχαριστώ

Όταν είπες 1234 vs 1233 το πρώτο πράγμα που πήγε το μυαλό μου ήταν "δεκαδικοί αριθμοί" που συμβαδίζει και με την αρχαία κινέζικη παροιμία "When in doubt, always blame the floating point" :)

 

Κοιτάζοντας όμως τον κώδικα είδα μόνο κλήσεις της pow που δεν μου φάνηκε να φταίει αυτή. Επίσης, υποθέτοντας ότι ο mingw και ο gcc υλοποιούν με το ίδιο πρότυπο το floating point, δεν έβγαινε νόημα να παίζει σε linux.

 

Μην έχοντας windows για να δω τι γίνεται αυτό που μου ήρθε να προτείνω ήταν να παίξεις με optimizations. Ο κλασικός τρόπος για να δεις πως λειτουργεί αυτό που έγραψες και όχι αυτό που νόμισε ο compiler ότι ήθελες να γράψεις (στο βαθμό που αυτό είναι δυνατό. κάποιες αλλαγές πάντα υφίστανται) είναι απενεργοποιώντας τις βελτιστοποιήσεις με -O0. Αφού λυθεί το πρόβλημα γυρνάς σε -Ο2 που είναι το προτεινόμενο στάδιο βελτιστοποιήσεων. Όπως είπε και ο pc_magas το O3 δεν προτείνεται γιατί πολλές φορές δημιουργεί προβλήματα λόγω του πολύ aggressive τρόπου βελτιστοποίησης. Λόγω όμως αυτής της διαφορετικής λειτουργίας του, αν το O2 έχει ως αποτέλεσμα κάποιο bug, το Ο3 μπορεί να καταλήξει σε σωστό αποτέλεσμα για αυτό στο πρότεινα ως εναλλακτική του Ο0.

 

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

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

άρα είμαστε στο blame mingw;

Όταν έχεις χρόνο και βαριέσαι ψάξε "select is broken". Η ιδέα είναι ότι πάντα (τουλάχιστον μέχρι να εξαντληθούν όλα τα ενδεχόμενα) φταίει ο κώδικας και όχι ο compiler. Εν προκειμένω όμως δεν μου έρχεται κάτι στον κώδικα που να φταίει.

 

Η pow μπορει να εχει θεμα γιατι δουλευει με double. Δοκιμασε με μια δικια σου 

int myPow(int base,int exp)
{
   int i, ret=1;
   for(i=0;i<exp;i++)
      ret*=base;
   return ret;
}

 

Και εγώ το σκέφτηκα αυτό και έκανα κάποιες δοκιμές πριν. Αν θέσω το αποτέλεσμα της pow σε μια ενδιάμεση μεταβλητή τύπου double (ή και float ακόμη), παίρνω 1234 αλλά στην επόμενη ανακύκλωση το αποτέλεσμα είναι κατά ένα μεγαλύτερο. Το επόμενο που έκανα ήταν να γράψω ακριβώς τον ίδιο κώδικα (μόνη αλλαγή το όνομα mpow στη δική μου περίπτωση) και πήρα πάλι 1234 αλλά πιο μετά παίρνω πάλι κατά ένα μικρότερο (αν θυμάμαι καλά 377 αντί για 378).

 

Ο cl.exe που παρέχει το Visual Studio 2010 πάντως παράγει σωστό αποτέλεσμα με τον αρχικό κώδικα του OP. Ή κάτι μας διαφεύγει στο κώδικα ή ο MinGW τον παίζει.

 

Edit:

ε οχι και blame mingw. Ο κωδικας ειναι τ-ρ-α-γ-ι-κ-ο-ς.

Ο MinGW κρασάρει επίτηδες για να τον αναγκάσει να βελτιώσει το κώδικά του :)
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μήπως μετά από στην scanf θέλει ένα fflush(stdin);

Παραβλέποντας ότι δεν υπάρχει fflush(stdin), δοκίμασε να βάλεις ένα printf αμέσως μετά την scanf. Ο αριθμός διαβάζεται σωστά από την scanf. Το πρόβλημα βγαίνει μετά στην συνάρτηση digits.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παραβλέποντας ότι δεν υπάρχει fflush(stdin), δοκίμασε να βάλεις ένα printf αμέσως μετά την scanf. Ο αριθμός διαβάζεται σωστά από την scanf. Το πρόβλημα βγαίνει μετά στην συνάρτηση digits.

 

δεν ξέρω αν ήταν ερωτήσεις, αλλά ναι έτσι είναι

 

Λέω blame the mingw σκεπτόμενος ότι μπορεί και κάνει κανονικά compile και τρέχει σε linux μηχάνημα ενώ σε αντίθεση δεν τρέχει σωστά με mingw.

ε οχι και blame mingw. Ο κωδικας ειναι τ-ρ-α-γ-ι-κ-ο-ς.

 

Αν θες αιτιολόγησετο και μην το πετάς έτσι στον αέρα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για την ιστορία ο δημοσιευμένος κώδικας λειτουργεί (ως έχει) σωστά και σε C++ Builder :)

 

Προσωπικά έλυσα το πρόβλημα από περιέργεια με recursion (αν έχεις διάθεση δοκίμασε το κάποια στιγμή) και ένα custom sort.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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