[C con Clase] Ayuda paso de matriz como parametro

Salvador Pozo salvador en conclase.net
Sab Sep 12 22:16:00 CEST 2009


El pasado 2009-09-12 19:31:18, Emilio escribió:
 
E> gracias a todos, supuestamente se puede hacer el problema que me piden sin
E> punteros ni memoria dinamica, es programacion de primer curso,
E> asi que supongo que lo que habra que hacer crear una matriz gigante
E> estaticamente y lo que no se use llenarlo de ceros, aunque sea una chapuza
E> yo es que creia que se podia hacer asi, estaticamente,pero si decis que solo
E> dinamicamente y punteros, lo hare a lo basto
E> era para una practica preexamen, y lo queria hacer lo mejor posible
E> gracias otra vez

Hola:

Efectivamente, los valores de las dimensiones de un array deben ser constantes, nunca variables. Eso es lo que dicen las normas sobre el comportamiento que se debe esperar de un compilador.

Sin embargo, casi todos los compiladores admiten variables cuando se especifican las dimensiones de un array.

Esto, por supuesto, es un comportamiento irregular. El problema de que funcione con el compilador que usas es que puede que no lo haga con otros compiladores que sigan al pie de la letra esa norma concreta, y por lo tanto, tu programa no sería transportable.

Es posible que quien deba corregir tu examen considere que la solución de crear un array enorme sea una mala solución, y puntue mal tu práctica. No digo que no lo hagas correctamente, sino que te asegures de que quien corrija la práctica sepa por qué haces lo que haces, del modo que lo haces.

Es muy difícil plantear problemas que se puedan resolver sólo con los conocimientos explicados, sobre todo porque el que los plantea tiene más conocimientos, y muchos de ellos se aplican de forma inconsciente.

En cuanto a tu pregunta original, podemos tomar dos alternativas:

1) Asumir que las dimensiones con que fue declarado el array son constantes (como deben ser). En ese caso, el programa "sabe" las dimensiones del array, y por lo tanto, cualquier función puede indicar las dimensiones del array pasado como parámetro.

Pero podemos necesitar una función que trabaje con varios arrays, de diferentes tamaños. En ese caso, hay que saber cómo se almacenan los arrays en memoria.

Se usan siempre direcciones consecutivas de memoria, incrementando esas posiciones a medida que aumenta la última dimensión, e incrementando la anterior a medida que termina cada bloque del número de elementos de esta.

Por ejemplo, un array:
int tabla[4][2]

Se almacenan en posiciones consecutivas los siguientes elementos:
tabla[0][0], tabla[0][1], tabla[1][0], tabla[1][1], tabla[2][0]...

Esto nos da una forma de acceder a cualquier elemento mediante una fórmula sencilla. Si nuestra función es:
<tipo> funcion(int tab, int filas, int columnas)

Podemos acceder al elmento [f][c] de este modo:
tab[c+f*columnas]

2)Que las dimensiones sean variables. En este caso sirve la misma solución.

Pero si optamos por arrays dinámicos, esta forma de trabajar no nos sirve.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase