Mostrando entradas con la etiqueta Arreglos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Arreglos. Mostrar todas las entradas

lunes, 23 de agosto de 2010

Argumentos desde la linea de comandos C/C++

En este post vamos a ver como reconocer los argumentos que recibe nuestro programa desde la linea de comandos cuando es ejecutado.

Cuando declaramos correctamente la función main, lo hacemos de la siguiente forma:

int main(int argc, char **argv)

Podemos observar que la función main recibe dos parámetros (argc, argv). Donde:

-argv: Es un array de cstrings, que contiene los parámetros pasados por la linea de comandos. En la primera posición del array, podemos encontrar la orden con la cual fue ejecutado nuestro programa.
A partir de la segunda posición están los argumentos que hemos recibido.

-argc: Es un número entero, que nos indica la cantidad de parámetros recibidos (el tamaño del array argv).

Observemos el siguiente código:


#include<iostream>

using namespace std;

int main(int argc, char **argv)
{
cout << "cantidad de argumentos: " << argc-1 << endl;
cout << "orden de ejecución: " << argv[0] << endl;
for(int i = 1; i < argc; i++)
{
cout << "Posición nro " << i
<< ": " << argv[i] << endl;
}
return 0;
}


El siguiente ejemplo esta probado en GNU/Linux.

Si ejecutáramos el código anterior desde una terminal, de la siguiente forma:

./argumentos argumento1 argumento2


Obtemdremos la siguiente salida:

cantidad de argumentos: 2
orden de ejecución: ./argumentos
Posición nro 1: argumento1
Posición nro 2: argumento2


Miremos entonces, que después de ejecutar el programa, podemos enviar la cantidad de parámetros que deseemos, siempre y cuando separemos cada uno de estos con un espacio.

lunes, 19 de abril de 2010

Pasar matrices por referencia en C++

Cuando declaramos un array de algún tipo, en realidad estamos declarando un puntero a la dirección de memoria del primer elemento del array. Y cuando accedemos a los subíndices del array por medio del operador [], estamos haciendo uso de la aritmética de punteros para movernos por la memoria accediendo a las direcciones que necesitamos. Podemos ver esto de una forma mas fácil en el siguiente ejemplo:


//Primero declaramos un array de enteros
//de dimensión diez (10)

int array[10];

//Luego creamos un puntero a un entero
int * pArray;

//y asignamos la dirección del array al puntero
pArray = array;


Note se que cuando asignamos la dirección lo hacemos directamente, sin necesidad de usar el operador & (dirección de). Esto pasa, porque en realidad 'array' es un puntero como 'pArray'.

Ahora si queremos acceder a los subíndices, podemos hacerlo por medio de 'pArray' y de 'array'. Miremos el siguiente ejemplo:

//En este ejemplo estamos inicializando
//los diez elementos de 'array' en cero

for(int i = 0; i < 10; i++)
{
pArray[i] = 0;
}

Ahora lo importante. ¿Cómo pasar arreglos por referencia en C++? Como ya vimos, en realidad los arreglos son punteros al primer subíndice de un array. Entonces para pasar un array por referencia, resulta ser sencillo. Observemos el siguiente prototipo:

void inicializar(int filas, int columnas,
int matriz[filas][columnas]);

Lo que hacemos aquí es, primero pasar las dimensiones de la matriz, y luego la declaramos. El orden aquí es importante, ya que si declaramos el array sin conocer sus dimensiones, el compilador arrojara un error, pues no sabrá como tiene que dimensionar el arreglo. Ahora, para llamar la función simplemente hacemos lo siguiente:

//llamada a la función 'inicializar'
inicializar(filas, columnas, matriz);

donde 'matriz' es una matriz de dimenciones [filas][columnas].