AlfredoSC   09-11-2021, 22:41
#1
Hola a todos:

Hace unos días Shell me instruyó sobre el uso de "diccionarios" para evitar una larga serie de if..then, elif...elif... pero para el caso de python.

Como su sugerencia me dio excelente resultado, estoy tratando de buscar su equivalente en Gambas3, pero no doy con la solución.

Actualmente tengo en mi proyecto lo siguiente (referido a Select Case):

Código:
      Case "A"
        bait = A11
      Case "B"
        bait = B1
      Case "C"
        bait = C1
      Case "D"
        bait = D1
      Case "E"
        bait = E1
      Case "F"
        bait = F1
      Case "G"
        bait = G1
      Case "H"
        bait = H1
      Case "I"
        bait = I1
      Case "J"
        bait = J1
      Case "K"
        bait = K1
      Case "L"
        bait = L1
      Case "M"
        bait = M1
      Case "N"
        bait = N1
      Case "O"
        bait = O1
      Case "P"
        bait = P1
      Case "Q"
        bait = Q1
      Case "R"
        bait = R1
      Case "S"
        bait = S1
      Case "T"
        bait = T1
      Case "U"
        bait = U1
      Case "V"
        bait = V1
      Case "W"
        bait = W1
      Case "X"
        bait = X1
      Case "Y"
        bait = Y1
      Case "Z"
        bait = Z1
      Case "0"
        bait = A0
      Case "1"
        bait = A1
      Case "2"
        bait = A2
      Case "3"
        bait = A3
      Case "4"
        bait = A4
      Case "5"
        bait = A5
      Case "6"
      bait = A6
      Case "7"
        bait = A7
      Case "8"
        bait = A8
      Case "9"
        bait = A9
      Case " "
        bait = SP 
      Case ":"
        bait = SP 
      
  End Select

Generalmente así he dejado mis proyectos, lo cual no causa ningún problema, pero la idea es reducir el número de líneas de código y aumentar la eficiencia.

Alguna idea al respecto?.

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
Shordi   09-11-2021, 22:59
#2
Usa colecciones y recorrerlas en un bucle. Es lo más claro.

Saludos

No podemos regresar
AlfredoSC   10-11-2021, 06:16
#3
(09-11-2021, 22:59)Shordi escribió: Usa colecciones y recorrerlas en un bucle. Es lo más claro.
Muchas gracias Shordi: 
Finalmente hice lo siguiente, que funcionó muy bien:

Código:
Public colletra As Collection

colletra = ["A": A11, "B": B1, "C": C1, "D": D1, "E": E1, "F": F1, "G": G1, "H": H1, "I": I1,
 "J": J1, "K": K1, "L": L1, "M": M1, "N": N1, "O": O1, "P": P1, "Q": Q1, "R": R1, "S": S1,
  "T": T1, "U": U1, "V": V1, "W": W1, "X": X1, "Y": Y1, "Z": Z1, "0": A0, "1": A1, "2": A2,
   "3": A3, "4": A4, "5": A5, "6": A6, "7": A7, "8": A8, "9": A9, " ": SP, ":": SP]

For indx1 = 0 To 4
  indx = indx1

  bait = colletra[letra[indx1]]
  sumar()

Next

Saludos a todos....

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
tincho   10-11-2021, 14:11
#4
En el caso de laletra "A" ¿Que tipo de variable es A11? ya que si declaro así la funcion me da error
si fuera tipo string
colletra = ["A": "A11", "B": "B1"...

Saludos.

1 Saludo.
Shell   10-11-2021, 17:24
#5
(10-11-2021, 14:11)tincho escribió: En el caso de laletra "A" ¿Que tipo de variable es A11?

Es un array.

Ejemplo:

Código:
Public Sub Form_Open()

  'Algunas de las representaciones
  Dim A11 As Integer[] = [1, 1, 1, 0, 1, 1, 1]
  Dim B1 As Integer[] = [0, 0, 1, 1, 1, 1, 1]
  Dim C1 As Integer[] = [1, 0, 0, 1, 1, 1, 0]
  Dim D1 As Integer[] = [0, 1, 1, 1, 1, 0, 1]
  Dim E1 As Integer[] = [1, 0, 0, 1, 1, 1, 1]
  Dim F1 As Integer[] = [1, 0, 0, 0, 1, 1, 1]
  Dim G1 As Integer[] = [1, 1, 1, 1, 0, 1, 1]
  Dim H1 As Integer[] = [0, 1, 1, 0, 1, 1, 1]
  Dim I1 As Integer[] = [0, 1, 1, 0, 0, 0, 0]

  Dim diccioletras As Collection = ["A": A11, "B": B1, "C": C1, "D": D1, "E": F1, "G": G1, "H": H1, "I": I1]

  Dim letrasenviar As String[] = ["A", "G", "D", "E", "C", "H"]
  Dim i As Integer 'Para recorrer el array de letras que queremos representar en un display de 8 segmentos
  Dim j As Integer 'Para recorrer cada uno de los segmentos que pertenece una letra
  Dim codigo As String

 
  For i = 0 To letrasenviar.Max
    'Vamos a recorrer las letras a enviar y a usar diccioletras como traductor
    For j = 0 To diccioletras[letrasenviar[i]].Max
      'Obtenemos los segmentos que se van encender
      codigo &= diccioletras[letrasenviar[i]][j] & " "
    Next
    'Mostramos el código
    Print codigo
    'Limpiamos
    codigo = ""
  Next

End

Salida:
Cita:1 1 1 0 1 1 1
1 1 1 1 0 1 1
0 1 1 1 1 0 1
1 0 0 0 1 1 1
1 0 0 1 1 1 0
0 1 1 0 1 1 1

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   10-11-2021, 18:38
#6
Veamos..
Si la lista de números para "A" es [1, 1, 1, 0, 1, 1, 1] entonces se podría hacer una rutina de código mas simple si el código fuera binario seria algo así:

Código:
' Gambas class file

Private sText As String
Private sBin As String

Public Sub Form_KeyRelease()

  sText &= Chr(Key.Code)

  Print Bin(Key.Code)
  sBin &= Bin(Key.Code) & "\n"

  Label1.Text = sText
  TextArea1.Text = sBin

End

Evidentemente el código para las letras del puerto paralelo y el binario no es el mismo (según este tema) pero seguro hay una formula para obtenerlo.

Nota: Si el código binario de la letra "A" en el protocolo del puerto paralelo y el código binario de la misma letra, difieren se me ocurre que o bien el que invento el protocolo tenia ganas de romper las bolas o hay otra razón. Supongo que sera lo segundo. Big Grin

Dejo un programa para experimentar en el que no es necesario usar una Collection o diccionario para los pitonistas. En este se calcula el código binari de una tecla pulsada. Lo suyo seria dar con la formula que genere el código que usa el puerto paralelo.
[Imagen: 1L5wS7B.png]

1 Saludo.
Archivos adjuntos
.gz
sample-parallel-port-0.0.1.tar.gz (Tamaño: 12.07 KB Descargas: 2)
Última modificación: 10-11-2021, 19:13 por tincho.

1 Saludo.
Shell   10-11-2021, 20:26
#7
(10-11-2021, 18:38)tincho escribió: Nota: Si el código binario de la letra "A" en el protocolo del puerto paralelo y el código binario de la misma letra, difieren se me ocurre que o bien el que invento el protocolo tenia ganas de romper las bolas o hay otra razón. Supongo que sera lo segundo.

Lo segundo no es. Que no lo hicieron por fastidiar. Big Grin

Estamos hablando de una serie de segmentos que emiten luz (son diodos leds) distribuidos de una forma.

[Imagen: K3pKe7q.jpg]

En el caso de un solo display *BCD de siete segmentos. BCD =Decimal codificado en binario.
Como ves no coincide con el binario que va por un lado y si está activo o no algunos de los segmentos.

¿ Qué ocurre ?. Que nosotros tenemos un circuito decodificador conectado al display de 7 segmentos ( mediante resistencias limitadoras)
que este deco recibe a la entrada (si recibe el número en bcd) y a la salida va encendiendo los segmentos en función de esa entrada.


 
Cita:Lo suyo seria dar con la formula que genere el código que usa el puerto paralelo.

Si quieres hacer la tabla de la verdad por cada segmento, tomando las cuatro entradas en binario, liarte a reducir con tablas de Karnaugh.  Angel
Oye que como ejercicio está realmente interesante, pero es que no me sobra el paracetamol y este es un medicamento en lista de falta de suministro. ( no es coña )

Por algo las colecciones. Wink

Cof cof cof..¿ os había contado que después de los exámenes de electrónica digital ( que no digo la combinacional ) acabé viendo ceros y unos cada vez que cerraba los ojos ?.
Pastillote tipo ensaimada y para adentro! Rica, rica.

Referencia de la imagen:

Conectar display 7 segmentos cátodo común

Saludos
Última modificación: 10-11-2021, 20:33 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
AlfredoSC   10-11-2021, 22:37
#8
(10-11-2021, 18:38)tincho escribió: en el que no es necesario usar una Collection o diccionario

Luego de que Shell ha dado una excelente explicación del código para las letras mayúsculas convertidas a segmentos de led, que es lo que hace mi proyecto, no me queda mas que agradecerle lo bien explicado que ha quedado en su respuesta.

Por otro lado la sugerencia de Tincho, ya la he usado cuando hice el proyecto del YM2151, que es un sintetizador para producir música en videojuegos de antaño, pues a ese proyecto le puse un teclado de piano, con el uso de Key.Code, tal como se muestra en el proyecto que el mismo Tincho puso para que lo bajásemos. (Este último proyecto también lo subí a este Foro hace unos meses).

Gracias nuevamente....

(10-11-2021, 20:26)Shell escribió: acabé viendo ceros y unos cada vez que cerraba los ojos

En la Universidad nos causaba hilaridad la materia de Circuitos Lógicos I, la cual traducíamos como "Palitos y Bolitas" como una clase de jardín de niños, siendo que estábamos en plena carrera a ser ingenieros....ja ja ja....
Última modificación: 10-11-2021, 22:39 por AlfredoSC.

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
Shell   10-11-2021, 22:47
#9
(10-11-2021, 22:37)AlfredoSC escribió: En la Universidad nos causaba hilaridad la materia de Circuitos Lógicos I, la cual traducíamos como "Palitos y Bolitas" como una clase de jardín de niños, siendo que estábamos en plena carrera a ser ingenieros....ja ja ja....

Nunca mejor dicho, palitos y bolitas. Big Grin

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   11-11-2021, 01:33
#10
Veo que ustedes ven la matrix en texto Smile

1 Saludo.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.