Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#111
La definición de una función no contempla constantes.
El usuario cuando no quiere que el contenido de un dato sea modificado dentro de la función, es reponsable de mandar una copia, lo que técnicamente es lo mismo que una constante, pero de forma transparente a la función. Porque dentro de la función no se sabe el origen de la misma.

De hecho uno podría hacer todas estas cosas:

entero = declaracion de funcion Y(entero valor)
   valor +=2
   devolver valor modulo 5
fin funcion

...
...
...

constante de entero x = 25
entero z

z= funcion Y(25)   // técnicamente se está recibiendo una constante inicializada durante la llamada.
...
fin funcion

z= x
z = funcion Y(z)  // es una constante si se pasa como valor, aunque al final el retorno se le entrega a 'z' y acaba así cambiando de valor.
...
fin funcion

z= 25
z= funcion Y(z +0)  //técnicamente se está recibiendo una constante, resultante de la suma de z + un valor constante... que se guardará en la pila, y que en origen tampoco se podrá rescatar.
...
fin funcion

z= funcion Y(x +3)  // igual que anterior, aunque es la suma de dos constantes.
...
fin funcion

z= 7
z= funcion Y(x + z + 3)   // igual que anterior... cuando procede de una expresión es lo mismo que si fuera una constante.
...
fin funcion


Como puedes entender, indistintamente de que se pase en ocasiones por valor o por referencia, una constante, no es meramente aquello que está declarado como constante, puede asumirse que es constante, si el cambio de dicha variable dentro de la función, a la vuelta de la función no afecta a la de origen. Una función no necesita saber que pasa fuera de ella, solo precisa saber que se hace dentro, para eso tiene el código preciso de lo que debe hacer. Si resultara vital saber si una variable es o no una constante (no se me ocurre a bote pronto, ningún caso donde esto deba ser necesario, ni siquiera útil), podría añadirse un parámetro adicional que así lo detalle, pero no hay garantias  de que el usuario tenga que 'decir' la verdad...
#112
Me edito.... al relerte de nuevo, veo que quieres justo lo contrario a lo que me pareció entender al principio... Tu quieres crear un fichero con las entradas únicas que constan en ambos ficheros, es decir quieres unirlos y por tanto eliminar entradas repetidas...

Dejo al final del mensaje...lo que antes era el contenido del mismo para posibles interesados
Aunque, todavía si al final se unen A2 + B2 + C en un único fichero se consigue el resultado deseado... No obstante puede hacerse más óptimo si se hace un diseño específico.

Lo mejor para eliminar entradas repetidas es usar una tabla hash.

funcion UnirFilesSinRepes(  RutaA, RutaB)
   abrir ficheros A(rutaA), B(rutaB)
   crear y abrir fichero temporal C
   
   THash = crear nueva tabla hash

   AddFileToTHash(tHash, fichero A)
   AddFileToTHash(tHash, fichero B)

   por cada item en THash
       copiar item al fichero C
   siguiente
   vaciar y eliminar tHash

   cerrar fichero C (y quizás renombrar...)
   cerrar y (seguramente) eliminar A, B
fin funcion

funccion AddFileToTHash(tHash, fichero )
   Por cada linea en fichero
       h = Hashing(linea)
       tHash.Add(h, Linea)
       // habitualmente una tabla hash no admite repes, pero si no fuera el caso...
       //si tHash.Contiene(h) = FALSE
       //   tHash.add(h, linea)
       //fin si
   siguiente
fin funcion  




======================================================


======================================================
Quedaría mejor en un spolier, pero el foro no dispone de ellos...

Esta solución es para tener en un fichero las entradas que constan en los dos ficheros  y dejar en cada fichero solo las entradas que no contiene el otro.

Tienes dos opciones, dependiendo de si al menos uno de los dos ficheros está ordenado o ninguno.

Básicamente como quieres crea 1 fichero con la diferencia y los originales (A1 y B1) quedarán también modificados, necesitarás crear 3 ficheros (A2,B2,C)...

- Si alguno de los fichero no está ordenado... leer en memoria y ordenar, luego guardar a fichero
- Ahora que los dos ficheros están ordenados:

funcion DiferenciaFiles(  RutaA, RutaB)
   abrir ficheros A1(rutaA), B1(rutaB)
   crear y abrir ficheros temporales A2, B2, C

   Por cada linea1 en fichero A1
       Por cada linea2 en fichero B1
           Si (linea2 > linea1)
               copiar linea1 al fichero A2 y salir dle bucle
           pero Si (linea2 = linea1)
               copiar linea2 al fichero C y salir del bucle.
           si no // linea2 < linea1
               copiar linea2 al fichero B2
           fin si
       siguiente
   siguiente

   cerrar y eliminar A1, B1
   renombrar A2 como A1, y B2 como B1.
fin funcion

 

- Opcionalmente si ninguno (o solo uno) de los dos ficheros está ordenado.
 Se puede crear una tabla hash, y meter en ella las entradas de un fichero...

funcion DiferenciaFiles(  RutaA, RutaB)
   abrir ficheros A1(rutaA), B1(rutaB)
   crear y abrir ficheros temporales  A2, B2, C

   THash = llenar desde fichero A1
   Por cada linea1 en fichero B1
       h = Hashing(linea1)
       si tHash.Contiene(h)
            copiar linea1 al fichero C y THash.Eliminar(h)
       si no
            copiar linea1 al fichero B2
       fin si
   siguiente
   // como se han ido eliminando las entradas que están contenidas también en B1,
   // al final solo quedan entradas únicas en la tabla hash.
   por cada item en THash
       copiar item al fichero A2
   siguiente

   cerrar y eliminar A1, B1
   renombrar A2 como A1, y B2 como B1.


NOTA: Se supone que siendo un diccionario, en un mismo fichero no habrá entradas repetidas... si fuera el caso, habria que tenerlo en cuenta para modificar el pseudocódigo ofrecido...
======================================================


======================================================
#113
Seguridad / Re: Gestor contraseñas - Darknet
6 Noviembre 2021, 15:03 PM
No cifres el disco... luego con cualquier problema, con él mismo, no podrás recuperar su contenido.
Es preferible tener un disco externo.

Si te quieres dedicar a la seguridad y andar probando chorrocietas cosas y programas, para una seguridad crítica, es deseable tener un segundo pc no conectado a la red, y usas un USB para traspaso de datos entre uno y otro. El que tienes conectado a la red, que sea el más 'sencillo' para formatear cuando se requiera, por tanto lo que deba contener que no sea muy importante.
#114
Windows / Re: virus windows 7
6 Noviembre 2021, 14:38 PM
Antes debieras revisar que no sea que el disco duro tenga algunos sectores defectuosos... ese problema es fácil que pase por actividad vírica y viceversa.
Haz al menos un chequeo de disco con todas las opciones: chkdsk c: /f/v/r (que podrá tardar horas).

Pero si decides instalar win10 de todas formas, el formateo que haga para la instalación cambia opciones para buscar sectores defectuosos (no un formateo rápido), porque si el  disco tiene algún daño, también tendrías problemas con win10...
#115
También pudiera ser que hubieras cambiado el idioma dle teclado por alguno 'extraño'. Tendrías que ver exactamente qué teclas son las que fallan.
Si te urge, puedes tirar del teclado virtual (en pantalla).
Intenta a desintalar el teclado y luego reinicia a ver si lo detecta de nuevo pero correctamente.

Aunque opino que lo más probable es que el teclado esté sucio (o se te haya caído al suelo una o más veces) con lo que algunas teclas con el tiempo terminen por no funcionar. Si es por suciedad, hay que demsontarlo y lavar las teclas y sus mecanismos, secarlo y luego volverlo a montar...

Los visus normalmente se centran en otras 'tareas' que la 'tontería' de fastidiarte unas teclas... de todos si sposspechas de actividad vírica, ten cuidado con qué paginas visitas, que te descargas y de dónde, cuidado con los enlaces que pinchas aunque t elos ofrezca 'un amigo'. Y por supuesto cuidado con qué dispositivios que no son tuyos conectas a tu PC.

Como te han dicho, una forma de poder descartar rápido si el problema es realmente del teclado, es conectar otro y ver si ese otro funciona correctamente o si tiene el mismo problema...
#116
Hay 3 formas:
En todos los casos se parte de la imagen en su tamaño real.

A - Creas recortes para cada zona de tu interés. y de ellas se realizan máscaras, de modo que cada imagen finalmente contenga solo el recorte como zona opaca y valor de máscara en el resto. Pero todas del mismo tamaño. Cada imagen es finalmente (se carga en) un objeto image, la máscara de cada una deja esa zona para esa imagen invisible.
La superposición de todas ellas completan la imagen (típicamente una, sería la que no tiene 'nada' especial'. Esta puede se rla imagen original puesta de fondo... Al ser todas del mismo tamaño y posicionadas en las mismas cordenadas, la zona opaca de cada imagen es la que actúa como receptor del foco, bastaría en ese caso colocar en la propiedad tooltiptext de cada una lo que proceda, ojo derecho, boca, muslo, etc... en la imagen del fondo no s epone tooltiptext, que recibirá el foco justo en las zonas que no ocupa ninguna del resto. Es decir donde no merece la pena indicar nada especial (si es el caso), aunque conviene usarse para indicar: "si mueves el cursor por la imagen al detetar zonas señalará ciertos valores', o el texto que ati te parezca pertinenen al caso.
.
Por supuesto al hacer zoom, debe hacerse para todas y posicionarse todas en las mismas cordenadas.



B - Otra forma consiste en marcar las areas (rectangulares) de cada zona, y anotar para cada una su posición, medidas, texto, etc... relativa a cada una. Una copia de la imagen la trabajas primero en un programa de dibujo para señalar dichas zonas y tener certidumbre de los valores...
Cuando se haga click sobre la imagen (o en el evento mousemove), debes hacer una búsqueda para determinar en que zona está...

Vamos a complicarlo un poquito, y permitir solapes de zonas, incluso permitir zonas completamente dento de otras, aunque se limita que las misma área sea solapada por la confluencia de más de 2 zonas.


estructura datosImg
   entero X
   entero Y
   entero Ancho
   entero Alto
   string Texto
   // estos datos son opcionales. si no se incluyen (en el fichero) deben valer -1.
   entero Solapa            // una zona cubre parcialmente a la zona  que aquí se indica (cuestión dle uso de rectangulos). esta es la que tiene preferencia sobre la solapada.
   entero Solapado         // señala cuantas zonas están solapando a esta.
   entero InluidaEn         // Una zona está completamente de la que aquí se señale.
   entero Excluye           // señala cuantaz zonas contiene esta dentro de sí completamente.
fin estructura

array de datosImg datos()

sub imageX_Click (x, y, ...)
   llamada a DetectarZona(x,y)
fin sub
sub imageX_Mousemove (x, y, ...)
   llamada a DetectarZona(x,y)
fin sub


Un ejemplo... sean los siguientes los parámetros, que constan en el fichero que has creado y demos por supuesto que sabes leer del fichero, etc... (más abajo adjunto una imagen con las zonas que (con aprox,) correponden a estos datos).
----------------------------------------------------------
10 zonas
0, 191,374,34,25, "ojo izquierdo", -1, -1, 8
1, 239,372,40,25, "ojo derecho",-1, -1, 8
2, 211,235,45,25, "boca", -1, -1, 8
3, 114,555,184,154, "manos"
4, 294,128,80,240, "pelo", -1, 9,
5, 187,080, 150,48, "pelo"
6, 166,126,26,240, "pelo"
7, 191,260,45,63,"pelo"          <-------- pelo ocupa varias zonas disitntas.
8, 192,128,103,155,"cabeza", -1, -1, -1, 3   <------- cabeza será si están dentro de la zona cabeza, pero no en ojos ni boca.
9, 253,283,71,40, "cuello", 4   <------- esta zona solapa a la zona 4 (el pelo a la derecha de la imagen).
--------------------------------------


array datosImg  Datos()
entero numzonas


funcion IniciarImagen(string ruta)
  entero k

  abrir fichero
  leer numzonas
 
  dimensionar array Datos(0 a numzonas-1)
  por cada linea siguiente en fichero
       datos(k) = LineaToDatos(linea)
  siguiente
fin funcion

datosImg = funcion LineaToDatos(string linea)
     datosImg  dt
     array de string campos() = split(linea, ",")

     dt.X = campos(0).ToEntero
     dt.y = campos(1).ToEntero
     dt.Ancho = campos(2).ToEntero
     dt.Alto = campos(3).ToEntero
     dt.Texto = campos(4)

     // Datos opcionales.
     si campos.Length = 6
         dt.Solapa = campos(5).ToEntero    
     fin si
     si campos.Length =7
         dt.Solapado = campos(6).ToEntero    
     fin si  
     si campos.Length = 8
         dt.IncluidaEn = campos(7).ToEntero    
     fin si
     si campos.Length = 9
         dt.Excluye = campos(8).ToEntero    
     fin si

     devolver dt
fin funcion


Finalmente la función 'DetectarZona' que detecta sobre qué zona está el ratón... la dejo a tu ingenio y esfuerzo... si pasado un par de días no consigues avances, avisa y te pongo un sencillo/enredoso peudocodigo para resolverlo.
Nota: Si no permites solapes ni zonas dentro de otras, la función es relativamente sencilla. Al menos resuelve ese caso de entrada y cuando te funcione y si te interesa el caso, copia la funcion, renombrala y modifica la copia para acometer la comentada funcionalidad extra...

Una imagen para que te sirva de guía (los datos adjuntados más arriba cuasi corresponden, y digo cuasi, porque los he anotado de memoria y puede que alguno no se ajuste con precisión al valor dado.
nota como los ojos y la boca están encajados dentor d ela zona de 'cara', que se ha pintaod de rojo, para remarcar el hecho de tener zonas en su interior. etc...




C - La última forma es considerar solo un punto para cada zona... el punto en este caso, se considera el 'centro' de la zona, y además del punto se considera un área de influencia, que en vez de dar ancho y alto (para un área rectangular), se da en radio.
Es similar al caso anterior, pero es más fácil la detección. Incluso casos con solapes... y opera con 'circulos en vez de rectángulos.

Un psuedocódio para que sepas por donde andar...

estructura datosImg
   estructura datosImg
   entero X
   entero Y
   entero radio
   string Texto
fin estructura


Abres el fichero, lees la cantidad de zonas y cada zona para pasar los datos al array... (como se señala más arriba)
Igualmente con eventos click o mousemove, invocasa la función detectarZona...
Esta función es más sencilla, que la anterior, incluso con solapes. Te la señalo en pseudocódigo en pocas líneas:


funcion DetectarZona(x,y)
   datosImg zona
   entero z,n,d, index

   establecer un valor para z = ancho + alto de la imagen
   n = -1

   por cada zona en datos()
       // si el punto cae en el circulo que delimita el radio
       esto es:     d = calcular la distancia desde el punto al centro de la zona   // d puede ser un 'float' si se requiere.
       si (d < zona.radio)  // está dentro de la zona.
           si (d < z)    // está más cerca del centro de esta zona que de otra zona previa.
               z = d         // recordamos la distancia al su centro, para descubir si más adelante otra zona la bate.
               n = index  // recordamos que zona es por su indice en el array.
            fin si
       fin si

       index +=1
   Siguiente

   si (n>0)    // si el cursor finalmente se encontró dentro de una zona y buscado la zona cuyo centor queda más cerca...
       image1.tooltiptext = datos(n).Texto
   sino
       image1.tooltiptext = ""   // el cursor no cae en ninguna zona.
   fin si
fin funcion


Como se ve en esta función lo que se trata es ver si el cursor (que se localiza en las cordenadas x,y), cae dentro del radio de alguna zona y en caso de que caiga dentro de más de una zona, trata de ver del centro de cual zona está más cerca el cursor.
Esa zona será la que mande para señalar el texto.
Si no está dentro de ninguna zona, el texto es nulo...  

Bueno, y qué pasa cuando haces zoom?....
Simplemente reescala la posición del cursor en función del zoom realizado, es decir si el zoom es anamorfico:
 x = cursor.x / zoom.x
 y = cursor.y / zoom.y
Esto es más sencillo y rápido que recalcular medidas y posiciones de cada zona de la imagen. Es decir retrotraes la posición actual del cursor al equivalente a si el zoom fuera del 100%. y son esos valores los que debiera recibir la función de detección...
o bien recalcularlo dentro de la propia función, etc.. al gusto.

Y eso es todo, te toca pasar a código de Fox Pro o de VB6, de cualquiera de las 2 soluciones propuestas con pesudocódigo.




p.d.: Por cierto este tema, no va aquí si no en programación. Software es mas bien refrido a programas ya hechos, no a los que hace uno mismo...
A ver si un moderador con permisos lo mueve.
#117
Si requieres una solución óptima, olvida pasar valores numéricos a string...

Hay una forma más sencilla y eficiente de conseguir el objetivo, simplemente rediseñando ligeramente lo que hay que hacer y como hacerlo.

Lista1, en vez de contener los valores 1 al 35, y dado que son valores contínuos... lo lógico es que su propósito sea el de contar.
Entonces el asunto se resuelve así:


Lista1(0 a 35)  #La lista1 inicialmente contiene valor 0, para cada uno de sus 36 elementos.

bucle para k desde 0 hasta lista2.length
    lista1(lista2(k)) += 1   # incrementa la cantidad  de apariciones con cada valor.
next

...y eso es todo. Luego podrás imprimir la cantidad a apariciones de cualquier valor, si fuera por ejemplo las veces que aaprece el 19:

    imprimir lista1(19)
#118
Lo que te ha fallado es el nombre de la ruta de destino.
Citarcopy ejecutable.lnk C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
Siempre que una ruta contenga un nombre que incluye espacios (lo que ocurre en 'Start Menu'), requiere ir entre comillas.

Luego tu comando debe ser:
copy ejecutable.lnk "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
#119
Dudas Generales / Re: duda como contar años
1 Noviembre 2021, 21:40 PM
..y cuando te preguntan la edad.. ¿qué respondes, cómo la calculas?.
#120
Cita de: wvb en  1 Noviembre 2021, 01:05 AM
..Para empezar la placa base tiene factor de forma propietario (no puedes utilizarla en otra torre ni puedes utilizar una placa base estándar en esta torre)...

Normalmente la RAM también es propietaria (solo se puede usar en placas base propietarias, y por supuesto no se le puede poner RAM que no sea Dell/HP).
Esto mismo en una medida total sucede con los Apple y ahí están. De hecho hay quien los compra sin siguiera ver características ni prestaciones, tan solo para presumir de tener un aparato de dicha marca.

Creo que una cosa es la preferencia de compra y otra distinta reconocer cuando uno ve que el 'cacharro' se ha diseñado y fabricado con esmero en conseguir algo por encima de lo normal, cuidando cada detalle. Aunque luego el precio sea prohibitivo para la mayyoría d elos bolsillos.

Yo, cuantos más cacharros chinos veo, más harto estoy de la mediocridad y desaire que se deposita en ellos, incluso aunque su precio sea muy barato. Tienen buen rendimiento en 3 o 4 cosas, pero luego una quinta, desentona del todo, lo que hace caer el global de todo el conjunto, no están 'equilibrados'. Por eso me permito apreciar un aparato donde nada se ha dejado al tuntún y se ha pensado y cuidado cada aspecto del mismo, aunque luego el precio te tire para atrás.

El servicio técnico creo que es difícil evaluarlo de modo global, hay demasiados puntos en la geografía como para que por haber tenido mala experiencia con los 3 o 4 alrededor de tu casa hacerlo extensivo a todo. Al final esos servicios dependen del tipo de personas que los dirigen, cambia el sitio y suele cambiar la gente. Si hay un director de región que resulta ser un capullo, pues afecta a una zona más o menos extensa y dentro de dicha zona, seguramente no haya diferencia... aléjate y no tiene por qué ser igual.