Ir al contenido


Foto

Problemas con string muy largo


  • Por favor identifícate para responder
7 respuestas en este tema

#1 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 08 julio 2014 - 07:10

En delphi7, con "Huge strings" activado en el proyecto, es decir, que string equivale a AnsiString que teoricamente tiene longitud ilimitada, me ocurre que un string que voy ampliando en un for no me pasa de 3338 caracteres... cuando llega a ese límite, los siguientes añadidos "se los come".



delphi
  1. function Ptos2Str(L: TList; Prec: integer = 4;
  2.         SinUltimo: boolean = false; EdSoloUno: boolean = false): string;
  3. var
  4.   i, p, np: integer;
  5.   x, y: double;
  6.   FormatoTmp: TFormatSettings;
  7. begin
  8.   GetLocaleFormatSettings( 0, FormatoTmp);
  9.   FormatoTmp.ThousandSeparator:= ',';
  10.   FormatoTmp.DecimalSeparator:=  '.';
  11.   p:= round(power(10,Prec));
  12.   np:= L.count;
  13.   if SinUltimo then dec(np);
  14.   if EdSoloUno then np:= 1;
  15.   for i:= 0 to np-1 do begin
  16.     x:= TGPoint(L[i]).x;
  17.     y:= TGPoint(L[i]).y;
  18.     if Prec>0 then begin
  19.       x:= round(x*p)/p;
  20.       y:= round(y*p)/p;
  21.     end;
  22.     result:= result + '('+FloatToStr(x, FormatoTmp)+','+FloatToStr(y, FormatoTmp)+') ';
  23.   end;
  24. end;



Como veis, quiero construir una cadena del estilo '(1,2) (1.33,4)...' muy larga, pero eso, que llega un punto en el que no crece más y no se ni porque ni como arreglarlo.

He probado a usar ansistring directamente, a hacer varios tipos de casts, pero nada, de aqui no paso... ¿ideas?
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 08 julio 2014 - 07:37

Hola Sergio

¿Y no has evaluado utilizar otros objetos, por ejemplo, un TStrings ?

Saludos
  • 0

#3 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 08 julio 2014 - 08:04

¿Ya probaste usar PChar y/o arreglos dinámicos?
Son algo más complicados para manejar, pero tienen una enorme cantidad de funciones y utilizando casting y punteros son muy poderosos. Según tengo entendido, casi no tienen limitaciones.

  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 08 julio 2014 - 08:22

Hasta donde tengo entendido y recuerdo, por defecto el tipo String es tratado como AnsiString, perteneciente a los Huge Strings.
Por otro lado, no es que sea infinito. Simplemente puede crecer hasta consumir toda la memoria disponible. Me cuesta creer que a los 3338 caracteres te hayas quedado sin memoria... sabiendo que cada caracter ocupa 1 byte, los 3338 bytes son 3,26KB.
Prueba primero estableciendo el tamaño final del string con SetLength y luego volcar los datos.

Saludos,
  • 0

#5 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 08 julio 2014 - 08:53

Dado que mis ejemplos podrían confundirte más.
Te paso este enlace, Sergio.
http://www.freepasca...ef/refsu16.html
es de Lazarus, pero compatible con Delphi.

Por otra parte,
¿probaste utilizar un procedimiento en vez de una función y obtener esa salida mediante el uso de una variable?
¿No será la variable destino la que corta la cadena de respuesta de la función?

Sin recurrir a la verificación de variables, etc. en modo depuración, te recomiendo que le agregues un ShowMessage con la longitud de la cadena que te da problema y luego otro con la asignación que usas (supongo que hay alguna).

stack y heap no son lo mismo. También deberías revisar las directivas de compilación, por las dudas.

Saludos
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 08 julio 2014 - 12:40

A priori no veo ningún problema en el código. ¿Como sabes que la cadena se amputa?

Prueba este código:


delphi
  1. function Huge: String;
  2. var
  3.   i, N: integer;
  4. begin
  5.   Result:= '';
  6.   N:= 40000;
  7.   for i:= 0 to N-1 do
  8.     Result:= Result + 'Hola, ';
  9.   N:= Length(Result);  // N toma el valor 240000 sin problemas...
  10. end;





Saludos
  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 09 julio 2014 - 01:48

Creo que ya tengo el problema localizado, que no resuelto: Primero, al hacer debug las cadenas largas se cortan en pantalla, eso me llevo pensar que se estaban recortando de manera rara pero no es así, la cadena al parecer si que crece, pero no se ve si monitoreas el contenido de la cadena con debug.

Por otro lado, esa cadena es pasada a un script de dws, y aquí está el mayor problema: la versión que uso de dws (para ejecutar scripts en pascal) y parece ser que es dws el que "recorta" la cadena que recibe por alguna limitación interna.

Como la cadena era usada para "dibujar" una curva en pantalla, y gráficamente solo aparecían los primeros 80 puntos, por eso encajaba lo que veia en el debug de que el texto no crecia con la salida gráfica... pero por en medio la cadena llegaba a contener todos los puntos.

Ahora mismo ando investigando el código de dws a ver sipudiese ampliar este límite, pero esta un poco complicado de entender.

Gracias a todos por el interes!
  • 0

#8 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 09 julio 2014 - 03:29

Chicos, he recompilado todo y zas, fuera problema....  :|

Supongo que es por algo de mezclar un EXE que llama a una DLL que usa un script en DWS, depuerar es una locura y muchas cosillas pueden fallar (DLLs que no se descargan de memoria y esas cosas), así que reinicio, recompilado de todo, y desapareció.... eso sí, me quedo con muchas ganas de saber lo que pasaba, masoca que es uno!
  • 0




IP.Board spam blocked by CleanTalk.