Pasaje de parametros

Algoritmos, estructuras de datos, estrategias o patterns. Lenguaje' de programasión, vieja! Ce, loco, Ce! Páison, y todo eso.

Pasaje de parametros

Notapor danhorris el Vie Feb 09, 2007 6:48 pm

Buenas Gente!:

Sigo aprendiendo las cosillas de C. Ahora el punto es el pasaje de parametros en las funciones. Estoy utilizando la librería GNU mailutils.
Tengo una estructura stream ya creada y abierta. Les paso la sgte. definicion de funcion que quiero utilizar, que "en teoria" sirve para escribir el stream.

int mu_stream_write (mu_stream_t stream, const char *buffer, size_t buflen, mu_off_t offset, size_t *writen)

Ahora mi llamada a la función sería:

char * buff;
size_t writen;
size_t bufflen;
buff = malloc(4*sizeof(char));
bufflen=sizeof(buff);
strcpy(buff,"Hola");

estado=mu_stream_write(stream,buff,bufflen,offset,&writen);

El punto es que no me ejecuta la correctamente la función. El cód del error (estado) me devuelve un "Invalid argument". A que puede deberse?

Estudiando un poco el tema del pasaje de parametros, me pregunto si realmente voy a modificar el stream, ya que el pasaje segun la definición de la funcion lo estaría haciendo por valor y no por referencia (que es lo que quiero en realidad, modificar el stream con el valor de buff)

saludos!
danhorris
 
Posts: 23
Registrado: Vie Ene 26, 2007 9:18 am

Pasaje de parametros

Sponsor

Sponsor
 

Re: Pasaje de parametros

Notapor Adriano el Vie Feb 09, 2007 7:14 pm

Vediamo:
  • buff tiene que tener como largo 5 chars, no 4 (siempre va uno más para el '\0' de terminación, si le copiás un literal string)

No sé exactamente qué argumento le estás pasando mal, probá a compilar con la opción
Código: Seleccionar todo
-Wall
de gcc, y pegate la parte _relevante_ acá del output o adjuntá el output como un archivo de texto.
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Pasaje de parametros

Notapor danhorris el Vie Feb 09, 2007 7:28 pm

Claro, no se cual de los argumentos es el incorrecto.

Probé compilar con la opción -Wall, pero no arrojo ningún resultado (compilo correctamente) y en primera instancia me informo sobre las variables sin uso, las borré y no dió ningun aviso más...

Los argumentos son del tipo correcto al parecer y están inicializados.

Que otra cosa puede ser?...
danhorris
 
Posts: 23
Registrado: Vie Ene 26, 2007 9:18 am

Re: Pasaje de parametros

Notapor Adriano el Vie Feb 09, 2007 7:36 pm

¿Podés copiar el error completo, y cuándo te lo da en tiempo de ejecución?
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Pasaje de parametros

Notapor danhorris el Vie Feb 09, 2007 7:43 pm

Vediamo!:

Te dejo una parte del código. Las declaraciones son las mismas del post anterior.

estado= mu_stream_create(&stream,MU_STREAM_RDWR,owner); //creo el stream
mu_stream_open(stream);
estado=mu_stream_write(stream,buff,bufflen,offset,&writen); //intento escribir el stream con el contenido de buff

if (estado!=0) {

mu_error ("mu_stream_write: %s", mu_strerror (estado));
}



No tengo errores en tiempo de compilación. Al comprobar que no escribió el stream intenté leer que valor me retorna la función, y ahí me imprime que el error es "Invalida argument".
danhorris
 
Posts: 23
Registrado: Vie Ene 26, 2007 9:18 am

Re: Pasaje de parametros

Notapor Adriano el Vie Feb 09, 2007 7:58 pm

No se me ocurre qué pueda ser. Podrías probar con pasarle parámetros hardcoded (correctos, claro) tipo "hola" y 5 como buffer y buflen respectivamente, y probar a usar los otros parámetros en otras funciones de la librería, o asegurarte de alguna forma que están bien cuando se los pasás a ...write(). O podés esperar a que alguien con más experiencia que yo responda... La documentación online trae sólo el prototipo de la función, y eso ya lo habías puesto vos...
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Pasaje de parametros

Notapor buanzo el Sab Feb 10, 2007 12:08 am

Los buffers se suelen pasar como &... tal vez es eso.

Por otra parte, no estas chequeando el valor de retorno de mu_stream_open().

por otra parte, yo a veces uso una serie de parametros que me dan un codigo bastante portable... A veces necesito poner algunos #define arriba de todo, pero bue'...

Código: Seleccionar todo
-Wall -ansi -pedantic


Aunque no lo uses para todo tu codigo, a veces te ayuda a encontrar algun error por cuestiones de prototipeo que gcc extendido no te dice ni con Wall
Avatarde Usuario
buanzo
Administrador
 
Posts: 673
Registrado: Sab Dic 09, 2006 11:17 am
Ubicación: Buanzonia (ok, Florida, Buenos Aires)

Re: Pasaje de parametros

Notapor Adriano el Sab Feb 10, 2007 3:18 am

No lo recomendé acá porque, siendo funciones que posiblemente usen la parte POSIX, a veces no son compatibles con -ansi. O al menos, eso me pasó estudiando Sistemas Operativos Smile
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Pasaje de parametros

Notapor danhorris el Sab Feb 10, 2007 10:17 am

Sip estoy chequeando el valor de mu_stream_open(stream). Y el valor de retornno es 0.

Otro detalle es que a la función mu_stream_write() le paso el stream por "valor" y no por "referencia", estaría modificando el stream con el valor de buffer entonces???

mu_stream_write() es la función mas "razonable" para escribir la estructura stream.
danhorris
 
Posts: 23
Registrado: Vie Ene 26, 2007 9:18 am

Re: Pasaje de parametros

Notapor Astor el Mie Feb 28, 2007 1:19 pm

Este codigo

char * buff;
size_t writen;
size_t bufflen;
buff = malloc(4*sizeof(char));
bufflen=sizeof(buff);
strcpy(buff,"Hola");

lo dejaste igual o lo modificaste ?
en buff estas poniendo 5 caracteres (Hola + '\0') y solo alocaste 4. Es decir que el 5 byte puede que este cayendo encima de bufflen (al ser variables locales estan en el stack en orden inverso).

Aparte si queres obtener el tamaño de buff no podes hacer "sizeof(buff)" ya que el sizeof de un puntero es siempre el mismo (dependiendo la arquitectura que uses, pero es probable que sean 4 bytes en un IA32).

Saludos.
Astor
Amigo del Jefe
 
Posts: 1
Registrado: Mie Feb 28, 2007 1:14 pm


Volver a Programación y Diseño de Sófwer.

¿Quién está conectado...?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron