Arreglo y puntero en una funcion [No me corre]

Iniciado por barnix456, 12 Noviembre 2012, 14:16 PM

0 Miembros y 1 Visitante están viendo este tema.

barnix456

En la escuela, me han dejado un problema sencillo, pero el maestro quiere que usemos, arreglos, punteros y una función, el problema es: "Contar una cierta cantidad de números (he puesto 10) y almacenarlas en mi arreglo, despues de tenerlas ahi, pasarle la direccion de cada datos, no del arreglo completo, sino de cada datos a mi puntero, de cierta forma tambien trabajara como un arreglo de puntero o algo asi, y despues con los punteros hacer el calculo, que en este caso sera una suma, he estado todo el dia, y no me corre, alguna idea... les dejo mi code:

code:


#include <stdio.h>
#include <stdlib.h>
#define sise 10
int suma(int arreglo[sise]);
void main ()
{
    int arreglo[sise], i;
    for (i=0;i<=sise-1;i++) //Aqui voy recorriendo el arreglo
    {
        printf("Escriba el numero\n");
        scanf("%d", &arreglo[i]);  // voy guardando un dato en cada posicion del arreglo
    }
    suma(arreglo[sise]);  // mi funcion que trabaja con los datos de mi arreglo
}
int suma(int xarreglo[sise]) //Inicializacion de mi funcion
{
    int sum=0,i,*pnt[sise];
    for(i=0;i<=sise-1;i++)    //Con el segundo for, recorro el arrelo de nuevo
    {
        pnt[i]=&xarreglo[i];  //doy al puntero la direccion de cada numero guardado en el arreglo
        sum+=pnt[i];
    }
    printf("La suma es: %d\n",sum);
}
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

C_1^N

Hola barnix456!!
A ver.. vi dos cuestiones.. el main deberia devolver un entero pq de esta manera le devuelve el estado a la consola una vez finalizado el programa, cuando le pasas el arreglo a la funcion hacelo sin el [sise] el nombre del arreglo es un puntero al primer elemento del mismo y poniendole un subindice especifico le estas pasando el elemento de la posicion sise, no el arreglo completo.

Saludos!
La gestión manual de bloques de memoria en C es como hacer malabarismos con pastillas de jabón en la ducha de la prisión: todo diversión hasta que cometes un fallo

barnix456

Hola C_1^N

Siempre me marca ese error, de que "El tipo de devolucion de main no es int", pero no se que es lo que deberia cambiar, si el codigo esta bien, y si lo ejecuto lo hace con normalidad, ahora en cuanto al codigo, le he dado vueltas y vueltas ya le hice esa modificacion que me dijiste, pase la funcion

suma(arreglo[]);

y nada
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

satu

Buenas!!!

Te he cambiado el código, a ver si es esto lo que necesitas:

#include <stdio.h>
#include <stdlib.h>

#define size 10

void suma(int *arreglo);

int main () {
    int arreglo[size], i;
    for(i = 0; i < size; i++) { //Aqui voy recorriendo el arreglo
        printf("Escriba el numero\n");
        scanf("%d", &arreglo[i]);  // voy guardando un dato en cada posicion del arreglo
    }
    suma(arreglo);  // mi funcion que trabaja con los datos de mi arreglo
    while(getchar() != '\n') ; // Limpia el buffer
    getchar(); // Pausa la ejecucion del programa hasta que pulses una tecla
    return 0;
}

void suma(int *xarreglo) { //Inicializacion de mi funcion
    int sum = 0, i, pnt[size];
    for(i = 0; i < size; i++) {
        pnt[i] = xarreglo[i];
        sum+=pnt[i];
    }
    printf("La suma es: %d\n", sum);
}



Saludos!!
Breakbeat como forma de vida

Ferno

Hola!

Antes que nada, para pasarle a la función el arreglo solo debes hacer:

suma(arreglo);

Le estarías pasando por parámetro la dirección al primer elemento del arreglo. Con eso es suficiente para que tu argumento actual actúe ordenadamente.

Por otro lado, dentro del for de la función suma no estoy muy seguro de lo que quieres hacer. Pero lo que estás haciendo ahí es sumar las direcciones de memoria de todos los int que forman el arreglo.
En realidad no es necesario utilizar ese arreglo de punteros "pnt", pero si tanto lo quieres, fijate que al hacer:

sum += pnt[i];

En realidad lo que haces ahí es sumar los punteros (que es lo que guarda pnt) es decir, sumas las direcciones de memoria de cada uno de los int correspondientes.
Para que esto funcione, lo que debes hacer es desreferenciar dichos punteros:

sum += *pnt[i];

Así estarías sumando los valores correspondientes que apuntan dichos punteros.

Si bien esto funcionaría, la verdad es que el code está un poco desordenado y es feo. Fijate de poder arreglarlo y hacer algo más limpio (por ejemplo, ese arreglo de punteros no es necesario). Además, fijate que la función "suma" debería de devolver un "int" y jamás lo hace (sólo imprime la suma por pantalla).

barnix456

Hola satu

Gracias por el codigo, no sabia eso para limpiar el bufer, entonces anlizando tu codigo, mi variable pnt que en este caso queria que fuera mi puntero osea de esta manera *pnt, no va, si no el puntero es el arreglo, y pnt viene siendo un arreglo cualqueira, la magia esta en pasar a la funcion nuestro arreglo sin un subindice, bueno sin nada.. gracias....!!  ;)
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

barnix456

una pregunta mas, si estamos trabajando con punteros, puedo imprimir en pantalla la diraccion de ese dato, como lo hago????
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

Ferno

Si por ejemplo tenés una variable de tipo "int":

printf("La dirección de la variabe es: %x",&variable);

Lo que hace "%x" es imprimirlo en hexadecimal, y el ampersand (&) te devuelve la dirección de memoria de la variable.

Saludos.

C_1^N

La gestión manual de bloques de memoria en C es como hacer malabarismos con pastillas de jabón en la ducha de la prisión: todo diversión hasta que cometes un fallo

barnix456

"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov