Ejercicio 5 - Error CMD

Ejercicio 5 - Error CMD

de Bruno Capote Hernández -
Número de respuestas: 5

#include <stdio.h>

int main()

{

    int n,i,pos;

    printf("ingrese largo del arreglo \n");

    scanf("%d", &n);

    int arr[n];


    llenar(arr,n);

    mostrar(arr,n);


    for(i = 0; i < n ; i++){

        cambiar(arr, i ,menor(arr,i ,n));

    }

    mostrar(arr,n);

    return 0;

}


void mostrar(int arr[],int n)

{

    int i;

    printf("su arreglo es:");

    printf("(");

    for (i = 0; i < n; i++){

        printf(" %d ", &arr[i]);

    }

    printf(")");

}


void llenar(int *arr[], int n)

{

    printf("ingrese valores para su arreglo \n");

    int i;

    for (i = 0; i < n; i++)

    {

        scanf("%d", &arr[i]);

    }

}


int menor(int arr[],int i, int n)

{

    int pos = arr[0];

    for (i;i<n;i++){

        if (arr[i] < pos){

            pos = i;

        }

    }

    return pos;

}


void cambiar(int *arr[], int i, int pos)

{

    int aux;

    aux = arr[i];

    arr[i] = arr[pos];

    arr[pos] = aux;

}

Así como está el código, me deja compilarlo en Codeblock pero no en la terminal, cuál sería el error? estoy compilando bien?

.


En respuesta a Bruno Capote Hernández

Re: Ejercicio 5 - Error CMD

de Ignacio Facello Marcotte -
Tenés dos errores diferentes ahí.

Primero, donde dice `'llenar' was not declared in this scope`, es lo que dice el compañero en la otra respuesta: no tenés declarada la función llenar. El compilador de C lee y procesa el archivo en orden. Si se encuentra con una llamada a una función que no conoce, te da un error. La solución es declarar las funciones antes de usarlas. En C, además, podés separar la declaración de la implementación. Podés decirle al compilador "existe una función llamada llenar, con estos parámetros" para que el compilador pueda seguir de largo y no dar un error, y después más abajo decirle "acá tenés la función esa que te decía".

Eso sería algo así:

void llenar(int arr[], int n); // Sólo la firma de la función
int main() {

llenar(arr, n); // La llamamos, y el compilador no protesta aunque no sabe cómo es, sólo cómo se llama y qué recibe y devuelve.

}
void llenar(int arr[], int n) {
    … // Acá la implementamos
}

Spoilers: eso es básicamente lo que vamos a estar haciendo con los archivos .h, que tienen los encabezados de funciones.

Siguiente problema, estás mezclando int* con int. int* es un puntero a int. Son tipos de datos diferentes. Cuando tenés algo como int *arr[] en un parámetro de una función, si lo que le pasás es un array de int, el compilador te va a decir que no, que lo que estás haciendo está mal. Si una función espera un tipo de datos, tenés que pasarle ese tipo de datos, no otro. Y un puntero a un entero no es lo mismo que un entero, y, en tu caso, un array de punteros a enteros no es lo mismo que un array de enteros.

En respuesta a Ignacio Facello Marcotte

Re: Ejercicio 5 - Error CMD

de Bruno Capote Hernández -
Muchas gracias por la primera aclaración, la verdad no tenía idea.
Mi intención con *arr[] es pasar el arreglo como parámetro de referencia para mismo poder modificarlo. ¿Cómo puedo hacerlo correctamente?
En respuesta a Bruno Capote Hernández

Re: Ejercicio 5 - Error CMD

de Ignacio Facello Marcotte -
Pah, te voy a decir la verdad, no lo probé, y estoy _muy_ oxidado con C, así que le puedo estar errando, pero si no me equivoco simplemente pasando el array funciona.

El tema es así, en C un array y un puntero son lo mismo. Una referencia a una dirección en memoria. La diferencia es más que nada el cómo lo pensás usar. PEro en teoría si tenés int *puntero podés hacer puntero[0] y te va a dar lo mismo que *puntero (puede ser que el compilador te insulte si hacés eso, dependiendo del nivel de warnings que tengas). Y si tenés un int[] array podés hacer *array y es lo mismo que array[0]. Obviamente esto se puede prestar a muchos líos si entrás a hacer esas cosas, sobre todo si hacés algo como puntero[1] cuando el puntero no estaba apuntando a un elemento de un array sino a una variable cualquiera. Pero está bueno saberlo, porque así sabés eso: las dos cosas son referencias a memoria.

Segundo tema, el pasaje de parámetros por referencia en C técnicamente no existe. Vos no estás pasando un parámetro por referencia, lo que est'as haciendo es pasar el valor de un puntero. Después la función que recibe ese puntero va y modifica la dirección en memoria que ese puntero referencia. Si le sumás a eso un par de syntactic sugar que tiene C, el efecto neto es que al final estás pasando la variable por referencia. Pero lo importante a tener en cuenta es que cuando pasás un puntero es lo mismo que pasar por referencia. Y volviendo a lo anterior, un array es un puntero. Entonces, cuando pasás un array, estás pasando un puntero, lo cual significa que los cambios que hagas en ese array van a hacerse en el array "original", porque no estás recibiendo una copia del array, estás recibiendo una referencia (un puntero) a los mismos datos.