Συμφωνώ με το Star_Light, ως προς το ότι έχουμε βελτιωθεί κάπως
Συντονιστής: konnn


stamatiou έγραψε:Τελικα εμενα γιατι μου δειχνει τον πινακα αδειο;
Edit:
1. Δηλαδή τέρμα οι ασκήσεις;!
2. Διάβασα σε ένα βιβλίο ότι αν δεν έχεις δοκιμάσει debugging μέχρι τώρα, είναι σαν να είσαι γιατρός του 17ου αιώνα που δε χρησιμοποιεί μικροσκόπιο, ισχύει;

stamatiou έγραψε:Να με και εγώ! Προσπάθησα να κάνω την append και την prepend αλλά και μου βγήκε ο κώδικας: http://ideone.com/zheFD
Γιατί μου λέει ότι είναι άδειος;
/* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
*/
Bool table_append_element( Table *table, const int element )
{
if ( !table ) /* έλεγχος ασφαλείας */
return FALSE; /* ... πρόωρη έξοδος */
if ( !table->buffer ) /* το buffer δεν υπάρχει */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen < 0 ) /* αποτροπή άκυρης θέσης */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen == table->bufmaxlen ) /* το buffer είναι γεμάτο */
return FALSE; /* ... πρόωρη έξοδος */
table->buffer[ table->buflen ] = element; /* εισαγωγή του element */
table->buflen++; /* ενημέρωση τρέχοντος μήκους */
return TRUE;
}

/* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
*/
Bool table_prepend_element( Table *table, const int element )
{
if ( !table ) /* έλεγχος ασφαλείας */
return FALSE; /* ... πρόωρη έξοδος */
if ( !table->buffer ) /* το buffer δεν υπάρχει */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen < 0 ) /* αποτροπή άκυρης θέσης */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen == table->bufmaxlen ) /* το buffer είναι γεμάτο */
return FALSE; /* ... πρόωρη έξοδος */
/* μετακίνηση στοιχείων δεξιά */
memmove( &table->buffer[1], &table->buffer[0], table->buflen * sizeof(int) );
table->buffer[ 0 ] = element; /* εισαγωγή του element */
(table->buflen)++; /* ενημέρωση τρέχοντος μήκους */
return TRUE;
}


Star_Light έγραψε:Καλησπερα σε όλους. Προσφατα ανακαλυψα πως μπορεις να δουλευεις - να μαθαινεις και να πληρωνεσαι ταυτοχρονα!!!!
https://www.odesk.com/jobs/c/#filter/?q=c&st=0&skip=10
![]()
αυτο ειναι ειδικα για την C!

migf1 έγραψε:stamatiou έγραψε:Να με και εγώ! Προσπάθησα να κάνω την append και την prepend αλλά και μου βγήκε ο κώδικας: http://ideone.com/zheFD
Γιατί μου λέει ότι είναι άδειος;
Καλημέρα,
σχετικά με την append σου βγάζει άδειο τον πίνακα διότι αντί να εισαγάγεις το value στη θέση [table->buflen], το εισαγάγεις στην αμέσως επόμενη. Οπότε στη θέση [table->buflen] παραμένει ως τιμή η TABLE_EMPTYCELL
Δυο ακόμα επισημάνεις: α) να αποφεύγεις να χρησιμοποιείς τα ++ και -- ως πρόθεμα μεταβλητών, να τα προτιμάς ως επίθεμα και β) το: [++table->buflen] δεν είμαι σίγουρος αν αυξάνει κατά 1 τον δείκτη table ή το πεδίο buflen (νομίζω τον δείκτη αυξάνει)... ακριβώς επειδή δεν είμαι σίγουρος, και για να μη ψάχνω στα εγχειρίδια, προτιμώ τη σιγουριά του: [ ++(table->buflen) ] το οποίο αυξάνει σίγουρα το πεδίο buflen.
Επίσης, η συνάρτησή σου δεν ελέγχει αν το buffer είναι ήδη γεμάτο πριν επιχειρήσει να εισαγάγει το value. Ούτε ελέγχει αν έστω και κατά λάθος, το table->buflen έχει αρνητική τιμή... περίπτωση κατά την οποία θα προκαλέσει segmentation fault
Και τελος, το: table->bufsize = sizeof(table->buffer) και περιττό είναι, και λάθος. Λάθος είναι διότι το buffer δεν έχει οριστεί ως array, αλλά ως δείκτης που έχει γίνει calloc()... οπότε το sizeof() σου δίνει πάντα το ίδιο νούμερο, που ισούται με τον αριθμό των bytes που καταλαμβάνει ο οποιοσδήποτε δείκτης στην πλατφόρμα σου. Για να βρεις το μέγεθος του buffer σε bytes, πρέπει να κάνεις: table->bufmaxlen * sizeof( int ) ... αλλά δεν το χρειάζεσαι στη συνάρτηση αυτή! Το μέγεθος του buffer σε bytes υπολογίζεται έτσι κι αλλιώς μια φορά στην table_init(), αποθηκεύεται στο table->bufsize και τέρμα.
Ίσως ήθελες να βρεις το μέγεθος σε bytes των γεμάτων στοιχείων του buffer, που ισούται με: table->buflen * sizeof( int ) αλλά αυτή την πληροφορία δεν την χρησιμοποιούμε στην άσκηση.
Παραθέτω τον κώδικα της append...
- Κώδικας: Επιλογή όλων
/* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
*/
Bool table_append_element( Table *table, const int element )
{
if ( !table ) /* έλεγχος ασφαλείας */
return FALSE; /* ... πρόωρη έξοδος */
if ( !table->buffer ) /* το buffer δεν υπάρχει */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen < 0 ) /* αποτροπή άκυρης θέσης */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen == table->bufmaxlen ) /* το buffer είναι γεμάτο */
return FALSE; /* ... πρόωρη έξοδος */
table->buffer[ table->buflen ] = element; /* εισαγωγή του element */
table->buflen++; /* ενημέρωση τρέχοντος μήκους */
return TRUE;
}
ΥΓ. Για την prepend() θα σου γράψω λίγο πιο μετά, γιατί έχω λίγη δουλίτσα τώρα.
migf1 έγραψε:Για την prepend, το 1ο που βλέπω είναι πως μέσα στο loop ξεκινάς με: table->buffer[i] = tmp; με το tmp να έχει undefined τιμή!
Όσο για το ίδιο το loop, δεν το έκανα trace (μπορείς να το κάνεις εσύ, είτε με χαρτί & μολύβι, είτε προσθέτοντας printf να σου τυπώνουν τις τιμές των στοιχείων σε ενδιάμεσα στάδια, είτε με debugger).
Για αυτές τις δουλειές πάντως (εννοώ τη μαζική μετακίνηση συνεχόμενων στοιχείων) ο ενδεδειγμένος και μακράν ταχύτερος τρόπος είναι με χρήση της έτοιμης συνάρτησης: memmove... δες επίσης κι εδώ: http://www.java-samples.com/showtutoria ... rialid=591.
Παραθέτω και τον κώδικα της table_prepend_element() για την δική μας περίπτωση...
- Κώδικας: Επιλογή όλων
/* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
*/
Bool table_prepend_element( Table *table, const int element )
{
if ( !table ) /* έλεγχος ασφαλείας */
return FALSE; /* ... πρόωρη έξοδος */
if ( !table->buffer ) /* το buffer δεν υπάρχει */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen < 0 ) /* αποτροπή άκυρης θέσης */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen == table->bufmaxlen ) /* το buffer είναι γεμάτο */
return FALSE; /* ... πρόωρη έξοδος */
/* μετακίνηση στοιχείων δεξιά */
memmove( &table->buffer[1], &table->buffer[0], table->buflen * sizeof(int) );
table->buffer[ 0 ] = element; /* εισαγωγή του element */
(table->buflen)++; /* ενημέρωση τρέχοντος μήκους */
return TRUE;
}


