Βάζοντας και εδώ SIZE 80 δεν καταλαβαίνω τι γλυτώνουμε σε δέσμευση μνήμης με τη malloc. Πάλι τον ίδιο χώρο δεν καταλαμβάνουμε στη μνήμη; Πάλι στατικό δεν είναι το SIZE?
Καλημέρα σας κύριε Ψούνη . Μου βγάζει ο compiler μήνυμα (για μέσα στη main) undefined reference to 'free_record' και error id returned 1 exit status... Θα μπορούσατε να μου εξηγήσετε αν έχω κάνει κάτι λάθος;
Καλησπέρα Σπύρο, πρέπει να υπάρχει κάποιο τυπογραφικό στη δήλωση της free_record. Δες και από εδώ τον κώδικα για αντιπαραβολή: github.com/psounis/C-programming/blob/master/lesson13/efarmogi3.c
Κ.Ψουνη αν στην init_record σαν ορισμα δεν βαλω δεικτη παλι δεν θα πιασει χωρο στην ραμ η εντολη μαλοκ?Ειναι αναγκαστικη δηλαδη η χρηση του δεικτη εδω?
@@psounis Εννουσα στην init_record να περνουσα απεθειας το στιγμιοτυπο record και να εκανα μαλοκ.Εκανα debug και ειδα πως τελικα αυτος ο χωρος δεσμευεται τοπικα στη συναρτηση και οταν επιστρεψω στην main δεν υπαρχει αυτος ο χωρος.Οποτε η απορια λυθηκε.Οπως και να εχει ευχαριστω πολυ!Τα βιντεο σας ειναι παρα πολυ βοηθητικά και κατανοητά!!
Στην create_string: διοχετεύεις σαν όρισμα έναν δείκτη σε συμβολοσειρά, αλλά ωστόσο θέλεις η αλλαγή που κάνεις σε αυτόν τον δείκτη να διατηρείται και μετά το πέρας της συνάρτησης * Πρέπει να περάσεις λοιπόν τη διεύθυνση του δείκτη (αλλιώς δείκτη σε δείκτη), π.χ: void create_string(char **string,int n) { *string=(char *)malloc(sizeof(char)*n); if(!string) { printf("Failed allocating memory."); exit(0); } } κληση: create_string(&a.name,80);
Βάζοντας και εδώ SIZE 80 δεν καταλαβαίνω τι γλυτώνουμε σε δέσμευση μνήμης με τη malloc.
Πάλι τον ίδιο χώρο δεν καταλαμβάνουμε στη μνήμη; Πάλι στατικό δεν είναι το SIZE?
Δεν γλιτώνουμε τίποτα απολύτως όντως. Είναι απλά για εξάσκηση-εμπέδωση επί της δυναμικής δέσμευσης μνήμης (η επανάληψη μήτηρ μαθήσεως)
Καλημέρα σας κύριε Ψούνη . Μου βγάζει ο compiler μήνυμα (για μέσα στη main) undefined reference to 'free_record' και error id returned 1 exit status... Θα μπορούσατε να μου εξηγήσετε αν έχω κάνει κάτι λάθος;
Καλησπέρα Σπύρο, πρέπει να υπάρχει κάποιο τυπογραφικό στη δήλωση της free_record. Δες και από εδώ τον κώδικα για αντιπαραβολή: github.com/psounis/C-programming/blob/master/lesson13/efarmogi3.c
@@psounis Θα το ελέγξω ευχαριστώ πολύ
Κ.Ψουνη αν στην init_record σαν ορισμα δεν βαλω δεικτη παλι δεν θα πιασει χωρο στην ραμ η εντολη μαλοκ?Ειναι αναγκαστικη δηλαδη η χρηση του δεικτη εδω?
Γιώργο, γράψε μου ακριβώς σε κώδικα την εκδοχή της init_record που σκέφτεσαι..
@@psounis Εννουσα στην init_record να περνουσα απεθειας το στιγμιοτυπο record και να εκανα μαλοκ.Εκανα debug και ειδα πως τελικα αυτος ο χωρος δεσμευεται τοπικα στη συναρτηση και οταν επιστρεψω στην main δεν υπαρχει αυτος ο χωρος.Οποτε η απορια λυθηκε.Οπως και να εχει ευχαριστω πολυ!Τα βιντεο σας ειναι παρα πολυ βοηθητικά και κατανοητά!!
δε καταλαβαινω εχουμε τον ιδιο κωδικα και εμενα μου εφανιζει παντου λαθοι που δε μπορω να τα εξηγησω
#include
#include
#define size 80
struct stoixeia{
char *onoma;
char *diefthinsé;
char *arithmos;
char *nomos;
};
typedef struct stoixeia RECORD;
void read_record(RECORD *p);
void print_record(RECORD a);
void init_record(RECORD *p);
void free_record(x);
main()
{
RECORD a,b;
init_record(&a);
init_record(&b);
printf("dwse stoixeia 1ou atomou: ");
read_record(&a);
printf("
dwse stoixeia 2ou atomou: ");
read_record(&b);
print_record(a);
printf("
===============
");
print_record(b);
free_record(a);
free_record(b);
}
void read_record(RECORD *p)
{
printf("
dwse to onoma: ");
scanf("%s",p->onoma);
printf("
dwse thn diefthinsi: ");
scanf("%s",p->diefthinsi);
printf("
dwse to arithmos: ");
scanf("%s",p->arithmos);
printf("
dwse nomo: ");
scanf("%s",p->nomos);
}
void print_record(RECORD a)
{
printf("
onoma:%s",a.onoma);
printf("
diefthinsi:%s",a.diefthinsi);
printf("
arithmos:%s",a.arithmos);
printf("
nomos:%s",a.nomos);
}
void init_record(RECORD *p)
{
p->onoma=malloc(sizeof(char)*size);
if(!p->onoma)
{
printf("
adunamia desmesushs mnhmhs");
exit(0);
}
p->diefthisi=malloc(sizeof(char)*size);
if(!p->diefthinsi)
{
printf("
adunamia desmesushs mnhmhs");
exit(0);
}
p->arithmos=malloc(sizeof(char)*size);
if(!p->arithmos)
{
printf("
adunamia desmesushs mnhmhs");
exit(0);
}
p->nomos=malloc(sizeof(char)*size);
if(!p->nomos)
{
printf("
adunamia desmesushs mnhmhs");
exit(0);
}
void free_record(x)
{
free(x.onoma);
free(x.diefthinsi);
free(x.arithmos);
free(x.nomos);
}
}
Κάποιο λαθάκι στην πληκτρολόγηση θα 'χεις. Τον κώδικα τον βρίσκεια και εδώ:
github.com/psounis/C-programming
#include
#include
struct person{
char *name;
char *address;
char *number;
char *county;
};
typedef struct person RECORD;
void read_record(RECORD *r);
void print_record(RECORD r);
void clean_stdin(void);
void create_string(char *string,int n);
void destroy_string(char *string,int n);
int main()
{
RECORD a;
/*Allocating memory for the strings*/
create_string(a.name,80);
create_string(a.address,80);
create_string(a.number,80);
create_string(a.county,80);
read_record(&a);
print_record(a);
destroy_string(a.name,80);
destroy_string(a.address,80);
destroy_string(a.number,80);
destroy_string(a.county,80);
}
void read_record(RECORD *r)
{
printf("
Give the name: ");
scanf("%s",r->name);
clean_stdin();
printf("
Give the address: ");
scanf("%s",r->address);
clean_stdin();
printf("
Give the number: ");
scanf("%s",r->number);
clean_stdin();
printf("
Give the county: ");
scanf("%s",r->county);
}
void print_record(RECORD x)
{
printf("
RECORD
==============
");
printf("Name: %s
",x.name);
printf("Address: %s
",x.address);
printf("Number: %s
",x.number);
printf("County: %s
",x.county);
}
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '
' && c != EOF);
}
void create_string(char *string,int n)
{
string=malloc(sizeof(char)*n);
if(!string)
{
printf("Failed allocating memory.");
exit(0);
}
}
void destroy_string(char *string,int n)
{
free(string);
}
μου βγαζει ως αποτελεσμα:
RECORD
==============
Name: (null)
Address: (null)
Number: (null)
County: (null)
για ποιον λογο δεν δουλευει??
Στην create_string: διοχετεύεις σαν όρισμα έναν δείκτη σε συμβολοσειρά, αλλά ωστόσο θέλεις η αλλαγή που κάνεις σε αυτόν τον δείκτη να διατηρείται και μετά το πέρας της συνάρτησης
* Πρέπει να περάσεις λοιπόν τη διεύθυνση του δείκτη (αλλιώς δείκτη σε δείκτη), π.χ:
void create_string(char **string,int n)
{
*string=(char *)malloc(sizeof(char)*n);
if(!string)
{
printf("Failed allocating memory.");
exit(0);
}
}
κληση:
create_string(&a.name,80);