Vodoo Master Gore escribió: > Creo que esta lista no es para peticiones tales como esa.
Por que no? -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc. From [EMAIL PROTECTED] Wed May 10 01:03:14 2006 From: [EMAIL PROTECTED] (Alvaro Herrera) Date: Wed May 10 01:03:22 2006 Subject: Pregunta de C In-Reply-To: <[EMAIL PROTECTED]> References: <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> Message-ID: <[EMAIL PROTECTED]> Diego Caro escribió: > Según recuerdo de mi curso de C, el malloc necesita un argumento con > el tamaño del tipo de dato. > > arr = malloc( sizeof(char) * natt); > > Pero como sizeof(char) = 1 (un char se guarda con 1 byte), la función > debería funcionar de lo mejor. En realidad, sizeof(char) es 1 no porque char se guarde en 1 byte (8 bits), sino porque sizeof() retorna el taman~o de la variable en unidades de "unsigned char". O bien, porque en C la definicion de byte no es "8 bits", sino "un objeto de tipo unsigned char". http://www.ibm.com/developerworks/power/library/pa-ctypes1/ Lo del tatuaje en la frente es chistoso. Debere probarlo un dia de estos. -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc. From [EMAIL PROTECTED] Tue May 9 21:00:09 2006 From: [EMAIL PROTECTED] (rodrigo ahumada) Date: Wed May 10 01:26:53 2006 Subject: Pregunta de C In-Reply-To: <[EMAIL PROTECTED]> References: <[EMAIL PROTECTED]> Message-ID: <[EMAIL PROTECTED]> On Tue, 9 May 2006 20:07:10 -0400 Alvaro Herrera <[EMAIL PROTECTED]> wrote: > [Republicando desde la lista [EMAIL PROTECTED] > > Tengo una duda. Supongase la funcion siguiente: > > void > pgr_formtuple(Relation foo) > { > int natt = foo->natts; > char arr[natt]; > char nulls[natt]; > > ... > } > > Se aprecia que las variables arr y nulls son creadas como arreglos del > tamaño especificado que no es constante en tiempo de compilacion, sino > que se determina en tiempo de ejecucion dependiendo del contenido del > struct Relation. > > Es valido esto? Debo mencionar que compila perfectamente sin ningun > warning (con varias opciones -W), y que funciona perfectamente para > algunos valores de foo->natts. Sin embargo, el programa se cae en un > caso muy particular que es cuando foo->natts es 61, un valor superior a > los valores tipicos. (natts es el numero de columnas de una tabla; por > lo tanto 61 es un valor perfectamente valido pero tipicamente los > valores andan cercanos a la veintena). [...] yo hice este codigo: #include <stdio.h> void rareza(int valor) { char rareza1[valor]; char rareza2[valor]; printf("tamaño rareza 1: %d\n", sizeof(rareza1)); printf("tamaño rareza 2: %d\n", sizeof(rareza2)); int i; for (i = 0; i < valor; i++) { rareza1[i] = 'A'; rareza2[i] = 'Z'; } rareza1[valor - 1] = 0; rareza2[valor - 1] = 0; printf("%s\n", rareza1); printf("%s\n", rareza2); printf("--------\n"); } int main(int argc, char *argv[]) { int k, desde, hasta; if (argc == 3) { sscanf(argv[1], "%d", &desde); sscanf(argv[2], "%d", &hasta); } else { desde = 10; hasta = 65; } for (k = desde; k < hasta + 1; k++) rareza(k); printf("adios\n"); return(0); } y al ver el .s que sale: (lo estuve siguiendo un poco, no se si lo hice bien, pero se nota que en la funcion rareza, en dos partes se guardan bytes en el stack segun el valor de [ebp+8] (valor)) ... ... .globl rareza .type rareza, @function rareza: push %ebp mov %ebp, %esp push %ebx sub %esp, 36 ; reserva 36 bytes en el stack mov DWORD PTR [%ebp-12], %esp ; guarda el tope del stack dentro de esos 36 bytes mov %edx, DWORD PTR [%ebp+8] ; edx = valor lea %eax, [%edx+15] ; eax = valor +15 add %eax, 15 ; eax = valor + 15 +15 shr %eax, 4 ; eax = (valor + 15 +15) / 16 sal %eax, 4 ; eax = ((valor + 15 +15) / 16) * 16 ¿? sub %esp, %eax ; reserva EAX bytes mas en el stack lea %eax, [%esp+8] ; eax = 8 bytes antes del tope del stack add %eax, 15 ; shr %eax, 4 sal %eax, 4 mov DWORD PTR [%ebp-16], %eax mov %ebx, DWORD PTR [%ebp+8] ; esto es como lo mismo de arriba... lea %eax, [%ebx+15] add %eax, 15 shr %eax, 4 sal %eax, 4 sub %esp, %eax lea %eax, [%esp+8] add %eax, 15 shr %eax, 4 sal %eax, 4 mov DWORD PTR [%ebp-20], %eax mov DWORD PTR [%esp+4], %edx mov DWORD PTR [%esp], OFFSET FLAT:.LC0 call printf mov DWORD PTR [%esp+4], %ebx mov DWORD PTR [%esp], OFFSET FLAT:.LC1 call printf mov DWORD PTR [%ebp-8], 0 ... ... el programa lo he probado con numeros mas grandes que 61 y no se me ha caido... de todas formas, al compilar da ni una queja, y alojar memoria el el stack segun el valor de una variable... (!) ___________________________________________________________ 1GB gratis, Antivirus y Antispam Correo Yahoo!, el mejor correo web del mundo http://correo.yahoo.com.ar

