Debe estar conectado para participar
Buscar en los foros:


 






Uso de Comodín:
*    coincide cualquier número de caracteres
%    coincide exactamente un caracter

[C] funcion rebelde??

No hay Etiquetas
Entrada
Extreme Level

santiago_103

entradas: 1483

01:45 21/02/2009

1

Hola a todos los amigos foreros, les comento que estaba aburrido y me puse a hacer unos programitas faciles con C como para pasar el rato, y de repente cuando quiero compilar digo, oooh, que pasa aca?? les comento el programa:
Queria hacer un programa donde tenga un vector de 10 elementos, y queria que me imprima el mayor de ellos, pero al poner el "if" para sacar cual es el mayor me tira un problrma, les pongo el codigo para vean lo que digo:

Código:
#include <stdio.h>

typedef int vec[10];

int Max (vec a, int b)
{
    int i;
    for(i=0;i<10;i++)
    {
                     if(a[i]>b)
                     return a;
                     else
                     return b;
    }
}

int main()
{
    int i, max=0;
    vec vector;

    for(i=0;i<10;i++)
    {
                     printf("Ingrese valor %d para el vector: \n", i+1);
                     scanf("%d",&vector[i]);
    }
    printf("Vector ingresado correctamente \n&quotwink;
    getchar();

    printf("Numeros ingresados al vector: \n&quotwink;
    getchar();             getchar();

    for(i=0;i<10;i++)
    {
                     printf("%4d", vector[i]);
    }
    getchar();

    max=Max(vector, max);
    printf("\n El numero mayor es: %d \n", max);
    getchar();

}

El compilador me tira un problema en la linea que marque en negrita, me dice esto:
in function int Max(int*,int):
11- invalid conversion from `int*' to `int'

Se que es algo por el vector, por la forma en que lo declare pense que podia ser, pero lo puse de todas las formas que sabpia y me tiraba siempre ese error, alguien que me tire un centro? Si es posible resolver este error me gustaria hacerlo yo solo, osea que me tiren un centro pero no que me digan "pone tal cosa y te funca", y si ven que esta muy mal hecho y tengo que cambiar mucho codigo ahi si deganme que tengo que cambiar todo el codigo, asi lo cambio y busco la forma de que funcione.

Saludos

Nuevo miembro

Brazlee

entradas: 34

02:13 21/02/2009

2

gcc maximo.c -o maximo
maximo.c: En la función ‘Max’:
maximo.c:11: aviso: la devolución crea un entero desde un puntero sin una conversión

Ese error da gcc

No podes devolver un puntero al primer elemento del vector (return a), si declaras a Max como "int Max…". Te falta algo en ese return a.

PD: Al principio pensé que el error estaba en el typedef, es la primera vez que lo veo implementado para arreglos.
Ah! y además hay un problema con la lógica de Max…digamos que retornas muy rápido antes de comparar con todos los elementos.

Nuevo miembro

Kasa.Ramone

entradas: 49

02:38 21/02/2009

3

Te explico porque pasa eso:
Estas tratando de devolver un int* cuando tenes que devolver un int ,en la función Max, esto pasa justamente cuando hace "return a;" (tal cual dijo Brazlee).
Desde ya te digo, el algoritmo para calcular el máximo no me cierra para nada, yo que vos le pego una ojeada.

Saludos.-

P.D: No es necesario el typedef en este caso.

Extreme Level

santiago_103

entradas: 1483

02:39 21/02/2009

4

gracias por contestar, ese error ya lo corregi, me di cuenta, ahora el programa corre pero funciona mal, siempre me devuelve como "maximo" el numero que ingrese al principio.
Posteo el codigo como esta ahora:

Código:
#include <stdio.h>

typedef int vec[10];

int Max (vec a, int b)
{
    int i;
    for(i=0;i<10;i++)
    {
                     if(a[i]>b)
                     return a[i];
                     else
                     return b;
    }
}

int main()
{
    int i, max=0;
    vec vector;

    for(i=0;i<10;i++)
    {
                     printf("Ingrese valor %d para el vector: n", i);
                     scanf("%d",&vector[i]);
    }
    printf("Vector ingresado correctamente n&quotwink;
    getchar();

    printf("Numeros ingresados al vector: n&quotwink;
    getchar();

    for(i=0;i<10;i++)
    {
                     printf("%4d", vector[i]);
    }
    getchar();

    max=Max(vector, max);
    printf("n El numero mayor es: %d n", max);
    getchar();

}

por ejemplo, cuando me pide ingresar los valores del array yo pongo:
2-1-3-4-5-6-7-8-9-20
Y al final me dice, "el maximo es 2", que es el que ingrese al principio, es evidente que hay algo mal con la funcion, pero no logro darme cuenta que.
El typedef para lo unico que me lo enseñaron en la escuela es para definir vectores, mejor dicho, no me lo enseñaron, saltearon ese tema en la guia y lo lei por mi cuenta porque un user del foro me dijo que era mas practico definir asi los arrays, y la verdad uqe tenia razon, me resulta mucho mas comodo, para este programa cortito me da lo mismo, pero la prueba final de informatica me hizo todo un poquito mas facil. Y el profesor me dijo que lo sauqe que era al pedo que no me iba a funcionar el programa porque me iba a confundir jaja

Pd:
editaban mientras escribia, lo de la funcion me imagine que seria algo con los return, probe de igualar b a a[i], mejor posteo el codigo:

Código:
int Max (vec a, int b)
{
    int i;
    for(i=0;i<10;i++)
    {
                     if(a[i]>b)
                     b = a[i];

    }
}

probe de hacer eso pero me pasa lo mismo, corre el programa y me tira cualquier resultado
Igual se que ahi algo le falta, no se que pero no me cierra, como que le falta algo…

Nuevo miembro

Brazlee

entradas: 34

02:44 21/02/2009

5

No había visto las respuestas y … edite el mensaje solamente :P.

Sobre el typedef quizás es más facil, pero después cuando quieras aprender otros temas te podes llegar a confundir. Con punteros a mí me habría confundido si me lo enseñaban así :P

Usa b para ir guardando el valor max y recién cuando termines el bucle hace el return.

Nuevo miembro

Kasa.Ramone

entradas: 49

02:47 21/02/2009

6
Cita Iniciado por santiago_103
Ver Mensaje
gracias por contestar, ese error ya lo corregi, me di cuenta, ahora el programa corre pero funciona mal, siempre me devuelve como "maximo" el numero que ingrese al principio.
por ejemplo, cuando me pide ingresar los valores del array yo pongo:
2-1-3-4-5-6-7-8-9-20
Y al final me dice, "el maximo es 2"

La miercoles, rapidisimo respondiste.
En fin, eso pasa porque estas pasando a la función un vector y max (0), y el algoritmo analiza:
si a[i]>0 devolver a[i], si no devolver 0.(Fijate que si ingresas -1, devuelve 0.)
Y listo, no pasa de ahi el for, porque ya usaste el return (ya devolvio valor).
Tenes que tratar de implementar un algoritmo que saque el maximo, ¿Como?, una variable y despues devolvela al final de la función. (ahi ya no necesitarias b como parametro)
Podes usar el mismo "b" como dijo Brazlee, pero si vas a hacer eso.. conveniente usar parametro por referencia y hacerlo una función void.(o una función que devuelva un puntero, o lo que se te ocurra).

Saludos.-

Edit: uff veo que postean y editan rapido en este foro, fijate que ahi no pusiste return en la función.

Nuevo miembro

Brazlee

entradas: 34

02:55 21/02/2009

7
Cita Iniciado por Kasa.Ramone
Ver Mensaje
La miercoles, rapidisimo respondiste.
En fin, eso pasa porque estas pasando a la función un vector y max (0), y el algoritmo analiza:
si a[i]>0 devolver a[i], si no devolver 0.(Fijate que si ingresas -1, devuelve 0.)
Y listo, no pasa de ahi el for, porque ya usaste el return (ya devolvio valor).
Tenes que tratar de implementar un algoritmo que saque el maximo, ¿Como?, una variable y despues devolvela al final de la función. (ahi ya no necesitarias b como parametro)
Podes usar el mismo "b" como dijo Brazlee, pero si vas a hacer eso.. conveniente usar parametro por referencia y hacerlo una función void.(o una función que devuelva un puntero, o lo que se te ocurra).

Saludos.-

Edit: uff veo que postean y editan rapido en este foro, fijate que ahi no pusiste return en la función.

Sí, parece una conversación de locos.
No editemos más :P

Extreme Level

santiago_103

entradas: 1483

03:01 21/02/2009

8
Cita Iniciado por Brazlee
Ver Mensaje
No había visto las respuestas y … edite el mensaje solamente :P.

Sobre el typedef quizás es más facil, pero después cuando quieras aprender otros temas te podes llegar a confundir. Con punteros a mí me habría confundido si me lo enseñaban así :P

Usa b para ir guardando el valor max y recién cuando termines el bucle hace el return.

Gracias, ahora me funciona.
Ahora, me quedo con la duda, porque no me funcionaba si hacia el return adentro del bucle?
Osea, mi idea era con el codigo inicial, el que tenia los 2 return, era mas o menos asi:

Supongamos tengo este array:
12-65-2-6-5
Primera pasada:
-Si a[i] es mayor a b (que en principio era 0):
Devuelve el valor de a[i] y max toma ese valor (osea 12)

Segunda
-Si a[i](65) es mayor a b (que ahi b vale 12 porque b es max, si mas vale 12 b vale 12):
como es mayor, devuelve el 65 y max cambia su valor a 65

Tercera:
-La condicion del if es falsa, asique se ejecuta la otra sentencia, entonces
-Si a[i] (2) no es mayor a b (65):
como es menor devuelve b, que es 65 y max queda igual

Y asi con el resto del array, osea, mi idea era que max cambie su valor constantemente, pero es como que max cambia su valor solo en la primera pasada, y en las restantes no le da bola al valor que devuelve el return, eso es lo que no entinedo porque les "pasa por encima".

EDITO :
osea, que si pongo para devolver un valor adentro de un for, el for se corta y no hace mas bucles?

Nuevo miembro

Kasa.Ramone

entradas: 49

03:04 21/02/2009

9
Cita Iniciado por santiago_103
Ver Mensaje
Gracias, ahora me funciona.
Ahora, me quedo con la duda, porque no me funcionaba si hacia el return adentro del bucle?
Osea, mi idea era con el codigo inicial, el que tenia los 2 return, era mas o menos asi:

Supongamos tengo este array:
12-65-2-6-5
Primera pasada:
-Si a[i] es mayor a b (que en principio era 0):
Devuelve el valor de a[i] y max toma ese valor (osea 12)

Segunda
-Si a[i](65) es mayor a b (que ahi b vale 12 porque b es max, si mas vale 12 b vale 12):
como es mayor, devuelve el 65 y max cambia su valor a 65

Tercera:
-La condicion del if es falsa, asique se ejecuta la otra sentencia, entonces
-Si a[i] (2) no es mayor a b (65):
como es menor devuelve b, que es 65 y max queda igual

Y asi con el resto del array, osea, mi idea era que max cambie su valor constantemente, pero es como que max cambia su valor solo en la primera pasada, y en las restantes no le da bola al valor que devuelve el return, eso es lo que no entinedo porque les "pasa por encima".

Return acción para devolver valor en la función. Una vez que devolvio valor.. la función se termino, ergo, el for se termina y no se ejecuta totalmente.

Nuevo miembro

Brazlee

entradas: 34

03:08 21/02/2009

10

Sin el return me compilaba igual pero porque no estaba usando la opción -Wall

Código:
gcc maximo.c -Wall -o maximo
maximo.c: En la función ‘Max’:
maximo.c:14: aviso: el control alcanza el final de una función que no es void
maximo.c: En la función ‘main’:
maximo.c:42: aviso: el control alcanza el final de una función que no es void

Qué extraño que sea solo un warning…

Lo modifiqué un poco…

http://rafb.net/p/4jwgzr47.html
Si queres verlo

Max recibe un solo argumento, y es el vector, hay un return 0 (ya que int main tiene que devolver algo… al terminar), también borre la variable max de main porque ya no es necesario. Lo que hacía max, lo hace b en la función Max (para que se libere una vez terminada la ejecución). Y modifique el printf para no usar una variable de por medio.

Cita Iniciado por Kasa.Ramone
Ver Mensaje
Return acción para devolver valor en la función. Una vez que devolvio valor.. la función se termino, ergo, el for se termina y no se ejecuta totalmente.

Exacto
Se le devuelve el control a la función "llamadora", se liberan las variables locales y lo que no se guardo se perdió :P (Excepto que sea por referencia…).

Nuevo miembro

Kasa.Ramone

entradas: 49

03:14 21/02/2009

11
Cita Iniciado por Brazlee
Ver Mensaje
Sin el return me compilaba igual pero porque no estaba usando la opción -Wall
Lo modifiqué un poco…

http://rafb.net/p/4jwgzr47.html
Si queres verlo

Max recibe un solo argumento, y es el vector, hay un return 0 (ya que int main tiene que devolver algo… al terminar), también borre la variable max de main porque ya no es necesario. Lo que hacía max, lo hace b en la función Max (para que se libere una vez terminada la ejecución). Y modifique el printf para no usar una variable de por medio

Claro, yo siempre uso -wall (viene por defecto en el IDE Geany).
No tenia idea de la pagina esa para postear codigo, gracias por la data.

Extreme Level

santiago_103

entradas: 1483

03:35 21/02/2009

12
Cita Iniciado por Brazlee
Ver Mensaje
Sin el return me compilaba igual pero porque no estaba usando la opción -Wall

Código:
gcc maximo.c -Wall -o maximo
maximo.c: En la función ‘Max’:
maximo.c:14: aviso: el control alcanza el final de una función que no es void
maximo.c: En la función ‘main’:
maximo.c:42: aviso: el control alcanza el final de una función que no es void

Qué extraño que sea solo un warning…

Lo modifiqué un poco…

http://rafb.net/p/4jwgzr47.html
Si queres verlo

Max recibe un solo argumento, y es el vector, hay un return 0 (ya que int main tiene que devolver algo… al terminar), también borre la variable max de main porque ya no es necesario. Lo que hacía max, lo hace b en la función Max (para que se libere una vez terminada la ejecución). Y modifique el printf para no usar una variable de por medio.

Exacto
Se le devuelve el control a la función "llamadora", se liberan las variables locales y lo que no se guardo se perdió :P (Excepto que sea por referencia…).

Ahora entendi todo!!
Cuando la funcion devuelve un valor se ejecuta la llamada a la funcion y depsues el codigo sigue, no se siguen haciendo los bucles.
Yo habia sacado esa idea de este programa que hice:

Código:
#include <stdio.h>

int Max(int a, int b)
{
   if (a>b)
   return a;
   else
   return b;
}

int main()
{
    int metros, max=0;

    do
    {
        printf("Ingrese los metros recorridos: n&quotwink;
        scanf("%d",&metros);
        max=Max(metros,max);
    }
    while(metros>0);
    printf("Maximo de metros recorridos: %d n", max);
    getchar();        getchar();
    return 0;
}

Y ahora entiendo la diferencia, en este segundo caso no habia un bucle de x cantidad de veces predefinidas, corta al ingresar 0, entonces, se ejecuta el codigo, ingreso un numero y se guarda en la variable metros y se lo compara con el valor maximo, ahi tengo la fuincion con los 2 return, entonces devuelve un valor y lo almacena en la variable max, pero como "metros" es mayor a 0 no cumple con la condicion de corte, entonces se ejecuta denuevo y ahi pide que ingrese otro numero y se compara con el valor de max que cambio, y ahi se ejecuta la funcion y determina si es mayor a max y si es asi cambia max y sino no. Y siempre comparo el ingresado con el guardado en la variable.
En cambio, en el del array (quise hacer lo mismo pero con un array para hacerlo un poquitito mas complejo) tengo que hacer que pasen todos los bucles y almacenar el mayor en una variable, y devolver el valor de esa variable, porque si pongo el return adentro del bucle va a devolver el valor, y pasa a la llamada a la funcion, y no la puedo repetir entonces el programa sigue y solo me analizo el primer numero del array, y me imprime ese como mayor.
Es correcto este analisis que le hice??

Nuevo miembro

Brazlee

entradas: 34

03:36 21/02/2009

13
Cita Iniciado por Kasa.Ramone
Ver Mensaje
Claro, yo siempre uso -wall (viene por defecto en el IDE Geany).
No tenia idea de la pagina esa para postear codigo, gracias por la data.

OFF:
Hasta ayer, tampoco tenía idea :P. Ahora buscando un poco, encontré otra:
http://www.friendpaste.com/
Tiene más opciones

Sobre Geany…Lo use una o dos veces ya que viene con el livecd de Zenwalk -uno de los primeros que grabé a CD- , Geany está bueno, es cómodo =) pero nunca lo instale :P.
Uso vim nomas, porque me resulta cómodo para editar los .tex también o cualquier otra cosa…

Nuevo miembro

Kasa.Ramone

entradas: 49

03:40 21/02/2009

14
Cita Iniciado por santiago_103
Ver Mensaje
Y ahora entiendo la diferencia, en este segundo caso no habia un bucle de x cantidad de veces predefinidas, corta al ingresar 0, entonces, se ejecuta el codigo, ingreso un numero y se guarda en la variable metros y se lo compara con el valor maximo, ahi tengo la fuincion con los 2 return, entonces devuelve un valor y lo almacena en la variable max, pero como "metros" es mayor a 0 no cumple con la condicion de corte, entonces se ejecuta denuevo y ahi pide que ingrese otro numero y se compara con el valor de max que cambio, y ahi se ejecuta la funcion y determina si es mayor a max y si es asi cambia max y sino no. Y siempre comparo el ingresado con el guardado en la variable.
En cambio, en el del array (quise hacer lo mismo pero con un array para hacerlo un poquitito mas complejo) tengo que hacer que pasen todos los bucles y almacenar el mayor en una variable, y devolver el valor de esa variable, porque si pongo el return adentro del bucle va a devolver el valor, y pasa a la llamada a la funcion, y no la puedo repetir entonces el programa sigue y solo me analizo el primer numero del array, y me imprime ese como mayor.
Es correcto este analisis que le hice??

Si a " y pasa a la llamada a la funcion" te referis a que termino la función y que el programa sigue de largo, entonces esta perfecto

Saludos.-

P.D: Esta bastante bueno Geany, yo lo uso para C/C++ y Perl. Mientras no tengas que hacer nada muy heavy(tipo un proyecto muy grande, que ahi podes usar otros IDE), va bien, sobretodo cuando estas aprendiendo.

Extreme Level

santiago_103

entradas: 1483

03:55 21/02/2009

15
Cita Iniciado por Kasa.Ramone
Ver Mensaje
Si a " y pasa a la llamada a la funcion" te referis a que termino la función y que el programa sigue de largo, entonces esta perfecto

Saludos.-

Exacto, me referia que terminaba la funcion y que pasaba a la linea donde la llamaba y el programa seguia de largo, mas concretamente me referia a esta linea:

Código:
max=Max(vector, max);

Jajaj ultimamente estoy bastante bien con la programacion.
Bah, "bastante bien", los programas que hago mal cuando los veo bien y me pongo a pensar y me doy cuenta de mis errores y porque estan mal y como habria uqe hacerlo para que este bien. Mas que con la programacion en estos ultimos 3 dias estoy bien con la logica, esta vez no me di cuenta de que el programa seguia de largo y no volvia a la funcion, fui un ****** y no me di cuenta que el programa seguia. Pero ultimamente cuando me doy cuenta de mi error entiendo que es lo que esta mal y porque, antes cuando estaba recien aprendiendo C y me correjian algo no entendia porque era que no funcioaba, y caundo el profesor me explicaba no entendia una mierd* y seguia sin comprender mi errror y depsues para hacer un programa no razonaba diciendo "no, si hago esto va a pasar tal cosa y no va a funcionar", hacai el programa y si escribia algo de una forma me decia "no, esto no andaba, habia que escribirlo de tal forma", y es como que lo escribia de memoria el codigo y no razonando, ahora razonar me cuesta mucho menos, no se porque.. sera uqe las vacaciones hicieron un efecto positivo en mi y me relaja el cerebro jajaj