Δημοσιεύτηκε: 29 Σεπ 2011, 09:17
Για την 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() για την δική μας περίπτωση...
Όσο για το ίδιο το 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;
}