anyp4kouo_ydor Δημοσ. 5 Αυγούστου 2011 Δημοσ. 5 Αυγούστου 2011 ρε παιδιά που είναι λάθος ο παρακάτω κώδικας; >#include "stdio.h" float z; float function(struct domi); struct domi{ int x; float y; }; struct domi arithmoi; int main() { printf("dose tous 2 arithmous"); scanf("%d%f",&arithmoi.x,&arithmoi.y); z=function(arithmoi); printf("%0.2f\n",z); return 0; } float function(struct domi ar) { z=ar.x+ar.y; return z; }
migf1 Δημοσ. 5 Αυγούστου 2011 Δημοσ. 5 Αυγούστου 2011 Τι λάθος εννοείς, μια χαρά πρόσθεση κάνει αυτός ο κώδικας.
MeTaXaS4 Δημοσ. 5 Αυγούστου 2011 Δημοσ. 5 Αυγούστου 2011 εντάξει την πρόσθεση την κάνει, αλλά ο κώδικας δεν μου φαίνεται καθόλου καλά γραμμένος, έχεις μία global μεταβλητή "z" στην function της δίνεις αποτέλεσμα και στην επιστροφή στην main της ξανά δίνεις το ίδιο ακριβώς αποτέλεσμα. και προτιμότερο οι δομές να είναι πριν τον υπόλοιπο κώδικα..
ektwr_ Δημοσ. 5 Αυγούστου 2011 Δημοσ. 5 Αυγούστου 2011 > #include "stdio.h" struct domi{ int x; float y; }; float z; struct domi arithmoi; float function(struct domi); /* το decleration του structure προηγείται κάποιας οντότητας που το χρησιμοποιεί */ int main() { printf("dose tous 2 arithmous"); scanf("%d%f",&(arithmoi.x),&(arithmoi.y)); /* καλύτερα να χρησιμοποποιείς παρενθέσεις */ z=function(arithmoi); printf("%0.2f\n",z); return 0; } float function(struct domi ar) { z=ar.x+ar.y; return z; }
anyp4kouo_ydor Δημοσ. 5 Αυγούστου 2011 Μέλος Δημοσ. 5 Αυγούστου 2011 Τι λάθος εννοείς, μια χαρά πρόσθεση κάνει αυτός ο κώδικας. εμ δε την κάνει... μου βγάζει το παρακάτω μήνυμα λάθους: Building δοκιμή συνάρτηση.obj. C:\Users\βαγγέλης\Documents\Pelles C Projects\δοκιμή συνάρτηση\δοκιμή συνάρτηση.c(18): error #2140: Type error in argument 1 to 'function'; expected '(incomplete) struct domi' but found 'struct domi'. C:\Users\βαγγέλης\Documents\Pelles C Projects\δοκιμή συνάρτηση\δοκιμή συνάρτηση.c(23): error #2120: Redeclaration of 'function', previously declared at C:\Users\βαγγέλης\Documents\Pelles C Projects\δοκιμή συνάρτηση\δοκιμή συνάρτηση.c(4); expected 'float __cdecl function((incomplete) struct domi)' but found 'float __cdecl function(struct domi)'. *** Error code: 1 *** Done. ο κώδικας δεν μου φαίνεται καθόλου καλά γραμμένος, έχεις μία global μεταβλητή "z" στην function της δίνεις αποτέλεσμα και στην επιστροφή στην main της ξανά δίνεις το ίδιο ακριβώς αποτέλεσμα. αντί γι'αυτό: >z=function(arithmoi); printf("%0.2f\n",z); εννοείς αυτό; >printf("%0.2f\n",function(arithmoi));
MeTaXaS4 Δημοσ. 5 Αυγούστου 2011 Δημοσ. 5 Αυγούστου 2011 > #include "stdio.h" //αν έρθει εδώ η δομή δεν θα έχεις error στο compile σου. struct domi{ int x; float y; }; float z; struct domi arithmoi; float function(struct domi); /* το decleration του structure προηγείται κάποιας οντότητας που το χρησιμοποιεί */ int main() { printf("dose tous 2 arithmous"); scanf("%d%f",&(arithmoi.x),&(arithmoi.y)); /* καλύτερα να χρησιμοποποιείς παρενθέσεις */ z=function(arithmoi);//εδώ αν κάνεις debug θα δεις ότι η μεταβλητή z έχει ίδια τιμή με αυτή που της ξανά δίνεις printf("%0.2f\n",z); return 0; } float function(struct domi ar) { //return (ar.x+ar.y); // θα μπορούσες να κάνεις άμα δεν ήθελες να περάσεις τιμή στην μεταβλητή z z=ar.x+ar.y;//εφόσον εδώ περνάς τιμή σε μία global μεταβλητή είναι λίγο ανούσιο return z;//που την κάνεις return } > #include "stdio.h" struct domi{ int x; float y; }; float function(struct domi); /* το decleration του structure προηγείται κάποιας οντότητας που το χρησιμοποιεί */ int main() { struct domi arithmoi; float z; printf("dose tous 2 arithmous"); scanf("%d%f",&(arithmoi.x),&(arithmoi.y)); z=function(arithmoi); printf("%0.2f\n",z); return 0; } float function(struct domi ar) { return (ar.x+ar.y); }
anyp4kouo_ydor Δημοσ. 5 Αυγούστου 2011 Μέλος Δημοσ. 5 Αυγούστου 2011 /* καλύτερα να χρησιμοποποιείς παρενθέσεις */ γιατί παρακαλώ; στο βιβλίο μου δεν έχει παρενθέσεις
anyp4kouo_ydor Δημοσ. 5 Αυγούστου 2011 Μέλος Δημοσ. 5 Αυγούστου 2011 #include "stdio.h" //αν έρθει εδώ η δομή δεν θα έχεις error στο compile σου. struct domi{ int x; float y; }; κοίτα να δεις!! /* το decleration του structure προηγείται κάποιας οντότητας που το χρησιμοποιεί */ λογικό... τον έριξα στα χάπια τον μεταγλλωτιστή lol /* καλύτερα να χρησιμοποποιείς παρενθέσεις */ εννοείς για να μη γίνει μπέρδεμα με την προτετραιότητα των τελεστών; εδώ πάντως δε νομίζω ότι υπάρχει θέμα return z;//που την κάνεις return την επιστρέφω στο function(arithmoi) εδώ δε νομίζω ότι υπάρχει πρόβλημα έχεις δίκιο πάντως ότι δίνω 2 φορές τιμή στο z αν κάνεις debug σου είναι κόπος να μου πεις πώς κάνω debug; για την ποιότητα του κώδικα μη σκάς, για την ώρα με ενδιαφέρει απλά να δουλεύει για να μπορώ να εξασκήθώ. καλό κώδικα θα γράψω στην πορεία, ελπίζω δλδ
migf1 Δημοσ. 6 Αυγούστου 2011 Δημοσ. 6 Αυγούστου 2011 εμ δε την κάνει... μου βγάζει το παρακάτω μήνυμα λάθους: Building δοκιμή συνάρτηση.obj. C:\Users\βαγγέλης\Documents\Pelles C Projects\δοκιμή συνάρτηση\δοκιμή συνάρτηση.c(18): error #2140: Type error in argument 1 to 'function'; expected '(incomplete) struct domi' but found 'struct domi'. C:\Users\βαγγέλης\Documents\Pelles C Projects\δοκιμή συνάρτηση\δοκιμή συνάρτηση.c(23): error #2120: Redeclaration of 'function', previously declared at C:\Users\βαγγέλης\Documents\Pelles C Projects\δοκιμή συνάρτηση\δοκιμή συνάρτηση.c(4); expected 'float __cdecl function((incomplete) struct domi)' but found 'float __cdecl function(struct domi)'. *** Error code: 1 *** Done. Α ναι, δίκιο έχει... είναι επειδή στο πρότυπο της συνάρτησης αναφέρεσαι στη δομή πριν την ορίσεις. ΥΓ. Ο κώδικας όντως πάει Αθήνα - Κόρινθο μέσω... Λάρισας πάντως Αλλά υποθέτω κάνεις τα πρώτα σου βήματα, ε;
MeTaXaS4 Δημοσ. 6 Αυγούστου 2011 Δημοσ. 6 Αυγούστου 2011 εξαρτάται ποιον IDE χρησιμοποιείς για να γράψεις τον κώδικά σου, είναι διαφορετικά στον καθένα για να κάνεις debug.
migf1 Δημοσ. 6 Αυγούστου 2011 Δημοσ. 6 Αυγούστου 2011 Εγώ θα τον έγραφα κάπως έτσι τον κώδικα πάντως: > #include "stdio.h" #define MAXINBUF 255+1 // μέγιστο μήκος buffer εισόδου typedef struct domi { int xint; float yfloat; } Domi; // ------------------------------------------------------------------------------- float selfsum( Domi domi ) { return domi.xint + domi.yfloat; } // ------------------------------------------------------------------------------- int main( void ) { char inbuf[ MAXINBUF ] = ""; // buffer εισόδου Domi domi = {.xint=0, .yfloat=0.0}; // αρχικοποίηση δομής, ala C99 // είσοδος (αποφυγή της προβληματικής scanf) printf("dose tous 2 arithmous (x y): "); fgets( inbuf, MAXINBUF, stdin ); sscanf("%d%f", &domi.xint, &domi.yfloat); // έξοδος printf("%.2f\n", selfsum( domi ) ); return 0; } Όσο για το debugging, είδα έχεις Pelles-C... Πήγαινε στα Project Options κι ενεργοποίησε τα Debug Information σε compiler, assembler και linker (αν είσαι με την 64μπιτη έκδοση της Pelles-C, στον linker βάλε σκέτο Codeview Format). Κατόπιν κάνε Build το project, βάλε με δεξί κλικ breakpoints στις γραμμές του κώδικά σου που θέλεις να σταματάει κατά την εκτέλεση (για να κάνεις step-into ή step-over στις συναρτήσεις) και αντί για Run διάλεξε Debug.
ektwr_ Δημοσ. 6 Αυγούστου 2011 Δημοσ. 6 Αυγούστου 2011 εννοείς για να μη γίνει μπέρδεμα με την προτετραιότητα των τελεστών; εδώ πάντως δε νομίζω ότι υπάρχει θέμα ακριβώς αυτό εννοώ , εκεί δεν υπάρχει θέμα , αλλα εάν έχεις κάποια πολύπλοκότερη δήλωση είναι πολύ πιθανό να κάνεις κάποιο λογικό / συντακτικό λάθος επίσης δεν υπάρχει λόγος να χρησιμοποιείς global μεταβλητές > #include <stdio.h> struct s_tag { int x; float y; }; float addition(struct s_tag s_var){ return s_var.x + s_var.y; } int main(void){ struct s_tag z; float result; printf("Δώσε δύο αριθμούς(int,float): "); scanf("%d %f",&(z.x),&(z.y)); result = addition(z); printf("Αποτέλεσμα: %f\n",result); return 0; }
migf1 Δημοσ. 6 Αυγούστου 2011 Δημοσ. 6 Αυγούστου 2011 γιατί παρακαλώ; στο βιβλίο μου δεν έχει παρενθέσεις Εγώ πάλι είμαι κατά της άσκοπης χρήσης των παρενθέσεων. Μόνο αν είναι κάτι πολύπλοκο ή σε macro τις χρησιμοποιώ. Ασχημαίνουν και τον κώδικα
anyp4kouo_ydor Δημοσ. 7 Αυγούστου 2011 Μέλος Δημοσ. 7 Αυγούστου 2011 Τώρα που σας βρήκα να ρωτήσω και αυτό: όταν αρχικοποιώ ένα δείκτη (προς δομή), μου το δέχεται έτσι ># include "stdio.h" struct domi{ int x; float y; }; struct domi arithmoi; struct domi *p_arithmoi=&arithmoi; int main() μου το δέχεται έτσι ># include "stdio.h" struct domi{ int x; float y; }; struct domi arithmoi; struct domi *p_arithmoi; int main() { p_arithmoi=&arithmoi; αλλά δε μου το δεχέται έτσι ># include "stdio.h" struct domi{ int x; float y; }; struct domi arithmoi; struct domi *p_arithmoi; p_arithmoi=&arithmoi; int main() νομίζω ότι ξέρω την αιτία, απλά θέλω να μου την επιβεβαιώσετε. Έχει να κάνει με τον τρόπο που αρχικοποιούνται οι μεταβλητές, ο οποίος είναι στο τμήμα δηλώσεων έτσι <τύπος δεδομένου> <όνομα μεταβλητής> <=τιμή> ή στη main έτσι <όνομα μεταβλητής> <=τιμή>. Αλλά έτσι <όνομα μεταβλητής> <=τιμή> στο τμήμα δηλώσεων δεν γίνεται. Σωστά;;;
ektwr_ Δημοσ. 7 Αυγούστου 2011 Δημοσ. 7 Αυγούστου 2011 Εγώ πάλι είμαι κατά της άσκοπης χρήσης των παρενθέσεων. Μόνο αν είναι κάτι πολύπλοκο ή σε macro τις χρησιμοποιώ. Ασχημαίνουν και τον κώδικα Οκ , δεκτό anyp4kouo_ydor : Δέν μπορείς να έχεις παραστάσεις ξέμπαρκες μέσα στο κώδικα σου , παρα μόνο μέσα σε συναρτήσεις. Τα δύο παραπάνω τα δέχεται γιατι θεωρούνται δηλώσεις/αρχικοποιήσεις global μεταβλητής
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.