DTMFim Δημοσ. 19 Αυγούστου 2007 Δημοσ. 19 Αυγούστου 2007 Kalispera, exw ena programma me structures kai ta loipa k otan paw na to treksw mou petaei segmentation fault, opote prospathw na kanw malloc gia ti struct auti me ton parakatw kwdika >html_doc *Html_doc; Html_doc=(html_doc *) malloc(sizeof(html_doc)); if (Html_doc == NULL) { printf("ERROR\n"); exit(EXIT_FAILURE); } kai mou petaei auta ta errors warning: data definition has no type or storage class error: conflicting types for Html_doc error: previous declaration of Html_doc was here warning: initialization makes integer from pointer without a cast error: initializer element is not constant to exw psaksei arketa kai den mporw na katalavw pou kanw lathos...an kapoios exei kamia idea, giati exoun arxisei na spane ta neura mou... p.s.i struct exei ws members alles structs...den kserw an exei simasia
Mystirios Δημοσ. 20 Αυγούστου 2007 Δημοσ. 20 Αυγούστου 2007 >Html_doc=(html_doc *) malloc(sizeof(html_doc)); για αρχή άλλαξε το παραπάνω και κάντο >html_doc=(Ηtml_doc *) malloc(sizeof(Ηtml_doc)); το hrml_doc είναι η μεταβλητή σου , to Html_doc είναι το type
DTMFim Δημοσ. 20 Αυγούστου 2007 Μέλος Δημοσ. 20 Αυγούστου 2007 oxi to html_doc einai to type kai to Html_doc i metavliti...
Directx Δημοσ. 20 Αυγούστου 2007 Δημοσ. 20 Αυγούστου 2007 Για αρχή δες αν έχεις δηλώσει το struct ως typedef struct δημιουργώντας έτσι έναν νέο custom τύπο δεδομένων (html_doc) για τον Compiler και τις malloc/free κτλ. Για παράδειγμα: > #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { typedef struct { struct { struct { struct { int DATA; }html_doc_c; }html_doc_b; }html_doc_a; }html_doc; html_doc *Html_doc = NULL; if((Html_doc=(html_doc*)malloc(sizeof(html_doc)))==NULL) printf(" Malloc failure!\n"); else { Html_doc->html_doc_a.html_doc_b.html_doc_c.DATA = 2007; printf(" Data: %d\n",Html_doc->html_doc_a.html_doc_b.html_doc_c.DATA); } free(Html_doc); printf(" Press any key to quit.."); getchar(); return 0; } Καλή συνέχεια! Υ.Γ. Προσθέτω nested structs για να δείξω πως δεν υπάρχει πρόβλημα στον αριθμό των δηλωμένων δομών κτλ.
pinball_elf Δημοσ. 20 Αυγούστου 2007 Δημοσ. 20 Αυγούστου 2007 Μπορεις να μας δωσεις τον ορισμο της html_doc structure καθως επισης και τα include files? Μου φενεται οτι υπαρχει καποιο προβλημα με την δηλωση της html_doc structure.
Sailsman Δημοσ. 20 Αυγούστου 2007 Δημοσ. 20 Αυγούστου 2007 Πάντως το typecast σε malloc δεν θεωρείται καλή χρήση της malloc και μπορεί να προκαλέσει προβλήματα στον κώδικα... Καλό είναι να αποφεύγεται για να είναι ο κώδικά σας πιο συμβατός, κυρίως σε συστήματα όπου το int και το char έχουν διαφορετικό μέγεθος! Ορίστε και ένα αντίστοιχο link!!
bookysmell2004 Δημοσ. 20 Αυγούστου 2007 Δημοσ. 20 Αυγούστου 2007 Το παρακάτω δουλεύει μια χαρά struct doc { //Body }; typedef struct doc html_doc; html_doc *Html_doc; Html_doc=(html_doc *) malloc(sizeof(html_doc)); //... free(Html_doc); Βεβαιώσου ότι πρωτού χρησιμοποιήσεις το struct έχεις κάνει typedef cast.
dark_banishing Δημοσ. 20 Αυγούστου 2007 Δημοσ. 20 Αυγούστου 2007 Πάντως το typecast σε malloc δεν θεωρείται καλή χρήση της malloc και μπορεί να προκαλέσει προβλήματα στον κώδικα...Καλό είναι να αποφεύγεται για να είναι ο κώδικά σας πιο συμβατός, κυρίως σε συστήματα όπου το int και το char έχουν διαφορετικό μέγεθος! Ορίστε και ένα αντίστοιχο link!! Εμένα πάλι μου φαίνεται λίγο υπερβολικός αυτός ο λόγος.. !
Directx Δημοσ. 20 Αυγούστου 2007 Δημοσ. 20 Αυγούστου 2007 Φίλοι μου αν λάμβανα υπόψη μου όλα αυτά τα χρόνια τι λέει ο ένας και ο άλλος (ακόμα και το ANSI ή οι K&R -τώρα θίγω Ιερά Τέρατα χι χι χι) για το τι είναι σωστή C ειλικρινά δεν θα τολμούσα να γράψω προγράμματα, θα είχα χαθεί στο τι είναι standard και τι όχι όπως επίσης και σε άλλες ανούσιες συζητήσεις για εμένα (πχ. πρέπει να κάνω cast στο malloc ή όχι; -πω,πω!) - οπότε έχω μια απλή αρχή, αφού ο κώδικας δουλεύει με τον Compiler μου σωστά, τον οποίο Compiler δεν αλλάζω συχνά (σχεδόν καθόλου) τέρμα, κάνω την δουλεία μου; δουλεύει σωστά η εφαρμογή; Ναι - Ok λοιπόν! - όλα πρίμα πάμε παρακάτω, απλά πράματα Τώρα από την άλλη πλευρά υπάρχουν άνθρωποι που πραγματικά χρειάζονται διαπλατφορμική συμβατότητα (το έχω ζήσει και αυτό παλαιότερα..) οπότε εκεί .. πρέπει να ψάξουν την υπόθεση περισσότερο ώστε να είναι εντός των standards, σεβαστό λοιπόν και αυτό (με λίγη προσοχή και κάποιο κόπο βέβαια.. η C είναι θαυμάσια στο code porting)!
DTMFim Δημοσ. 21 Αυγούστου 2007 Μέλος Δημοσ. 21 Αυγούστου 2007 Paidia sorry pou argisa toso na apantisw, alla den irthe kamia eidopoihsh sto mail mou k nomiza oti den eixe apantisei kaneis!!!Telika afou mou eixe spasei ta neura auto to thema k den mporousa na katevasw idees pira allo dromo k vrika ti eftaige gia to seg fault (den eixe provlima dld sto na desmeusw xwro gia tin html_doc) kai me duo sinartisoules ola einai ok...Vevaia k ekei xrisimopoihsa malloc, alla ti na peis... Euxaristw poli gia tis apantiseis paidia...Tha domimaza tis protaseis sas alla distixws den exw xrono auti ti stigmi mias k plisiazei k i eksetastiki!!! Thanks
Sailsman Δημοσ. 21 Αυγούστου 2007 Δημοσ. 21 Αυγούστου 2007 Δημοσίευσα το προηγούμενο post μου με αφορμή το συγκεκριμένο post και γνωρίζοντας ότι ίσως φανεί λίγο υπερβολικό... Ο λόγος που το έκανα ήταν για ενημέρωση και προβληματισμό. Όσο ζεις μαθαίνεις και γιατί αυτό να μην γίνεται διαβάζοντας αυτό το forum.... Φιλικά
dop Δημοσ. 26 Αυγούστου 2007 Δημοσ. 26 Αυγούστου 2007 @DirectX: δεν είναι δα και τόσο δύσκολο να ακολουθήσεις 5-10 απλούς κανόνες που 1) θα κάνουν πιο εύκολη τη ζωή αυτουνού που θα δει τον κώδικά σου 2) θα σε γλυτώσουν από χαζά προβλήματα ΟΤΑΝ αλλάξεις compiler 3) θα σε γλυτώσουν από χαζά προβλήματα ΟΤΑΝ αλλάξει ο vendor του compiler το προϊόν του 4) θα διασφαλίζουν ότι δεν προκαλείς undefined behavior
Directx Δημοσ. 26 Αυγούστου 2007 Δημοσ. 26 Αυγούστου 2007 Χθες στα έγραψα λίγο συγκεχυμένα - αλλά τρέχουμε αυτές τις μέρες όλοι με αυτά τα δυσάρεστα γεγονότα Λοιπόν, Δύσκολο δεν είναι δα, χρονοβόρο όμως είναι! Για παράδειγμα, γράφω μια εφαρμογή σε καθαρή C (ας πούμε ότι τολμώ να το κάνω -κάποτε το έκανα ελλείψει άλλων λύσεων) και χρειάζομαι μια strrev για να αντιστρέψω ένα char string ώστε να διευκολύνω ορισμένους ελέγχους που απαιτεί η εφαρμογή μου στο input του χειριστή. Εδώ τώρα υπάρχουν δυο δρόμοι, ο πρώτος είναι να γράψω μια δικιά μου ρουτίνα strrev η οποία θα αντιστρέψει το char string ενώ ο δεύτερος είναι να χρησιμοποιήσω έτοιμη αυτή την ρουτίνα όπως μου την προσφέρουν οι extra βιβλιοθήκες του μεταφραστή μου. Οι πιστοί της ANSI-C θα προτιμήσουν τον πρώτο δρόμο κερδίζοντας σε portability αλλά παράλληλα αυξάνοντας την πολυπλοκότητα της εφαρμογής και φυσικά τον χρόνο ανάπτυξης και γιατί όχι τον χρόνο debugging της καθώς ως γνωστών κάθε νέα γραμμή κώδικα σημαίνει ενδεχομένως και νέα bugs στο αναπτυσσόμενο λογισμικό ακόμα και αν κάποια στιγμή συγκεντρώσουν όλες αυτές τις ρουτίνες τους –που ενδεχομένως δεν θα είναι και τόσο καλογραμμένες ή αποδοτικές (δεν είναι όλοι C guru)- σε προσωπικές βιβλιοθήκες. Οι πιστοί των Vendor ή custom libraries θα χάσουν σε portability (και θα δεθούν με τον Vendor τους ενδεχομένως) αλλά θα κερδίσουν σε χρόνο ανάπτυξης των εφαρμογών τους, θα συμπιέσουν την πολυπλοκότητα και θα γλιτώσουν ορισμένα bugs από τις προς ανάπτυξη ρουτίνες τους. Εγώ, τώρα διότι μόνο για εμένα μπορώ να μιλήσω και αυτό εμπειρικά, ακολούθησα και τον πρώτο δρόμο (παλαιότερα γιατί δεν είχα άλλη λύση..) και τον δεύτερο (ύστερα που υπήρχαν λύσεις..), από ένα σημείο και μετά όταν έπαψα να ενθουσιάζομαι με την δημιουργία των «εργαλείων μου» και την συντήρηση των προσωπικών βιβλιοθηκών μου (κάποτε για παράδειγμα σε εποχή DOS για να γλιτώσω 25KB από το overhead των graphics library του MS-C compiler στις εφαρμογές μου έγραψα “from scratch” ένα δικό μου “custom tailored graphics library” σε C/ASM στα 2-3Kb κτλ..) και χρειάστηκε να επικεντρωθώ στην επίλυση του ζητούμενου κάθε εφαρμογής (business problem) αποφάσισα να ακολουθήσω τον δεύτερο δρόμο και να εκμεταλλευθώ ότι καλούδια μου προσέφεραν τα εργαλεία μου ώστε να ελαφρύνω τον κόπο ανάπτυξης και debugging εις βάρος βέβαια του portability. Τώρα σωστό, λάθος .. Αυτά.
dop Δημοσ. 31 Αυγούστου 2007 Δημοσ. 31 Αυγούστου 2007 Άλλο είναι το να χρησιμοποιώ κάποια βιβλιοθήκη που μπορεί να μην υπάρχει σε όλες τις πλατφόρμες και άλλο το παραβλέπω το τι λέει το standard. Το πρώτο είναι αναγκαίο, το δεύτερο αποφευκταίο, εκτός και αν υπάρχει σοβαρός λόγος... Ίσως φαίνομαι αρκετά δυσκοίλιος, αλλά η δουλειά μου αυτή την εποχή είναι να δημιουργώ βιβλιοθήκες που πρέπει να δουλεύουν από το ταπεινό DualCore μηχανάκι στο γραφείο σας μέχρι τον BlueGene/L, οπότε το να ακολουθώ τα standard είναι μοναδική οδός, αν δεν θέλω να χαθώ σε #ifdefs. Και ειλικρινά, ο μεγαλύτερος πονοκέφαλός μου είναι να χρησιμοποιώ components και βιβλιοθήκες που ο δημιουργός τους ξέχασε ότι οι συνδυασμοί πλατφορμών εκεί έξω είναι περισσότεροι από τον έναν που έχει πάνω στο γραφείο του.
Directx Δημοσ. 31 Αυγούστου 2007 Δημοσ. 31 Αυγούστου 2007 Σίγουρα αλλά μην ξεχνάς ότι ο καθένας γράφει με βάση τις ανάγκες του (δεν μου χρειάζεται η πολυπόθητη C συμβατότητα) και τους στόχους του (MS-Windows), όπως προείπα - το πράγμα αλλάζει μόνο όταν ο δημιουργός προβάλει τις βιβλιοθήκες του ή τον κώδικα του ως platform independed. Εκεί φυσικά θα πρέπει να κάνει κάθε τι το απαραίτητο ώστε να εξασφαλίσει την αναγκαία συμβατότητα που διατυμπανίζει (και να μην σε ταλαιπωρεί για παράδειγμα), δεν χωρά αμφιβολία επ' αυτού -όπως παρατήρησα άλλωστε σε νωρίτερο μήνυμα μου. Σε διαφορετική περίπτωση (platform depended) δίκαιος ο κόπος του port πέφτει σε εσένα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.