Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 16 Φεβ 2012, 17:03

Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
int slen;
char *s;

printf(" How long the string? : ");
scanf("%d" , &slen);

printf(" Give a string : ");
fgets(s , slen , stdin);

s = malloc(slen + 1);

if( s == NULL)
printf(" malloc() failed ");

printf(" %lu " , strlen(s) + 1);
puts(s);

return 0;
}


προσπαθω να φτιαξω ενα παραδειγμα τελοςπαντων με μεγεθος που θα δινει ο χρήστης.
Υποτιθεται πως αυτο ειναι το δυναμικο που λεμε... και ακομη δεν μου κολλαει καπως στο αρχικο παραδειγμα
που έδωσες το #define στην αρχη.... δεν ξερω εφοσον το οριζεις εξαρχης νομιζω ειναι προκαθορισμενο ειτε ο χρηστης δωσει
10 ειτε 20..... εκτος και αν εσωτερικα η malloc παντα δεσμευει ή 10 ή 20 τα ελευθερωνει και το #define MAXSLEN(80+1) ειναι απλα
ενα πάνω οριο το οποιο βαζεις εσυ για να μην σου βαλει το ιδιο το λειτουργικο συστημα . Και στην περιπτωση των στατικων πινακων
το #define MAXSLEN(80+1) αν δωσεις εσυ 20 ή 10 τοτε ολα τα αλλα μενουν κενα...... στη μνημη.... καταλαβαινεις τι ρωταω???
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Φεβ 2012, 17:19

Πέρα του ότι δεν κάνεις free() στο τέλος, του ότι δεν αρχικοποιείς το s σε NULL και του ότι χρησιμοποιείς το s (στην strlen() και την puts()) ακόμα κι αν έχει αποτύχει το malloc() του, τι άλλο πρόβλημα έχει ο κώδικας αυτός;

Όσο για την ερώτηση, σου εξήγησα πως στα δυναμικά strings μπορείς να τους αυξομειώσεις το μέγιστο μήκος τους όποτε γουστάρεις με realloc(), άσχετα με το σε τι μέγεθος τα έχεις δημιουργήσει αρχικά.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Φεβ 2012, 17:26

Ορίστε μια ωραία άσκηση για αρχάριο σε δυναμικά strings: Γράψε ένα πρόγραμμα που θα διαβάζει από την κύρια είσοδο ένα c-string, ανεξαρτήτως πλήθους χαρακτήρων που θα πληκτρολογήσει ο χρήστης.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 16 Φεβ 2012, 17:28

Οταν έχω

Κώδικας: Επιλογή όλων


#define MAXSLEN (80 + 1)

...
int main()
{
char s1[MAXSLEN] = {'\0'};


και

Κώδικας: Επιλογή όλων


char *s1 = {'\0'};

....
printf( " Give MAXSLEN : ");
.....
s= malloc( MAXSLEN + 1 ) ;

....



Α) Τοτε στην 1η στατική περιπτωση δηλωσης ενος string άν εγω δωσω λέξη μήκους 60 τα 20 έχουν δεσμευτεί στην μνήμη και μένουν αχρησιμοποίητα?

Β) Δινω ακριβως στο 2ο παράδειγμα την μνήμη που θέλω να δεσμευτεί καθε φορα μεσω της MAXSLEN

O Κωδικας που παρέθεσα έχει προβλημα.... αν τον τρεξεις θα δεις. :( :( :(

θα τρεξει ομως... δεν ειναι στο χερι του.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Φεβ 2012, 17:35

Star_Light έγραψε:Οταν έχω
Spoiler: show
Κώδικας: Επιλογή όλων


#define MAXSLEN (80 + 1)

...
int main()
{
char s1[MAXSLEN] = {'\0'};


και

Κώδικας: Επιλογή όλων


char *s1 = {'\0'};

....
printf( " Give MAXSLEN : ");
.....
s= malloc( MAXSLEN + 1 ) ;

....



Α) Τοτε στην 1η στατική περιπτωση δηλωσης ενος string άν εγω δωσω λέξη μήκους 60 τα 20 έχουν δεσμευτεί στην μνήμη και μένουν αχρησιμοποίητα?

21 έχουν δεσμευτεί κι έχουν μείνει αχρησιμοποιητα
έγραψε:
Β) Δινω ακριβως στο 2ο παράδειγμα την μνήμη που θέλω να δεσμευτεί καθε φορα μεσω της MAXSLEN

Όχι κάθε φορά, την 1η μόνο φορά, αργότερα μπορείς να το κάνεις realloc() σε διαφορετικό μέγεθος. Επίσης είναι τελείως λάθος αυτό που έχεις γράψει για το δυναμικό s! Το σωστό είναι έτσι...

Κώδικας: Επιλογή όλων

char *s1 = NULL;
...
s1 = calloc( MAXSLEN, sizeof(char));
if ( !s ) {
// handle the error here
}
...
free(s);


Το αν θα το φτιάξεις αρχικά με MAXSLEN ή με κάποιο νούμερο που θα σου δώσει χρήστης είναι δική σου απόφαση.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Φεβ 2012, 17:38

Btw, σκας και γάιδαρο :P ... ή φοράς παρωπίδες ή μας γράφεις στα αποτέτοια σου και τσάμπα γράφουμε... ρωτάς συνέχεια τα ίδια πράγματα!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Φεβ 2012, 17:55

Star_Light έγραψε:
O Κωδικας που παρέθεσα έχει προβλημα.... αν τον τρεξεις θα δεις. :( :( :(

Έχει τα προβλήματα που σου έγραψα πιο πριν. Το 1 που βγάζει ως αποτέλεσμα είναι σωστό όμως. To strlen() μετράει τρέχον μήκος και όχι μέγιστο μήκος.
Το μέγεθος του μέγιστου μήκους το μετράει το sizeof() αλλά ΟΧΙ στα δυναμικά strings, μόνο στα στατικά.

Στα δυναμικά strings το sizeof επιστρέφει το μέγεθος του ονόματος-δείκτη (που είναι όσα bytes καταλαμβάνει οποιοσδήποτε δείκτης στο σύστημά σου). Στα δυναμικά strings το μέγεθος του μέγιστου μήκους τους το διαχειρίζεσαι μόνος σου (εσύ δηλαδή ξέρεις σε τι μέγεθος έχεις δημιουργήσει αρχικά το string).
Τελευταία επεξεργασία από migf1 και 16 Φεβ 2012, 17:56, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 16 Φεβ 2012, 17:56

Γιατι το

Κώδικας: Επιλογή όλων
if ( s == NULL )


ειναι λάθος ρε συ... αφου αυτο δεν εξετάζουμε? Για να πουμε αν η malloc απετυχε ή οχι?
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Φεβ 2012, 18:08

Star_Light έγραψε:Γιατι το

Κώδικας: Επιλογή όλων
if ( s == NULL )


ειναι λάθος ρε συ... αφου αυτο δεν εξετάζουμε? Για να πουμε αν η malloc απετυχε ή οχι?

Που είδες ότι είναι λάθος αυτό;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 16 Φεβ 2012, 18:12

ααα οκ δεν εννοουσες μεσα στην if. Τελοςπαντων.... απο οτι βλεπω εχουν προκυψει θεματακια τα οποια ελπιζω μαζι και με την ασκηση που έδωσες να τα έχω βγαλει μεχρι τελος Φεβρουαριου για να μπορεσω να συνεχισω το κολπο με τις κρυπτογραφησεις. -.-
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron