C/Visual C - c ++ Problema valor variable

   
Vista:

c ++ Problema valor variable

Publicado por Ruben (4 intervenciones) el 02/01/2018 10:21:21
Buenas..

En primer Lugar feliz Año a Todos...

Estoy adaptando un codigo de c# a c++ y me a surgido un problema con el valor de una variable al ejecutar una funcion recursiva..

la funcion es la siguiente

Código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
main
{
.....
 recursiva(2513169434916L, 0, 1, 14, 2513169509823);
}
 
 
void recursiva(long long Z, byte P, byte H, byte X, long long K)
{
 
 long long int num = 7L << (int)(3 * P);
 
 for (byte b = P; b < X; b += 1)
  {
   for (short num2 = 1; num2 >= 0; num2 -= 1)
    {
    long long  num3 = (Z & ~num) | 1L << (int)((short)(b * 3) + num2);
    if (P < H)
      {
         recursiva(num3, b + 1, H + 1, X, K);
      }
    }
   num <<= 3;
  }
}


La variable que me da problemas es num3

sus valorese deberian ser sucesivamente

2513169509823
2513169434914
2513169434898
2513169434770
2513169433746
2513169425554
2513169360018
2513168835730
2513164641426
2513131086994
2512862651538
hasta aqui bien pero el siguiente en vez de
2510715167890

da -1840700270

En el codigo en c# original el tipo de variable num3 es long (64bites) yo lo he adaptado a long long e incluso a long long int pero sigue igual

Alguna Idea Gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

c ++ Problema valor variable

Publicado por Chema (234 intervenciones) el 02/01/2018 10:45:27
c# es un lenguaje que incorpora mucha magia. La magia es incompatible con C.

Pasar código de C a c# en factible, al contrario no veo la manera de compatibilizar la magia con C.

El código que presentas es un quema procesadores.

¿Disfrutas quemando procesadores?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Ruben (4 intervenciones) el 02/01/2018 10:57:17
Buenos Dias.

Solo constatar que usted es la evidencia de que conocimiento y educación no simpre van unidos...

Gracias por su tiiempo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Tom (561 intervenciones) el 02/01/2018 11:19:17
Es un algoritmo muy delicado. Resulta bastante fácil que sobrepases los rangos de los tipos.
Esto funciona, creo, como tú quieres, compara tu código con este, has cometido varios errores.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
 
/* */
void recursiva(long Z, char P, char H, char X, long K) {
	long num = 7L << (3 * P);
 
	for(char b = P; b < X; b += 1) {
		for(short num2 = 1; num2 >= 0; num2 -= 1) {
			long  num3 = (Z & ~num) | 1L << ((short)(b * 3) + num2);
 
			printf("%lu\n", num3);
			if(P < H) {
				recursiva(num3, b + 1, H + 1, X, K);
			}
		}
		num <<= 3;
	}
}
 
/* */
int main(int argc, char *argv[]) {
	recursiva(2513169434916L, 0, 1, 14, 2513169509823L);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Tom (561 intervenciones) el 02/01/2018 12:15:22
Está claro que hay más errores, por ejemplo, K no se usa en recursiva() ...
El resultado en octal es curioso aunque no parece de mucha utilidad ...

44444444444442
44444444444422
44444444444222
44444444442222
44444444422222
44444444222222
44444442222222
44444422222222
44444222222222
44442222222222
44422222222222
44222222222222
42222222222222
22222222222222
12222222222222
41222222222222
...
Así hasta más o menos, 130616 valores distintos, llamando recursivamente a recursiva, unas 65500 veces (es fácil que pete por el stack antes de quemar la CPU :))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Chema (234 intervenciones) el 02/01/2018 12:55:08

VENTILEITOR 2000.




Comprobador del estado de los sistemas de refrigeración (ventiladores).

VENTILEITOR 2000 es lo que estabas esperando, el comprobador de refrigeración
VENTILEITOR 2000. comprueba elevando al máximo de su potencia, y por tiempo indefinido
los ventiladores de tu equipo.

Una vez superado el test de VENTILEITOR 2000. tu Pc queda homolago para resistir
cualquier situación extrema.

VENTILEITOR 2000, Idea original by Ruben.

Versión 1.1 mejorada by Tom.

Este sofware se entreaga con sus propias virtudes y errores.

No esiste garantia de resultado, si tu procesador se quema, o se funde la instalación
electrica de tu casa o empresa , es tu total y absoluta responsabilidad.

/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
 
 
/* */
void recursiva(long Z, char P, char H, char X, long K) {
	long num = 7L << (3 * P);
 
	for(char b = P; b < X; b += 1) {
		for(short num2 = 1; num2 >= 0; num2 -= 1) {
			long  num3 = (Z & ~num) | 1L << ((short)(b * 3) + num2);
 
			printf("%lu\n", num3);
			if(P < H) {
				recursiva(num3, b + 1, H + 1, X, K);
			}
		}
		num <<= 3;
	}
}
 
/* */
int main(int argc, char *argv[]) {
	recursiva(2513169434916L, 0, 1, 14, 2513169509823L);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Tom (561 intervenciones) el 02/01/2018 12:59:41
Minar bitcoins será mucho más caro :D aunque más productivo sin duda.

1
2
3
4
5
/tmp$ time kk >sal
 
real	0m0.015s
user	0m0.014s
sys	0m0.001s
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Chema (234 intervenciones) el 02/01/2018 11:44:40
No puedo tomar en serio lo que no es serio.
Si fueras en serio, lo primero que hubieras definido es el significado de la función ,su cometido, para qué sirve.

Según veo , el "invento "solo sirve para quemar procesadores y , o hacerte creer que posees conocimientos que no tienes, o quizás intentas tomar el pelo a la gente, que es lo más habitual en este tipo de cuestiones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por neg1414 (4 intervenciones) el 02/01/2018 13:53:45
Buenas Dias

Lo que haga o deje de hacer el procedimiento recursivo en este caso es lo de menos,( de hecho es mucho mas largo) lo reduzco lo mas posible por la maxima (para solucionar el problema el primer paso es acotarlo lo maximo) de hecho tengo el mismo problema si la funcion es la siguiente

1
2
3
4
for(int x=0;x<12;x++)
  {
     long long int num = 7L << (int)(3 * x);
  }

(Por lo que creo que el problema es de tamaño palabra y mi compilador).

Creo que hay maneras de contestar a una duda, sin tener que juzgar la finalidad o no de la cuestion e intentar menospreciar al ignorate..

Su ultimo comentario confirma la mi primera impresion.

Gracias por Contestar. Un saludo.

Post Data: En la programacion no hay Magia.. hay ceros y unos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Tom (561 intervenciones) el 02/01/2018 14:22:46
Tu problema está en como calificas tus constantes.
Un long long funcionaría mejor con una cte calificada con LL.

http://en.cppreference.com/w/c/language/integer_constant
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Chema (234 intervenciones) el 02/01/2018 14:53:56
long num3 = (Z & ~num) | 1L << ((short)(b * 3) + num2);

long num = 7L << (3 * P);

¿Me explicas la finalidad de estos miles de desplazamientos de bits.?, Desplazar miles de veces los mismos bits de la misma variable, debe ser algo novedoso y exitoso que desconozco.


¿Es algún conjuro mágico copiado de C#?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por Chema (234 intervenciones) el 02/01/2018 15:49:04
Ruben, eres educado y correcto, me caes simpatico, explica lo que intentas hacer de forma simple,. y a lo mejor puedo ayudarte.

Creo que necesitas un poco de orientación.

No "trabajes" con conceptos fuera de tu nivel técnico, es improductivo y conseguirás odiar C.

Juega y juega con los conceptos que no comprendes hasta que jugando jugando los comprendas muy BIEN.

Crear código que funcione por ciencia infusa es lo peor que puedes hacer si realmente deseas ser un buen programador en C.


Post Data: En la programacion no hay Magia.. hay ceros , y unos y otros que saben que la programación no son ceros y unos, otros como yo mismo ,que saben muy bien que la programación es simplemente dotar de nombre una espacio de almacenamiento y no salirse de sus limites .
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

c ++ Problema valor variable

Publicado por neg1414 (4 intervenciones) el 02/01/2018 16:58:42
Buenas..

Primero reconocer que te honra cambiar el tono, y dirigirte a mi de una manera mas respetuosa.. tengo que admitir, que apesar de empezar a programar con 10 años con un comodore 64 K y haber tocado varios lenguajes de programacion desde el Basic al C ++ pasando por pascal, Cobol, fortran... sigo teniendo muchas limitaciones que intento superar preguntando a quien sabemas que yo.. "la ignorancia es una enfermedad que se cura preguntando")
Considero que no es tan importante el fin que persigue un algoritmo, como el que este funcione (cada loco con su tema).Espero me perdones si te he faltado al respeto en algun momento, yo seguire preguntando mis dudas en este foro y espero que tu me sigas ayudando.

Dicho esto, el problema esta solucionado ,como ha dicho Tom "Un long long funcionaría mejor con una cte calificada con LL." (gracias Tom eres un crack)

1
long long int num = 7LL << (int)(3 * x);

Gracias .. Un Saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad