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...