PDA

Ver la Versión Completa : Procedimiento completa de basura otras variables


Enan0
02-07-2007, 20:46:35
Hola Amigos ante todos Muchas gracias , aca ando un problemita!!
Tengo un procedimiento el cual completa con basura una variable de texto, de longitud definida, el problema es el siguiente. Luego de ejecutar dicho procedimiento, TODAS las variables que estubieran dentro del Procedimiento Padre/Abuelo, Son completados con basura.:confused:

lo solucione convirtiendolo en una Funcion, pero bueno dicho procedimiento ya estaba implementado. y no entiendo el porque de la destruccion de todas las variables.
el codigo



Procedure FillWithGarbageEmail(var pw: ShortString);
var
Len, i: Integer;
begin
Randomize;
Len:=Length(pw);
SetLength(pw,CPassEmailLen+1);//establece la nueva longitud
pw[CPassEmailLen+1]:=Char(Len);//en el final incluye cual es el length del texto original
for i:=Len+1 to CPassEmailLen do //luego de la longitud del string completa con basura
pw[i]:=Chr(Ord(pw[i-Len])+(i*7)+2);
end;

antrahxg
02-07-2007, 22:04:15
Yo no veo en realidad cual es el problema se supone que la variable pw que pasas como parametro es la que se llena con basura pero dices

Luego de ejecutar dicho procedimiento, TODAS las variables que estubieran dentro del Procedimiento Padre/Abuelo, Son completados con basura.

Yo no veo que otras variables pueden ser llenadas con basura, podrias especificarlo un poco mas.

Enan0
02-07-2007, 22:45:38
La verdad que no puedo.. eso es todo lo que hace.. y desgraciadamente Si lo hace.. para que lo vieras deberia tener que pasarte Todo el codigo fuente y como te inmaginaras no puedo hacer eso...
Ya se que es un procedimiento sencillo pero bueno..
Si me completa de basura el resto de las Variables..
:mad:

Mick
03-07-2007, 09:33:23
La verdad que no puedo.. eso es todo lo que hace.. y desgraciadamente Si lo hace.. para que lo vieras deberia tener que pasarte Todo el codigo fuente y como te inmaginaras no puedo hacer eso...
Ya se que es un procedimiento sencillo pero bueno..
Si me completa de basura el resto de las Variables..
:mad:

Si pides ayuda, lo minimo es dar la informacion necesaria para que se pueda resolver el problema. Si no puedes por problemas de licencias, no has venido al sitio adecuado, en ese caso contrata una empresa que te de soporte y repercute los costes a los clientes a los que venderas el programa.

Saludos

Enan0
03-07-2007, 13:05:00
Si pides ayuda, lo minimo es dar la informacion necesaria para que se pueda resolver el problema. Si no puedes por problemas de licencias, no has venido al sitio adecuado, en ese caso contrata una empresa que te de soporte y repercute los costes a los clientes a los que venderas el programa.

Saludos

Mick perdoname, pero creo que estoy pasando la funcion/procedimiento que produce el error, o acaso, pretendes que te suba 250 mb de codigos fuentes mas todos los paquetes que se requiere, y si, obvio que por licencias y otras cosas no puedo subir el codigo.

Pero bueno,
Disculpa o cerremos el tema

adfa
03-07-2007, 16:02:44
Hola Enan0, creo que la intención de Mick es ayudarte y no creo que la idea de el fueran muchos megas de código.

Hay cosas que no entiendo:
1) el Randomize, en ningun lugar del procedimiento llamas a la funcion Random (lo unico que hace ahi es liar a quien intente ayudar, pero tu tendras tus motivos).

2) porque usar el setlength, y cargar la posicion no es lo mismo hacer:
pw := pw + char(len);

3) el for me parece que debería de ser desde len+2

Pero si decis que el código esta bien, basta para mi
Lo que no me doy cuenta porque decis que te completa el resto de las variable con basura, al menos no deberia.

Saludos desde la otra orilla.

roman
03-07-2007, 17:21:24
Como ya te han dicho, no se trata de que subas todo el programa, pero deberías poner más empeño en establecer información que pueda servir para ayudarte. Por ejemplo, yo veo muy raro que uses SetLength para una variable de tipo ShortString ya que éstas, si bien son de longitud variable, ocupan un espacio fijo en memoria de 256 bytes, y desconozco qué puede suceder si pasas un valor mayor a SetLength. Como no has dicho de dónde sale la variable CPassEmailLen (es más, ni siquiera sabemos si es una variable o una constante) pues tampoco podemos saber si por ahí viene realmente el problema.

// Saludos

Enan0
05-07-2007, 11:11:59
Hola Roman.. bueno en ningun momento quise crear una disputa y mucho menos hacer algo de mala gana, sino ni posteaba, el tema es que una funcion tan sencilla que genere este tipo de error, me llamo mucho la atencion, Asique perdon POr el embrollo.
El tema es que no se que otro codigo puedo Subir, Ya que eso es lo que genera el error. Bueno tome unos Screen shoots, de que es lo que hace cuando ejecuta el procedimiento de la discordia, como veran en el Watch, se ven los errores en cuestion.

Antes que nada lo que hace esta funcion es completar con basura un string encriptado.
Lo que hace es establecer una longitd preestablecida.
pw[CPassEmailLen+1]:=Char(Len);

Aca lo que hace es. en el Final de String, Guarda Cual es la Longitud Real del String (Sin Basura), para luego porder obtener solo la informacion valida.
Bueno Comento el Porque del SetLength: en este caso se esta completando con basura el String de un password de una cuenta de mail, El length que se esta asignando, es mucho mayor que el Length valido de un password.
Entonces. Seteo el nuevo length, en la posiscion final, almaceno la Longitud Real del Password, y luego se completa desde la el Length del PSW, hasta el final.

espero que sea mas claro y dejo las Imagenes del error

http://img174.imageshack.us/my.php?image=captura005fm7.jpg
http://img179.imageshack.us/my.php?image=captura006pv6.jpg

Enan0
05-07-2007, 11:31:15
1) el Randomize, en ningun lugar del procedimiento llamas a la funcion Random (lo unico que hace ahi es liar a quien intente ayudar, pero tu tendras tus motivos).


Para serte sincero, yo tampoco se para que lo hace.. pero bueno. ahi estaba desde antes, lo he corrido con el Randomize comentado, y la parecer no produce ningun cambio, (por lo menos no es lo que genera el error), asique no le preste mayor importancia.


2) porque usar el setlength, y cargar la posicion no es lo mismo hacer:
pw := pw + char(len);

no, lo que pasaria ahi, es que Se inserta en el length +1, Ejemplo
(string orginal)

'ESTE ES MI STRING'

Si no me equivoco el length es 17, Si hago lo que vos decis seria!

'ESTE ES MI STRING17'
Y no podria completarlo con vasura!! ahora..
El "CPassEmailLen" Tiene una longitud de 50 Entonces Esto quedaria mas o menos asi.
'ESTE ES MI STRING (eL RESTDO DEL ESPACIO EN BLANCO) 17'


3) el for me parece que debería de ser desde len+2

Bueno a ver ahora.. lo que hace en el for es esto!!
'ESTE ES MI STRING(length 17) a partir del 18, basura hasta el 50' entonces
'ESTE ES MI STRING@#~~#¬€~#@€¬~€¬¬¬€¬sdfasdfasdfsd(hasta 50)17'

Entonces ya se sabe que desde la Pos 17 el resto es todo Verdura...

Bueno espero haber aclarado y perdon, Si se mal interpreto lo del tamaño y la informacion
(talvez estaba un poquito caliente.. con esto que me tenia mal.)

Enan0
05-07-2007, 11:33:38
PErdon Es BASURA y no VASURA , pero no me deja editar

adfa
05-07-2007, 15:36:16
no, lo que pasaria ahi, es que Se inserta en el length +1, Ejemplo
(string orginal)

'ESTE ES MI STRING'

Si no me equivoco el length es 17, Si hago lo que vos decis seria!

'ESTE ES MI STRING17'
Y no podria completarlo con basura!! ahora..

Bien, entendi la diferencia despues que aclaraste para que era el "CPassEmailLen", pero lo podes hacer sin el setlength igual haciendo:
pw := pw + dupestring(' ',CPassEmailLen-len)+char(len); //la funcion dupestring esta en la unit strutils


Y ahora entendi lo del for, el cual esta bien.:D
Para mi el único cambio bueno sería el no usar el setlength, proba eso que te puse arriba.

El randomize, fijate si en algun lugar del código se llama a la funcion random, si no es así no tiene sentido. El randomize inicializa el generador de numeros randomicos.

Saludos

gabrielkc
05-07-2007, 16:25:00
Me queda una duda, la variable AuxPsw está declarada de tipo TPassEmailString y tu la envias como parametro por referencia a un procedimiento que recibe un shortstring.

Si por alguna razon la clase TPassEmailString está mal implementada puede que cuando la pasas por referencia, el procedimiento invada posiciones de memoria que no le corresponden.

jeje, haber cala una cosa, declara la variable AcountID antes de cualquier otra variable, es una buena forma de probar que eso no es el error, como la declaras antes, quedaría seguramente en una posición de memoria anterior a la AuxPsw y no tendría porque modificarla, si sigue modificandola entonces al menos sabemos que no es eso

Enan0
05-07-2007, 16:39:13
No hay tal Clase TPASSEmailStirng.. es solo un const!
TPassEmailString = String[CPassEmailLen];
donde CPassEmailleng=50; Que es una tonteria que con usar
TPasEmailsTring=String[50] ya eta. pero bueno como se usa por otros lados (el CPAss....) esta declarado..
Lo mas extraño de todo es Que "solo hace en esta unidad" en el resto funciona Bien..,
Si te fijas he comentado una funcion (en linea superior al procedimiento) que es exactamente lo mismo, pero Funcion..
Y no da problemas..
Bueno como dije.. es muy extraño..

gabrielkc
05-07-2007, 16:50:12
haber, haber.

Para empezar
No hay tal Clase TPASSEmailStirng.. es solo un const!

Dices la frase como diciendo........... no seas tonto, como crees que va a haber tal clase.......... al menos así suena. Si no das información suficiente, no puedes quejarte de que uno no pueda ayudarte como tu quisieras. Recuerda que uno lo hace con la mejor intención e inviertimos 1 minuto de nuestro tiempo sin necesidad de hacerlo, así es que POR FAVOR, trata de ser cortéz


TPassEmailString=string[cPassEmailString];

En la imagen que posteas dice:
var
AuxPsw:TPassEmailString;

una constante..... creo que tengo un problema, yo pensaba que las constantes se declaraban difetente :eek: .

Ese tipo de errores SIEMPRE son culpa del programador. Si estás cerrado a las posibilidades, vas a dejar de aprender mucho.

Ahi te dejo mi propuesta, declara la variable AcountID antes de la AuxPsw declarada como TPassEmailString. y ejecuta el programa, perderías 30 segundos.......... pero es tu decisión obviamente

Enan0
05-07-2007, 17:37:20
Dices la frase como diciendo........... no seas tonto, como crees que va a haber tal clase..........


NOOO ni en pedo quise decir ESO.. solo comento que no hay tal Clase que es solo una Constante.. NADA MAS!! por favor no me mal interpretes que ya paso arriba y la verdad que en mi y en el tiempo que estoy en el foro.. jamas ah pasado esto.! asique no no!!!!

solo digo que no es eso.,. y perdon. esta delcarado como un Type..

Y sii obvio que hize la prueva que me dijiste..,
Tambien la declare (para probar) global al formulario.. y tambien como privada...

Y todo igual!

Tambien como comente.. lo solucione declarandolo como un Function!!

El tema del post.. es para ver si a alguien le ha pasado. y esas cosas. y tambien te agradezco por tu tiempo..
PD. el PROCEDIMIENTO luego lo llamo en otras unidades y no genera dicho error..
es muy "loco" lo que hace.

un saludo y muchas gracias por tu tiempo

gabrielkc
05-07-2007, 18:05:09
:D Perfecto.... problema solucionado... tema cerrado.

Que estes bien