Punteros dobles en arduino

Scooter

Cascarrabias crónico
Tengo una aplicación para arduino que usa tres arrays 10x10, para no repetir las rutinas que los gestionan (los guardan en la eeprom, los reciben y transmiten por serial) quería dirigirme a ellos por punteros pero tengo un par de problemas:

El primero es interiorizar y comprender como van porque los punteros simples lo tengo bastante claro, pero con los dobles aún no me aclaro, pero bueno ser cuestión de insistir.

El segundo es saber si wiring va igual que el C en estos casos, a ver si me pego la paliza de montar el sistema y resulta que arduino no lo soporta.

¿Alguna recomendación?
 
El compilador que usa el Arduino es el AVR-GCC, entonces soporta cualquier cosa que soporte el C/C++, lo del Wiring/Processing es solo una traducción que se le hace del C/C++ y de lo otro no se.
 
Tengo una aplicación para arduino que usa tres arrays 10x10, para no repetir las rutinas que los gestionan (los guardan en la eeprom, los reciben y transmiten por serial) quería dirigirme a ellos por punteros pero tengo un par de problemas:

El primero es interiorizar y comprender como van porque los punteros simples lo tengo bastante claro, pero con los dobles aún no me aclaro, pero bueno ser cuestión de insistir.

Yo también siempre me enredo mal cuando trabajo con punteros dobles.

¿No podés trabajarlos como matrices? yo suelo hacer eso para evitar el enredo :p.
 
Si, lo uso como matrices pero luego hay ciertas funciones que yo quería hacer en plan envia_serie(matriz_1) y vista la enseimada mental de los punteros dobles creo que voy a hacer una sola matriz de 3x10x10 algo así:
Declarar como const Matriz_para_tal = 0, Matriz_para_cual = 1 etc
Y luego en la función digo:;
Enviar_serie(Matriz_para_tal) o directamente enviar_serie(2)
y dentro un bucle con Matriz[parametro_funcion][x][y] o algo así

No se si se entiende la idea.
 
Última edición:
Se entiende lo que decís y funciona, trabajar por referencia con el puntero de la fila (si fuera un array de 2 dimensiones) y moverte con las columnas dentro de la función.

Otra alternativa, es verlo como un bloque de datos plano y trabajarlo como un array de 1D.

Ejemplo:

PHP:
#define FILA_MAX        2
#define COLUMNA_MAX     3


int imprime_matriz(int mat[])
{
    int cont_fila,cont_col;


    for(cont_fila=0;cont_fila<FILA_MAX;cont_fila++)
    {
        for(cont_col=0;cont_col<COLUMNA_MAX;cont_col++)
            printf("Fila %d, Columna %d = %d \n",cont_fila,cont_col,*(mat+cont_col+cont_fila*COLUMNA_MAX));
    }


}


int main()
{
    int matriz[FILA_MAX][COLUMNA_MAX]={{1,2,3},{4,5,6}};

    imprime_matriz(matriz[0]);

    return 0;
}
 
Si, también pensé en hacer un array seguido y sacar la dirección en plan:

dirección= tabla*100+fila*10+columna;

y luego ...

valor_para_lo_que_sea = tabla[dirección];

Como las tablas son iguales, son solo tres, todas contienen valores byte etc está bastante sencillo, pero si cada tabla fuese de un tamaño y de tipos diferentes los punteros vendrían muy bien para hacer el trabajo. De haí mi interés en aprender a usarlos. Tampoco quería meterme mucho porque si después me olvido no seré capaz de mantener mi propio código.
 
Última edición:
Me quedé pensando en el problema y creo encontrar una alternativa interesante.

El problema como lo veo yo (tal vez esté mal), se presenta con que "C" no permite pasar una matriz directamente por argumento, pero si se puede pasar un puntero de un vector para armar la matriz dentro de la función, a ver si soy un poco más claro con el código:

PHP:
#define FILA_MAX        2
#define COLUMNA_MAX     3

void imprime_matriz(int *array_vec[])
{
    int cont_mat,cont_fila,cont_col;

    for(cont_mat=1;cont_mat<MAT_MAX;cont_mat++)
    {
        for(cont_fila=0;cont_fila<FILA_MAX;cont_fila++)
        {
            for(cont_col=0;cont_col<COLUMNA_MAX;cont_col++)
                printf("Fila %d, Columnta %d = %d \n",cont_fila,cont_col,array_vec[cont_fila][cont_col]);
        }

    }

}


int main()
{
    int matriz[FILA_MAX][COLUMNA_MAX]={{1,2,3},{4,5,6}};

    int *array_vector[FILA_MAX];

    array_vector[0]=matriz[0];
    array_vector[1]=matriz[1];

    imprime_matriz(array_vector);

    return 0;
}

Si bien parece una definición similar, de una forma se puede pasar como argumento a la función y trabajarla como una matriz dentro de la misma y de la otra forma no (pasar directamente la matriz).

En otras palabras lo que estoy haciendo es pasar un array con las direcciones de las filas de la matriz.

En el caso de trabajar con un array de matrices, la cosa se pone un poco más confusa:

PHP:
#define MAT_MAX         2
#define FILA_MAX        2
#define COLUMNA_MAX     3

void imprime_matriz(int **array_mat[])
{
    int cont_mat,cont_fila,cont_col;

    for(cont_mat=0;cont_mat<MAT_MAX;cont_mat++)
    {
        for(cont_fila=0;cont_fila<FILA_MAX;cont_fila++)
        {
            for(cont_col=0;cont_col<COLUMNA_MAX;cont_col++)
                printf("Fila %d, Columnta %d = %d \n",cont_fila,cont_col,array_mat[cont_mat][cont_fila][cont_col]);
        }

    }

}


int main()
{
    int vector_matrices[MAT_MAX][FILA_MAX][COLUMNA_MAX]={{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};

    int *array_vectores_1[FILA_MAX];
    int *array_vectores_2[FILA_MAX];

    int **array_matrices[MAT_MAX];

    array_vectores_1[0]=vector_matrices[0][0];
    array_vectores_1[1]=vector_matrices[0][1];

    array_vectores_2[0]=vector_matrices[1][0];
    array_vectores_2[1]=vector_matrices[1][1];

    array_matrices[0]=array_vectores_1;
    array_matrices[1]=array_vectores_2;


    imprime_matriz(array_matrices);

    return 0;
}

¿Funciona?, si. ¿Es la mejor forma de realizarlo? la verdad no lo creo, lo veo demasiado confuso.
 
Última edición:
Atrás
Arriba