Programación General > Visual Basic para principiantes
Podrian Publicar funciones para procesar Cadena de texto
Jimbenit:
^_^Vaya palabras has citado F_Tanori.
Nebire:
Bueno comentaros que el otro día respondí, pero era hora de cenar y no había terminado el mensaje después al enviar no me di cuenta de que habría caducado la sesión, me deslogó y me dió pereza reconstruir el mensaje (porqué estos foros no pueden recuperar el mensaje, hace 10 años se entiiende pero hoy día esto es intolerable, en fin...)
Mencionaba que yo no considero un error una coma al final, de más o de menos ya que de hecho la función que presentaba ilson quedaba 'guarreada' precisamente por querer mantener esa coma y por lo del númerito delante que 'pa qué ?'. La coma no estorba porque a menudo debe concatenarse un resultado con otro y por tanto suele tenerse que meter cuando en la función se lo extrajo.
También os presentaba otra manera de resolver la función sencilla y con mucha claridad aunque ligeramente más lenta.
Señalaba que la función de Nilson puede mejorarse a lo siguiente (prescindiendo del numerito que no sirve para nada y que lleva siempre coma al final excepto que sólo haya un carácter.)
--- Código: Visual Basic --- Function CadenaASCII(CadenaNormal As String) As String Dim k As Long, cadena As String On Local Error GoTo errorSobrepasa: cadena = "" 'If CadenaNormal = "" Then Exit Function If Len(CadenaNormal) > 16383 Then MsgBox "Existen posibilidades de que se produzca un error..." End If For k = 1 To Len(CadenaNormal) ' el último carácter lo quedamos fuera del bucle cadena = cadena & Asc(Mid$(CadenaNormal, k, 1)) & "," Next ' al finalizar el bucle, k todavía aumenta en 1 CadenaASCII = cadena Exit Function errorSobrepasa: MsgBox ("Cada carácter de entrada genera entre 2 y 4 caracteres de salida. en VB6 el tamaño máximo de una cadena son 65535 caracteres, dicho valor se ha alcanzado con el " & " k ésimo carácter de la cadena de entrada..." & vbCrLf & Err.Description) CadenaASCII = cadenaEnd Function
Yo proponía la siguiente función ligeramente más lenta que esta anterior pero bastante más clara y breve
--- Código: Visual Basic --- ' bytes con comasPrivate sub Cadena_A_BytesCC(byref cadena As String, optional concat as string=",") ' nótese el byref puesto a propósito Dim s() As String ReDim s(0 To Len(cadena)) For k = 1 To Len(cadena) s(k) = Asc(Mid$(cadena, k, 1)) Next cadena= Join(s, concat)End Function De esta fnción decir que la coma en vez de aparecer al final aparecerá al principo, para el caso es lo mismo siempre que se tenga en cuenta.
Como puede verse a esta función le he añadido un parámetro opcional que sirve para 'meter' cualquier cadena y no sólo comas, lo que le daría más versatilidad sin apenas código adicional.
La función inversa resulta igualmente breve:
--- Código: Visual Basic --- ' nota la cadena puede empezar tanto con coma como con cifras, pero si empieza con coma debe ir detrás números, la cadena no puede acabar en coma, esta función es la pareja de la anterior, que deja cadenas con comas delante, no es pareja de una función que deje comas detrás. Private Function convertir(cadena As String) As String Dim s() As String, ini As Byte on local error goto errorChr s = Split(cadena, ",") ini = IIf(Left$(cadena, 1) = ",", 1, 0) For k = ini To UBound(s) s(k) = Chr$(s(k)) Next convertir = Join(s, "") exit functionerrorChr: msgbox "La cifra ' " & s(k) & " ' no está dentro del rango 0-255 (byte)" & err.description End Function se supone que nunca habría de ocurrir chr$(23456) si se creó usando la otra función.... pero bueno se ha incluído un tratamiento de error...
Y en otro momento os coloco una función que totaliza las palabras que hay en un texto, para lo que pide nuestro amigo Nilson...
m0skit0:
--- Citar ---solo que deberias de usar el parametro ByRef para utilizarlo como "puntero" y no estarlo pasando como copia a cada llamado de la funcion
--- Fin de la cita ---
Entonces, ¿para qué queremos ByVal? :lol: :lol:
En teoría, no tienes razón: debería pasarse ByVal (por valor) porque no se va a modificar dicho parámetro, así el código queda más claro y entendible (aparte de poder cambiar de valor el parámetro sin que se modifique en el código llamante).
En la práctica, tienes razón, porque el código corre más deprisa pasando sólo un puntero (ByRef, por referencia) en vez de hacer la copia de la variable.
Lo que me lleva a preguntarles:
¿Qué creen que compensa más: que el código se ejecute más rápido o que sea más legible? <_<
Jimbenit:
La conversación ahora gira entorno a la legibilidad y a la rapidez...
Pero pensando bien... esto es lo que realmente importa de un codigo... B), pero para el nivel de principiante (para lo que este foro fue creado), creo que esta bien.... pero es muy, muy interesante ver los codigos de programadores EXPERTOS (como ustedes) <_< resolviendo aquello que los chiquillos hacen (como yo), sin lugar a dudas es fantastico poder interactuar con ustedes :good:
Saludos y gracias por lo que me enseñan... (como podré agradecerles esto???)
F_Tanori:
Algunas teorias indican que hay que darle prioridad , al lector (del codigo) es decir que sea mas entendible,pero en lo personal creo que es mas importante la rapidez y eficientación de recursos , y quien no lo entienda debera informarse un poco mas :P
* En este caso aun usando ByRef no se modifica la variable
--- Código: Text ---... InvertirCadena(ByRef str As String) ...
Saludos
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa