migf1 έγραψε:Αν βρω χρόνο θα ποστάρω αργότερα κώδικα με ένα τυπικό interface για απλή διαχείριση δομών ArrInt

Λοιπόν, έγραψα στα γρήγορα ένα μίνι interface συναρτήσεων για διαχείριση πινάκων ακεραίων με μεταβλητό μεγέθος.
Βασικά έφτιαξα συναρτήσεις μονάχα για: αρχικοποίηση, αλλαγή μεγέθους, γέμισμα με τυχαίες τιμές (για να μην τις περνάω με το χέρι

), εναλλαγή (swap), τύπωμα περιεχομένων (πλήθος στοιχείων και τιμές στοιχείων) και καθαρισμό (cleanup). Η main() είναι ουσιαστικά δείγμα χρήσης του μίνι αυτού interface.
Βαριέμαι τώρα να το ανεβάσω στο ideone, οπότε το βάζω εδώ (ελπίζω να μη χαλάσει πολύ τα tabs). Αποτελεί πολύ καλό αντικείμενο μελέτης για όποιον ενδιαφέρεται, μιας και δεν χρησιμοποιεί τίποτα ιδιαίτερα προχωρημένο. Ενδιαφέρον έχει κι ο κώδικας της arrint_printf() που δείχνει πως φτιάχνονται συναρτήσεις εκτύπωσης αγνώστου πλήθους παραμέτρων

- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>
typedef enum { FALSE=0, TRUE } Bool;
typedef unsigned int uint;
typedef struct ArrInt {
uint len;
int *data;
} ArrInt;
#define pressENTER() \
do{ \
char mYcHAr; \
printf("\npress ENTER..."); \
while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF ) \
; \
}while(0)
/* -------------------------------------------------------
* Initialize ArrInt data for len elements.
* -------------------------------------------------------
*/
Bool arrint_init( ArrInt *arrint, const uint len )
{
if ( !arrint )
return FALSE;
if ( NULL == (arrint->data = calloc(len, sizeof(int))) )
return FALSE;
arrint->len = len;
return TRUE;
}
/* -------------------------------------------------------
* Resize ArrInt data to newlen elements.
* cleanextra decides whether extra-elements will be 0'ed or left with garbage values.
* -------------------------------------------------------
*/
Bool arrint_resize( ArrInt *arrint, const uint newlen, const Bool cleanextra )
{
int *try = NULL;
if ( !arrint || newlen < 1 )
return FALSE;
if ( arrint->len == newlen)
return TRUE;
if ( NULL == (try = realloc(arrint->data, newlen * sizeof(int))) )
return FALSE;
if ( newlen > arrint->len && cleanextra )
memset( &try[ arrint->len ],
0,
(newlen - arrint->len) * sizeof(int)
);
arrint->len = newlen;
arrint->data = try;
return TRUE;
}
/* -------------------------------------------------------
* Fill ArrInt data with random values.
* -------------------------------------------------------
*/
Bool arrint_fill_randomly( ArrInt *arrint )
{
uint i = 0;
if ( !arrint )
return FALSE;
for (i=0; i < arrint->len; i++ )
arrint->data[i] = (rand() % arrint->len) * 10;
return TRUE;
}
/* -------------------------------------------------------
* Swap two ArrInt structures
* -------------------------------------------------------
*/
Bool arrint_swap( ArrInt *arrint1, ArrInt *arrint2 )
{
ArrInt temp;
size_t size = sizeof(ArrInt);
if ( !arrint1 || !arrint2 )
return FALSE;
memcpy( &temp, arrint1, size );
memcpy( arrint1, arrint2, size );
memcpy( arrint2, &temp, size );
return TRUE;
}
/* -------------------------------------------------------
* Print contents of an ArrInt structure.
* -------------------------------------------------------
*/
void arrint_printf( const ArrInt *arrint, const char *fmttext, ... )
{
uint i = 0;
if ( !arrint || arrint->len < 1 )
return;
if ( fmttext ) {
va_list args;
va_start( args, fmttext );
vprintf( fmttext, args );
va_end( args );
}
for (i=0; i < arrint->len; i++)
printf( "%d ", arrint->data[i] );
putchar('\n');
return;
}
/* -------------------------------------------------------
* Cleanup an ArrInt structure.
* -------------------------------------------------------
*/
void arrint_cleanup( ArrInt *arrint )
{
if ( !arrint )
return;
if ( arrint->data ) {
free( arrint->data );
arrint->data = NULL;
}
arrint->len = 0;
return;
}
/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
int main( void )
{
ArrInt arr1, arr2; /* two ArrInt structures */
srand( time(NULL) );
/* init arr1 for 10 elems & arr2 for 15 elems */
if ( !arrint_init( &arr1, 10 ) )
goto exit_failure;
if ( !arrint_init( &arr2, 15 ) )
goto exit_failure;
/* fill randomly arr1 & arr2 */
puts( "\nBEFORE ----------------------" );
arrint_fill_randomly( &arr1 );
arrint_fill_randomly( &arr2 );
/* print arr1 & arr2 elements */
arrint_printf( &arr1, "\narr1 (%d elems):\n", arr1.len );
arrint_printf( &arr2, "\narr2 (%d elems):\n", arr2.len );
arrint_swap( &arr1, &arr2 );
puts( "\nAFTER -----------------------" );
arrint_printf( &arr1, "\narr1 (%d elems):\n", arr1.len );
arrint_printf( &arr2, "\narr2 (%d elems):\n", arr2.len );
/* resize arr1 form 15 elems (after the swapping) to 20 elems */
if ( arrint_resize( &arr1, 20, TRUE ) )
arrint_printf( &arr1, "\nRESIZED arr1 (%d elems):\n", arr1.len );
/* cleanup & exit */
arrint_cleanup( &arr1 );
arrint_cleanup( &arr2 );
pressENTER();
exit( EXIT_SUCCESS );
exit_failure:
arrint_cleanup( &arr1 );
arrint_cleanup( &arr2 );
pressENTER();
exit( EXIT_FAILURE );
}