miércoles, 21 de enero de 2009

Wikipedia y la prueba, medida y control

Desde 2006 contribuyo en algunos artículos en la enciclopedia libre Wikipedia, maravillosa herramienta del conocimiento (puede ver mi perfil en Wikipedia aquí: http://es.wikipedia.org/wiki/Usuario:Adrienj). Comencé redactando artículos sobre la historia y la cultura del norte de México. Pero, desde hace algún tiempo, participo, cuando tengo tiempo, agregando artículos relativos a la prueba, la medida, el control y sus distintas herramientas. Si desea participar en este esfuerzo, que no tiene más nobleza que de compartir el conocimiento, entonces no hay nada más simple que crear una cuenta en Wikipedia.
Creé varios artículos como LabWindows/CVI, TestStand, Measurement Studio o modifiqué LabVIEW... pero muchas cosas quedan por completar y muchas otras definiciones no forman aún parte de la enciclopedia: ¡a sus teclados!

domingo, 11 de enero de 2009

LabWindows/CVI 9.0 : variable-length arrays

Con la puesta en práctica de la norma C99, un avance se hace en cuanto a la gestión de la memoria: la declaración de array dinámica (variable-length arrays in english).

Me dirá, conozco la array, declaro una array de diez totalidades calculando las dimensiones con una constante del siguiente modo: int iArray [10]. Las array dinámicas, ok conozco, declaro a un indicador luego yo hago un malloc o calloc para calcularla las dimensiones con una variable, en no olvidando liberar la memoria asignada con un free al final del tratamiento.

¿Entonces que son las variable-length arrays? Es la posibilidad de declarar array indicando dimensiones con variables y no solamente con constantes. A continuación, dos ejemplos para ilustrar la utilización de una array dinámica: se pide al usuario calcular las dimensiones de una array que él mismo asignará, luego se indica el contenido de esa array.

ANTES
int iRows, iCols;
int i, j;
int *piArray = NULL;

printf("Número de líneas: ");
scanf("%d", &iRows);
printf("Número de columnas: ");
scanf("%d", &iCols);

*piArray = (int*)malloc(iRows*iCols*sizeof(int));
if (piArray != NULL)
{
__for (int i = 0; i < iRows;i++)
__{
____for (int j = 0; j ____{
______piArray [i][j] = i*iCols+ j;
______printf("%d ", piArray [i][j]);
____}
____printf("\n");
__}
}
free(piArray );
piArray = NULL;

AHORA
En el código siguiente, se utiliza también otra novedad del C99: la declaración de las variables no será ya al principio de los bloques {}.

int iRows, iCols;
int i, j;

printf("Número de líneas: ");
scanf("%d", &iRows);
printf("Número de columnas: ");
scanf("%d", &iCols);

int tiArray [iRows][iCols];
for (int i = 0; i < iRows; ++i)
{
__for (int j = 0; j < iCols; ++j)
__{
____tiArray[i][j] = i*iCols+ j;
____printf("%d ", tiArray[i][j]);
__}
__printf("\n");
}

Aquí, la liberación de la memoria asignada a tiArray se efectúa al final de "vida" de esta variable. Como tiArray es una variable local, es liberada al final del tratamiento de la función en la cual se declara.

viernes, 9 de enero de 2009

Que hay de nuevo en LabWindows/CVI 9.0 : el estándar C99

Muchas novedades están disponibles en LabWindows/CVI 9.0 sobre todo con la puesta en práctica de la última norma del lenguaje C: el C99. Pues se habrán esperado diez años, el tiempo de maduración, para beneficiarse de las ventajas de esta nueva norma.

¿Que aporta el C99?

Ahí tienes la lista de estas mejoras:
* La declaración de las variables no será ya al principio de los bloques {}.
* Se pueden declarar array indicando dimensiones con variables y no solamente con constantes.
* Cada elemento de la array, estructuras y uniones son ahora inicializable distinta y especialmente.
* Los elementos de las array, estructuras y uniones podrán iniciarse con variables.
* Nuevo tipo: las totalidades de 64 bits (long long).
* Nuevas funciones snprintf y vsnprintf que son versiones "aseguradas" de sprintf et vsprintf evitan los rebasamientos controlando el tamaño de la cadena de entrada.
* Los macros a N argumentos (...).
* Adición de la variable del precompilador __func__ que contiene el nombre de la función corriente.

Observo que esta última novedad (__func__) del C99 estaba ya presente desde hace algunas versiones de CVI.

Enumeraré en artículos dedicados a cada aspecto del C99 para LabWindows/CVI.