elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 ... 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 [382] 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 ... 436
3811  Programación / .NET (C#, VB.NET, ASP) / Re: Guardar informacion en una pila en: 17 Julio 2017, 16:22 pm
Te pongo el pseudocódigo de lo que podría ser la estructura de una pila. Tu luego lo transformas a código NET, y después creas la interfaz para usarla...

Es mejor separar siempre que sea posible, el objeto que se crea de la operatoria que haga el cliente con ese objeto.

Entonces crea un nuevo proyecto, llámale  como quieras, luego añade una clase y llámala Pîla

Código:
clase pública Pila

    privado array entero ePila()  // los valores se alamcenarán aquí
    privado entero sCapacidad  // cantidad total de ítems que caben en la pila
    privado entero sItems   // cantidad de ítems que tiene la pila en un momento dado.

    Entero = publico Propiedad solo lectura Capacidad
        devolver sCapacidad  
    fin Propiedad

    Entero = publico Propiedad solo lectura Items
        Devolver sItems
    Fin Propiedad

    Buleano = publico Funcion EstaVacia
        Devolver (sItems=0)     // Si sItems es 0, la pila está vacía.
    Fin funcion

    Buleano = publico Funcion EstaLlena
        Devolver (sItems = sCapacidad)  // Si el valor de lo que contiene es igual a la capacidad, la pila está llena.
    Fin Funcion

    // Constructor de la clase, exige una cantidad para limitar la Pila.
    publico Funcion Nuevo(entero Cantidad)
       Si (cantidad > 0) luego
           Redimensionar array sPila(0 a Cantidad-1)
           sCapacidad = Cantidad
           sItems = 0
       Si no
           Generar ERROR "La cantidad de elementos en la Pila no puede ser 0 (ni un valor negativo)"
        Fin si
    Fin Funcion

    Buleano = Publico Funcion Meter(entero Valor)
        Si (EstaLlena = FALSE) entonces // invocamos un método de la propia clase
            ePila(sItems) = Valor
            sItems += 1  
            Devolver TRUE  
        Si no
            Generar ERROR " La pila está llena. Imposible añadir más elementos."
            Devolver FALSE
        Fin si
    Fin Funcion

    entero = publico Funcion Sacar // no lleva parámetros, la pila siempre saca elementos de la cima.
        Si (EstaVacia = FALSE) luego            
            sItems -=1    // simplemente se baja el puntero, no es preciso eliminar nada (salvo que se guardaren referencias de objetos).
            Devolver ePila(sItems)
        Si no
            Generar ERROR "La pila está vacía. no contiene elementos para extraer.
            Devolver 0
        Fin Si
    Fin funcion

    privada Funcion Destruir // el desctructor de la clase.
        Vaciar  
    Fin funcion

    privada Funcion Vaciar  //si esta función se hace pública necesitaría otra pareja llamada NuevaCapacidad(Cantidad) que haga lo mismo que hace el constructor... si no quedaría vacía y sin posibilidad de ser populada...
        sCapacidad=0
        sItems = 0
        Borrar array ePila
    Fin Funcion

    
Fin Clase

Éste pseudocódigo es un sencillo código pero completo para una pila. Incluso contiene dos métodos para consultar el estado de la pila (estaLlena y EstaVacia), que no son imprescindibles, pero internamente las vamos a usar, así que por que no hacerlos públicos...

Cómo usarla ?:
La pila es limitada, al valor que se le indica cuando se contruye una instancia de la clase. Es decir, tú puedes hacer uso de la pila por ejemplo desde una ventana o desde otra clase, lo mejor para probarlo es crear unos botones en un formulario y unas cajas de texto, los botones podrían ser 'crear()', Meter(), Sacar:  (los paréntesis en Crear y Meter, indican que requieren un parámetro que podría tomarlo de una caja de texto asociado a dicho botón.

Crear una instancia de la pil:
Código:
Pila p = Nueva Pila(25) //y creas una instancia de la Pila en p, que puede contener hasta 25 elementos.

Esta pila tiene varias limitaciones, no solo la cantidad de elemntos que puede contener (las pilas en general se diseñan para contener pequeñas cantidades, no cientos de millones, rara vez se necesitará un pila muy grande, un ejemplo de esas excepciones son precisamente los programas compiladores.
Bueno, otra limitación de esta pila es que la hemos limitado al tipo de datos entero. como es un proyecto de prueba, es suficiente, pero podrías hacerla de cualquier tipo incluso para admitir cualquier tipo...

Una Pila, es una estructura para guardar elementos y luego obtenerlos en orden inverso a como se metieron, es decir, la forma lógica de verlo, es imaginandose poner un libro en el suelo y lueo otro encima y luego otro y luego otro... esto es: "apilar libros"... directamente solo puedes coger el último, el que está arriba en  la cima, para coger otro más abajo, debes primero retirar los que tienes encima. Las pilas, por esto mismo se usan en casos donde se requiere precisamente mantener ese orden (inverso al que se ha metido).

Apilar datos:
Código:
p.Meter(12)
p.Meter(567)
entero n= -1234
p.Meter(n)
p.Meter(-44)

Probar los métodos y propiedades:
Código:
Mensaje p.Capacidad
Mensaje p.Items
Mensaje p.EstaLlena
Mensaje p.EstaVacia

Retirar datos:
Código:
entero n = p.Sacar
mensaje n  // el último valor metido fue -44, luego este es el primer valor sacado.
n = p.Sacar // se obtiene -1234, que fue el penúltimo metido.

Mensaje p.Items

etc....

Si tienes alguna duda, pregunta...

p.d.: no te conformes con ejecutar el proyecto a "saco" (F5, run), si no paso a paso (F11, debug... no recuerdo si en C# es también esa tecla F11 )
3812  Programación / .NET (C#, VB.NET, ASP) / Re: hacer split y almacenarlo en una matriz en vb.net en: 17 Julio 2017, 04:58 am
Lo siento, pero todos esos 'millones' que tú dices es insignificancia... Se pueden gestionar ficheros de hasta gigabytes de tamaño con cierta soltura.

Split, está pensado para cadenas de texto pequeñas, si tienes que manejar archivos muy grandes entonces hay que trabajar a un nivel mucho más bajo, manipulando bytes, aunque tampoco hace falta llegar al ensamblador.

...pero es que ni siquiera te has molestado en explicar si tus datos tienen o no un formato fijo y estricto, ni mucho menos el formato del 'fichero gigante' que dices tener... Pero tú mismo, si no quieres hacerlo eficiente, es cosa tuya... Perder el tren por llegar tarde es una cosa, perderlo por orgullo, es tontería.
3813  Programación / .NET (C#, VB.NET, ASP) / Re: C# Problemas con un tipo de guardado en: 17 Julio 2017, 04:49 am
No. La base puedes considerarlo la parte común a todos los lenguajes e independiente de ellos. Toca un poco todos los palos.
Y basta que sea a nivel conceptual, aunque al menos la parte matemática debe quedar muy clara. Con una buena base, luego es muy asequible avanzar, sin la base es frecuente tropezar casi con cada cosa que tenga algo de complejidad.

Busca algún libro sobre "fundamentos de programación"... No te preocupes si al principio, no entiendes demasiado, a medida que avances y lo leas 3 o 4 veces, lo verás todo bastante claro, es cuestión de que puedas atar cabos, mientras habrá cabos sueltos por todos lados, cuando logres empezar a atarlos, la complejidad desaparece y todo lo que queda es el trato del inglés...
3814  Programación / .NET (C#, VB.NET, ASP) / Re: C# Problemas con un tipo de guardado en: 16 Julio 2017, 21:38 pm
No entiendo nada.
Si quieres programar, y dedicarte a esto, lo primero e imprescindible es aprender lo básico y elemental, al margen de cualquier lenguaje de programación.

Tienes que saber operar con números, tienes que entender los números negativos y las bases binaria, hexadeciaml y octal (la decimal se supone que uno lo tiene).
Tienes que saber que son las operaciones lógicas, aritméticas, qué son los condicionales y las bifurcaciones, que son las funciones, propiedades, variables, secciones de código...
Tienes que saber la diferencia entre la ejecución compilada e interpretada y por lo mismo que es depurar/'debugar' un programa.
Tienes que conocer las estructuras básicas de datos: array, estructuras, listas enlazadas, pilas (FIFO), colas (LIFO), árboles, ficheros y de las bases de datos al menos algo somero...

...y todo sin profundizar, lo básico al menos. Solo entonces es cuando puedes decantarte por un lenguaje y avanzar en profundidad, si todo lo básico lo conoces, nada en un lenguaje va a ser tan complejo que te resulte incomprensible.

Sin un conocimiento básico, es perder el tiempo. Es como querer arreglar un avión cuando no conoces ni como funciona una bicicleta.

Es impòsible poder prestar ayuda útil a alguien que carece de conocimientos básicos... ¿qué baldosa puedo decirte que pises si tu no la conoces y yo ignoro lo que tu desconoces?. Cuando alguien se pone a programar se le supone que sabe lo básico y si no es así, su prioridad no debe ser otra que adquirir esa base... se torna absurdo querer conbstruir un avión, cuando uno no sabe lo que es un ala, ni un motor a reacción ni siquiera un tobera de escape, ni una hélice. ¿¿¿Cómo se supone que vas a hacer algo que no sabes ni cómo es, ni de qué piezas se compone????.
3815  Programación / .NET (C#, VB.NET, ASP) / Re: hacer split y almacenarlo en una matriz en vb.net en: 16 Julio 2017, 21:26 pm
bueno gracias a los dos por quererme ayudar pero yo desde un principio conocía la respuesta, pero solo preguntaba por si se podía pero párese que les gusta escribir mucho y sin llegar a nada
Vaya... es que eres duro de mollera. Se te ha explicado de todas las maneras posibles y sigues sin entenderlo. Y eso de llegar a nada, lo siento, solucion se te ha dado, otra cosa es que tu desistas de usarlas...

pero solo bastaba con decir "no se puede por esto y esto", eso aclararía todo ahora yo les digo por que no se puede
Eso es lo que se ha dicho una y otra vez... y no que no se pueda si no que las soluciones no son eficaces.


primero la solución a este problema es crear una matriz escalonada cosa que ninguno de los dos menciono como el siguiente ejemplo:
FALSO. Ya te comenté eso, otra cosa es que en tu ignorancia no sepas verlo...
Existen los JaggedArray que pueden solucionar ciertos problemas con arrays multidimensionales donde cada dimensión puede tener diferente cantidad de elementos...

Tu problema más elemental se traduce en que no aclaras (ni aún a estas alturas), para que rayos necesitas hacer eso, porque es fijo que hay una manera óptima de tratar los datos, pero tu te cierras en banda en querer usar un array mutidimensional porque sí, y solo si... (y además sin usar un bucle para volcarlo). Es como si alguien dice que quiere ir a la Luna, y contrata a una empresa aeroespacial, pero al final resulta que "quiere ir con su motocicleta y no admite ninguna otra cosa". Pues va a ser que así solo irás al pueblito de al lado o a otra ciudad... pero jamás a la Luna.

Si quieres y realmente lo necesitas, explica como tienes los datos en ¿el fichero?, y explica pará que vas a usarlos y por tanto qué datos son precisos y olvida la parte de cómo o de qué manera hay que tratarlo, eso ya se te aclara... deja abierto que te sugieran como tratar los datos, no te obceques en querer hacer algo de una manera específica. Es seguro que hay mucha maneras de hacerlo óptimo, pero 'usando tu moto, forzosamente', nadie se va a comprometer a que sea óptimo...
3816  Programación / .NET (C#, VB.NET, ASP) / Re: C# Problemas con un tipo de guardado en: 16 Julio 2017, 17:45 pm
A ver, yo personalmente no critico a nadie... la idea de responder es ayudar...

Igual que señalo fallos en el código, señalo fallos en el programador. Pero porque a veces el fallo está en el código y a veces el fallo está en el programador.

Si Elektro te puso el código que cumple tus necesidades y tu luego copias y pegas y añades código superfluo, ahora demuestras que el fallo está en el programador, luego señalo el fallo encontrado...

Si el fallo está en el código, pués señalo por donde puedes avanzar, con código y más a menudo con pseudocódigo. y si el fallo está en el programador, también señalo como avanzar o como evitar o solucionar el tema. De hecho mi mensaje previo está repleto de instrucciones y alternativas, que puedes seguir...

Si tú solo crees que los fallos están el código y que tu no debes 'corregirte' entonces seguirás siempre en la 'oscuridad' sin aprender nada, si no tras tropecientos mil intentos...

No te lo tomes a mal, nadie está aquí para molestar, aprende y sigue adelante...
3817  Programación / .NET (C#, VB.NET, ASP) / Re: hacer split y almacenarlo en una matriz en vb.net en: 16 Julio 2017, 17:25 pm
hola NEBIRE no me entendiste?
claro que te entendí... el código y explicaciones que pusiste (y que repito aquí debajo) son suficientemente claro:
Código
  1. ' tengo esta variable llamada cadena que es igual a
  2. dim cadena as string = "0-1-2-3-4-5-6-7-8-9"
  3. ' y declaro una matriz de 1x10 así
  4. dim matriz(1,9) as string
  5.  
  6. ' quiero hacer split y que el resultado sea almacenado en la posicion 0 hasta 10 de la matriz sin hacer esto
  7. dim vector() as string
  8.  
  9. vector=split(cadena,"-")
  10. for x=0 to 9
  11.   matriz(0,x)=vector(x)
  12. next
  13.  
  14. ' ... quiero guardar el vector en una fila de la matriz ... y quiero ahorrarme el ciclo
  15.  

Sin embargo, eres tú quien parece no haberme entendido...
Ningún lenguaje se dedica a crear funciones peregrinas para resolver un único caso que se va a usar 1 vez cada 5 años por parte de algún programador... máximo, cuando lo mismo puede hacerse con 3 líneas de código y para colmo a cambio de una complejidad extrema (sería preciso para que fuera útil del todo declarar que partes del array deberían mantenerse, lo que exigiría copias posteriores que lo harían lento).
Pero el principal problema por el que ningún lenguaje ha hecho ni hará jamás (salvo que lo formen chiflados), es crear una función cuyo resultado a priori se desconozca, y por tanto que deba crear y redimensionar un array y que en vez de ello, derive a un array administrado por 'el usuario', para volcar el contenido, pero antes redimensionarlo y J0D35L3 el contenido actual, o a cambio de una complejidad extrema donde declare que partes exigen ser mantenidas... y la función deba restaurar esas partes previas verificaciones de si el nuevo tamaño, lo va a permitir (ajustado a la perfeccción), si va a sobrtar contenido nuevo, o si se va a destruir contenido existente...

- Cuando vas a hacer Split, de entrada no sabes cuantas apariciones habrá, por eso en un primer momento han de contarse (si se quieren guardar en un array), para luego redimensionar el array a la cantidad encontrada y en otro paso volcar ahí los datos. Si en vez de un array se usara por ejemplo una lista enlazada, podría hacerse todo en un solo paso, pero la ventaja de los arrays recae en la contigüidad de sus elementos, y de ahí la facilidad de encontrar la dirección de memoria del elemento 'x'... y con ello la velocidad de acceso.

- Si tu tienes un array ya declarado con más de una dimensión, ese array ya está definido a tener 'x' dimensiones por 'y' elementos en cada dimensión (suponiendo uno de 2 dimensiones). Un Split, podría hacer una de dos cosas sobre un array así: Redimensionarlo de nuevo para que tenga el tamaño que encuentre el 'splitado', o bien usar el espacio actual que tenga el array no redimensionándolo en ningún caso y en tal situación que queden ocurrencias sin copia. ó indices sin una reocupación (con basura del contenido previo). ambas situaciones son una chapuza.... peroooooooooo... si ese es tu caso, YA te puse código para una función que hace eso, luego no vengas con que no te entendí.... prueba la función más arriba y dime si lo hace o no (que desde luego lo hace, porque la he probado).

- Pero el problema es que tu ya tienes ese array, en cambio Split, devuelve un array que Split crea. Split no admite (en ninguna sobrecarga) como parámetro de entrada un array tuyo donde volcar el contenido. Luego Split, no hace lo que tu pides (cierto es que no he probado aún VS-2017, pero dudo mucho que hagan eso ni ahora ni nunca. Es más si a alguien se le ocurriera tamaña patraña, creo que lo despidirían ese mismo día).

- Te decía también, que es posible tras obtener el array que devuelve split, volcar en contenido en tu array (sin usar un bucle), haciendo uso de Marshalling, para operar con punteros de dirección y hacer un: copyMemory(ptrDestino, ptrOrigen, NumBytesACopiar)...
...pero francamente el código necesario en NET para esto, es mucho más que las 3 PUT45 líneas sencillas de un bucle (en vb6 sería solo la línea de código de la llamada a la función, pero en NET al operar con memoria administrada se requiere más código aunque luego compilado no difiera mucho).

- Y en cuanto a la velocidad de copia, creo que estás subestimando los procesadores.... trata de hacer pruebas de velocidad de asignación entre bucles y demuéstrame que es lento, dime cuantos millones de índices por segundo es capaz de transferir tu equipo entre 2 arrays... sin conocer nada de tu equipo, apuesto que más de 20millones por segundo, así que tu aseveración de que 'es lento' es pueril e injustificada.

---------
p.d.: En programación se puede hacer cualquier cosa, pero eso no significa que sea admisible hacer cualquier cosa, hay aberraciones y esta que propones (por no usar un bucle) es una de ellas. Francamente eso dice muy poco a tu favor como programador...

Desde el momento en que se deba realojar memoria para copiar datos y deba modificarse una infinidad y la complejidad lo haga costoso, será relativamente más sencillo proveer una array adicional que se crea en el momento preciso y se destruye cuando ya no se requiera, y se deje el resto 'en paz'.... en general esta ecuación suele ser casi siempre cierta: Mayor sencillez = mayor velocidad.

En fin si no entiendes todo esto que te digo, es que tu madurez como programador aún está muy verde...
3818  Foros Generales / Foro Libre / Re: Escenas de hackers en peliculas o series en: 16 Julio 2017, 02:55 am
Una de las primeras pelis, de ese tipo fue la de Superman III (1983), donde el actor Richard Prior, encarnaba al hacker malandrín que hacía de las suyas para sacarse un dinerito... y eso que al inicio era un prongadillo en la programación...  :laugh: :laugh: :laugh:



p.d.: No es ni de lejos, la mejor actuación como hacker, pero si que influenció a muchísima gente para meterse en el mundillo de la informática e hizo soñar a otra mucha, con lo que se podía lograr hacer con un ordenador...
3819  Programación / Programación C/C++ / Re: Necesito ayuda con mi código help en: 16 Julio 2017, 02:20 am
Código:
array Modas() =  Funcion ContarPresencias(array Numeros() ) 
    array x(0 a numeros.MaxValue)  // esto es, exige previamente o bien conocer a priori el valor mayor del array o recorrerlo en un bucle para localizarlo.

    // Contar la presencia de cada valor en el array.
    Bucle para k desde 0 a Numeros.Length-1
         x(numeros(k)) += 1
    Fin Bucle

    // Buscar la moda o modas que pudiera haber...
    Bucle para k desde 0 a x.Length -1
        Si x(k) > n luego
            n = x(k)
            Modas=1
        O si x(k) = n luego
            Modas +=1
        Fin Si
    Fin bucle

    Redimensionar Array m(0 a Modas -1)
    k=0
    Hacer Mientras (modas > 0)
        Si n= x(k) luego
            Modas -=1   //hacemos una cuenta regresiva, para ser más óptimos, nos da igual en que orden aparezcan las modas, ¿no?
            m(Modas) = k            
        Fin si
        k +=1
    Repetir

    Devolver m //el array....
Fin Funcion
La llamada a esta función con el array de valores: 1, 2, 2, 3, 3, 4, 4 devolvería un array con 3 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2

Nota sin embargo que esta solución al usar parcialmente el algoritmo counting, tiene algunas serias limitaciones:
 --- solo vale para números, no para cadenas.
 --- solo vale para enteros, no para decimales (no es dle todo cierto, pero sería costoso multiplicar todos los números para convertirlos en enteros)
 --- si el valor mayor del array es gigante, será costoso en memoria, ya se necesita memoria auxilair del array de contar presencia de cada valor desde 0 hasta el mayor valor hallado en el array. por ejemplo si tienes un array de 5 elementos y sus valores son estos: 5,6,76543210,16,84, exige crear un array de 76543211 elementos...
 --- si hay valores negativos, es costoso, exige buscar el valor menor, sumar ese valor a todos, para hacer el menor igual a 0, y al final restar ese valor al consignar los valores en el array 'm'...


Ahora bien, si es algo simple como el ejemplo que has puesto cumple perfectamente tus necesidades...

-----------------------------------------
p.d.: modificado, para indicar la salida que daría la función con tus datos de ejemplo como entrada. OJO: Solo indica los valores de moda, no la frecunecia alcanzada en la moda. Si fuere preciso esto, podría devolverse dicho valor en un índice más (el último en el array)... y los cambios al código serían estos:
Citar
Redimensionar Array m(0 a Modas -1)
 Redimensionar Array m(0 a Modas)

y...
 
Citar
k = 0
  Hacer Mientras (modas > 0)

  k = 0
  m(Modas) =n
  Hacer Mientras (modas > 0)
y finalmente la salida sería entonces:
  array con 4 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2 y la cuenta de moda: m(3) = 3
3820  Programación / .NET (C#, VB.NET, ASP) / Re: hacer split y almacenarlo en una matriz en vb.net en: 16 Julio 2017, 01:49 am
No sé yo si entiendes la idea de 'bucle'.

La solución, pasa sí o sí, por hacer bucles. Otra cosa es que el bucle lo realices tú explícitamente o delegues en algún método interno.

Split, no entrega el contenido donde tu desees, si no en la posición de memoria de un array. Si quieres que Split, entregue el resultado en otro lado, tienes que manejar el puntero del array. Básicamente falsificando la dirección del array 'vector', para hacerle creer que su dirección es en realidad la dirección del índice en Matriz(0,0). Ahora bien, esto supone un problema irresoluble aquí... ya que Split, redimensiona automáticamente el array, pero al pasarle una dirección de array falsa, la estructura (SafeArray) del array (Matriz), no va a coincidir en nada con el de 'Vector', por lo que en algún punto va a cantar un error...

No hay buenas noticias para ti, que conste que en VB no existe solución a lo que tu esperas (ni en ningún lenguaje), porque exige sí o sí, redimensionar siempre el array en el que se vuelca, y si el array ya está redimensionado hacerlo de nuevo, sin duda borraría el contenido previo, pero puedes enfangarte y hacer algo...

Lo mejor es que ya que se requiere usar bucles (sí o sí), implementes tu propia función Split ... (aquí simplificada en parámetros)

Código
  1. ''' <summary>
  2. ''' Entrecorta un texto, por un carácter que se busca y el resultado lo aloja en un array.
  3. ''' </summary>
  4. ''' <param name="Texto">El Texto origen del procesado</param>
  5. ''' <param name="Delimitador">El carácter (ojo, no un texto), por el que se busca entrecortar.</param>
  6. ''' <returns>Un array con los resultados hallados.</returns>
  7. ''' <remarks>Si delimitador se quiere que sea una cadena y no un texto, debe modificarse la búsqueda (el condicional dentro del bucle).</remarks>
  8. Public Function Split(ByRef Texto As String, Optional ByRef Delimitador As String = " ") As String()
  9.        Dim cd() As String
  10.        Dim ct1 As UInt32, ct2 As UInt32, k As UInt32, n As UInt32
  11.  
  12.        ' Buscar cuantas coincidencias se localizan...
  13.        While (k < Texto.Length)
  14.            If Texto.Chars(k) = Delimitador Then
  15.                ct1 += 1
  16.            End If
  17.            k += 1
  18.        End While
  19.  
  20.        ReDim cd(0 To ct1)
  21.  
  22.        ct2 = 0 : n = 0 ' a cero, por si se usaran antes...
  23.        If (ct1 > 0) Then ' número de subdivisiones, si no se encontró, no recorremos de nuevo el texto...
  24.            k = 0
  25.            While (k < Texto.Length)
  26.                If Texto.Chars(k) = Delimitador Then
  27.                    cd(ct2) = Texto.Substring(n, k - n)
  28.                    ct2 += 1 : n = k + 1
  29.                End If
  30.                k += 1
  31.            End While
  32.        End If
  33.        ' queda la subcadena final, puede ser el texto original si no se encontró nada.
  34.        cd(ct2) = Texto.Substring(n, k - n)
  35.  
  36.        Return cd
  37. End Function
  38.  

Bien, ahora que hay una función que opera conforme a como se espera (esto es casi igual que hace el Split de VB, digo casi, porque el delimitador aquí debe ser un solo carácter, queda a tu esfuerzo hacer los cambios necesarios que requieras), ahora puedes añadir una sobrecarga con la modificación que tu pedías...
...y hay un pero, bastante gordo... y es que tu array ya debe estar redimensionado y debe poder albergar todos los hallazgos que se encuentren, o generará error... obviamente esto conlleva a preguntar qué necesidad hay de hacer realmente esto, que no va a quedar en condiciones (no deja de ser un poco chapuza), y hace cuestionar lo más importante: ¿Para qué es necesario hacer esto?... porque seguramente existe una alternativa mucho más óptima y razonable, con la que no es posible contar al ignorar el propósito de para qué lo necesitas...

Existen los JaggedArray que pueden solucionar ciertos problemas con arrays multidimensionales donde cada dimensión puede tener diferente cantidad de elementos...

...de todos modos, ya que he perdido el tiempo en ello, lo pongo... aquí el código de la modificación... pero fíjate en las 2 importantes limitaciones de esta 'solución': No puedes redimensionar el array, y el número de elementos de la dimensión final, debe poder alojar todos los hallazgos, o bien añadir un parámetro adicional (como tiene VB), para señalar cuántos elementos desean consignarse en el array (en VB un valor de -1, indica que todos los que haya)... nuevamente queda a tu esfuerzo cualquier cambio que necesites...

Código
  1. ''' <summary>
  2.    ''' Entrecorta un texto, por un carácter que se busca y el resultado lo aloja en la dimensión de un array YA ESTABLECIDO.
  3.    ''' </summary>
  4.    ''' <param name="Bolsa">Un array ya dimensionado a un tamaño útil.</param>
  5.    ''' <param name="Dimension">El índice la dimensión donde se van a alojar.</param>
  6.    ''' <param name="Texto">El Texto origen del procesado</param>
  7.    ''' <param name="Delimitador">El carácter (ojo, no un texto), por el que se busca entrecortar.</param>
  8.    ''' <returns>El número de delimitadores hallados</returns>
  9.    ''' <remarks>Si delimitador se quiere que sea una cadena y no un texto, debe modificarse la búsqueda (el condicional dentro del bucle).</remarks>
  10.    Public Function Split(ByRef Bolsa(,) As String, ByVal Dimension As Integer, ByRef Texto As String, Optional ByRef Delimitador As String = " ") As Integer        
  11.        Dim ct1 As UInt32, ct2 As UInt32, k As UInt32, n As UInt32, d As Integer
  12.  
  13.        ' Buscar cuantas coincidencias se localizan...
  14.        While (k < Texto.Length)
  15.            If Texto.Chars(k) = Delimitador Then
  16.                ct1 += 1
  17.            End If
  18.            k += 1
  19.        End While
  20.  
  21.        ct2 = 0 : n = 0 ' a cero, por si se usaran antes...
  22.        If (ct1 > 0) Then ' si no se encontró, no recorremos de nuevo el texto...
  23.            k = 0
  24.            While (k < Texto.Length)
  25.                If Texto.Chars(k) = Delimitador Then
  26.                    Bolsa(Dimension, ct2) = Texto.Substring(n, k - n)
  27.                    ct2 += 1 : n = k + 1
  28.                End If
  29.                k += 1
  30.            End While
  31.        End If
  32.        ' queda la subcadena final, puede ser el texto original si no se encontró nada.
  33.        Bolsa(Dimension, ct2) = Texto.Substring(n, k - n)
  34.  
  35.        Return ct2
  36. End Function
  37.  

Puede sprobar ambas funciones, por ejemplo con esto:
Código
  1.        Dim s As String = "0-1---2-3-4-5-6-7-8-9-"  
  2.        ' otros textos de prueba:"0-1-2-3-4-5-6-7-8-9", "0123456789"
  3.        Dim cd() As String, sd(,) As String
  4.        Dim n As Integer
  5.  
  6.        cd = Strings.Split(s, "-") ' el split de VB, para tras su ejecución y verifica si éste resultado coincide con el que devuelve la función cuyo código se ha creado...
  7.        cd = Me.Split(s, "-")
  8.  
  9.        ReDim sd(0 To 2, 0 To 16)
  10.        n = Me.Split(sd, 1, s, "-")
  11.        n= n ' pon aquí un punto de parada (tecla F9) , y ejecuta hasta aquí, luego posa el ratón sobre 'sd' y baja a la flechita para ver el contenido del array con el intellisense
  12.  

Y bueno, si nos cuentas para que los quieres se puede analizar una solución más óptima y acorde...

Incluso usando la función Split de VB, una vez obtenido el array podrías copiar el contenido (sin un bucle), nuevamente mediante el uso de punteros a memoria... la función de las API CopyMemory, vale perfectamente para ello, pero con Marshalling (bajo NET), evitarás la problemática de las API con la memoria administrada y no administrada....

p.d.: después de todo lo dicho, espero que reconsideres la opción de usar el bucle para asignarlo en tu array, aunque sea usando copymemory si no quieres usar un bucle (internamente en ensamblador, así se hará. Te guste o no, el bucle es inevitable).
Páginas: 1 ... 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 [382] 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 ... 436
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines