Dynamic Array

Dynamic Array — Dynamic Arrays of undefinite data

Stability Level

Unstable, unless otherwise indicated

Synopsis

#include <mlib.h>

MStatus             (*MDArraySetNoElement)              (mpointer ___array___,
                                                         const msize len);
struct              MDArray;
#define             M_DARRAY                            (data)
#define             M_DARRAY_type_string_element        (data)
#define             M_DARRAY_type_size_element          (data)
#define             M_DARRAY_type_size_array            (data)
#define             M_DARRAY_len_array                  (data)
#define             M_DARRAY_len_elements               (data)
#define             M_DARRAY_set_noelement              (data)
#define             M_DARRAY_user                       (data)
#define             M_DARRAY_                           (data)
#define             M_DARRAY_REF                        (data,
                                                         type)
#define             M_DARRAY_INS                        (data,
                                                         type,
                                                         index)
#define             M_DARRAY_REM                        (data,
                                                         type,
                                                         index)
MDArray *           m_darray_new                        (const mchars type_string_element,
                                                         const msize type_size_element,
                                                         const msize len_array,
                                                         MDArraySetNoElement set_noelement);
mpointer            m_darray_free                       (MDArray *darray);
MStatus             m_darray_full_free                  (MDArray *darray);
MStatus             m_darray_element_inserted           (MDArray *darray,
                                                         msize index);
MStatus             m_darray_element_removed            (MDArray *darray,
                                                         msize index);
MStatus             m_darray_set_noelement              (MDArray *darray);
#define             m_c_darray_element_inserted         (darray,
                                                         index)
#define             m_c_darray_element_removed          (darray,
                                                         index)

Description

Attraverso le strutture MDArray è possibile gestire array dinamici adoperando le potenzialità delle strutture derivate.

Ogni struttura di tipo MDArray possiede l'indirizzo di un array dinamico che viene memorizzato come mpointer, per questo è necessario utilizzare le macros specifiche per adoperare i corretti casting e poter utilizzare liberamente l'array dinamico.

Example 14. Using MDArray


#include <mlib.h>
#include <glib/gprintf.h>


    MStatus
    set_noelement ( mpointer     ___array___,
                    msize          _len       )
{
    mint index, len; len = (mint)_len;

    for ( index = 0; index <len; index++ )
    {
        ((mchar*)___array___)[index] = 'x';
    }

    return MCORRECT;
}


int
m_main ( argc, argv )
{
    m_main_init ( argc, argv );

    MDArray* array = m_darray_new ( M_STRSIZE_FROM_TYPE (mchar), 5, set_noelement );

    g_printf ( "\n type_string_element: %s \n", M_DARRAY_type_string_element(array) );
    g_printf ( "\n type_size_element:   %lu \n", M_DARRAY_type_size_element(array) );
    g_printf ( "\n type_size_array:     %lu \n", M_DARRAY_type_size_array(array) );
    g_printf ( "\n len_array:           %lu \n", M_DARRAY_len_array(array) );
    g_printf ( "\n len_elements:        %lu \n", M_DARRAY_len_elements(array) );

    g_printf ( "\n array:               %p \n", ((mchar*)M_DARRAY_(array)) );

    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[0] );
    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[1] );

    M_DARRAY_REF (array, mchar)[0] = 'a'; m_darray_element_inserted ( array, 0 );
    M_DARRAY_REF (array, mchar)[1] = 'b'; m_darray_element_inserted ( array, 1 );

    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[0] );
    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[1] );
    g_printf ( "\n len_elements:        %lu \n", M_DARRAY_len_elements(array) );

    // M_DARRAY_set_noelement(array) ( M_DARRAY_(array), M_DARRAY_len_array(array) );

    m_darray_set_noelement ( array );

    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[0] );
    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[1] );
    g_printf ( "\n len_elements:        %lu \n", M_DARRAY_len_elements(array) );

    M_DARRAY_INS (array, mchar, 0)[0] = 'c';
    M_DARRAY_INS (array, mchar, 1)[1] = 'd';

    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[0] );
    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[1] );
    g_printf ( "\n len_elements:        %lu \n", M_DARRAY_len_elements(array) );

    M_DARRAY_REM (array, mchar, 0)[0] = 'X';
    M_DARRAY_REM (array, mchar, 1)[1] = 'X';

    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[0] );
    g_printf ( "\n %c; \n", M_DARRAY_REF (array, mchar)[1] );
    g_printf ( "\n len_elements:        %lu \n", M_DARRAY_len_elements(array) );

    mchar* dynamic_array = (mchar*)m_darray_free ( array );

    g_printf ( "\n dynamic : %c; \n", dynamic_array[0] );
    g_printf ( "\n dynamic : %c; \n", dynamic_array[1] );

    g_free ( dynamic_array );

    return MCORRECT;
}

  


Details

MDArraySetNoElement ()

MStatus             (*MDArraySetNoElement)              (mpointer ___array___,
                                                         const msize len);

Utilizzato nella inizializzazione dell' array dinamico contenuto nella struttura derivata MDArray.

___array___ :

indirizzo di un array dinamico valido

len :

quantità di elementi contenuti nell'array dinamico

Returns :

MCORRECT o MERROR in caso di errore.

struct MDArray

struct MDArray {
        const mchars            type_string_element;
        const msize             type_size_element;
        const msize             type_size_array;
        const msize             len_array;
        const msize             len_elements;

        MDArraySetNoElement     set_noelement;

        const mpointer          array;
};

Contiene un array dinamico ed una serie di informazioni e strumenti utili alla sua gestione.

La proprietà len_elements è un elemento instabile della struttura derivata. Ciò è di peso dalla libertà di azione che l'user dispone rispetto alla gestione degli elementi inseriti o rimossi nell'array dinamico.

Se utilizzata in una struttura non e' necessario che questa contenga una MDefine poiche' gia' presente nella MDArray.

Questa è una struttura derivata ed è diretta evoluzione della struttura MBoxData, della quale eredita le proprietà.

const mchars type_string_element;

tipo, sottoforma di stringa, dell'elemento inseribile nell'array dinamico - only Read

const msize type_size_element;

dimensione in byte del tipo inseribile nell'array dinamico - only Read

const msize type_size_array;

dimensione in byte dell'intero array dinamico - only Read

const msize len_array;

quantità di elementi inseribili nell'array dinamico - only Read

const msize len_elements;

quantità di elementi inseriti nell'array dinamico - only Read

MDArraySetNoElement set_noelement;

indirizzo ad una funzione di inizializzazzione dell'array dinamico - Read / Write

const mpointer array;

indirizzo ad un array dinamico - only Read

M_DARRAY()

    #define M_DARRAY(data)     ds_CAST (MDArray*,data)

stability: Unstable

Provvede al casting di una struttura data ritornando una struttura di tipo MDArray

data :

struttura derivata

M_DARRAY_type_string_element()

    #define M_DARRAY_type_string_element(data)     ds_GET_PROPERTY(M_DARRAY(data),type_string_element)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "type_string_element"

data :

una struttura derivata

M_DARRAY_type_size_element()

    #define M_DARRAY_type_size_element(data)     ds_GET_PROPERTY(M_DARRAY(data),type_size_element)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "type_size_element"

data :

una struttura derivata

M_DARRAY_type_size_array()

    #define M_DARRAY_type_size_array(data)     ds_GET_PROPERTY(M_DARRAY(data),type_size_array)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "type_size_array"

data :

una struttura derivata

M_DARRAY_len_array()

    #define M_DARRAY_len_array(data)     ds_GET_PROPERTY(M_DARRAY(data),len_array)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "len_array"

data :

una struttura derivata

M_DARRAY_len_elements()

    #define M_DARRAY_len_elements(data)     ds_GET_PROPERTY(M_DARRAY(data),len_elements)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "len_elements"

data :

una struttura derivata

M_DARRAY_set_noelement()

    #define M_DARRAY_set_noelement(data)     ds_GET_PROPERTY(M_DARRAY(data),set_noelement)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "set_noelement"

data :

una struttura derivata

M_DARRAY_user()

    #define M_DARRAY_user(data)     ds_GET_PROPERTY(M_DARRAY(data),user)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "user"

data :

una struttura derivata

M_DARRAY_()

    #define M_DARRAY_(data)     ds_GET_PROPERTY(M_DARRAY(data),array)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "array", l'array dinamico è ancora nella forma di (void*)array[]

data :

una struttura derivata

M_DARRAY_REF()

    #define M_DARRAY_REF(data,type) ((type*)M_DARRAY_(data))

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "array", quindi effettua un ulteriore casting ritornando l'array dinamico utilizzabile.

data :

una struttura derivata

type :

tipo dell'elemento inseribile nell'array dinamico

M_DARRAY_INS()

#define             M_DARRAY_INS(data,type,index)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "array", quindi effettua un ulteriore casting ritornando l'array dinamico utilizzabile.

Prima di queste operazioni segna come "element inserted" la posizione index dell'array dinamico parte del MDArray.

data :

una struttura derivata

type :

tipo dell'elemento inseribile nell'array dinamico

index :

un identificativo di posizione valido

M_DARRAY_REM()

#define             M_DARRAY_REM(data,type,index)

stability: Unstable

Provvede al casting di un dato data ritornando la proprietà "array", quindi effettua un ulteriore casting ritornando l'array dinamico utilizzabile.

Prima di queste operazioni segna come "element removed" la posizione index dell'array dinamico parte del MDArray.

data :

una struttura derivata

type :

tipo dell'elemento inseribile nell'array dinamico

index :

un identificativo di posizione valido

m_darray_new ()

MDArray *           m_darray_new                        (const mchars type_string_element,
                                                         const msize type_size_element,
                                                         const msize len_array,
                                                         MDArraySetNoElement set_noelement);

stability: Unstable

Crea un nuovo MDArray.

Per semplificare il codice è possibile utilizzare la macro M_STRSIZE_FROM_TYPE al posto dei primi due argomenti.

type_string_element :

tipo, sottoforma di stringa, dell'elemento inseribile nell'array dinamico - only Read

type_size_element :

dimensione in byte del tipo inseribile nell'array dinamico - only Read

len_array :

quantità di elementi inseribili nell'array dinamico - only Read

set_noelement :

indirizzo ad una funzione di inizializzazzione dell'array dinamico - Read / Write

Returns :

un nuovo MDArray o NULL in caso di errore.

Since 0.0.2


m_darray_free ()

mpointer            m_darray_free                       (MDArray *darray);

stability: Unstable

Libera la memoria allocata per una MDArray. L'array dinamico parte della MDArray resta a disposizione fino al termine del programma.

darray :

indirizzo ad una struttura derivata allocata di tipo MDArray

Returns :

l'indirizzo dell'array dinamico parte della MDArray o NULL in caso di errore.

Since 0.0.2


m_darray_full_free ()

MStatus             m_darray_full_free                  (MDArray *darray);

stability: Unstable

Libera la memoria allocata per una MDArray. L'array dinamico parte della MDArray viene anch'esso liberato.

darray :

indirizzo ad una struttura derivata allocata di tipo MDArray

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_darray_element_inserted ()

MStatus             m_darray_element_inserted           (MDArray *darray,
                                                         msize index);

stability: Unstable

Segna come "element inserted" una posizione di un array dinamico parte di una MDArray.

darray :

indirizzo ad una struttura derivata allocata di tipo MDArray

index :

identificativo di una posizione all'interno di un array dinamico parte di un MDArray

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_darray_element_removed ()

MStatus             m_darray_element_removed            (MDArray *darray,
                                                         msize index);

stability: Unstable

Segna come "element removed" una posizione di un array dinamico parte di una MDArray.

darray :

indirizzo ad una struttura derivata allocata di tipo MDArray

index :

identificativo di una posizione all'interno di un array dinamico parte di un MDArray

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_darray_set_noelement ()

MStatus             m_darray_set_noelement              (MDArray *darray);

stability: Unstable

Provvede a chiamare la funzione di risettaggio della proprietà "set_noelement" passando come argomenti l'array dinamico parte della MDArray e il valore della proprietà "len_array". Segna come "element removed" tutte le posizioni dell'array dinamico parte della MDArray.

darray :

indirizzo ad una struttura derivata allocata di tipo MDArray

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_c_darray_element_inserted()

#define             m_c_darray_element_inserted(darray,index)

stability: Unstable

Come la funzione m_darray_element_inserted() , provvede a passare il dato castato.

darray :

array dove segnare inserito un elemento

index :

un identificativo di posizione valido

m_c_darray_element_removed()

#define             m_c_darray_element_removed(darray,index)

stability: Unstable

Come la funzione m_darray_element_removed() , provvede a passare il dato castato.

darray :

array dove segnare rimosso un elemento

index :

un identificativo di posizione valido