Comunidad Gambas-es

Versión completa: Se pueden hacer "diccionarios" o "catálogos" en Gambas3?
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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):

GAMBAS
  1. Select Case letra[indx]
  2.       Case "A"
  3.         bait = A11
  4.       Case "B"
  5.         bait = B1
  6.       Case "C"
  7.         bait = C1
  8.       Case "D"
  9.         bait = D1
  10.       Case "E"
  11.         bait = E1
  12.       Case "F"
  13.         bait = F1
  14.       Case "G"
  15.         bait = G1
  16.       Case "H"
  17.         bait = H1
  18.       Case "I"
  19.         bait = I1
  20.       Case "J"
  21.         bait = J1
  22.       Case "K"
  23.         bait = K1
  24.       Case "L"
  25.         bait = L1
  26.       Case "M"
  27.         bait = M1
  28.       Case "N"
  29.         bait = N1
  30.       Case "O"
  31.         bait = O1
  32.       Case "P"
  33.         bait = P1
  34.       Case "Q"
  35.         bait = Q1
  36.       Case "R"
  37.         bait = R1
  38.       Case "S"
  39.         bait = S1
  40.       Case "T"
  41.         bait = T1
  42.       Case "U"
  43.         bait = U1
  44.       Case "V"
  45.         bait = V1
  46.       Case "W"
  47.         bait = W1
  48.       Case "X"
  49.         bait = X1
  50.       Case "Y"
  51.         bait = Y1
  52.       Case "Z"
  53.         bait = Z1
  54.       Case "0"
  55.         bait = A0
  56.       Case "1"
  57.         bait = A1
  58.       Case "2"
  59.         bait = A2
  60.       Case "3"
  61.         bait = A3
  62.       Case "4"
  63.         bait = A4
  64.       Case "5"
  65.         bait = A5
  66.       Case "6"
  67.       bait = A6
  68.       Case "7"
  69.         bait = A7
  70.       Case "8"
  71.         bait = A8
  72.       Case "9"
  73.         bait = A9
  74.       Case " "
  75.         bait = SP 
  76.       Case ":"
  77.         bait = SP 
  78.       



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?.
Usa colecciones y recorrerlas en un bucle. Es lo más claro.

Saludos
(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:

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



Saludos a todos....
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.
(10-11-2021, 14:11)tincho escribió: [ -> ]En el caso de laletra "A" ¿Que tipo de variable es A11?

Es un array.

Ejemplo:

GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   'Algunas de las representaciones
  4.   Dim A11 As Integer[] = [1, 1, 1, 0, 1, 1, 1]
  5.   Dim B1 As Integer[] = [0, 0, 1, 1, 1, 1, 1]
  6.   Dim C1 As Integer[] = [1, 0, 0, 1, 1, 1, 0]
  7.   Dim D1 As Integer[] = [0, 1, 1, 1, 1, 0, 1]
  8.   Dim E1 As Integer[] = [1, 0, 0, 1, 1, 1, 1]
  9.   Dim F1 As Integer[] = [1, 0, 0, 0, 1, 1, 1]
  10.   Dim G1 As Integer[] = [1, 1, 1, 1, 0, 1, 1]
  11.   Dim H1 As Integer[] = [0, 1, 1, 0, 1, 1, 1]
  12.   Dim I1 As Integer[] = [0, 1, 1, 0, 0, 0, 0]
  13.  
  14.   Dim diccioletras As Collection = ["A": A11, "B": B1, "C": C1, "D": D1, "E": F1, "G": G1, "H": H1, "I": I1]
  15.  
  16.   Dim letrasenviar As String[] = ["A", "G", "D", "E", "C", "H"]
  17.   Dim i As Integer 'Para recorrer el array de letras que queremos representar en un display de 8 segmentos
  18.   Dim j As Integer 'Para recorrer cada uno de los segmentos que pertenece una letra
  19.   Dim codigo As String
  20.  
  21.  
  22.   For i = 0 To letrasenviar.Max
  23.     'Vamos a recorrer las letras a enviar y a usar diccioletras como traductor
  24.     For j = 0 To diccioletras[letrasenviar[i]].Max
  25.       'Obtenemos los segmentos que se van encender
  26.       codigo &= diccioletras[letrasenviar[i]][j] & " "
  27.     Next
  28.     'Mostramos el código
  29.     Print codigo
  30.     'Limpiamos
  31.     codigo = ""
  32.   Next
  33.  



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
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í:

GAMBAS
  1. ' Gambas class file
  2.  
  3.  
  4. Public Sub Form_KeyRelease()
  5.  
  6.   sText &= Chr(Key.Code)
  7.  
  8.   Print Bin(Key.Code)
  9.   sBin &= Bin(Key.Code) & "\n"
  10.  
  11.   Label1.Text = sText
  12.   TextArea1.Text = sBin
  13.  



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.
(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
(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....
(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
Veo que ustedes ven la matrix en texto Smile