• Jueves 28 de Marzo de 2024, 14:18

Autor Tema:  Paso De Argumentos En C  (Leído 3057 veces)

huevofritopamojarpan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Paso De Argumentos En C
« en: Lunes 5 de Mayo de 2008, 07:02 »
0
Tengo dudas (es lo que tiene ser novato, jeje) respecto al paso de argumentos en funciones. ¿Cómo debería hacer para pasar un array de caracteres y poder modificarlo con la función? Es que mi duda es que el nombre del array es un puntero al primer elemento del array, entonces no debería usar punteros, pero al escribir la función si no indico que es un puntero la función entiende que es un caracter solo, creo, por lo sí debería usar punteros ¿Cuál es la solución?
La función podría servir para rellenar con ceros un array de caracteres, por ejemplo.
Muchas gracias!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #1 en: Lunes 5 de Mayo de 2008, 09:18 »
0
Si, char * (puntero a caracter) tenes que usar. Tene en cuenta el tamaño del array ya que el mismo no puede variar (podes acortar una cadena terminandola con el 0 correspondiente pero no agrandarla).

Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. void cambiar(char *buff)
  5. {
  6.   *buff = 'S';
  7.   //cad ahora es "SOLA"
  8. }
  9.  
  10. char cad[] = "HOLA"; //la cadena esta en una seccion read/write
  11.  
  12. void main()
  13. {
  14.   //char cad[] = "HOLA"; //asi tambien funciona, la cadena esta en la pila
  15.   //char *cad = "HOLA"; //asi no, la cadena esta en una seccion read only
  16.   cambiar(cad);
  17.   printf("%s\r\n", cad);
  18. }
  19.  
  20.  

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.

huevofritopamojarpan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #2 en: Lunes 5 de Mayo de 2008, 14:25 »
0
Pero como hago para acceder a un elemento del array como array? ¿No se puede hacer como array y tengo que hacerlo con punteros?
Es que soy novato en esto y aunque entiendo los punteros y tal, prefiero no usarlos hasta dominar mejor el lenguaje.
Muchas gracias!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #3 en: Lunes 5 de Mayo de 2008, 14:40 »
0
Código: Text
  1.  
  2. buff[0] = 'S';
  3. buff[1] = 'O';
  4. buff[2] = 'S';
  5. buff[3] = 0;
  6.  
  7.  

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: Paso De Argumentos En C
« Respuesta #4 en: Miércoles 7 de Mayo de 2008, 00:07 »
0
Pues yo en C lo hago asi, nunca me dio error

ejemplo:
Código: Text
  1.  
  2. char *funcion(static char string[20]) {
  3.  
  4. ...
  5. return string;
  6. }
  7.  
  8.  

Es decir, el argumento es un array con un limite maximo de caracteres, en este caso 19. Para devolver un string si que necesitas un puntero, y para eso yo hago la variable statica (o sea que no se borra al finalizar la funcion)

Ambos metodos son crrectos, tanto el mio (creo) como el de Eternal Idol, creo que la diferencia es que el de el trabajo directo sobre la cadena que le pasas, en cambio el mio crea una cadena nueva copia dentro de la funcion, y no trabaja sobre la original, es decir que para cambiarle el valor tendrias que hacer por ejemplo
Código: Text
  1.  
  2. strcpy(cad, cambiar(cad));   //solo con mi metodo
  3.  
  4.  

Saludos

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #5 en: Miércoles 7 de Mayo de 2008, 08:12 »
0
Los arrays se pasan por referencia y no por valor.

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.

huevofritopamojarpan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #6 en: Miércoles 7 de Mayo de 2008, 13:09 »
0
Muchas gracias por las respuestas. :D

A ver, no quiero crear una variable estática, porque sería desperdiciar recursos. Lo que pretendo es hacer una función a la que se le pasen 2 arrays de caracteres, y guarde en el segundo array el primero modificado. Este es el código que tengo (que no me funciona):


Código: Text
  1. void corregir_espacios(char texto[1000], char texto2[1000])
  2.   {
  3.   int i;
  4.   int j;
  5.   char corregido[1000];
  6.   i=0;
  7.   j=0;
  8.   while (texto[i]!=0)  
  9.     {
  10.     if (isspace(texto[i]))  /*Salta los espacios antes de otro espacio o un signo de puntuación*/
  11.       {
  12.       if (ispunct(texto[i+1])||isspace(texto[i+1]))
  13.         {
  14.         i=i+1;  
  15.         }
  16.       else
  17.         {
  18.         corregido[j]=texto[i];
  19.         i=i+1;
  20.         j=j+1;
  21.         }
  22.       }
  23.     else if (ispunct(texto[i]))  //Inserta un espacio después de un signo
  24.       {          
  25.       corregido[j]=texto[i];
  26.       j=j+1;
  27.       corregido[j]=' ';
  28.       i=i+1;
  29.       j=j+1;
  30.       }
  31.     else
  32.       {  
  33.       corregido[j]=corregido[i];
  34.       i=i+1;
  35.       j=j+1;                  
  36.       }
  37.      
  38.     }
  39.   strcpy(texto2,corregido);
  40.   }
  41.  
  42.  

¿Por qué no funciona?
También he probado a hacer esta función de otra manera, pasándole un solo argumento y que devuelva el array modificado, y después, fuera del procedimiento ya hago es strcpy. Pero tampoco me ha funcionado.

Bueno, muchas gracias.
Un saludo! :hola:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #7 en: Miércoles 7 de Mayo de 2008, 14:26 »
0
corregido[j]=corregido;

El codigo no me gusta NADA realmente ... a ver si es esto lo que queres:

Código: Text
  1.  
  2. void corregir_espacios(char *texto, char *texto2)
  3. {
  4.   int i = 0;
  5.   int j = 0;
  6.  
  7.   while (texto[i])
  8.   {
  9.     if (isspace(texto[i]))  /*Salta los espacios antes de otro espacio o un signo de puntuación*/
  10.     {
  11.       if ( ispunct(texto[i+1]) || isspace(texto[i+1]) )
  12.       {
  13.         i++;
  14.       }
  15.       else
  16.       {
  17.         texto2[j++] = texto[i++];        
  18.       }
  19.     }
  20.     else if (ispunct(texto[i]))  //Inserta un espacio después de un signo
  21.     {          
  22.       texto2[j++] = texto[i++];
  23.       texto2[j++] = ' ';
  24.     }
  25.     else
  26.     {  
  27.       texto2[j++] = texto[i++];
  28.     }
  29.   }
  30. }
  31.  
  32.  

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.

huevofritopamojarpan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #8 en: Miércoles 7 de Mayo de 2008, 15:40 »
0
Ouch! Vaya error más estúpido.

Lo de NADA en mayúsculas me acaba de hundir la moral... jeje, es coña.  :P
Muchas gracias por ayudarme. La verdad es que tu código es bastante más compacto.
Yo vengo de MODULA-2, y todavía estoy iniciándome en C. Por eso, por ejemplo, casi nunca uso los incrementos (i++) y otras cosas.

Al final lo he dejado así:
Código: Text
  1. void corregir_espacios(char texto[1000], char texto2[1000])
  2.   {
  3.   int i = 0;
  4.   int j = 0;
  5.  
  6.   while (texto[i])
  7.     {
  8.     if (isspace(texto[i]) && ( ispunct(texto[i+1]) || isspace(texto[i+1]) ))  /*Salta los espacios antes de otro espacio o un signo de puntuación*/
  9.       {
  10.       i++;
  11.       }
  12.     else if (ispunct(texto[i]) && !isspace(texto[i+1]))  //Inserta un espacio después de un signo
  13.       {          
  14.       texto2[j++] = texto[i++];
  15.       texto2[j++] = ' ';
  16.       }
  17.     else
  18.       {  
  19.       texto2[j++] = texto[i++];
  20.       }
  21.     }
  22.   }
  23.  
  24.  


Bueno, lo dicho, he aprendido bastante con este post. :smartass:  Muchas gracias!!
 :hola:

PD: Eternal Ido, cuando dices que mi código no te gusta nada, ¿lo dices por estética, por poco compacto, o por eficiencia?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #9 en: Miércoles 7 de Mayo de 2008, 15:46 »
0
Cita de: "huevofritopamojarpan"
Lo de NADA en mayúsculas me acaba de hundir la moral... jeje, es coña.  :P
Muchas gracias por ayudarme. La verdad es que tu código es bastante más compacto.
Yo vengo de MODULA-2, y todavía estoy iniciándome en C. Por eso, por ejemplo, casi nunca uso los incrementos (i++) y otras cosas.
Lo digo principalmente por las tabulaciones. Me da dolor de ojos leer codigo sin tabulaciones, no se puede entender bien rapidamente como uno tabulado. Lo de los incrementos es simplemente cuestion de practicidad, seguramente el compilador te lo optimize con lo cual no habria ninguna mejora en el rendimiento.

Igual lo MAS importante es que funcione  ;)

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.

huevofritopamojarpan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #10 en: Miércoles 7 de Mayo de 2008, 15:57 »
0
Si te fijas sí que he tabulado bien, lo que pasa es que lo hago de forma distinta. Por ejemplo: pongo un if y abro la llave ya tabulada. Tú lo haces de otra forma, no tabulas la llave pero sí el código que contiene.

Mi forma:
Código: Text
  1. void corregir_espacios(char texto[1000], char texto2[1000])
  2.   {
  3.   int i = 0;
  4.   int j = 0;
  5.  



La tuya:
Código: Text
  1. void corregir_espacios(char *texto, char *texto2)
  2. {
  3.   int i = 0;
  4.  



¿Tu forma es la estándar? Si es así debería empezar a utilizarla.
Agur!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #11 en: Miércoles 7 de Mayo de 2008, 16:06 »
0
Cita de: "huevofritopamojarpan"
Si te fijas sí que he tabulado bien, lo que pasa es que lo hago de forma distinta. Por ejemplo: pongo un if y abro la llave ya tabulada. Tú lo haces de otra forma, no tabulas la llave pero sí el código que contiene.

¿Tu forma es la estándar? Si es así debería empezar a utilizarla.
Agur!!
Tenes razon, no me di cuenta, para mi solo se veia incomprensible y por eso lo tabule como siempre hago yo  :lol: En cuanto a escribir el codigo no hay un standard universal, algunas empresas crean el suyo interno por ejemplo. Hay que apuntar a la legibilidad  :)

Agur! ¿Sos vasco? Vivi dos años en Bilbao por eso pregunto  :kicking:

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.

huevofritopamojarpan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #12 en: Miércoles 7 de Mayo de 2008, 16:26 »
0
Pues va a ser que no, soy gallego pero tengo raíces en el país vasco y mis abuelos estuvieron viviendo durante una época del franquismo en el Pais Vasco. Incluso mi madre nació en el País Vasco (en Aretxabaleta), pero vivió allí sólo hasta los 4 años.

Y vos, sos argentino, no? XDD

Encantado de conocerte.
Un saludo!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #13 en: Miércoles 7 de Mayo de 2008, 16:29 »
0
Cita de: "huevofritopamojarpan"
Pues va a ser que no, soy gallego pero tengo raíces en el país vasco y mis abuelos estuvieron viviendo durante una época del franquismo en el Pais Vasco. Incluso mi madre nació en el País Vasco (en Aretxabaleta), pero vivió allí sólo hasta los 4 años.

Y vos, sos argentino, no? XDD

Encantado de conocerte.
Un saludo!
Ah, esta bien, de algun lado tenia que venir el agur  :smartass:

Si señor, yo soy argentino  :)

 Igualmente encantado y saludos.

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: Paso De Argumentos En C
« Respuesta #14 en: Jueves 8 de Mayo de 2008, 01:07 »
0
Otro argentino por aca :P
Eternal puede ser que no me deje mandar MP?

Saludos

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Paso De Argumentos En C
« Respuesta #15 en: Jueves 8 de Mayo de 2008, 08:12 »
0
Cita de: "Riskz"
Otro argentino por aca :P
Eternal puede ser que no me deje mandar MP?

Saludos
Si, no me acuerdo cuantos mensajes hay que tener para poder hacerlo.

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.