Επιστροφή στο Forum : Float μεταβλητές σε GCC
Καλησπέρα σας,
Λοιπόν, θέλω μια βοήθεια σχετικά με C. (GCC)
Μεταξύ άλλων δηλώνω:
float c;
int a=10;
int b=3;
c=b/a;
και το c μου το βγάζει 0. Τι παίζει και δεν παίζει? :blush:
Στο βγάζει 0 επειδή δεν σου δείχνει το δεκαδικό μέρος. Δοκίμασε να το κάνεις double.
Δοκίμασες αυτήν την εντολή??? Πως το εμφανίζεις??
printf("%f\n",c);
Ευχαριστώ Γιώργο. Είναι σε GCC στο AVRstudio. Βρήκα μετά από ψάξιμο στο ιντερνετ ότι πρέπει να γράψω
c=(float)b/a;
και μου δούλεψε. Κάτι έμαθα και σήμερα :))
Αυτο ειναι ενα απο τα κλασικα "προβληματα" που εχει η C.
Οταν κανεις μια πραξη και καταχωρεις το αποτελεσμα σε μια αλλη μεταβλητη τοτε η πραξη γινεται με βαση την ευρυτερου τυπου μεταβλητη στο δεξι μερος και κατοπιν γινεται περικοπη στο αποτελεσμα με βαση τον τυπο της μεταβλητης στα αριστερα.
Ετσι στην περιπτωση σου η διαιρεση γινοταν με βαση int οποτε εχανες τα δεκαδικα.
Ισοδυναμο με το (float)b/a ειναι το b./a Ειναι το γνωστο casting μεταβλητης, θεωρει προσωρινα ο compiler την b σαν float και κανει την πραξη σε float "mode".
Ευχαριστώ Τάσο.
logos=(float)absy/absx; Αυτό μου παίζει
logos=absy./absx; αυτό μου βγάζει σφάλμα
Ισως να μην το υποστηριζει ο compiler το casting με (μεταβλητη). δεν εχω χρησιμοποιησει gcc οποτε δεν μπορω να σου πω σιγουρα.
Μηπως εχεις ορισει οτι η υποδιαστολη ειναι κομμα αντι για τελεια? Τοτε θα θελει , αντι για . μετα την μεταβλητη.
Δοκιμασε να βαλεις και logos=absy/absx. ; μηπως παιξει.
Επιτρέψτε μου μια παρέμβαση. Δεν είναι "πρόβλημα" της C αυτό αλλά του προγραμματιστή.
Η C καλώς έχει αυστηρό σύστημα δήλωσης μεταβλητών. Το casting δεν είναι σωστή προγραμματιστική τακτική και πρέπει να γίνεται μόνο όταν δεν μπορούμε ή δεν μας συμφέρει να διορθώσουμε τα πράγματα αλλιώς και δείχνει ότι γράφουμε κώδικα χωρίς να έχουμε κάτσει να υπολογίσουμε σωστά το τι κάνει το πρόγραμμα μας φτιάχνοντας σωστά το προσχέδιο του(ανάλυση) και δοκιμάζοντας πιθανά σενάρια πριν το υλοποιήσουμε σε οποιαδήποτε γλώσσα. Φιλικά πάντα! :)
Η τελεία . έχει νόημα για σταθερές. Η σταθερά 3 είναι int ενώ η σταθερά 3. είναι float.
Συνοψίζοντας, η παράσταση a./b είναι λάθος, η παράσταση 3/2 επιστρέφει 1 ενώ η παράσταση 3./2 επιστρέφει 1.5.
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.