• Viernes 29 de Marzo de 2024, 08:01

Autor Tema:  Error Al Pasar 4 Argumentos A Una Funcion  (Leído 3625 veces)

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Error Al Pasar 4 Argumentos A Una Funcion
« en: Miércoles 23 de Abril de 2008, 04:37 »
0
bueno soy nuevo en el foro, tengo 15 años y recien estoy empezando a programar. Estoy intentando hacer un programa en C que entre otras cosas clasifica un compuesto quimico, pero cuando tengo que llamar a la funcion ecuacion(), le paso 4 argumentos:

2 strings (cada una viene de otra funcion llamada simb() )
2 enteros (los escribo manualmente)

El problema es que me toma bien el primer string y ambos enteros, pero el segundo string me lo toma igual que el primero, aca les dejo el codigo, perdonen si es alguna macana mia xD

Aca llamo a la funcion:
Código: Text
  1. //paso dos simbolos y dos numeros de valencias
  2.  
  3. printf("Ecuacion(sin balancear): %s", ecuacion(1,1,simb("hidrogeno"),simb(tercera)));
  4.  
  5.  

Aca la declaracion:
Código: Text
  1.  
  2. char *ecuacion(int numv1,int numv2,char simb1[3],char simb2[3]) {...
  3.  
  4.  

(no les copio toda la declaracion porque el error esta cuando paso los argumentos, ya que comprobe los argumentos antes de pasarlos y estaban bien, pero al comprobarlos una vez pasados pasaba lo que comente arriba)

Por ejemplo:
- paso la valencia del hidrogeno y del otro elemento (ambas 1) manualmente
- paso el simbolo del hidrogeno mediante una funcion que hice simb()
- paso el simbolo del elemento guardado en la variable tercera (por ejemplo aluminio) tambien mediante simb()

seria como poner ecuacion(1,1,H,Al)

pero cuando compruebo los valores dentro de la funcion ecuacion, es como si hubiera pasado (1,1,H,H)


Gracias y perdonen si lo puse medio confuso :P

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #1 en: Miércoles 23 de Abril de 2008, 05:37 »
0
Abría que ver la función simb, ¿trataste de pasar también los dos últimos parámetros en forma manual?
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #2 en: Miércoles 23 de Abril de 2008, 05:54 »
0
Tienes razon, probe pasando manualmente los simbolos y los tomo bien, entonces el error debe ser de simb()... aca te dejo la declaracion:

Código: Text
  1.  
  2. char *simb(char names[16]) {
  3.         char name[16];  /*Tuve que hacer esta variable para poder cambiar a mayuscula la primer letra*/
  4.         sprintf(name, "%s", names);
  5.         int num;
  6.         static char simbolo[3];
  7.         if(name[0]>96) {
  8.                        name[0]-=32;
  9.                        }
  10.         for(num=0;num<TOTAL;num++) {
  11.                                    if(strcmp(name, elemento[num].nombre)==0) {
  12.                                                    if(strlen(elemento[num].nombre)==1) sprintf(simbolo, "%c", elemento[num].simbolo[0]);
  13.                                                    else strcpy(simbolo, elemento[num].simbolo);
  14.                                                    return simbolo;
  15.                                                    }
  16.                                    }
  17.         exit(1);
  18. }
  19.  
  20.  

de alguna forma debe de quedar guardado el simbolo anterior y devuelve el mismo :S

Gracias por tu ayuda

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #3 en: Miércoles 23 de Abril de 2008, 08:39 »
0
El unico que tiene el programa funcionando sos vos, depuralo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #4 en: Miércoles 23 de Abril de 2008, 12:27 »
0
es que no se eso de depurar, como dije, soy nuevo, cuando vuelva del colegio busco por internet como hacerlo

si quieren les dejo el codigo fuente

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #5 en: Miércoles 23 de Abril de 2008, 12:58 »
0
Despues de un par de cambios (poner los tipos de retorno int, incluir stdio.h - tengo que compilarlo como C++ ya que las variables en C solo se pueden definir al principio y tu codigo no lo cumple - y modificar el main para que solo llame a ecuacion asi: ecuacion(1,1,"H","Al");) este es el output producido:

H
1
Al
1
num: 17
num2: 1
simb1: H
simb2: Al
romano:
romano:
Ecuacion: H2() + Al() --> H0 Al0

¿Esta mal eso?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #6 en: Miércoles 23 de Abril de 2008, 19:17 »
0
No, asi es como debe salir, pero en el codigo sin modificar tambien funcionaba pasando los argumentos "manualmente", el tema esta cuando los paso con simb()

no entiendo bien lo que dices al principio, pero stdio.h esta incluida, ya que en quimica.c hago:
#include "elementos.h"
y en elementos.h hago:
#include <stdio.h>

y con respecto a las variables, hay alguna variable/funcion no definida al principio?
es que no me doy cuenta :S

Muchas gracias por gastar tu tiempo y hasta modificar el codigo (no conozco c++ todavia ya que primero quiero aprender bien c)

Editado: Mirando bien me di cuenta que meti algunos printf() antes de la declaracion de algunas variables locales (el codigo esta lleno de printf() que son para revisar el valor de algunas variables, y cuando ya funciones las borro o le agrego las // a esa linea y listo)

Igualmente arregle esto y sige sin pasarme bien el segundo argumento de ecuacion() con simb()

corrigeme si me equivoco, pero la estructura del programa quedaria algo asi como:
Código: Text
  1.  
  2. #includes
  3.  
  4. // Esto estaria incluido en elementos.h
  5. struct tablap {} elemento[];
  6. metalono() {}
  7. simb() {}
  8. romanos() {}
  9. ecuacion() {}
  10. // Aca terminaria elementos.h
  11.  
  12. mostrar() {}
  13. menu() {}
  14. buscar() {}
  15. formula() {}
  16. main() {}
  17.  
  18.  

Jeje sorry si escribo confuso

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #7 en: Miércoles 23 de Abril de 2008, 19:54 »
0
Lo que digo es que no pones el tipo de retorno de las funciones:
int metalono(char name[16]){

stdio.h estaba, confusion mia. Y las variables en C se escriben todas al principio, tu codigo no es C. Por ejemplo en la funcion del problema real:

Código: Text
  1.  
  2. char *simb(char names[16]) {
  3.       char name[16];
  4.         sprintf(name, &#34;%s&#34;, names);
  5.         int num; //&#60;&#60; esto es invalido en C
  6.  
  7.  

Ahora el tema es que estas devolviendo una variable estatica (static char simbolo[3]) por lo tanto no puede tener dos valores al mismo tiempo, siempre sera la misma direccion en memoria y tendra unos caracteres determinados, los ultimos escritos. Mejor retorna directamente asi:

return elemento[num].simbolo;

Y trata esa cadena como de solo lectura.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #8 en: Miércoles 23 de Abril de 2008, 20:09 »
0
EDITO: recien lei tu respuesta, entendi lo de static que me dijiste, asi que ahora lo arreglo, en el codigo que esta en esta respuesta ya esta arreglado lo de declarar las variables primero, lo que si no entendi es lo de que no pongo el tipo de retorno. Por ejemplo en elementos.h, metalono esta con el tipo de retorno int, no se que me corregiste (exepto que te hallas fijado en la "estructura" que puse en la respuesta anterior, que era solo representativa y no tenia ninguno de los tipos de retorno))
Igualmente ya funciona y ahora que me aclaraste lo de static ya voy a poder seguir con la funcion formula() para oxidos y haluros.
GRACIAS
--------------------------------------------------------------------------------------------

Logre hacerlo bien haciendo entre otras cosas que en vez de pasar simb("hidrogeno") pase directamente "H" (al pedo usaba simb ahi)

El problema es que solo sirve para hidruros y oxidos (donde el elemento H o O no varia. Cuando son dos elementos variables como en un haluro (no importa que no sepas lo q es, solamente q pueden ser dos elementos cualquiera, entonces si o si tendria q usar simb() en ambos)

Te subo el codigo esta vez arregle un par de cosas y ya funciona, pero sigo con la duda de por que ecuacion ecibia ambos argumentos simb() iguales

Hice una prueba haciendo que cada vez que simb() se ejecute me imprima en pantalla el valor q va a devolver.
Cuando le paso los argumentos a ecuacion() uso simb() dos veces, por lo tanto me imprimia el valor q devolvia en cada caso al argumento. Y para mi sorpresa me devolvio bien los dos, es decir, Al y H (suponiendo que escribo "Hidruro de aluminio" en la opcion 3 del programa).

Esto quiere decir que el error esta cuando ecuacion() me toma los dos argumentos?
si tienes tiempo y ganas de probarlo acordate que cuando llamo a ecuacion() en el codigo actual le paso un solo argumento con simb(), por eso no da error, pero haz la prueba poniendo en vez de "H" simb("hidrogeno")

GRACIAS
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #9 en: Miércoles 23 de Abril de 2008, 20:15 »
0
Cita de: "Riskz"
El problema es que solo sirve para hidruros y oxidos (donde el elemento H o O no varia. Cuando son dos elementos variables como en un haluro (no importa que no sepas lo q es, solamente q pueden ser dos elementos cualquiera, entonces si o si tendria q usar simb() en ambos)

Entonces mucho no sirve  :)

Cita de: "Riskz"
Te subo el codigo esta vez arregle un par de cosas y ya funciona, pero sigo con la duda de por que ecuacion ecibia ambos argumentos simb() iguales

Eso te lo explique arriba:
Ahora el tema es que estas devolviendo una variable estatica (static char simbolo[3]) por lo tanto no puede tener dos valores al mismo tiempo, siempre sera la misma direccion en memoria y tendra unos caracteres determinados, los ultimos escritos. Mejor retorna directamente asi:

return elemento[num].simbolo;

Y trata esa cadena como de solo lectura.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #10 en: Miércoles 23 de Abril de 2008, 20:17 »
0
Citar
EDITO: recien lei tu respuesta, entendi lo de static que me dijiste, asi que ahora lo arreglo, en el codigo que esta en esta respuesta ya esta arreglado lo de declarar las variables primero, lo que si no entendi es lo de que no pongo el tipo de retorno. Por ejemplo en elementos.h, metalono esta con el tipo de retorno int, no se que me corregiste (exepto que te hallas fijado en la "estructura" que puse en la respuesta anterior, que era solo representativa y no tenia ninguno de los tipos de retorno))
Igualmente ya funciona y ahora que me aclaraste lo de static ya voy a poder seguir con la funcion formula() para oxidos y haluros.
GRACIAS
--------------------------------------------------------------------------------------------

Cita de: "Eternal Idol"
Entonces mucho no sirve  :)
Ahora que me aclaraste eso de static ya puedo hacer que funcione con haluros
Gracias de nuevo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #11 en: Miércoles 23 de Abril de 2008, 20:22 »
0
Cita de: "Riskz"
lo que si no entendi es lo de que no pongo el tipo de retorno. Por ejemplo en elementos.h, metalono esta con el tipo de retorno int

Mierda volvi a equivocarme, en este caso eligiendo la funcion, estan en el .c las que no llevaban tipo de retorno ... mostrar, menu, etc.

Cita de: "Riskz"
Ahora que me aclaraste eso de static ya puedo hacer que funcione con haluros
Gracias de nuevo

De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #12 en: Miércoles 23 de Abril de 2008, 20:29 »
0
Es que las funciones mostrar, etc, solamente devuelven 0 (al no poner tipo de retorno es como poner int, cierto?) para que luego main termine (tambien podria hacerlas void), ya que en realidad esas funciones se utilizan una vez sola en el programa (para que son funciones entonces? jajaja, es solo para que me entienda mejor ya que no comento demasiado los programas como veras, tengo q acostumbrarme)

Ahora me surgio otra duda, en la funcion romanos tambien uso static
y la uso tambien 2 veces en este caso, y me devuelve los valores q quiero (distintos), por ejemplo "I" y la segunda vez "III"
porque?
no tendria que devolverme ambas veces "I"?
quizas no entendi tan bien lo que me explicaste

Gracias, :P

Edito: ya hice simb sin static y funciono, gracias :P

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #13 en: Miércoles 23 de Abril de 2008, 20:41 »
0
Cita de: "Riskz"
Es que las funciones mostrar, etc, solamente devuelven 0 (al no poner tipo de retorno es como poner int, cierto?) para que luego main termine (tambien podria hacerlas void), ya que en realidad esas funciones se utilizan una vez sola en el programa (para que son funciones entonces? jajaja, es solo para que me entienda mejor ya que no comento demasiado los programas como veras, tengo q acostumbrarme)

En C++ no hay tipos de retorno por defecto y tu programa en C no compila. Si pones void es que no retorna nada (no podes usar return), 0 es un entero. Que una funcion se use una sola vez no significa que no deba retornar nada, no tiene nada que ver ...

Cita de: "Riskz"
Ahora me surgio otra duda, en la funcion romanos tambien uso static
y la uso tambien 2 veces en este caso, y me devuelve los valores q quiero (distintos), por ejemplo "I" y la segunda vez "III"
porque?
no tendria que devolverme ambas veces "I"?
quizas no entendi tan bien lo que me explicaste

Si los usas atomicamente funcionan pero proba esto y vas a ver a que me refiero
Código: Text
  1.  
  2. printf(&#34;Al mismo tiempo falla: %s %s&#092;r&#092;n&#34;, romanos(2), romanos(3));
  3.  
  4.  

Cita de: "Riskz"
Edito: ya hice simb sin static y funciono, gracias :P

De nadas  :comp:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #14 en: Miércoles 23 de Abril de 2008, 21:06 »
0
Citar
En C++ no hay tipos de retorno por defecto y tu programa en C no compila.

Mi programa lo compilo con el DevC++
esta compilando en c++? (es decir que no tiene nada que ver que el codigo este en un archivo.c?)
como cambio para que compile en C? (es que nunca me di cuenta si compilaba en c++, nunca me tiro ningun error con respecto a los tipos de retorno automaticos ni nada)

Citar
Si pones void es que no retorna nada (no podes usar return), 0 es un entero.

Con lo de void me referia a sacar el return tambiem.

Citar
Que una funcion se use una sola vez no significa que no deba retornar nada, no tiene nada que ver ...

Quise decir como que si la voy a usar solo una vez para que la hice funcion, si la podria haber escrito en main. Y por eso dije que solo era para entenderla mejor.

Gracias :P

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #15 en: Miércoles 23 de Abril de 2008, 21:24 »
0
Cita de: "Riskz"
Mi programa lo compilo con el DevC++
esta compilando en c++? (es decir que no tiene nada que ver que el codigo este en un archivo.c?)
como cambio para que compile en C? (es que nunca me di cuenta si compilaba en c++, nunca me tiro ningun error con respecto a los tipos de retorno automaticos ni nada)
Si, Dev-C++ usa gcc y eso en ANSI C no compila por lo que te comente de las variables. Lo otro depende del grado de "severidad" (es configurable) que tenga el compilador, en VC++ 8 (Visual Studio .NET 2005) por defecto da error:
quimica1.c(50) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Riskz

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Error Al Pasar 4 Argumentos A Una Funcion
« Respuesta #16 en: Viernes 25 de Abril de 2008, 02:14 »
0
Termine el programa!
Al fin lo deje tal cual queria, y todo gracias a tu ayuda

Como agradecimiento te dejo el programa, aunque no te va a servir de mucho exepto que sepas de quimica o (como yo) te sirva para la tarea de quimica del cole.
Jaja
Gracias

(por cierto, dentro del rar hay dos, uno compilado en ANSI C (o eso creo) y el otro en C comun (tampoco estoy seguro), aunque no tuve que cambiar demasiadas cosas)

EDIT:
Subo la version 3, que arregle un par de cosas y ademas agrege funciones
El programa ya acepta hidruros (metalicos y no metalicos), oxidos basicos y acidos, haluros, hidroxidos y oxoacidos
=)
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.