Προς το περιεχόμενο

c δομή


anyp4kouo_ydor

Προτεινόμενες αναρτήσεις

Δημοσ.

ρε παιδιά που είναι λάθος ο παρακάτω κώδικας;

 

>#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;
}

Δημοσ.

εντάξει την πρόσθεση την κάνει,

αλλά ο κώδικας δεν μου φαίνεται καθόλου καλά γραμμένος,

έχεις μία global μεταβλητή "z" στην function της δίνεις αποτέλεσμα

και στην επιστροφή στην main της ξανά δίνεις το ίδιο ακριβώς αποτέλεσμα.

 

και προτιμότερο οι δομές να είναι πριν τον υπόλοιπο κώδικα..

Δημοσ.
>
#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;
}

Δημοσ.

Τι λάθος εννοείς, μια χαρά πρόσθεση κάνει αυτός ο κώδικας.

 

 

εμ δε την κάνει... μου βγάζει το παρακάτω μήνυμα λάθους:

 

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));

Δημοσ.

>
#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);
}

Δημοσ.

#include "stdio.h"

//αν έρθει εδώ η δομή δεν θα έχεις error στο compile σου.

struct domi{

int x;

float y;

};

 

κοίτα να δεις!! :-)

 

/* το decleration του structure προηγείται κάποιας οντότητας που το χρησιμοποιεί */

λογικό... τον έριξα στα χάπια τον μεταγλλωτιστή lol

 

 

/* καλύτερα να χρησιμοποποιείς παρενθέσεις */

 

εννοείς για να μη γίνει μπέρδεμα με την προτετραιότητα των τελεστών; εδώ πάντως δε νομίζω ότι υπάρχει θέμα

 

 

return z;//που την κάνεις return

 

την επιστρέφω στο function(arithmoi) εδώ δε νομίζω ότι υπάρχει πρόβλημα

έχεις δίκιο πάντως ότι δίνω 2 φορές τιμή στο z

 

 

 

αν κάνεις debug

 

 

σου είναι κόπος να μου πεις πώς κάνω debug;

 

 

 

για την ποιότητα του κώδικα μη σκάς, για την ώρα με ενδιαφέρει απλά να δουλεύει για να μπορώ να εξασκήθώ. καλό κώδικα θα γράψω στην πορεία, ελπίζω δλδ :-)

Δημοσ.

εμ δε την κάνει... μου βγάζει το παρακάτω μήνυμα λάθους:

 

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.

Α ναι, δίκιο έχει... είναι επειδή στο πρότυπο της συνάρτησης αναφέρεσαι στη δομή πριν την ορίσεις.

 

ΥΓ. Ο κώδικας όντως πάει Αθήνα - Κόρινθο μέσω... Λάρισας πάντως :lol: Αλλά υποθέτω κάνεις τα πρώτα σου βήματα, ε;

Δημοσ.

εξαρτάται ποιον IDE χρησιμοποιείς για να γράψεις τον κώδικά σου, είναι διαφορετικά στον καθένα για να κάνεις debug.

Δημοσ.

Εγώ θα τον έγραφα κάπως έτσι τον κώδικα πάντως:

 

>
#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.

Δημοσ.

 

εννοείς για να μη γίνει μπέρδεμα με την προτετραιότητα των τελεστών; εδώ πάντως δε νομίζω ότι υπάρχει θέμα

 

 

ακριβώς αυτό εννοώ , εκεί δεν υπάρχει θέμα , αλλα εάν έχεις κάποια πολύπλοκότερη δήλωση είναι πολύ πιθανό να κάνεις κάποιο λογικό / συντακτικό λάθος

 

επίσης δεν υπάρχει λόγος να χρησιμοποιείς 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;
}

Δημοσ.

γιατί παρακαλώ; στο βιβλίο μου δεν έχει παρενθέσεις

Εγώ πάλι είμαι κατά της άσκοπης χρήσης των παρενθέσεων. Μόνο αν είναι κάτι πολύπλοκο ή σε macro τις χρησιμοποιώ. Ασχημαίνουν και τον κώδικα :rolleyes:

Δημοσ.

Τώρα που σας βρήκα :D να ρωτήσω και αυτό:

όταν αρχικοποιώ ένα δείκτη (προς δομή), μου το δέχεται έτσι

># 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 έτσι <όνομα μεταβλητής> <=τιμή>. Αλλά έτσι <όνομα μεταβλητής> <=τιμή> στο τμήμα δηλώσεων δεν γίνεται.

Σωστά;;;

Δημοσ.

Εγώ πάλι είμαι κατά της άσκοπης χρήσης των παρενθέσεων. Μόνο αν είναι κάτι πολύπλοκο ή σε macro τις χρησιμοποιώ. Ασχημαίνουν και τον κώδικα :rolleyes:

 

Οκ , δεκτό :)

 

anyp4kouo_ydor : Δέν μπορείς να έχεις παραστάσεις ξέμπαρκες μέσα στο κώδικα σου , παρα μόνο μέσα σε συναρτήσεις.

 

Τα δύο παραπάνω τα δέχεται γιατι θεωρούνται δηλώσεις/αρχικοποιήσεις global μεταβλητής

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...