elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18
121  Foros Generales / Foro Libre / Acertijo - ¿Que son los archivos? en: 8 Mayo 2016, 20:34 pm
¿Que es el contenido de estos archivos?

1
2

Saludos!
122  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:

Código
  1. void funcion() {
  2. }

Código
  1. void funcion()
  2. {
  3. }

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?
123  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 n

El siguiente codigo es muestra de ello de forma manual y sin ninguna optimizacion.

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. int resto,a,n,contador;
  5. a = 9999998;
  6. n = 3;
  7. resto = a;
  8. contador = 0;
  9. while(resto >= n) {
  10. resto-= n;
  11. contador++;
  12. }
  13. printf("resto: %u\nVeces en el ciclo %u\n",resto,contador);
  14. }

Salida:

Código:
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.

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. int resto,a,n,contador,n_pivote,resto_pivote,entrar;
  5. a = 9999998;
  6. n = 3;
  7. resto = a;
  8. contador = 0;
  9. resto_pivote = resto;
  10. n_pivote = n;
  11. entrar = 1;
  12. while(entrar && resto >= n) {
  13. resto_pivote-=n_pivote;
  14. if(resto_pivote>=0) {
  15. resto = resto_pivote;
  16. n_pivote*=2;
  17. }
  18. else {
  19. if(n_pivote > n) {
  20. n_pivote/=2;
  21. resto_pivote = resto;
  22. }
  23. else {
  24. entrar = 0;
  25. }
  26. }
  27. contador++;
  28. }
  29. printf("resto: %u\nVeces en el ciclo %u\n",resto,contador);
  30. }

Salida:

Código:
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

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. int resto,a,n,contador,n_pivote,entrar;
  5. a = 9999998;
  6. n = 3;
  7. resto = a;
  8. contador = 0;
  9. n_pivote = n;
  10. entrar = 1;
  11. while(n_pivote<resto) {
  12. n_pivote+=n_pivote;
  13. contador++;
  14. }
  15. while(entrar && resto >= n) {
  16. while(n_pivote>resto && n_pivote>n) {
  17. n_pivote/=2;
  18. contador++;
  19. }
  20. resto-=n_pivote;
  21. }
  22. printf("resto: %u\nVeces en el ciclo %u\n",resto,contador);
  23. }

Salida:

Código:
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
124  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:

Código
  1. unsigned char resultado[3];
  2. unsigned char acarreo;
  3. unsigned char a;
  4. unsigned char b;
  5. unsigned short c;
  6. a = 0xFF;
  7. b = 0x01;
  8. c = a + b;
  9. //ahora c vale 0x0101
  10. resultado[0] = c;
  11. acarreo = c >> 8;
  12. //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

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. unsigned char a;
  5. unsigned char b;
  6. unsigned short c;
  7. a = 0xFF;
  8. b = 0x01;
  9. c = a - b;
  10. }


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.
125  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"

Código
  1. int main() {
  2. numero *n;
  3. n = valor("1"); //Ejemplo de 1 solo digito
  4. free_numero(n);
  5. n = valor("50"); //Ejemplo de 2 digitos
  6. free_numero(n);
  7. n = valor("200"); //Ejemplo de 3 digitos
  8. free_numero(n);
  9. n = valor("255"); //Maximo numero de 1 byte
  10. free_numero(n);
  11. n = valor("65535"); //Maximo numero de 2 bytes
  12. free_numero(n);
  13. n = valor("4294967295"); //Maximo numero de 4 bytes
  14. free_numero(n);
  15. n = valor("18446744073709551615"); //Maximo numero de 8 bytes
  16. free_numero(n);
  17. }

Salida (Con un poco de depuración)
Código:
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
Código:
98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210
Código
  1. int main() {
  2. numero *n;
  3. n = valor("98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210"); //Ejemplo de un Googol???
  4. free_numero(n);
  5. }

Salida sin tanta depuración:
Código:

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:

Código
  1. /*
  2. Twitter @albertobsd
  3. */
  4.  
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<string.h>
  8. #include<stdarg.h>
  9.  
  10. typedef unsigned char byte;
  11.  
  12. typedef struct numero_struct {
  13. byte *valor;
  14. unsigned int bytes;
  15. }numero;
  16.  
  17. numero *valorBase10(unsigned char n,unsigned char e);
  18. numero *valor(char *n);
  19. unsigned short add(unsigned char a, unsigned char b);
  20. void debug(char*s,unsigned char *ptr,unsigned int l,...);
  21. numero *add_numero(numero *a,numero *b);
  22. numero *copiar(numero* n);
  23.  
  24. numero *add_numero(numero *a,numero *b) {
  25. numero *c;
  26. unsigned char flag_a = 1,flag_b = 1,valor_a,valor_b,acarreo;
  27. unsigned short valor_c;
  28. unsigned int i = 0,max,entrar =1;
  29. //printf("add_numero\n");
  30. //debug("a->valor",a->valor,a->bytes);
  31. //debug("b->valor",b->valor,b->bytes);
  32. c = calloc(sizeof(numero),1);
  33. max = a->bytes + b->bytes;
  34. c->valor = calloc(max,1);
  35. //printf("while\n");
  36. while(entrar) {
  37. valor_c = 0;
  38. //printf("valor de i: %u\n",i);
  39. //printf("valor de a->bytes: %u\n",a->bytes);
  40. if(i < a->bytes) {
  41. valor_a = a->valor[i];
  42. }
  43. else {
  44. flag_a = 0;
  45. valor_a = 0;
  46. }
  47. //printf("valor de b->bytes: %u\n",b->bytes);
  48. if(i < b->bytes) {
  49. valor_b = b->valor[i];
  50. }
  51. else {
  52. flag_b = 0;
  53. valor_b = 0;
  54. }
  55. if(flag_a || flag_b) {
  56. if(c->valor[i] != 0) {
  57. //printf("valor de c->valor[%i]: 0x%.2x\n",i,c->valor[i]);
  58. valor_c+=c->valor[i];
  59. c->valor[i] = 0;
  60. }
  61. //printf("valor de valor_a: 0x%.2x\n",valor_a);
  62. //printf("valor de valor_b: 0x%.2x\n",valor_b);
  63. valor_c+= add(valor_a,valor_b);
  64. //printf("valor de valor_c: 0x%.4x\n",valor_c);
  65. c->valor[i] = valor_c;
  66. acarreo = valor_c >> 8;
  67. i++;
  68. if(acarreo) {
  69. //printf("valor de acarreo: 0x%.2x\n",acarreo);
  70. c->valor[i] = acarreo;
  71. //printf("valor de c->valor[%i]: %.2x\n",i,c->valor[i]);
  72. }
  73. }
  74. else {
  75. entrar = 0;
  76. }
  77. }
  78. //printf("end while\n");
  79. if(acarreo) {
  80. c->bytes = i+1;
  81. }
  82. else {
  83. c->bytes = i;
  84. }
  85. //printf("bytes: %i\n",c->bytes);
  86. //debug("c->valor",c->valor,c->bytes);
  87. //printf("End add_numero\n");
  88. return c;
  89. }
  90.  
  91. void free_numero(numero* t) {
  92. if(t) {
  93. if(t->valor) {
  94. memset(t->valor,0,t->bytes);
  95. free(t->valor);
  96. }
  97. memset(t,0,sizeof(numero));
  98. free(t);
  99. }
  100. }
  101.  
  102. numero *copiar(numero* n) {
  103. numero *t;
  104. t= calloc(sizeof(numero),1);
  105. t->bytes = n->bytes;
  106. t->valor = calloc(t->bytes,1);
  107. memcpy(t->valor,n->valor,t->bytes);
  108. return t;
  109. }
  110.  
  111. void debug(char *s,unsigned char *ptr,unsigned int l,...) {
  112. va_list args;
  113. int i = 0;
  114. char *buffer;
  115. buffer = calloc(strlen(s)*10,sizeof(char));
  116. va_start(args, l);
  117. vsprintf(buffer,s, args);
  118. printf("%s: 0x%x ",buffer,ptr);
  119. while(ptr && i < l) {
  120. printf("%.2x",ptr[i++]);
  121. }
  122. printf("\n");
  123. va_end(args);
  124. free(buffer);
  125. }
  126.  
  127. numero *valorBase10(unsigned char n,unsigned char e) {
  128. int i,j;
  129. numero *a,*b,*t,*zero,**tofree;
  130. a = calloc(sizeof(numero),1);
  131. a->bytes = 1;
  132. a->valor = calloc(a->bytes,1);
  133. a->valor[0] = n;
  134. zero = calloc(sizeof(numero),1);
  135. zero->bytes = 1;
  136. zero->valor = calloc(zero->bytes,1);
  137. zero->valor[0] = 0;
  138. b = zero;
  139. i = 0;
  140. while(i< e) {
  141. j = 0;
  142. tofree = calloc(sizeof(numero*),10);
  143. while(j < 10) {
  144. t = add_numero(a,b);
  145. tofree[j++] = t;
  146. b = t;
  147. }
  148. free_numero(a);
  149. a = copiar(b);
  150. j = 0;
  151. while(j<10) {
  152. free_numero(tofree[j++]);
  153. }
  154. free(tofree);
  155. b = zero;
  156. i++;
  157. }
  158. free_numero(b);
  159. return a;
  160. }
  161.  
  162. numero *valor(char *n) {
  163. numero *zero,*b;
  164. numero **numeros;
  165. char *ptr;
  166. int bytes;
  167. int i,j;
  168. printf("procesando numero %s\n",n);
  169. ptr = n;
  170. bytes = strlen(n);
  171. numeros = calloc(sizeof(numero*),bytes);
  172. i = 0;
  173. while(i < bytes) {
  174. numeros[i] = valorBase10(ptr[i] - '0' , (bytes-1) - i);
  175. //debug("numeros[i]",(unsigned char*)numeros[i],sizeof(numero));
  176. //debug("%c x10^%i : numeros[%i]->valor",(unsigned char*)numeros[i]->valor,numeros[i]->bytes,ptr[i],(bytes-1) - i,i);
  177. i++;
  178. }
  179. zero = calloc(sizeof(numero),1);
  180. zero->bytes = 1;
  181. zero->valor = calloc(zero->bytes,1);
  182. zero->valor[0] = 0;
  183. b = zero;
  184. i = 0;
  185. while(i < bytes) {
  186. b = add_numero(numeros[i],b);
  187. free_numero(numeros[i]);
  188. i++;
  189. }
  190. //debug("b",(unsigned char*)b,sizeof(numero));
  191. debug("b->valor",(unsigned char*)b->valor,b->bytes);
  192. free(zero);
  193. return b;
  194. }
  195. unsigned short add(unsigned char a, unsigned char b) {
  196. return a+b;
  197. }
  198. int main() {
  199. numero *n;
  200. n = valor("1"); //Ejemplo de 1 solo digito
  201. free_numero(n);
  202. n = valor("50"); //Ejemplo de 2 digitos
  203. free_numero(n);
  204. n = valor("200"); //Ejemplo de 3 digitos
  205. free_numero(n);
  206. n = valor("255"); //Maximo numero de 1 byte
  207. free_numero(n);
  208. n = valor("65535"); //Maximo numero de 2 bytes
  209. free_numero(n);
  210. n = valor("4294967295"); //Maximo numero de 4 bytes
  211. free_numero(n);
  212. n = valor("18446744073709551615"); //Maximo numero de 8 bytes
  213. free_numero(n);
  214. n = valor("98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210"); //Ejemplo de un Googol???
  215. printf("el numero necesita %i bytes\n",n->bytes);
  216. free_numero(n);
  217. }
126  Programación / .NET (C#, VB.NET, ASP) / Equivalente json_encode en ASP.NET ? en: 28 Abril 2016, 22:43 pm
Estoy buscando una solucion simplo como
Código

pero en ASP.net ya se C# o VB


Solucion

Código
  1. JavaScriptSerializer serie = new JavaScriptSerializer();
  2. lista = serie.Serialize(Objeto);


127  Programación / .NET (C#, VB.NET, ASP) / ¿Donde van las sentencias imports ? en: 28 Abril 2016, 19:51 pm
Código
  1. Imports System.Web
  2. 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:

Código
  1. <%@ 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
128  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

Código
  1. <!-- Single statement block -->
  2. @{ var myMessage = "Hello World"; }
  3.  
  4. <!-- Inline expression or variable -->
  5. <p>The value of myMessage is: @myMessage</p>
  6.  
  7. <!-- Multi-statement block -->
  8. @{
  9. var greeting = "Welcome to our site!";
  10. var weekDay = DateTime.Now.DayOfWeek;
  11. var greetingMessage = greeting + " Here in Huston it is: " + weekDay;
  12. }
  13. <p>The greeting is: @greetingMessage</p>
  14.  

Al momento de cargar en la URL en el navegaor me dice que:

http://localhost/test.cshtml

Código:
Server 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.
129  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_paso

El 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

Código
  1. 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:

Código
  1. char *crear_baraja(int n) {
  2. int i = 0,j;
  3. int offset = 0;
  4. char *cartas;
  5. cartas = calloc(sizeof(char)*52+1,n);
  6. while(i < n) {
  7. j = 0;
  8. while(j < 4) {
  9. memcpy(cartas+offset,mazo,13);
  10. offset+=13;
  11. j++;
  12. }
  13. i++;
  14. }
  15. 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
  16. return cartas;
  17. }

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
Código
  1. baraja = crear_baraja(2);
  2. printf("Baraja:\n%s\n",baraja);
salida:
Código:
Baraja:
A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK

Ahora si bien tenemos que barajar la bajara.

Código
  1. char *barajar(char *baraja) {
  2. int len = strlen(baraja);
  3. char *temp = calloc(len+1,1);
  4. int r;
  5. int i = 0;
  6. /*
  7. Poner su propia funcion random disponible en su sistema
  8. En freeBSD prefiero usar arc4rand
  9. */
  10. while(i < len) {
  11. r = arc4random_uniform(len);
  12. if(baraja[r] != 0) {
  13. temp[i] = baraja[r];
  14. baraja[r] = 0;
  15. i++;
  16. }
  17. }
  18. free(baraja);
  19. return temp;
  20. }

Esta función nos devuelve un nuevo puntero con la bajara anterior pero ahora en desorden

Mostramos la salida:
Código
  1. baraja = barajar(baraja);
  2. printf("Baraja:\n%s\n",baraja);
Código:
Baraja:
9KJ4067Q6A9068Q5A08J3Q3QJ7Q3AK38A6J453762KK0852KA4Q52548753Q234A42K2Q3J7KJ090A62A5J0674KJ702689799989584

Depues de construir las funcoines de evaluar carta y evaluar jugador podemos terminar el juego
Código
  1. /*
  2. Twitter @albertobsd
  3.  */
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. /*
  8. Maso basico de Cartas para su salida en pantalla.
  9. el 0 vale representa a la carta 10
  10.  */
  11. typedef struct jugador_struct {
  12. int continuar;
  13. int valor;
  14. int offset;
  15. char mano[6];
  16. }jugador;
  17.  
  18. char *mazo = "A234567890JQK";
  19.  
  20. char *crear_baraja(int n);
  21. char *barajar(char *baraja);
  22. int juego(char *bajara,int *offset,int m);
  23. void evaluar_jugador(jugador *j);
  24. int evaluar_carta(char c);
  25. void debug(char *p,int l);
  26.  
  27. int main() {
  28. char *baraja;
  29. int offset = 0;
  30. printf("Juego de BlackJack\n");
  31. printf("Creando bajara...\n");
  32. baraja = crear_baraja(2);
  33. printf("Baraja:\n%s\n",baraja);
  34. printf("Revolver bajara...\n");
  35. baraja = barajar(baraja);
  36. printf("Baraja:\n%s\n",baraja);
  37. 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
  38. free(baraja);
  39. }
  40.  
  41. char *crear_baraja(int n) {
  42. int i = 0,j;
  43. int offset = 0;
  44. char *cartas;
  45. cartas = calloc(sizeof(char)*52+1,n);
  46. while(i < n) {
  47. j = 0;
  48. while(j < 4) {
  49. memcpy(cartas+offset,mazo,13);
  50. offset+=13;
  51. j++;
  52. }
  53. i++;
  54. }
  55. cartas[offset] = '\0'; //Esta instruccion es incesaria debido a la funcion calloc
  56. return cartas;
  57. }
  58.  
  59. char *barajar(char *baraja) {
  60. int len = strlen(baraja);
  61. char *temp = calloc(len+1,1);
  62. int r;
  63. int i = 0;
  64. /*
  65. Poner su propia funcion random disponible en su sistema
  66. En freeBSD prefiero usar arc4random_uniform
  67. */
  68. while(i < len) {
  69. r = arc4random_uniform(len);
  70. if(baraja[r] != 0) {
  71. temp[i] = baraja[r];
  72. baraja[r] = 0;
  73. i++;
  74. }
  75. }
  76. free(baraja);
  77. return temp;
  78. }
  79.  
  80. int juego(char *bajara,int *offset,int m) {
  81. int len = strlen(bajara);
  82. int i = offset[0],j = 0,k = 0, n = m+1;
  83. jugador **jugadores;
  84. jugadores = calloc(sizeof(jugador*),n);
  85. //memset(jugadores,0,sizeof(jugador)*2);
  86. /* Generamos n jugadores (m jugadores elegidos por el usuario + la casa jugador 0) */
  87. /* Repartimos Cartas a todos los jugadores*/
  88. while(k < n) {
  89. jugadores[k] = calloc(sizeof(jugador),1);
  90. printf("Memoria asignada para el jugador %i @ 0x%X [%i bytes]\n",k,jugadores[k],sizeof(jugador));
  91. k++;
  92. }
  93. while( j < 2 ) {
  94. k = 0;
  95. while(k < n) {
  96. jugadores[k]->mano[j] = bajara[i];
  97. jugadores[k]->offset++;
  98. i++;
  99. k++;
  100. }
  101. j++;
  102. }
  103. /* Funcion de depuracion
  104. debug(jugadores[0],16);
  105. debug(jugadores[1],16);
  106. */
  107. /*
  108. Aqui se ve la mano de cada jugador en el proximo printf dentro del ciclo solo es para fines didacticos
  109. posteriormente solo se evaluan las manos;
  110. */
  111. j = 0;
  112. while( j < n ) {
  113. printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  114. evaluar_jugador(jugadores[j]);
  115. printf("Valor actual: %i\n",jugadores[j]->valor);
  116. j++;
  117. }
  118. /*
  119. Despues de repartir las cartas los jugadores juegan y la casa se destapa al final
  120. */
  121. j = 1;
  122. while( j < n ) {
  123. while(jugadores[j]->continuar) {
  124. jugadores[j]->mano[jugadores[j]->offset] = bajara[i];
  125. //printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  126. jugadores[j]->offset++;
  127. evaluar_jugador(jugadores[j]);
  128. i++;
  129. }
  130. j++;
  131. }
  132. /*
  133. Ahora juega la casa.
  134. */
  135. while(jugadores[0]->continuar) {
  136. jugadores[0]->mano[jugadores[0]->offset] = bajara[i];
  137. jugadores[0]->offset++;
  138. evaluar_jugador(jugadores[0]);
  139. i++;
  140. }
  141. /* Mostramos a todos los resultados*/
  142. j = 1;
  143. while( j < n ) {
  144. printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  145. printf("Valor actual: %i\n",jugadores[j]->valor);
  146. if(jugadores[j]->valor > 21) {
  147. printf("Perdio\n");
  148. }
  149. else {
  150. if(jugadores[j]->valor == 21) {
  151. printf("Gano BlackJack\n");
  152. }
  153. else {
  154. if(jugadores[0]->valor > 21) {
  155. printf("Gano\n");
  156. }
  157. else {
  158. if(jugadores[j]->valor > jugadores[0]->valor) {
  159. printf("Gano\n");
  160. }
  161. else {
  162. printf("Perdio\n");
  163. }
  164. }
  165. }
  166. }
  167. j++;
  168. }
  169.  
  170. /*
  171. Liberamos memoria de los jugadores
  172. */
  173. while( j < n ) {
  174. free(jugadores[j]);
  175. j++;
  176. }
  177. /*
  178. Retornamos el valor actaul del offset mediante la direccion de memoria del argumento.
  179. y Retornamos el jugador ganador;
  180. */
  181. offset[0] = i;
  182. return 1;
  183. }
  184.  
  185. void evaluar_jugador(jugador *j) {
  186. int i = 0;
  187. char v;
  188. j->valor = 0;
  189. while(j->mano[i] != 0) {
  190. v = evaluar_carta(j->mano[i]);
  191. if(v == 1) {
  192. if((j->valor + 11) <= 21 ) {
  193. j->valor += 11;
  194. }
  195. else {
  196. j->valor += v;
  197. }
  198. }
  199. else {
  200. j->valor += v;
  201. }
  202. if(j->valor <= 16) {
  203. j->continuar = 1;
  204. }
  205. else {
  206. j->continuar = 0;
  207. }
  208. i++;
  209. }
  210. }
  211.  
  212. int evaluar_carta(char c) {
  213. int r = 0;
  214. switch(c) {
  215. case 'A':
  216. r = 1;
  217. break;
  218. case 'K':
  219. case 'Q':
  220. case 'J':
  221. case '0':
  222. r = 10;
  223. break;
  224. case '1':
  225. case '2':
  226. case '3':
  227. case '4':
  228. case '5':
  229. case '6':
  230. case '7':
  231. case '8':
  232. case '9':
  233. r = c - '0';
  234. break;
  235. }
  236. return r;
  237. }
  238.  
  239. void debug(char *p,int l) {
  240. int i = 0;
  241. printf("0x%x\n",p);
  242. while(i < l) {
  243. printf("%.2x",p[i]);
  244. i++;
  245. }
  246. printf("\n");
  247. }
  248.  

Salida completa

Código:
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
130  Programación / Desarrollo Web / Nube de Google en: 21 Abril 2016, 02:23 am
Estaba viendo que Google ofrece un periodo de prueba para su nube.

La pregunta es ¿Alguno lo a usado? estoy apunto de subir uno de mis proyectos a ella, mi preocupacion es el costo del uso del ancho de banda y el almacenamiento, he visto la calculadora de precios estimados pero me gustaria conocee la experiencia de alguno de ustedes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines