Static Array

Static Array — Static Arrays of undefinite data

Stability Level

Unstable, unless otherwise indicated

Synopsis

#include <mlib.h>

MStatus             (*MSArraySetNoElement)              (mpointer ___array___,
                                                         const msize len);
struct              MSArray;
#define             M_SARRAY                            (data)
#define             M_SARRAY_type_string_element        (data)
#define             M_SARRAY_type_size_element          (data)
#define             M_SARRAY_type_size_array            (data)
#define             M_SARRAY_len_array                  (data)
#define             M_SARRAY_len_elements               (data)
#define             M_SARRAY_set_noelement              (data)
#define             M_SARRAY_user                       (data)
#define             M_SARRAY_                           (data)
#define             M_SARRAY_REF                        (data,
                                                         type)
#define             M_SARRAY_INS                        (data,
                                                         type,
                                                         index)
#define             M_SARRAY_REM                        (data,
                                                         type,
                                                         index)
#define             m_sarray_set_new                    (type,
                                                         len,
                                                         set_noelement,
                                                         id)
MSArray *           m_sarray_new                        (MId id);
mpointer            m_sarray_free                       (MSArray *sarray);
MStatus             m_sarray_element_inserted           (MSArray *sarray,
                                                         msize index);
MStatus             m_sarray_element_removed            (MSArray *sarray,
                                                         msize index);
MStatus             m_sarray_set_noelement              (MSArray *sarray);
#define             m_c_sarray_element_inserted         (sarray,
                                                         index)
#define             m_c_sarray_element_removed          (sarray,
                                                         index)

Description

Attraverso le strutture MSArray è possibile gestire array statici adoperando le potenzialità delle strutture derivate.

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

A differenza delle altre strutture derivate, dopo la liberazione della memoria allocata per una struttura derivata MSArray, bisogna tener conto della memoria allocata staticamente per l'array statico che ovviamente resta a disposizione fino a terminazione programma.

Example 13. Using MSArray


#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 );

    MId id;

    m_sarray_set_new ( mchar, 5, set_noelement, id );

    MSArray* array = m_sarray_new ( id );

    g_printf ( "\n type_string_element: %s \n", M_SARRAY_type_string_element(array) );
    g_printf ( "\n type_size_element:   %lu \n", M_SARRAY_type_size_element(array) );
    g_printf ( "\n type_size_array:     %lu \n", M_SARRAY_type_size_array(array) );
    g_printf ( "\n len_array:           %lu \n", M_SARRAY_len_array(array) );
    g_printf ( "\n len_elements:        %lu \n", M_SARRAY_len_elements(array) );

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

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

    M_SARRAY_REF (array, mchar)[0] = 'a'; m_sarray_element_inserted ( array, 0 );
    M_SARRAY_REF (array, mchar)[1] = 'b'; m_sarray_element_inserted ( array, 1 );

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

    // M_SARRAY_set_noelement(array) ( M_SARRAY_(array), M_SARRAY_len_array(array) );

    m_sarray_set_noelement ( array );

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

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

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

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

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

    mchar* static_array = (mchar*)m_sarray_free ( array );

    g_printf ( "\n static : %c; \n", static_array[0] );
    g_printf ( "\n static : %c; \n", static_array[1] );

    return MCORRECT;
}

  


Details

MSArraySetNoElement ()

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

Utilizzato nella inizializzazione dell' array statico contenuto nella struttura derivata MSArray.

___array___ :

indirizzo di un array statico valido

len :

quantità di elementi contenuti nell'array statico

Returns :

MCORRECT o MERROR in caso di errore.

struct MSArray

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

        MSArraySetNoElement     set_noelement;

        const mpointer          array;
};

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

La struttura derivata MSArray è composta da due parti: una parte dinamica riguardante la tipica conformazione delle strutture derivate, ed una parte statica riferita ad un array statico accessibile attraverso le macro M_SARRAY_REF e M_SARRAY_ .

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 statico.

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

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 statico - only Read

const msize type_size_element;

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

const msize type_size_array;

dimensione in byte dell'intero array statico - only Read

const msize len_array;

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

const msize len_elements;

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

MSArraySetNoElement set_noelement;

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

const mpointer array;

indirizzo ad un array statico - only Read

M_SARRAY()

    #define M_SARRAY(data)     ds_CAST (MSArray*,data)

stability: Unstable

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

data :

struttura derivata

M_SARRAY_type_string_element()

    #define M_SARRAY_type_string_element(data)     ds_GET_PROPERTY(M_SARRAY(data),type_string_element)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_type_size_element()

    #define M_SARRAY_type_size_element(data)     ds_GET_PROPERTY(M_SARRAY(data),type_size_element)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_type_size_array()

    #define M_SARRAY_type_size_array(data)     ds_GET_PROPERTY(M_SARRAY(data),type_size_array)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_len_array()

    #define M_SARRAY_len_array(data)     ds_GET_PROPERTY(M_SARRAY(data),len_array)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_len_elements()

    #define M_SARRAY_len_elements(data)     ds_GET_PROPERTY(M_SARRAY(data),len_elements)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_set_noelement()

    #define M_SARRAY_set_noelement(data)     ds_GET_PROPERTY(M_SARRAY(data),set_noelement)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_user()

    #define M_SARRAY_user(data)     ds_GET_PROPERTY(M_SARRAY(data),user)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_()

    #define M_SARRAY_(data)     ds_GET_PROPERTY(M_SARRAY(data),array)

stability: Unstable

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

data :

una struttura derivata

M_SARRAY_REF()

    #define M_SARRAY_REF(data,type) ((type*)M_SARRAY_(data))

stability: Unstable

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

data :

una struttura derivata

type :

tipo dell'elemento inseribile nell'array statico

M_SARRAY_INS()

#define             M_SARRAY_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 statico utilizzabile.

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

data :

una struttura derivata

type :

tipo dell'elemento inseribile nell'array statico

index :

un identificativo di posizione valido

M_SARRAY_REM()

#define             M_SARRAY_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 statico utilizzabile.

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

data :

una struttura derivata

type :

tipo dell'elemento inseribile nell'array statico

index :

un identificativo di posizione valido

m_sarray_set_new()

#define             m_sarray_set_new(type,len,set_noelement,id)

stability: Unstable

A differenza della maggior parte delle strutture derivate, il tipo MSArray richiede una fase di inizializzazione attraverso la chiamata alla macro m_sarray_set_new .

Questa macro espandendosi:

genera un blocco chiuso di dati comprendente la dichiarazione e definizione di un array statico di type elementi,

provvede al passaggio dell'indirizzo dell'array statico oltre che degli argomenti type, len e set_noelement ad una funzione interna,

questa alloca memoria per una struttura derivata di tipo MSArray archiviandola in una collezione interna di tipo MICollection,

infine viene assegnato alla variabile id un identificativo della struttura derivata.

Passando id alla funzione m_sarray_new() è possibile infine ottenere un MSArray.

type :

tipo dell'elemento inseribile nell'array statico

len :

quantità di elementi inseribili nell'array statico

set_noelement :

indirizzo ad una funzione di inizializzazzione dell'array statico

id :

una variabile di tipo MId valida

Since 0.0.1


m_sarray_new ()

MSArray *           m_sarray_new                        (MId id);

stability: Unstable

Preleva da un archivio interno di tipo MICollection una MSArray creata in precedenza attraverso la macro m_sarray_set_new.

id :

un identificativo valido di tipo MId

Returns :

un nuovo MSArray o NULL in caso di errore.

Since 0.0.2


m_sarray_free ()

mpointer            m_sarray_free                       (MSArray *sarray);

stability: Unstable

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

sarray :

indirizzo ad una struttura derivata allocata di tipo MSArray

Returns :

l'indirizzo dell'array statico parte della MSArray o NULL in caso di errore.

Since 0.0.1


m_sarray_element_inserted ()

MStatus             m_sarray_element_inserted           (MSArray *sarray,
                                                         msize index);

stability: Unstable

Segna come "element inserted" una posizione di un array statico parte di una MSArray.

sarray :

indirizzo ad una struttura derivata allocata di tipo MSArray

index :

identificativo di una posizione all'interno di un array statico parte di un MSArray

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_sarray_element_removed ()

MStatus             m_sarray_element_removed            (MSArray *sarray,
                                                         msize index);

stability: Unstable

Segna come "element removed" una posizione di un array statico parte di una MSArray.

sarray :

indirizzo ad una struttura derivata allocata di tipo MSArray

index :

identificativo di una posizione all'interno di un array statico parte di un MSArray

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_sarray_set_noelement ()

MStatus             m_sarray_set_noelement              (MSArray *sarray);

stability: Unstable

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

sarray :

indirizzo ad una struttura derivata allocata di tipo MSArray

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_c_sarray_element_inserted()

#define             m_c_sarray_element_inserted(sarray,index)

stability: Unstable

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

sarray :

array dove segnare inserito un elemento

index :

un identificativo di posizione valido

m_c_sarray_element_removed()

#define             m_c_sarray_element_removed(sarray,index)

stability: Unstable

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

sarray :

array dove segnare rimosso un elemento

index :

un identificativo di posizione valido