|
121
|
Programación / Programación C/C++ / Problema al escribir archivo - 0D le precede a 0A (Solucionado)
|
en: 9 Mayo 2016, 06:06 am
|
Problema al escribir archivo... Realmente estoy rompiéndome la cabeza desde hace unos 2 dias... Al momento de guardar datos en un archivo escribo los datos de 2 bytes en 2 bytes. Todo bien pero llega un momento en que el programa no guarda la información que debe de guardar, sin embargo si mando a imprimir lo que esta guardando esta información si es correcta, pero no la que se guarda en el archivo. file = fopen(nombre ,"a+"); if(file) { debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset); fwrite(primos [offset ]->valor ,primos [offset ]->bytes ,1,file ); }
Mando a llamar a una función debug para ver que es lo que se esta guardando, esta función me imprime el contenido de la memoria sin afectarlo... void debug(char *s,unsigned char *ptr,unsigned int l,...) { va_list args; int i = 0; char *buffer; buffer = calloc(len ,sizeof(char)); printf("%s: 0x%x ",buffer ,ptr ); while(ptr && i < l) { } }
Aquí lo importante es notar que llamo a fwrite para escribir en el archivo abierto con la opcion "a+" debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset); fwrite(primos [offset ]->valor ,primos [offset ]->bytes ,1,file );
La posición de memoria que se guarda es: primos[offset]->valor y la cantidad de bytes que se guardan con fwrite y se imprimen con debug es primos[offset]->bytes que para el ejemplo dado vale 2 La salida del programa va mas o menos asi... -primos[54]: 0x567fd0 0101 -primos[55]: 0x567ef0 0701 -primos[56]: 0x567f10 0d01 -primos[57]: 0x567ff0 0f01 -primos[58]: 0x567f60 1501 -primos[59]: 0x567e60 1901 -primos[60]: 0x568000 1b01 -primos[61]: 0x567f20 2501 -primos[62]: 0x567f90 3301 -primos[63]: 0x568010 3701 -primos[64]: 0x568020 3901 -primos[65]: 0x567e80 3d01 -primos[66]: 0x567f40 4b01 -primos[67]: 0x567f50 5101 -primos[68]: 0x568030 5b01 ... y donde se presenta el problema es la siguiente: -primos[372]: 0x568520 f509 -primos[373]: 0x568560 f709 -primos[374]: 0x5682c0 fd09 -primos[375]: 0x5683f0 130a -primos[376]: 0x5682b0 1f0a -primos[377]: 0x568570 210a -primos[378]: 0x5681e0 310a -primos[379]: 0x568390 390a -primos[380]: 0x5683e0 3d0a -primos[381]: 0x5681f0 490a -primos[382]: 0x568330 570a -primos[383]: 0x5683a0 610a ... ¿Nada anormal? Claro esa salida esta bien, el problema esta al guardar el archivo en ese ultimo segmento queda asi (Salida hexadecimal) F509F709FD09130D0A1F0D0A210D0A310D0A390D0A3D0D0A490D0A570D0A610D0A630D0A670D0A6F0D0A750D0A7B0D0A7F0D0A810D0A850D0A8B0D0A930D0A970D0A990D0A9F0D0AA90D0AAB0D0AB50D0ABD0D0AC10D0ACF0D0AD90D0AE50D0AE70D0AED0D0AF10D0AF30D0A030B110B150B1B0B Ahora que lo veo Noto un recurrente 0D y no tengo ni idea de donde sale, el detalle no veo error en donde se guarda el archivo repito: debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset); fwrite(primos [offset ]->valor ,primos [offset ]->bytes ,1,file );
En teoría lo que se muestra en la salida estándar y en el archivo creado debería de ser lo mismo primos[offset]->valor Si a alguien le a pasado algo similar o de plano ve un error que yo no veo por favor avíseme. No creo que sa detalle del sistema, el error se me presenta tanto en FreeBSD y en Windows
|
|
|
123
|
Programación / Programación C/C++ / C vs C++ [Civil War]
|
en: 3 Mayo 2016, 23:23 pm
|
Este post es totalmente offtopic del foro de Programacion C/C++ Las discuciones entre programadores que giran en torno al lenguaje C y sus derivados siempre son por temas un tanto tontos como si: void funcion() { }
void funcion() { }
Que si espacio o tabulador, que si funciones o metodos que si unsigned o signed, que si new o malloc, que si malloc o calloc en fin.. Cuando aprendi programación iniciamos con orientado a objetos y despues ejemplos en C estandar y me agradaban mas los ejemplos sencillos en C, me gustaba tener mas control de la memoria y programar a mas bajo nivel. A muchos no les gusta o no entienden los punteros o que se yo tal vez vienen de algun lenguaje de mas alto nivel cómo VB o de algun lenguaje script donde no se preocupan tanto por la memoria o los tipos de datos. He aprendido muchos lenguajes tanto VB como C sharp, Java, Ensamblador, PHP, y varios lenguajes script puedo decir que todos tienen sus pro y sos contra, aun asi NO me canso de programar en C, hay veces que he tenido fricciones con compañeros por la forma en la que programo me dicen usa esto o has esto y la verdad yo nunca les he dicho com programar en fin... Yo prefiero usar Tabuladores para separar. ¿Tienen ustedes fricciones por como programan o alguna vez le han dicho a alguien mas que mejor use una función u otra?
|
|
|
124
|
Programación / Programación C/C++ / Optimizando función manual de modulo o resto.
|
en: 1 Mayo 2016, 23:14 pm
|
En su momento mas de alguno uso el operador modulo r = a % n; donde r es el resto de la división a/n donde n != 0 Ahora como estoy trabajando con numeros muy grandes de longitud variable el operador modulo como tal no me sirve, necesito crear la funcion que haga el modulo manualmente. Si alguno de ustedes se perdio los temas, estos son algunos de ellos Números de longitud variable en C (Numeros muy grandes)Restas manuales en "Binario"Ahora si hacemos la funcion modulo en forma de restas, tenemos solo le tenemos que restar al numero a el valor de n hastra que a sea menor que nEl siguiente codigo es muestra de ello de forma manual y sin ninguna optimizacion. #include<stdio.h> int main() { int resto,a,n,contador; a = 9999998; n = 3; resto = a; contador = 0; while(resto >= n) { resto-= n; contador++; } printf("resto: %u\nVeces en el ciclo %u\n",resto ,contador ); }
Salida: resto: 2 Veces en el ciclo 3333332
Como vemos el numero de veces que entra al ciclo es el resultado de la división obtenido de forma iterativa mediante restas sucesivas. Pero como se trata solo de la función "Modulo" o "Resto" no nos interesa el resultado de la división, para fines prácticos y rápidos realice esa función un poco mas optimizada y se podría optimizar mas, pero ya lo dejo a su consideración. #include<stdio.h> int main() { int resto,a,n,contador,n_pivote,resto_pivote,entrar; a = 9999998; n = 3; resto = a; contador = 0; resto_pivote = resto; n_pivote = n; entrar = 1; while(entrar && resto >= n) { resto_pivote-=n_pivote; if(resto_pivote>=0) { resto = resto_pivote; n_pivote*=2; } else { if(n_pivote > n) { n_pivote/=2; resto_pivote = resto; } else { entrar = 0; } } contador++; } printf("resto: %u\nVeces en el ciclo %u\n",resto ,contador ); }
Salida: resto: 2 Veces en el ciclo 65
Como vemos el numero de veces que entra es muchísimo menor incluso si optimizamos mas la función para este ejemplo podremos llegar hasta solo 55 o 58 veces entrando al ciclo dado. El programa utilizada una aproximación binaria ya que en cada iteracion al numero a se le resta un valor igual a n*2 veces la cantidad del ciclo anterior. Dado que estoy trabajando con numero descomunalmente grandes... cualquier optimizan en estas funciones es mas que bien recibida. Saludos! Optimize aun mas el Código y ahora solo se ejecuta 42 veces para el ejemplo dado. Ahora en lugar de incrementar el sustraendo dentro del ciclo principal lo incremento al máximo en un ciclo aparte antes del principal y posteriormente dentro del ciclo principal lo decremento hasta que sea el un multiplo de n inmediamtamente menor al valor actual de r #include<stdio.h> int main() { int resto,a,n,contador,n_pivote,entrar; a = 9999998; n = 3; resto = a; contador = 0; n_pivote = n; entrar = 1; while(n_pivote<resto) { n_pivote+=n_pivote; contador++; } while(entrar && resto >= n) { while(n_pivote>resto && n_pivote>n) { n_pivote/=2; contador++; } resto-=n_pivote; } printf("resto: %u\nVeces en el ciclo %u\n",resto ,contador ); }
Salida: resto: 2 Veces en el ciclo 42
Considero yo que es el mas optimizado pero no se tal vez se puede ahorrar alguno que otro ciclo, la variable contador solo es para fines didácticos. Saludos
|
|
|
125
|
Programación / Programación C/C++ / Restas manuales en "Binario"
|
en: 1 Mayo 2016, 15:16 pm
|
Muy buen dia compañeros. Ayer publique el tema Números de longitud variable en C (Numeros muy grandes)Donde transformo strings de numeros a su representación en "binario" en memoria. Ya hago sumas y multiplicaciones en forma de sumas multiples. Necesito hacer ahora restas tengo mis dudas se que es una tonteria pero estoy hecho un lio. Las sumas a nivel de "byte" las hago asi: unsigned char resultado[3]; unsigned char acarreo; unsigned char a; unsigned char b; unsigned short c; a = 0xFF; b = 0x01; c = a + b; //ahora c vale 0x0101 resultado[0] = c; acarreo = c >> 8; //el acarreo se le suma al siguiente ciclo de bytes
Asi puedo meter ese seudo codigo en un ciclo de N bytes y poder trabajar con numetro positivos de cualquier longitud Ahora el detalle que necesito usar la operacion modulo y para ello necesito hacer diviciones y por lo tante necesito restas. Mi duda es hacer las restas mas o menos igual #include<stdio.h> int main() { unsigned char a; unsigned char b; unsigned short c; a = 0xFF; b = 0x01; c = a - b; }
Obvio tendré que tener forma de capturar los números negativos, y si es negativo ¿Que hay que hacer? ¿es como si fuera el acarreo en la suma? intente hacer las restas en el cuaderno en binario y me dormi en el intento eso fue hace unas 5 horas.
|
|
|
126
|
Programación / Programación C/C++ / Números de longitud variable en C (Numeros muy grandes)
|
en: 30 Abril 2016, 20:40 pm
|
Y si bien deben de existir varias librerías que ya lo implementen a su manera no me quería quedar sin implementar mi propia solución. El programa ahora solo convierte cadenas de números decimales "1234" en su representación binaria en memoria, pero no se engañen esta no es la función strtol, esta puede almacenar numeros (sin signo por el momento) de cualquier longitud siempre y cuando tengamos memoria suficiente. Vamos a ver un ejemplo de las siguientes cadenas: "1" "50" "200" "255" "65535" "4294967295" "18446744073709551615" int main() { numero *n; n = valor("1"); //Ejemplo de 1 solo digito free_numero(n); n = valor("50"); //Ejemplo de 2 digitos free_numero(n); n = valor("200"); //Ejemplo de 3 digitos free_numero(n); n = valor("255"); //Maximo numero de 1 byte free_numero(n); n = valor("65535"); //Maximo numero de 2 bytes free_numero(n); n = valor("4294967295"); //Maximo numero de 4 bytes free_numero(n); n = valor("18446744073709551615"); //Maximo numero de 8 bytes free_numero(n); }
Salida (Con un poco de depuración) procesando numero 1 1 x10^0 : numeros[0]->valor: 0x456b30 01 b->valor: 0x456bb0 01 procesando numero 50 5 x10^1 : numeros[0]->valor: 0x451480 32 0 x10^0 : numeros[1]->valor: 0x451470 00 b->valor: 0x451530 32 procesando numero 200 2 x10^2 : numeros[0]->valor: 0x451470 c8 0 x10^1 : numeros[1]->valor: 0x4514f0 00 0 x10^0 : numeros[2]->valor: 0x4514b0 00 b->valor: 0x451500 c8 procesando numero 255 2 x10^2 : numeros[0]->valor: 0x451550 c8 5 x10^1 : numeros[1]->valor: 0x451420 32 5 x10^0 : numeros[2]->valor: 0x451530 05 b->valor: 0x451420 ff procesando numero 65535 6 x10^4 : numeros[0]->valor: 0x451410 60ea 5 x10^3 : numeros[1]->valor: 0x451510 8813 5 x10^2 : numeros[2]->valor: 0x4514a0 f401 3 x10^1 : numeros[3]->valor: 0x451530 1e 5 x10^0 : numeros[4]->valor: 0x4513e0 05 b->valor: 0x451420 ffff procesando numero 4294967295 4 x10^9 : numeros[0]->valor: 0x4514f0 00286bee 2 x10^8 : numeros[1]->valor: 0x4514a0 00c2eb0b 9 x10^7 : numeros[2]->valor: 0x4514b0 804a5d05 4 x10^6 : numeros[3]->valor: 0x457210 00093d 9 x10^5 : numeros[4]->valor: 0x4571a0 a0bb0d 6 x10^4 : numeros[5]->valor: 0x457160 60ea 7 x10^3 : numeros[6]->valor: 0x457380 581b 2 x10^2 : numeros[7]->valor: 0x456ff0 c8 9 x10^1 : numeros[8]->valor: 0x457230 5a 5 x10^0 : numeros[9]->valor: 0x4572e0 05 b->valor: 0x457210 ffffffff procesando numero 18446744073709551615 1 x10^19 : numeros[0]->valor: 0x457180 0000e8890423c78a 8 x10^18 : numeros[1]->valor: 0x4572e0 0000203b9db5056f 4 x10^17 : numeros[2]->valor: 0x457370 00002876e1158d05 4 x10^16 : numeros[3]->valor: 0x457390 000004bfc91b8e 6 x10^15 : numeros[4]->valor: 0x457360 0000a7dcf75015 7 x10^14 : numeros[5]->valor: 0x456ff0 00c05773a57c02 4 x10^13 : numeros[6]->valor: 0x457060 0080ca396124 4 x10^12 : numeros[7]->valor: 0x457000 00409452a303 0 x10^11 : numeros[8]->valor: 0x457080 00 7 x10^10 : numeros[9]->valor: 0x457290 003c534c10 3 x10^9 : numeros[10]->valor: 0x457330 005ed0b2 7 x10^8 : numeros[11]->valor: 0x4571a0 0027b929 0 x10^7 : numeros[12]->valor: 0x4571e0 00 9 x10^6 : numeros[13]->valor: 0x457200 405489 5 x10^5 : numeros[14]->valor: 0x4570d0 20a107 5 x10^4 : numeros[15]->valor: 0x457250 50c3 1 x10^3 : numeros[16]->valor: 0x4572a0 e803 6 x10^2 : numeros[17]->valor: 0x457240 5802 1 x10^1 : numeros[18]->valor: 0x457130 0a 5 x10^0 : numeros[19]->valor: 0x457150 05 b->valor: 0x457840 ffffffffffffffff
Ahora esos son ejemplo que las funciones estándar existentes pueden manejar correctamente Ahora bien el siguiente numero 98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210 int main() { numero *n; n = valor("98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210"); //Ejemplo de un Googol??? free_numero(n); }
Salida sin tanta depuración: procesando numero 98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210 b->valor: 0x777b70 ea7ec651d7671ed5de67409bdc172dc9a9d7bbd8302306b3a2e2a0cf7730b39b359cea778e3d200b9b9fb6770c6b95b395e8ab9f1474014c01ce7a3e870aa632c1ce5b705dc9f0a328d297dc436038565411ca0e338c7db56f94881768b143402be103d352ddf1beb8d5d3f59c88bb500306744fbfea44dca84d3c2cca5a88060c7168dfa57b5f86a57dda5ad3d0957639100089ca6ac40c6fbc516e76821e8026d3fce0d3fa4b1a5c5b42f723c67c3801e5b6146b5c44a3c70c7b7f63634f14211881cf4fca1bd9f7d9b8bda6db831e0a06f25384fd4262826ba6498c9ec27623314c5d7222d86a9cdf905544e7d67a056bb74b830615b2a164ba237a3889fd302bd8e092456865c265c8202d61ff55a442dc22547e68935d270fa33825e4cd331378afe199ae4ab2acea2aca6330f4727f244b72569ba75bab5a53ce22e2472f603d57314b8b02b361931bcef98c0911032db9e418e9288359f38c1fdfbe7f6a4d2fed867f76fd66d82cd107278f5ae8ec0033a226a31d2e2415f9eb72e910bfad8c2d7c02e8d44c2689de3587e51162308a50fbb776d016ea5491929011176ec8401dbed59282af7910675df3810d704db4faca2e8b44ab92d06237e872c0deef48718f59edd1541f5366e49dcabd9a00c64ec1c99f23be503b0a559e545702185426b2d94b5d7dac547ae430ebac390487d3d80b8b7b7d7d1cd2a40688f96c286cb522671faa5f272e4dd858d3f6bcbdb10fa70bebbef59aa82c18fdfd622c4b7e215c315373e366e84e0a el numero necesita 557 bytes
Falta optimizar las funciones, el proceso de multiplicación lo hace mediante sumas continuas, trate de liberar la memoria con forme se va usando para no olvidar ninguna variable pero se me pudo pasar alguna. Usos que se le pueden dar al programa Si necesitas algo especializado y almacenar números extremadamente grandes para su posterior uso esta es una buena forma de hacerlo. Yo en lo personal trabaje con esta aplicación por que necesito una forma de almacenar números de mas de 4096 bits tengan encuenta que en el ejemplo anterior el numero mas grande fue un numero de 557 bytes que son 4456 bits. El proceso mas tardado es convertir el numero de string a binario. Posteriormente considero que las sumas son algo eficientes cuando los números ya se encuentran en su representación binaria. Codigo completo: /* Twitter @albertobsd */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdarg.h> typedef unsigned char byte; typedef struct numero_struct { byte *valor; unsigned int bytes; }numero; numero *valorBase10(unsigned char n,unsigned char e); numero *valor(char *n); unsigned short add(unsigned char a, unsigned char b); void debug(char*s,unsigned char *ptr,unsigned int l,...); numero *add_numero(numero *a,numero *b); numero *copiar(numero* n); numero *add_numero(numero *a,numero *b) { numero *c; unsigned char flag_a = 1,flag_b = 1,valor_a,valor_b,acarreo; unsigned short valor_c; unsigned int i = 0,max,entrar =1; //printf("add_numero\n"); //debug("a->valor",a->valor,a->bytes); //debug("b->valor",b->valor,b->bytes); max = a->bytes + b->bytes; //printf("while\n"); while(entrar) { valor_c = 0; //printf("valor de i: %u\n",i); //printf("valor de a->bytes: %u\n",a->bytes); if(i < a->bytes) { valor_a = a->valor[i]; } else { flag_a = 0; valor_a = 0; } //printf("valor de b->bytes: %u\n",b->bytes); if(i < b->bytes) { valor_b = b->valor[i]; } else { flag_b = 0; valor_b = 0; } if(flag_a || flag_b) { if(c->valor[i] != 0) { //printf("valor de c->valor[%i]: 0x%.2x\n",i,c->valor[i]); valor_c+=c->valor[i]; c->valor[i] = 0; } //printf("valor de valor_a: 0x%.2x\n",valor_a); //printf("valor de valor_b: 0x%.2x\n",valor_b); valor_c+= add(valor_a,valor_b); //printf("valor de valor_c: 0x%.4x\n",valor_c); c->valor[i] = valor_c; acarreo = valor_c >> 8; i++; if(acarreo) { //printf("valor de acarreo: 0x%.2x\n",acarreo); c->valor[i] = acarreo; //printf("valor de c->valor[%i]: %.2x\n",i,c->valor[i]); } } else { entrar = 0; } } //printf("end while\n"); if(acarreo) { c->bytes = i+1; } else { c->bytes = i; } //printf("bytes: %i\n",c->bytes); //debug("c->valor",c->valor,c->bytes); //printf("End add_numero\n"); return c; } void free_numero(numero* t) { if(t) { if(t->valor) { } } } numero *copiar(numero* n) { numero *t; t->bytes = n->bytes; t ->valor = calloc(t ->bytes ,1); memcpy(t ->valor ,n ->valor ,t ->bytes ); return t; } void debug(char *s,unsigned char *ptr,unsigned int l,...) { va_list args; int i = 0; char *buffer; printf("%s: 0x%x ",buffer ,ptr ); while(ptr && i < l) { } } numero *valorBase10(unsigned char n,unsigned char e) { int i,j; numero *a,*b,*t,*zero,**tofree; a->bytes = 1; a ->valor = calloc(a ->bytes ,1); a->valor[0] = n; zero = calloc(sizeof(numero ),1); zero->bytes = 1; zero ->valor = calloc(zero ->bytes ,1); zero->valor[0] = 0; b = zero; i = 0; while(i< e) { j = 0; tofree = calloc(sizeof(numero *),10); while(j < 10) { t = add_numero(a,b); tofree[j++] = t; b = t; } free_numero(a); a = copiar(b); j = 0; while(j<10) { free_numero(tofree[j++]); } b = zero; i++; } free_numero(b); return a; } numero *valor(char *n) { numero *zero,*b; numero **numeros; char *ptr; int bytes; int i,j; printf("procesando numero %s\n",n ); ptr = n; numeros = calloc(sizeof(numero *),bytes ); i = 0; while(i < bytes) { numeros[i] = valorBase10(ptr[i] - '0' , (bytes-1) - i); //debug("numeros[i]",(unsigned char*)numeros[i],sizeof(numero)); //debug("%c x10^%i : numeros[%i]->valor",(unsigned char*)numeros[i]->valor,numeros[i]->bytes,ptr[i],(bytes-1) - i,i); i++; } zero = calloc(sizeof(numero ),1); zero->bytes = 1; zero ->valor = calloc(zero ->bytes ,1); zero->valor[0] = 0; b = zero; i = 0; while(i < bytes) { b = add_numero(numeros[i],b); free_numero(numeros[i]); i++; } //debug("b",(unsigned char*)b,sizeof(numero)); debug("b->valor",(unsigned char*)b->valor,b->bytes); return b; } unsigned short add(unsigned char a, unsigned char b) { return a+b; } int main() { numero *n; n = valor("1"); //Ejemplo de 1 solo digito free_numero(n); n = valor("50"); //Ejemplo de 2 digitos free_numero(n); n = valor("200"); //Ejemplo de 3 digitos free_numero(n); n = valor("255"); //Maximo numero de 1 byte free_numero(n); n = valor("65535"); //Maximo numero de 2 bytes free_numero(n); n = valor("4294967295"); //Maximo numero de 4 bytes free_numero(n); n = valor("18446744073709551615"); //Maximo numero de 8 bytes free_numero(n); n = valor("98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210"); //Ejemplo de un Googol??? printf("el numero necesita %i bytes\n",n ->bytes ); free_numero(n); }
|
|
|
128
|
Programación / .NET (C#, VB.NET, ASP) / ¿Donde van las sentencias imports ?
|
en: 28 Abril 2016, 19:51 pm
|
Imports System.Web Imports MySql.Data.MySqlClient
Pues eso donde tengo que colocar las sentecias imports dentro del documento aspx? Estoy usando Visual Studio Express 2015 Saludos.
Solucion en el archivo defualt.aspx tiene que estar la primera linea debe de decir al como: <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="default.aspx.vb" Inherits="WebApplication5.WebForm1" %>
Entonces debe exister un archivo llamado defualt.aspx.vb Ahi tenemos que colocar las sentecias
|
|
|
129
|
Programación / Desarrollo Web / Problema con ejemplo sencillo en ASP.NET Razor C#
|
en: 27 Abril 2016, 00:27 am
|
Muy buen dia compañeros, yo realmente prefiero las soluciones en algun otro lenguaje como PHP pero.... me estan pidiendo trabajar en ASP.NET Me he topado al tratar de ejcutar un codigo sencillo de ejemplo de la siguiente pagina http://www.w3schools.com/aspnet/razor_syntax.asp<!-- Single statement block --> @{ var myMessage = "Hello World"; } <!-- Inline expression or variable --> <p >The value of myMessage is: @myMessage </p > <!-- Multi-statement block --> @{ var greeting = "Welcome to our site!"; var weekDay = DateTime.Now.DayOfWeek; var greetingMessage = greeting + " Here in Huston it is: " + weekDay; } <p >The greeting is: @greetingMessage </p >
Al momento de cargar en la URL en el navegaor me dice que: http://localhost/test.cshtmlServer Error in '/' Application.
This type of page is not served.
Description: The type of page you have requested is not served because it has been explicitly forbidden. The extension '.cshtml' may be incorrect. Please review the URL below and make sure that it is spelled correctly.
Requested URL: /test.cshtml
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34209
He googleado bastante y no he encontrado solucion al problema. Tengo el IIS instaldo y el codigo lo pongo desde el block de notas en el directorio correspondiente. Uso windows 8.1 en este momento. Tengo bastante sin usar windows aun asi no he encontrado la configuracion correspondiente para ejcutar esos codigos. Si escribo ejemplo de codigo de ASP clasico si los ejecuta, incluso algunos codgios de .net en VB y C# tambien pero el anterior no lo ejecuta para nada.
|
|
|
130
|
Programación / Programación C/C++ / Juego de BlackJack en C
|
en: 24 Abril 2016, 15:58 pm
|
La publicación original la tengo en mi pagina: http://codigoenc.com/post/33/Juego_de_BlackJack_en_C_paso_a_pasoEl juego se puede optimazar si. Se puede perzonalizar si, actualmente juega en automatico.
En este Topic vamos a hacer un juego de blackjack en C, lo vamos a tratar de ser lo mas sencillo posible explicando función por función. Primero definiremos un Maso de cartas esto es 13 cartas desde el A hasta el K char *mazo = "A234567890JQK";
Para hacer este juego lo mas escalable posible generaremos dinámicamente un mazo de juego de N bajaras, para eso tenemos la siguiente función: char *crear_baraja(int n) { int i = 0,j; int offset = 0; char *cartas; cartas = calloc(sizeof(char)*52+1,n ); while(i < n) { j = 0; while(j < 4) { memcpy(cartas +offset ,mazo ,13); offset+=13; j++; } i++; } cartas[offset] = '\0'; //Esta instrucción es innecesaria debido a la función calloc pero lo dejamos para aclarar que nuestra condicion de paro es el caracter nulo al final de la cadena return cartas; }
La funcion anterior solo nos devuelve un puntero con la memoria asignada mediante Malloc con la cantidad de bajaras que le pedimos. Ahora si mandamos a llamar esta funcion y mostramos la cadena veremos un mazo ordenado obvio por la forma que se construyo En este ejemplo usaremos 2 barajas pero tengan en cuenta que puede ser hasta 1000 barajas siempre y cuando este disponible baraja = crear_baraja(2); printf("Baraja:\n%s\n",baraja );
salida: Baraja: A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK
Ahora si bien tenemos que barajar la bajara. char *barajar(char *baraja) { int r; int i = 0; /* Poner su propia funcion random disponible en su sistema En freeBSD prefiero usar arc4rand */ while(i < len) { r = arc4random_uniform(len); if(baraja[r] != 0) { temp[i] = baraja[r]; baraja[r] = 0; i++; } } return temp; }
Esta función nos devuelve un nuevo puntero con la bajara anterior pero ahora en desorden Mostramos la salida: baraja = barajar(baraja); printf("Baraja:\n%s\n",baraja );
Baraja: 9KJ4067Q6A9068Q5A08J3Q3QJ7Q3AK38A6J453762KK0852KA4Q52548753Q234A42K2Q3J7KJ090A62A5J0674KJ702689799989584 Depues de construir las funcoines de evaluar carta y evaluar jugador podemos terminar el juego /* Twitter @albertobsd */ #include<stdio.h> #include<stdlib.h> #include<string.h> /* Maso basico de Cartas para su salida en pantalla. el 0 vale representa a la carta 10 */ typedef struct jugador_struct { int continuar; int valor; int offset; char mano[6]; }jugador; char *mazo = "A234567890JQK"; char *crear_baraja(int n); char *barajar(char *baraja); int juego(char *bajara,int *offset,int m); void evaluar_jugador(jugador *j); int evaluar_carta(char c); void debug(char *p,int l); int main() { char *baraja; int offset = 0; printf("Juego de BlackJack\n"); printf("Creando bajara...\n"); baraja = crear_baraja(2); printf("Baraja:\n%s\n",baraja ); printf("Revolver bajara...\n"); baraja = barajar(baraja); printf("Baraja:\n%s\n",baraja ); juego(baraja,&offset,6); // La casa juega contra 6 Jugadores Solo una ronda, si queremos mas rondas tendremos que agregarlo en un ciclo y controlar el numero de cartas restantes en la baraja } char *crear_baraja(int n) { int i = 0,j; int offset = 0; char *cartas; cartas = calloc(sizeof(char)*52+1,n ); while(i < n) { j = 0; while(j < 4) { memcpy(cartas +offset ,mazo ,13); offset+=13; j++; } i++; } cartas[offset] = '\0'; //Esta instruccion es incesaria debido a la funcion calloc return cartas; } char *barajar(char *baraja) { int r; int i = 0; /* Poner su propia funcion random disponible en su sistema En freeBSD prefiero usar arc4random_uniform */ while(i < len) { r = arc4random_uniform(len); if(baraja[r] != 0) { temp[i] = baraja[r]; baraja[r] = 0; i++; } } return temp; } int juego(char *bajara,int *offset,int m) { int i = offset[0],j = 0,k = 0, n = m+1; jugador **jugadores; jugadores = calloc(sizeof(jugador *),n ); //memset(jugadores,0,sizeof(jugador)*2); /* Generamos n jugadores (m jugadores elegidos por el usuario + la casa jugador 0) */ /* Repartimos Cartas a todos los jugadores*/ while(k < n) { jugadores [k ] = calloc(sizeof(jugador ),1); printf("Memoria asignada para el jugador %i @ 0x%X [%i bytes]\n",k ,jugadores [k ],sizeof(jugador )); k++; } while( j < 2 ) { k = 0; while(k < n) { jugadores[k]->mano[j] = bajara[i]; jugadores[k]->offset++; i++; k++; } j++; } /* Funcion de depuracion debug(jugadores[0],16); debug(jugadores[1],16); */ /* Aqui se ve la mano de cada jugador en el proximo printf dentro del ciclo solo es para fines didacticos posteriormente solo se evaluan las manos; */ j = 0; while( j < n ) { printf("Jugador: %i\ncartas %s\n",j ,jugadores [j ]->mano ); evaluar_jugador(jugadores[j]); printf("Valor actual: %i\n",jugadores [j ]->valor ); j++; } /* Despues de repartir las cartas los jugadores juegan y la casa se destapa al final */ j = 1; while( j < n ) { while(jugadores[j]->continuar) { jugadores[j]->mano[jugadores[j]->offset] = bajara[i]; //printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano); jugadores[j]->offset++; evaluar_jugador(jugadores[j]); i++; } j++; } /* Ahora juega la casa. */ while(jugadores[0]->continuar) { jugadores[0]->mano[jugadores[0]->offset] = bajara[i]; jugadores[0]->offset++; evaluar_jugador(jugadores[0]); i++; } /* Mostramos a todos los resultados*/ j = 1; while( j < n ) { printf("Jugador: %i\ncartas %s\n",j ,jugadores [j ]->mano ); printf("Valor actual: %i\n",jugadores [j ]->valor ); if(jugadores[j]->valor > 21) { } else { if(jugadores[j]->valor == 21) { } else { if(jugadores[0]->valor > 21) { } else { if(jugadores[j]->valor > jugadores[0]->valor) { } else { } } } } j++; } /* Liberamos memoria de los jugadores */ while( j < n ) { j++; } /* Retornamos el valor actaul del offset mediante la direccion de memoria del argumento. y Retornamos el jugador ganador; */ offset[0] = i; return 1; } void evaluar_jugador(jugador *j) { int i = 0; char v; j->valor = 0; while(j->mano[i] != 0) { v = evaluar_carta(j->mano[i]); if(v == 1) { if((j->valor + 11) <= 21 ) { j->valor += 11; } else { j->valor += v; } } else { j->valor += v; } if(j->valor <= 16) { j->continuar = 1; } else { j->continuar = 0; } i++; } } int evaluar_carta(char c) { int r = 0; switch(c) { case 'A': r = 1; break; case 'K': case 'Q': case 'J': case '0': r = 10; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': r = c - '0'; break; } return r; } void debug(char *p,int l) { int i = 0; while(i < l) { i++; } }
Salida completa Juego de BlackJack Creando bajara... Baraja: A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK Revolver bajara... Baraja: 57A6627296K55Q4Q0073Q2K4J6J297A962AK40350J87754369JJ3JJ7AJQ20828A9A5K0528K8549K9Q0AKK69604487Q38843Q33AQ Memoria asignada para el jugador 0 @ 0x2880D040 [20 bytes] Memoria asignada para el jugador 1 @ 0x2880D060 [20 bytes] Memoria asignada para el jugador 2 @ 0x2880D080 [20 bytes] Memoria asignada para el jugador 3 @ 0x2880D0A0 [20 bytes] Memoria asignada para el jugador 4 @ 0x2880D0C0 [20 bytes] Memoria asignada para el jugador 5 @ 0x2880D0E0 [20 bytes] Memoria asignada para el jugador 6 @ 0x2880D100 [20 bytes] Jugador: 0 cartas 52 Valor actual: 7 Jugador: 1 cartas 79 Valor actual: 16 Jugador: 2 cartas A6 Valor actual: 17 Jugador: 3 cartas 6K Valor actual: 16 Jugador: 4 cartas 65 Valor actual: 11 Jugador: 5 cartas 25 Valor actual: 7 Jugador: 6 cartas 7Q Valor actual: 17 Jugador: 1 cartas 794 Valor actual: 20 Gano Jugador: 2 cartas A6 Valor actual: 17 Perdio Jugador: 3 cartas 6KQ Valor actual: 26 Perdio Jugador: 4 cartas 650 Valor actual: 21 Gano BlackJack Jugador: 5 cartas 250 Valor actual: 17 Perdio Jugador: 6 cartas 7Q Valor actual: 17 Perdio
|
|
|
|
|
|
|