Timonkaipumpa Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Λέγοντας ότι θέλει να επεξεργαστεί τον πίνακα σημαίνει ότι μπορεί να θέλει να προσθέσει στοιχεία στις "γραμμές" ή ό,τι άλλο που να επηρεάζει τον "rows" pointer. Οπότε, *** αντί για **. Μία χαρά μπορείς να περάσεις και μη δυναμικά δεσμευμένο πίνακα με pointers. Από τα πιο βασικά στη C είναι πως το "όνομα" μίας μεταβλητής πίνακα είναι δείκτης στην αρχή αυτού. Π.χ. char foo[1]; Το: foo Είναι ίδιο με το: &foo[0];
Erevis Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Πρώτον, είπε ότι θέλει να επεξεργαστεί τα στοιχεία του πίνακα. Δεύτερον, ξέρω πολύ καλά ότι οι μονοδιάστατοι πίνακες γίνονται decay σε pointer εφόσον περαστούν σε συνάρτηση δε περιμένω να μου το πεις εσύ. Οι δυσδιάστατοι πίνακες ΔΕ γίνονται decay σε διπλό pointer όμως. Μπορείς να το δοκιμάσεις. Στον gcc είναι compilation error να περάσεις στατικό δυσδιάστατο πίνακα σε διπλό pointer. Ορίστε και ένα καλό link που εξηγεί για ποιό λόγο: http://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer . 2
doutsos13 Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 #include <stdio.h>int main(void){for (int i = 1; i != 0; i++)printf("%d\n", i);return 0;} ξέρει κανείς γιατί αυτό εδώ το σίχαμα μετά από ώρα που έχει τρέξει αρχίζει και πετάει random νούμερα και όχι +1 που θα έπρεπε ??
παπι Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Εφοσον τα array εχουν συγκεκριμενο layout στη μνημη, μπορουμε να τα θεωρησουμε "τυπους". Αρα αν θελουμε να περασουμε ενα int array[10][10] σε μια συναρτηση αρκει να γραψουμε τον τυπο δηλαδη void foo(int arr[10][10]) Εαν θελουμε εναν pointer σε αυτο το τυπο, τοτε αρκει να βαλουμε ενα αστερακι στο arr δηλαδη int (*arr)[10][10]. Εδω θελει προσοχη, η δηλωση αυτη μπορει να δεχτει εναν δισδιαστατο πινακα αλλα και εναν τρισδιαστατο, το οποιο δεν ειναι λαθος. Αυτο γινεται διοτι ενας array subscriping ειναι ενας pointer. Βεβαια, εφοσον το int (*arr)[10][10] μπορει να δεχτει εναν τρισδιαστατο αυτο σημαινει οτι το int (*arr)[10] μπορει να δεχτει ενα διστιαστατο το οποιο ειναι σωστο αλλα στην περιπτωση μας ειναι λαθος διοτι δεν θελουμε εναν pointer to array of 10 int αλλα ενα 2d array 10x10 int.
Star_Light Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 #include <stdio.h> int main(void) { for (int i = 1; i != 0; i++) printf("%d\n", i); -> 10 9 8 .... 1 return 0; } ξέρει κανείς γιατί αυτό εδώ το σίχαμα μετά από ώρα που έχει τρέξει αρχίζει και πετάει random νούμερα και όχι +1 που θα έπρεπε ?? "Ατέρμων βρόχος" ειναι αυτο που έχεις φτιάξει. Το i αρχικοποιειται στο 1 και αυξάνεται μέχρι το i να μην ειναι 0.... Ισως σταματησει κάπου .... εμενα ακομη μου τρέχει και το περιμενω Moνο έτσι υπάρχει κάποιο νοημα : #include <stdio.h> int main(void) { int i; for (i = 10; i != 0; i--) printf("%d\n", i); return 0; } OUTPUT : 10 9 8 .... 1
Erevis Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Διότι έχει γίνει overflowed ο integer και αρχίζει να μετράει απο την αρχή => ένας πολύ μεγάλος αρνητικός αριθμός.
παπι Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Απο το -INT_MAX. Ουσιαστικα θα "ανεβει" στην κορυφη και μετα θα αρχισει να κατεβαινει ωσπου να φτασει το 0 ΥΓ Οπως η πορνη η ΕΤΕ
Star_Light Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Nαι ακριβως. Θα ξεπεράσει τα ορια λογικα του τυπου int στο συστημα σου. Και αν μετα ξαναγυρισει στο 0 θα σταματησει εκει για καμποση ωρα παντως δινει την εντυπωση ενος ατερμονα βροχου. p.s Αυτες τις τιμές μπορεις να τις δεις στο limits.h http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/limits.h.htm δες εδω... για λογους φορητοτητας οριζουν μια σταθερά INT_MAX για τον μεγιστο δυνατο ακεραιο για δεδομενη πλατφορμα για αυτο σου ειπε ο παπι οτι θα ανεβει και μετα θα κατεβαινει επειδη θα πηγαινει να αυξησει και θα εχεις αρνητικο αριθμο πχ int x =2147483647; printf("%d" , x); // 2147483647 αλλά int x =2147483649; printf("%d" , x); // -2147483647 Για ακομα μεγαλυτερη ευκολια μπορεις να χρησιμοποιεις τους fixed-size τυπους της C99 ( stdint.h ).
doutsos13 Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 αχά κατάλαβα ευχαριστώ πολύ παιδιά γιατί όταν φτάσει 6-7 ψηφία αρχίζει και βγάζει άσχετα και τρελάθηκα λέω wtf? και δεν είχα ιδέα τι παίζει
Star_Light Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 αχά κατάλαβα ευχαριστώ πολύ παιδιά γιατί όταν φτάσει 6-7 ψηφία αρχίζει και βγάζει άσχετα και τρελάθηκα λέω wtf? και δεν είχα ιδέα τι παίζει #include <stdio.h> #include<limits.h> int main(void) { printf("%d" , INT_MAX); return 0; } Δοκιμασε αυτο στο δικο σου συστημα θα δεις οτι η εξοδος θα ειναι ο αριθμος 2147483647
migf1 Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Σχετικά με το decay των 2D πινάκων έχουμε ασχοληθεί ξανά και αναλυτικά πέριξ αυτού του ποστ . Στο συγκεκριμένο ποστ περνάω φορσέ τον 2Δ ως ** με casting.
Timonkaipumpa Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Πρώτον, είπε ότι θέλει να επεξεργαστεί τα στοιχεία του πίνακα. Δεύτερον, ξέρω πολύ καλά ότι οι μονοδιάστατοι πίνακες γίνονται decay σε pointer εφόσον περαστούν σε συνάρτηση δε περιμένω να μου το πεις εσύ. Οι δυσδιάστατοι πίνακες ΔΕ γίνονται decay σε διπλό pointer όμως. Μπορείς να το δοκιμάσεις. Στον gcc είναι compilation error να περάσεις στατικό δυσδιάστατο πίνακα σε διπλό pointer. Ορίστε και ένα καλό link που εξηγεί για ποιό λόγο: http://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer . Όταν ηρεμήσεις και είσαι έτοιμος για συζήτηση μπορούμε να τα ξαναπούμε.
Star_Light Δημοσ. 27 Φεβρουαρίου 2013 Δημοσ. 27 Φεβρουαρίου 2013 Ρε μανια αυτος ο Τιμον να τους βγαλει ολους νευρικους επειδη δεν συμφωνουν μαζι του Ενας σωστος διαλογος πρεπει να έχει και αντιλογο μεσα αυτη ειναι η δικια μου αποψη.
Erevis Δημοσ. 27 Φεβρουαρίου 2013 Δημοσ. 27 Φεβρουαρίου 2013 Όταν ηρεμήσεις και είσαι έτοιμος για συζήτηση μπορούμε να τα ξαναπούμε.Όταν το ύφος σου είναι passive-aggressive, να περιμένεις ανάλογη απάντηση...ιδίως όταν δε ξέρεις για τι πράγμα μιλάς. Σχετικά με το decay των 2D πινάκων έχουμε ασχοληθεί ξανά και αναλυτικάΤο casting αυτό είναι λάθος. Το έχει εξηγήσει το λινκ που έδωσα παραπάνω για ποιό λόγο. Αν δούλεψε, που αμφιβάλλω, ήταν εντελώς συγκυριακό.
Star_Light Δημοσ. 27 Φεβρουαρίου 2013 Δημοσ. 27 Φεβρουαρίου 2013 Όταν το ύφος σου είναι passive-aggressive, να περιμένεις ανάλογη απάντηση...ιδίως όταν δε ξέρεις για τι πράγμα μιλάς. Το casting αυτό είναι λάθος. Το έχει εξηγήσει το λινκ που έδωσα παραπάνω για ποιό λόγο. Αν δούλεψε, που αμφιβάλλω, ήταν εντελώς συγκυριακό. Αυτο ομως δεν ειναι λαθος : int sum_two_dimensional_array(int arr2d[][COLS] , int nrows) { int *p , sum=0 ; for( p = (int *) arr2d ; p < ( (int *) arr2d + nrows*COLS); p++) sum+= *p; printf(" %zu , %zu , %zu " , sizeof(arr2d) , sizeof(*p) , sizeof( *( (int * ) arr2d ) ) ); return sum; } o arr2d εχει εξαρχης τυπο δεικτη σε πινακα #COLS στοιχειων και δεν μπορεις να αρχικοποιησεις τον απλο p με αυτον για αυτο κανεις cast. Και εγω ειμαι υπερ της αποψης οτι καλυτερα να μην ταυτιζεις εξαρχης καθολου διπλους πινακες και διπλους δεικτες και το εχω πει αυτο στον migf1 μηνες τωρα οτι δεν συμφωνω με αυτο. Αλλα το να κανεις cast εναν πινακα σε μονο δεικτη ειναι λαθος? δεν το εχω ψαξει πολυ
Προτεινόμενες αναρτήσεις