Medidas ...

2 views
Skip to first unread message

Rodolfo (kix)

unread,
Jun 15, 2006, 12:45:24 PM6/15/06
to 9fan...@googlegroups.com
Hola a todos,

llevo toda la santa tarde picando y ahora me sale una chorrada que me trae loco. Me voy a por un café ...

si alguien se echa una mano con la "chorrada":

Tengo esta "basurrilla" de código

            loids = (char**) malloc(sizeof(char*) * sess->maxoids);
            noid = getfields(oids, loids, sess->maxoids, 0, ",");

la cual me parte "oids" en trozos donde encuentre una coma. El número de trozos lo deja en "noid". El problema reside en que pierdo el contenido de "oids" al cortar (vamos, la strtok de toda la vida hace lo mismo). Necesito el contenido de oids para maś tarde.

Para ello tengo que copiar primero el contenido de oids (type char **) en otro chisme [digamos tmp] (char **) y además averiguar su tamaño. oids es un parámetro recibido por línea de comandos (vease argv[n]).

¿Cómo lo copio? ¿Donde están los especialistas en memcpy()? ¿Como defino las cosas? ¿Cuanto mide oids?

Tnks.


--
Rodolfo García "kix"

Rodolfo (kix)

unread,
Jun 15, 2006, 1:22:16 PM6/15/06
to 9fan...@googlegroups.com
Ya, ...

cuestión de cafés.

thanks.

PD:

cpu% cat 1.3.6.1.2.1.1.2.0
<-5- Twalk tag 75 fid 890 newfid 902 nwname 1 0:cat
-5-> Rerror tag 75 ename file not found
<-5- Twalk tag 75 fid 890 newfid 902 nwname 1 0: 1.3.6.1.2.1.1.2.0
-5-> Rwalk tag 75 nwqid 1 0:(0000000000000001 0 )
<-5- Topen tag 75 fid 902 mode 0
fid mode is 0x0
-5-> Ropen tag 75 qid (0000000000000001 0 ) iounit 0
<-5- Tread tag 75 fid 902 offset 0 count 8192
[snmpfs] Debug: fsread() Session created.
[snmpfs] Debug: mkpkt(): Creating a Packet.
[snmpfs] Debug: mkpkt(): Memory for the packet allocated.
[snmpfs] Debug: mkpkt(): The Packet contains data.
[snmpfs] Debug: mkpkt(): Preparing the Request.
[snmpfs] Debug: mkreqid(): Creating a Request ID.
[snmpfs] Debug: mktuple(): Creating a Tuple.
[snmpfs] Debug: mktuple(): Created.
[snmpfs] Debug: mkpkt(): Created.
[snmpfs] Debug: mkpkt(): Creating a Packet.
[snmpfs] Debug: mkpkt(): Memory for the packet allocated.
[snmpfs] Debug: mkpkt(): Created.
[snmpfs] Debug: getit(): Doing a SNMP Get.
[snmpfs] Debug: talk(): Entering in the talk.
[snmpfs] Debug: encpkt(): Encapsulating the Packet.
[snmpfs] Debug: encpkt(): Making a SNMP GetRequest.
[snmpfs] Debug: mktuple(): Creating a Tuple.
[snmpfs] Debug: mktuple(): Created.
[snmpfs] Debug: freetuple(): Freeing the memory of a Tuple.
[snmpfs] Debug: freetuple(): Freeing the memory of a Tuple.
[snmpfs] Debug: freetuple(): Freeded.
[snmpfs] Debug: freetuple(): Freeded.
[snmpfs] Debug: encpkt(): The PDU is not a null pointer.
[snmpfs] Debug: encpkt(): Packet encapsulation Success.
[snmpfs] Debug: talk(): timeout = 5000
[snmpfs] Debug: decpkt(): Decodifing the Packet.
[snmpfs] Debug: decpkt(): Version = 1 Community = public
[snmpfs] Debug: dec_pdu(): Decodifing a PDU.
[snmpfs] Debug: dec_pdu(): reqid = 9913 errstat = 0 erridx = 0
[snmpfs] Debug: dec_pdu(): vlen = 1
[snmpfs] Debug: mktuple(): Creating a Tuple.
[snmpfs] Debug: mktuple(): Created.
[snmpfs] Debug: deb_pdu(): PDU Decodification Success.
[snmpfs] Debug: decpkt(): Packet decodification Success.
[snmpfs] Debug: talk(): pkt readed id = 9913
[snmpfs] Debug: getit(): SNMP Get Done.
[snmpfs] Debug: dumppkt(): Dumping the packets.
[snmpfs] Debug: dumppkt(): Dumping a packet.
[snmpfs] Debug: dumppkt(): Dumping a tuple.
[snmpfs] Debug: dumppkt(): OID = 1.3.6.1.2.1.1.2.0
[snmpfs] Debug: dumppkt(): Packets dumped.
[(1.3.6.1.2.1.1.2.0) (1.3.6.1.4.1.99.1.1.3.28)]

-5-> Rread tag 75 count 0 ''
<-5- Tclunk tag 75 fid 902
-5-> Rclunk tag 75

2006/6/15, Rodolfo (kix) <rodolfo...@gmail.com>:



--
Rodolfo García "kix"

Federico Benavento

unread,
Jun 15, 2006, 1:40:56 PM6/15/06
to 9fan...@googlegroups.com
Y que onda? Usaste memmove:

n = strlen(oids);
s= malloc(n+1);
memmove(s, oids, n);
s[n] = '\0';

o recreaste la string?


--
Federico G. Benavento

Rodolfo (kix)

unread,
Jun 15, 2006, 1:42:28 PM6/15/06
to 9fan...@googlegroups.com
Use justo eso,

memcpy(s, oids, strlen(oids));

2006/6/15, Federico Benavento <bena...@gmail.com>:
> [( 1.3.6.1.2.1.1.2.0) (1.3.6.1.4.1.99.1.1.3.28)]
--
Rodolfo García "kix"

Gabriel Diaz

unread,
Jun 15, 2006, 1:56:54 PM6/15/06
to 9fan...@googlegroups.com
Hola


loids = (char**) malloc(sizeof(char*) * sess->maxoids);

noid = getfields(strdup(oids), loids, sess->maxoids, 0, ",");


y luego no se te olvide hacer un free de loids.

gabi

PD: partiendo de la base de que oids es un string terminado en \0.

Enrique Soriano

unread,
Jun 16, 2006, 4:01:15 AM6/16/06
to 9fan...@googlegroups.com
man 2 strdup

te ahorras el malloc, pero no te olvides el free luego.

q.

Rodolfo (kix)

unread,
Jun 16, 2006, 4:18:39 AM6/16/06
to 9fan...@googlegroups.com
Gracias Enrique,

ya lo había indicado gabi. Sobre los frees ... si sólo fuera ese ;-). Estoy ahora mismo rebuscando todo aquello que hace peticiones de memoria para que me las dewelva.



2006/6/16, Enrique Soriano <enrique...@gmail.com>:



--
Rodolfo García "kix"

Enrique Soriano

unread,
Jun 16, 2006, 6:21:36 AM6/16/06
to 9fan...@googlegroups.com
yo suelo hacer un goto a un punto de salida único
para la función. y antes del (único) return de la función
hago free. funciona, pero tienes que tener cuidado con
los gotos. Cuando la memoria se pasa entre funciones,
lo haces en la que está más abajo en la pila.

q

ps. esto a un ingeniero del software le puede costar
un infarto, pero funciona.

Gabriel Diaz

unread,
Jun 16, 2006, 6:25:04 AM6/16/06
to 9fan...@googlegroups.com
Hola

¿puedes poner un ejemplo de lo que haces?, a mi a simple vista me
parece un poco salvaje :-? igual es que no lo entiendo bien :-?.


gabi

Rodolfo (kix)

unread,
Jun 16, 2006, 6:33:32 AM6/16/06
to 9fan...@googlegroups.com
yo suelo abusar de if(xxx) {} else {} para utilizar un único punto de salida en las funciones. Tambien uso "envezencuando" (veasé acento astur-maño) utilizo variables de tipo entero para almacenar errores y usarlos en los ifs .. ejemplo:

interror1 = 0

if (xxx) {
  blablabla
  error!
  interror1 = 1
} else { blballb}

if ((yyy) && !interror1) {
 xxxx
}





2006/6/16, Gabriel Diaz <gabi...@gmail.com>:
--
Rodolfo García "kix"

Gabriel Diaz

unread,
Jun 16, 2006, 6:35:27 AM6/16/06
to 9fan...@googlegroups.com
hola

a mi esas cosas personalmente no me gustan mucho, hacen el programa
mas dificil de leer. si no hay mas remedio :-D

gabi

Rodolfo (kix)

unread,
Jun 16, 2006, 6:36:53 AM6/16/06
to 9fan...@googlegroups.com
Si,

llevas toda la razón, pero evitan errores. Es lo que todos buscamos ...

algo que te evite errores, te deje el código "bien" y encima no lo haga más engorroso ... ah! y sin buffer overflows ;)

2006/6/16, Gabriel Diaz < gabi...@gmail.com>:

Gabriel Diaz

unread,
Jun 16, 2006, 6:41:20 AM6/16/06
to 9fan...@googlegroups.com
hola

con el hilo de los "errores" de 9fans parece mentira que pongas esas cosas :-D

enrique...@gmail.com

unread,
Jun 17, 2006, 7:46:30 AM6/17/06
to 9fan...@googlegroups.com

> ¿puedes poner un ejemplo de lo que haces?, a mi a simple vista me
> parece un poco salvaje :-? igual es que no lo entiendo bien :-?.
>

Yo lo uso en estos casos:

int
fun(void)
{
char *a;
char *b;
char *c;
int ret = -1;

a = malloc(Alen);
b = malloc(Blen);
c = malloc(Clen);
....
if(auxfun1(a,b,c) < 0)
goto end;
....
if(auxfun2(a,c) < 0)
goto end;
...
if(auxfun3(a,b) < 0)
goto end
...
ret = 1;
end:
free(a);
free(b);
free(c);
return ret;
}

En caso de que haya error en medio de la función, nunca se
te pasa hacer el free. No es tan bruto, no hay código espagueti
porque todos los gotos van al final, reduce el código, e incluso
lo hace más legible. De todas formas, para gustos, los colores.

q.


Reply all
Reply to author
Forward
0 new messages