Lomar Δημοσ. 9 Ιανουαρίου 2016 Δημοσ. 9 Ιανουαρίου 2016 (επεξεργασμένο) Θα είχες δίκαιο αν όντως δε δόθηκε η απάντηση στο πρόβλημα. Τώρα μόνο εκτείθεσαι. Και άντε και εκτέθηκα, σε ποιούς; τα ανώνυμα ποζέρια του ινσόμνια; Ρητορική η ερώτηση, δε χρειάζεται να απαντήσεις. απλά για γέλια, το 1ο σου σκέλος: Ποοο! Τι inseption τρελο ειναι αυτο...! Αντε βγαλε ακρη.. Τεσπα ευχαριστω πολυ για τη βοηθεια! Βέβαια forum είναι, "θόρυβος" θα υπάρχει και θα συνεχίσει αν κρίνω από το λόγο που απάντησες εδώ. Θα μπορούσες να του στείλεις pm. Ο λόγος που απάντησα εδώ και όχι σε πμ, ήταν ακριβώς επειδή πέσατε με τα μούτρα να φάτε τους μη γνώστες, ενώ θα μπορούσατε και εσείς με πμ να τους ενημερώσετε για την ασχετοσύνη τους. Επεξ/σία 10 Ιανουαρίου 2016 από Lomar 1
gon1332 Δημοσ. 9 Ιανουαρίου 2016 Δημοσ. 9 Ιανουαρίου 2016 Η λύση δόθηκε. Το αν κάθησε να το σκεφτεί ο OP ή όχι είναι δικό του θέμα. Θα μπορούσε να ζητήσει περισσότερες εξηγήσεις. Εδώ είμαστε. Ούτε ειρωνεύτηκε κάποιος τον OP, ούτε τίποτα. Επιπρόσθετα, παρακάτω προτάθηκαν ολόκληρες λύσεις οι οποίες είναι ορθές. Αν οποιοσδήποτε νέος κάτσει και τις διαβάσει (του imitheos) θα μάθει πολλά πράγματα. Έχω μάθει προσωπικά, εδώ μέσα πράγματα. Από πολλά διαφορετικά μέλη που έχουν γράψει και σε αυτό το νήμα κι εκτιμώ. Αλλά "στρώθηκα" για να καταλάβω τι λένε. Τροφή για σκέψη... Ποιο είναι το δικό σου κόλλημά δε μπορώ να καταλάβω. Ούτε ποζέρια υπάρχουν ούτε τίποτα από αυτά που λες. Επίσης δε μπορώ να καταλάβω που κολλάς εσύ εδώ ενώ δεν έχεις κάτι παραπάνω χρήσιμο να πεις; Αν έχει σχέση με το νήμα καλώς, διαφορετικά συνέχισέ το σε pm.
k33theod Δημοσ. 9 Ιανουαρίου 2016 Δημοσ. 9 Ιανουαρίου 2016 Θα το ξαναπώ ότι αυτοί που κάνουν ότι τα ξέρουν όλα εκνευρίζουν εμάς που τα ξέρουμε.
defacer Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 λολ, μόνο στο ινσόμνια καταλήγει ένα θέμα για κώδικα στο ποιος είναι ο πιο παλιός, ο πιο ANSI C compatible και ο op μένει με το bug στο χέρι. Καλά όχι ότι δε θα γίνει αυτό ακριβώς somewhere on the internet αλλά... 1. Του OP του βρήκαμε τα bug, του εξηγήσαμε και προτείναμε και λύσεις. Φαίνεται να κατάλαβε, πάντως δεν εξέφρασε άλλη απορία. 2. Το θέμα δεν είναι αν είναι κανείς ANSI ISO C compatible, το θέμα είναι ότι η C είναι από τις ελάχιστες γλώσσες στις οποίες συμβαίνει άνετα το να έχεις ένα πρόγραμμα γεμάτο μαλακίες το οποίο όμως βγάζει με λιγότερη ή περισσότερη τύχη το αναμενόμενο αποτέλεσμα στις συνθήκες υπό τις οποίες δοκιμάζεται. Οπότε όταν έρχεται κάποιος που έμαθε for if printf char** και νομίζει ότι ξέρει C και σου λέει "σαταφάκα ρε αφού δουλεύει το πρόγραμμα", δεν έχεις και πολλές διαφορετικές επιλογές από το να πεις "UB LOL". Σε οποιαδήποτε sane γλώσσα το πρόγραμμα δε θα δούλευε και αυτός που δεν ξέρει δε θα είχε τη δυνατότητα να εξηγεί σ' αυτούς που ξέρουν πόσο κάνει 1+1. PS αυτό είναι τώρα στο Hacker News How to C in 2016The first rule of C is don't write C if you can avoid it. 2
M2000 Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 (επεξεργασμένο) @gon1332. Του imitheos η λύση είναι "σχολικού τύπου". Μπορεί να είναι το πρώτο C πρόγραμμα που έγραψα...αλλά μου πήρε ελάχιστη ώρα να φτιάξω το κώδικα, και αυτό που έκανα ακόμα θα το βλέπεις και θα το σκέφτεσαι και θα λέει ο Defecer ότι δεν είναι βάσει του πρότυπου και άλλα κολοκύθια. Αυτά του τα λένε εκεί που δουλεύει...αλλά εδώ δεν έχουμε κάτι τέτοιο. Εμένα μου αρέσει ο έξυπνος προγραμματισμός. Ο imitheos εκνευρίστηκε από απανωτές αναθεωρήσεις. Αυτές έγιναν γιατί ήθελα να τεκμηριώσω ότι θα δουλεύει για μεγάλη εκχώρηση μνήμης. Έφτιαξα και άλλο που το δοκίμασα και έτσι είδα ότι δεν δίνει άμεσα άλλο άλλα δείκτη η realloc. Μια πληροφορία που ίσως την ξέρεις. Αλλά έχω να διαβάσω C από το 1987...και πέφτει κάπως πολύς ο καιρός. Επιπλέον στο κώδικά μου έχω βάλει να εισάγει κανείς φράσεις...αφού ένα λεξικό πρέπει να έχει και το "put on" για παράδειγμα! Δεν περιμένω να κερδίσω το σεβασμό από το Defecer. Να γίνει περισσότερο άνθρωπος και μετά κάτι θα καταφέρει! Πρώτα δηλαδή μαθαίνουμε να είμαστε ευγενείς. Και όταν κάτι δεν μας αρέσει, ρωτάμε, δεν βγάζουμε με το μυαλό μας ότι "μιλάει κατηγορηματικά". Αν μίλαγα κατηγορηματικά ή αν έκανα τον κάποιο..προφανώς δεν θα ξόδευα λεπτό για το φόρουμ. Επειδή και τα μέλη εδώ δίνουν κάτι από τη ζωή τους...ας πάμε στον δρόμο της ευγένειας και της κατανόησης και μην νομίζουμε ότι έχουμε παιδιά ή τίποτα χαζούς. Αυτό που παίζει βέβαια είναι το "απροσάρμοστος". Σε αυτό όλοι λίγο πολύ πρέπει να βοηθηθούμε να "προσαρμοστούμε". Στο φινάλε ο προγραμματισμός πρέπει να διασκεδάζει! @Defecer Ευχαριστώ για το Link παραπάνω...(καλό βοήθημα). Επεξ/σία 10 Ιανουαρίου 2016 από M2000 1
gon1332 Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 Δε διάβασα τον κώδικά σου, λόγω έλλειψης χρόνου, γιατί με μία πρώτη ματιά είδα ότι θα έπρεπε να ξοδέψω λίγο παραπάνω χρόνο σε σχέση με κάτι πιο δομημένο. Γι'αυτό και δεν έγραψα κάτι περί του θέματος. Πάντως, αυτό που είπες ότι κι ας έχει UB δουλεύει, ισχύει μόνο στην περίπτωσή σου. Με άλλο compiler και σύστημα τα πράγματα μπορεί να είναι διαφορετικά. Ξαναλέω δεν είδα τον κώδικά σου για να ξέρω τι έκανες (για το λόγο που ανέφερα κι εδώ). Γενικά μιλάω.
M2000 Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 Δεν ξέρω τι είναι το UB....o Defacer το είπε. Εγώ έφτιαξα ένα stream αλφαριθμητικών σε ένα μπλοκ μνήμης και χρησιμοποίησα έναν δεύτερο δείκτη για να κινώ τον δρομέα που γράφω στο stream. Στo realloc αν αλλαχτεί η "βάση" πρέπει να αλλάξω και τον δρομέα παίρνοντας την διαφορά (Το offset)..
DDevil Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 Δεν ξέρω τι είναι το UB....o Defacer το είπε. Εγώ έφτιαξα ένα stream αλφαριθμητικών σε ένα μπλοκ μνήμης και χρησιμοποίησα έναν δεύτερο δείκτη για να κινώ τον δρομέα που γράφω στο stream. Στo realloc αν αλλαχτεί η "βάση" πρέπει να αλλάξω και τον δρομέα παίρνοντας την διαφορά (Το offset).. UB ειναι οταν δεν μπορεις να προβλέψεις την συμπεριφορά του προγραμματος πχ το παρακάτω ειναι UB : int main(void) { int arr[3]={0}; int i = 0; for( ; i <=3; i++) arr[i] = i; return 0; }
M2000 Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 το δοκίμασα έτσι: include <stdio.h> int main(void) { int arr[3]={0}; int i = 0; for( ; i <=3; i++) arr[i] = i; printf("%d - %d \n",arr[3], i); return 0; } έδωσε 3 και 4 Αρχικά το δοκίμασα με arr[2] λογικά ο πίνακας θα έπρεπε να είχε από 0 έως 2 στοιχεία ή από 0 έως 3 στοιχεία ?? Εδώ όπως παίρνω την απάντηση 3 4 έχει ξεκάθαρα από 0 έως 3 άρα τέσσερα στοιχεία.
Moderators Kercyn Δημοσ. 10 Ιανουαρίου 2016 Moderators Δημοσ. 10 Ιανουαρίου 2016 UB (Undefined Behaviour) σημαίνει ότι δε μπορείς να είσαι σίγουρος τι αποτέλεσμα ακριβώς θα έχει αυτό που κάνεις. Μπορεί να δουλέψει σωστά, μπορεί και όχι. Το ότι δούλεψε σωστά δε σημαίνει ότι το πρόγραμμά σου είναι σωστό. Από τη στιγμή που έχεις UB μέσα το πρόγραμμα είναι, by definition, λάθος. Μπορεί την επόμενη φορά να κάνει κάτι άλλο, μπορεί σε κάποιο άλλο σύστημα να κάνει κάτι άλλο, μπορεί με κάποιον άλλον compiler να κάνει κάτι άλλο. Γι' αυτό λέγεται και UB. 1
gon1332 Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 Δες το και διαφορετικά. Στον παραλληλισμό, αν δεν έχεις ορίσει ακριβώς ποιά είναι τα race conditions και αφήσεις το πρόγραμμα να τρέξει κάποιες φορές θα τρέξει σωστά, αλλά άλλες λάθος. Μπορεί να είσαι τόσο τυχερός που δε σκάει ποτέ. Το πουλάς όμως αυτό το πρόγραμμα; Κάπως έτσι κι εδώ.
DDevil Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 το δοκίμασα έτσι: include <stdio.h> int main(void) { int arr[3]={0}; int i = 0; for( ; i <=3; i++) arr[i] = i; printf("%d - %d \n",arr[3], i); return 0; } έδωσε 3 και 4 Αρχικά το δοκίμασα με arr[2] λογικά ο πίνακας θα έπρεπε να είχε από 0 έως 2 στοιχεία ή από 0 έως 3 στοιχεία ?? Εδώ όπως παίρνω την απάντηση 3 4 έχει ξεκάθαρα από 0 έως 3 άρα τέσσερα στοιχεία. Ναι αλλα δεν έχεις δεσμευσει 4 στοιχεια στη δηλωση σου. 3 δεσμεύεις [0] , [1] και [2]. Δεν ειναι σωστο αρχικά να δεσμευεις 3 στοιχεια και μετα να εκχωρεις τιμή εκτος οριων του πινακα σου. #include<stdio.h> int main(void) { int i , a[3]={0}; for(i=0; i<4; a[i++] = 2) printf("%d" , i); for(i=0; i<3; i++) printf("%d" , a[i]); return 0; } Σε αυτο το "αθώο" loop το i μπορεί να αποθηκευτεί στην αμέσως μετα θέση στην μνήμη οποτε το a[3] θα το θέσει σε 2 ξαναμπαίνοντας στο loop και προκαλώντας Udenfined behaviour. Δεν μπορείς να εγγυηθείς την σειρά των μεταβλητων στην στοίβα.
M2000 Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 Ναι καταλαβαίνω γιατί το έψαξα και δεν σου πετάει λάθος επειδή δεν κάνει έλεγχο ορίων, για οικονομία! Αλλά το malloc δεν δίνει λιγότερο από 16bytes...(μπορεί να το κάνει ο gcc αυτό). Στο δικό μου πρόγραμμα δεν έχω επεκταθεί εκτός ορίων, άρα δεν έχω UB. Εκεί που μπορεί κανείς να πει ότι μπορεί να παίξει είναι το μέγεθος του char αλλά έχω την εντύπωση ότι δεν έγινε by default 2bytes. Σε VB6 με option base 0 έχουμε 4 στοιχεία και όχι 3 με DIM a(3) Dim a(3) As IntegerSub B()Debug.Print a(3), a(0)End Sub
defacer Δημοσ. 10 Ιανουαρίου 2016 Δημοσ. 10 Ιανουαρίου 2016 Καλά ρε παιδιά και σας τα ίδια πράγματα σας λένε στη δουλειά; θα λέει ο Defecer ότι δεν είναι βάσει του πρότυπου και άλλα κολοκύθια. Αυτά του τα λένε εκεί που δουλεύει...αλλά εδώ δεν έχουμε κάτι τέτοιο. Στο δικό μου πρόγραμμα δεν έχω επεκταθεί εκτός ορίων, άρα δεν έχω καταλάβει τι σημαίνει UB. Fixed.
Προτεινόμενες αναρτήσεις