Pregunta sobre bgt

37 mensajes, 2 páginas: 12  ↖ Volver a la lista de temas

Resultado: +0

31. Loba_Solitaria ,

En definitiva: cuando yo estoy a punto de agarrar un item, y dejan de obedecer los comandos y lo agarra otro, y a mí me toca salir y entrar, de quién es la culpa? De bgt, del UDP, de la recursividad o del factorial? No, por saber contra quién tengo que jurar en hebreo.
Saludos.
L.S. Usuaria.

Resultado: +0

32. BOFH ,

De la conexión, probablemente.

Resultado: +0

33. HijoDelTrueno,

Me parece que a alguien le gusta el estilo de windows (Siguiente > Siguiente > Instalar > Finalizar).

Un caso muy interesante el de la recursividad y otro mucho más interesante todavía el de los threads o hilos, que eso si que no existe en bgt.

Los hilos se usan para atender peticiones de red o procesar múltiples bloques de datos de un mismo conjunto al mismo tiempo, por ejemplo para comprimir/descomprimir.

GNU/Make por ejemplo usa threads para compilar muchos archivos fuente al mismo tiempo, aunque no tengo idea de como detecta las dependencias. En el caso de archivos fuentes en C/C++ es sencillo porque cada uno se compila a un código objeto y podrías poner al make a compilar todos los fuentes que quieras al mismo tiempo, solo que no se cuanta RAM utilizarías.

Saludos,

Resultado: +0

34. el_pichon,

El único problema de los threads es que hay que evitar a toda costa las condiciones de carrera.
Volviendo al tema de la recursividad, ayer BOFH llegó por Twitter a la conclusión de que el factorial tenía una versión iterativa, es decir, que se puede hacer con while. Y tiene toda la razón. Todo algoritmo recursivo tiene su versión iterativa. En cada caso, una puede ser más eficiente que la otra; incluso la eficiencia puede cambiar si modificamos el tamaño de los valores de entrada.
Ahora os voy a mostrar un ejemplo práctico de recursividad, para que veáis que no todo son matemáticas. Se trata de un generador de índices html. Por cada carpeta se enumeran sus subcarpetas y archivos, y se genera un index.html en cada carpeta con todo. ¡Vamos a ello!
El programa empieza aquí:
Sub Main()
generar App.Path, False
MsgBox ("Los archivos html se han generado correctamente")
End 'salimos del programa
End Sub
Sub generar(ruta As String, esSubRuta As Boolean)
Dim ts As TextStream, fldr As Folder, fil As File, fso As New FileSystemObject 'definición de variables
Set fldr = fso.GetFolder(ruta)
Set ts = fso.CreateTextFile(ruta & "\index.html")
ts.WriteLine ("<html><head>")
ts.WriteLine ("<title>Carpeta " & fldr.Name & "</title></head><body>")
ts.WriteLine ("<h1>Archivos y carpetas en el directorio " & fldr.Name & "</h1>")
ts.WriteLine ("<table><tr><th>Nombre</th><th>Fecha de modificación</th><th>Tamaño</th></tr>")
If esSubRuta = True Then 'ponemos un enlace para volver al directorio de nivel superior
ts.WriteLine ("<tr><td><a href=" & Chr(34) & "../index.html" & Chr(34) & ">Ir al directorio de nivel superior</a></td></tr>")
End If
Dim subruta As Folder, carpetas As Folders, archivos As Files
Set carpetas = fldr.SubFolders
For Each subruta In carpetas
ts.WriteLine ("<tr><td><a href=" & Chr(34) & subruta.Name & "/index.html" & Chr(34) & ">" & subruta.Name & "/</a></td>")
ts.WriteLine ("<td>" & subruta.DateLastModified & "</td>")
Select Case subruta.Size 'vamos a mostrar los tamaños de la mejor manera posible
Case 0 To 1000
ts.WriteLine ("<td>" & Round(subruta.Size, 2) & " B</td></tr>")
Case 1001 To 1000000
ts.WriteLine ("<td>" & Round(subruta.Size / 1024, 2) & " KB</td></tr>")
Case 1000001 To 1000000000
ts.WriteLine ("<td>" & Round(subruta.Size / 1024 / 1024, 2) & " MB</td></tr>")
Case 1000000001 To 1000000000000#
ts.WriteLine ("<td>" & Round(subruta.Size / 1024 / 1024 / 1024, 2) & " GB</td></tr>")
End Select
generar subruta.Path, True
Next 'se acaba el bucle for
Set archivos = fldr.Files
For Each fil In archivos
If Not (fil.Name = "index.html" Or fil.Name = App.EXEName & ".exe") Then 'listamos todos excepto index.html y este ejecutable
ts.WriteLine ("<tr><td><a href=" & Chr(34) & fil.Name & Chr(34) & ">" & fil.Name & "</a></td>")
ts.WriteLine ("<td>" & fil.DateLastModified & "</td>")
Select Case fil.Size
Case 0 To 1000
ts.WriteLine ("<td>" & Round(fil.Size, 2) & " B</td></tr>")
Case 1001 To 1000000
ts.WriteLine ("<td>" & Round(fil.Size / 1024, 2) & " KB</td></tr>")
Case 1000001 To 1000000000
ts.WriteLine ("<td>" & Round(fil.Size / 1024 / 1024, 2) & " MB</td></tr>")
Case 1000000001 To 1000000000000#
ts.WriteLine ("<td>" & Round(fil.Size / 1024 / 1024 / 1024, 2) & " GB</td></tr>")
End Select
End If
Next
ts.WriteLine ("</table>")
ts.WriteLine ("</body></html>")
ts.Close
End Sub
El programa acaba aquí.
Está hecho en Visual Basic 6. He puesto algún que otro comentario porque entiendo que algunas instrucciones pueden ser difíciles de interpretar si no conocéis el lenguaje.
Y bien, ¿para qué sirve? Yo en su momento lo desarrollé para que la carpeta public de Dropbox fuese explorable desde fuera. Se daban las condiciones idóneas: los enlaces públicos guardaban relación con la estructura de la carpeta en el disco, pero Dropbox no ofrecía un índice. Vino como anillo al dedo, como una llave que encaja en la cerradura. Si todavía usáis esa carpeta y queréis el ejecutable compilado, decídmelo y os lo subo a algún sitio. Volviendo al tema que nos ocupa, ¿a que sería jodido hacer una versión iterativa de esto?

Resultado: +0

35. sukil,

Anda, yo llegué a tener el ejecutable de esto, aunque en ni caso los html tenían una línea más.
Por cierto, a que viene lo de la discrepancia entre 1000 y 1024?

Resultado: +0

36. el_pichon,

Fue un capricho, para que por ejemplo muestre 0,99 GB en vez de 1001 MB.

Resultado: +0

37. BOFH ,

Volviendo a bgt, no recomiendo usarlo como servidor. Ojito para hacer girar a un personaje:
double girar(int giro, double anguloo)
{
if(giro==1)
anguloo=turnleft(anguloo, 1);
if(giro==2)
anguloo=turnright(anguloo, 1);
return anguloo;
}
Luego, en otra parte del servidor, junto a toda la mierda del chat...
else if(msg3[0]=="girarderecha")
{
player@ p=find_player_by_id(event.peer_id);
if(p is null)
{
net.send_reliable(event.peer_id,"Hubo un error al ejecutar.",0);
sendfinalmsg=false;
}
else
{
p.angulo=girar(2,p.angulo);
net.send_reliable(event.peer_id,"nuevoangulo."+p.angulo+"",0);
} // fin else
}
else if(msg3[0]=="girarizquierda")
{
player@ p=find_player_by_id(event.peer_id);
if(p is null)
{
net.send_reliable(event.peer_id,"Hubo un error al ejecutar.",0);
sendfinalmsg=false;
}
else
{
p.angulo=girar(1,p.angulo);
net.send_reliable(event.peer_id,"nuevoangulo."+p.angulo+"",0);
}
}
Y para terminar, en otra parte del cliente, que falla, dicho sea de paso...
string evento=event.message;
if(evento.containts("nuevoangulo")
{
string[] cosa=split(evento,".");
angulo=cosa[0];
}
Y solo falta añadir las pulsaciones de teclas. Por $Deity, lo que me queda como no de con la forma de ordenar y arreglar un poco esto...

Resultado: +0

37 mensajes, 2 páginas: 12  ↖ Volver a la lista de temas

Responder al tema

Usted debe estar conectado para poder postear.