PDA

Ver la Versión Completa : EAccessViolation al asignar valores a un array


jularaXD
13-05-2013, 22:01:29
Buenass

Tengo un problema que no entiendo muy bien porque ocurre, pero creo que no es culpa mia...
El problema me lo da este fragmento de código:

procedure crearmatrizjuego;
var
z,x,c:integer;
begin
c:=1;
x:=0;
z:=0;
while z<16 do
begin
z:=z+1;
while x<4 do
begin
x:=x+1;
fjuego.mjugadores[c,1]:=z; //Esta línea
fjuego.mjugadores[c,2]:=x; //Y esta
c:=1+c;
end;
x:=0;

end;
end;


Cuando llamo a este procedure me salta el siguiente error: Project parchis.exe reaised exception class EAccessViolation with message 'Access violation at adress 0041D6B7 in module 'parchis.exe'. Read of adress 0000000F' Process stoped.

El problema esta en la variable "c" para asignar el número de fila de la matriz, ya que he ido sustituyendo las variables por numeros y allí he encontrado el fallo. Pero porque me da ese error?


PD: Otra preguntita que tengo, es que cuando creo procedures manualmente, que los uso para llamarlos por ejemplo desde un boton, tengo que asignar siempre el formulario con el que estoy trabajando, por ejemplo, si quiero cambiar el texto de un panel, en vez de poner panel1.caption:= me obliga a escribir form1.panel1.caption:=.
Hay alguna manera de decirle que todo lo de ese procedure esta en el form1?


Saludos y gracias de antemano!!

ecfisa
13-05-2013, 22:16:47
Hola jularaXD.

Con seguridad no has creado una instancia de fjuego antes de usarla en la función crearmatrizjuego.

Algo como:

var
FJuego : TFJuego; // (o como se llame tu clase)
begin
fjuego := TFjuego.Create;
crearmatrizjuego;
...


Saludos. :)

jularaXD
13-05-2013, 22:19:41
El procedimiento lo llamo desde un boton del fjuego, y si cambio las variables por numeros entonces si funciona perfectamente, asi que supongo que ese form ya esta creado, no?

ecfisa
13-05-2013, 22:42:26
El procedimiento lo llamo desde un boton del fjuego, y si cambio las variables por numeros entonces si funciona perfectamente, asi que supongo que ese form ya esta creado, no?
Hola.

Obviamente que si fjuego es el form y estas llamando al procedimiento dentro de él ya está creado, al igual que mjugadores si es atributo del mismo. Pero sin ver las declaraciónes en tu código, era imposible saber a que clase pertenecía el objeto fjuego.

¿ Cuál es la declaración del arreglo bidimensional ? Veo que no estas controlando el valor final de la variable c dentro del while anidado y bién podría exeder el valor máximo declarado en él.

Saludos.

jularaXD
13-05-2013, 23:55:08
A ver si he entendido lo que me pides xD

La array mjugadores la declaro en private de esta manera

private
mjugadores:array[1..16,1..2] of integer;

Lo que quiero hacer es que me cree esta array:

[1, 1]
[1, 2]
[1, 3]
[1, 4]
[2, 1]
[2, 2]
[2, 3]
[2, 4]
[3, 1]
[.. ..]
[.. ..]
[4, 4]

También he intentado limitar el valor de C y me sigue dando el mismo error.

salu2

jularaXD
14-05-2013, 00:08:06
Ei, me acabo de enterar que no falla al crear la array, sino luego al leerla o al cerrar la aplicacion.
Subo este proyecto que se puede ver perfectamente el error.


saludos!

jularaXD
14-05-2013, 00:43:29
Ya esta, he conseguido solucionar el problema.
Había escrito mal el codigo, puesto que una matriz que tenía tan solo 16 filas, y el bucle le ponía valores hasta la fila 64 o algo asi...

Bueno, muchas gracias por tu tiempo ecfisa y disculpa si no me he explicado correctamente en algun momento ;)

ecfisa
14-05-2013, 00:56:51
La array mjugadores la declaro en private de esta manera

Lo que quiero hacer es que me cree esta array:

[1, 1]
[1, 2]
[1, 3]
[1, 4]
[2, 1]
[2, 2]
[2, 3]
[2, 4]
[3, 1]
[.. ..]
[.. ..]
[4, 4]

...

Correcto, entiendo esa parte, pero ¿ Podrías poner el ejemplo de la sucesión de valores que deseas asignar en cada posición de la matriz ?

Es decir:

[1,1] = 0
[1,2] = 1
...
[n,m] = x


Saludos.

ecfisa
14-05-2013, 01:58:44
Ya esta, he conseguido solucionar el problema.
Había escrito mal el codigo, puesto que una matriz que tenía tan solo 16 filas, y el bucle le ponía valores hasta la fila 64 o algo asi...

A eso me refería con el valor que alcanzaba la variable c, me alegro que lo solucionaras :)

No había visto tu último mensaje, y te consultaba sobre los valores que había que asignar a la matriz, por que generalmente es mas simple cargar la matriz con dos for, por ejemplo:

var
c,f: Integer;
begin
for c:= 1 to 2 do
for f:= 1 to 16 do
mjugadores[f,c] := ...


Saludos. :)

ozsWizzard
14-05-2013, 13:06:46
pero creo que no es culpa mia...

Un consejo, esta forma de pensar suele llevar a que sea muy difícil encontrar los errores, en mucho más de un 90% de ocasiones, la culpa es del programador, ya sea por algo que ha hecho mal o por algo que no ha entendido bien o lo que sea. De hecho, incluso alguna veces que se cree que es un bug del IDE, es error del programador pero que no ha sido capaz de interpretar bien el error.

Mi consejo es que pienses, de primeras, que el error es casi seguro tuyo.



PD: Otra preguntita que tengo, es que cuando creo procedures manualmente, que los uso para llamarlos por ejemplo desde un boton, tengo que asignar siempre el formulario con el que estoy trabajando, por ejemplo, si quiero cambiar el texto de un panel, en vez de poner panel1.caption:= me obliga a escribir form1.panel1.caption:=.
Hay alguna manera de decirle que todo lo de ese procedure esta en el form1?


Saludos y gracias de antemano!!


Para que un procedimiento sea del formulario, no basta con que esté en la misma unidad, deberías declarar el procedimiento de esta forma


procedure Tfjuego.crearmatrizjuego;
var
z,x,c:integer;
begin
c:=1;
x:=0;
z:=0;
while z<16 do
begin
z:=z+1;
while x<4 do
begin
x:=x+1;
mjugadores[c,1]:=z; //Esta línea
mjugadores[c,2]:=x; //Y esta
c:=1+c;
end;
x:=0;

end;
end;


Si te fijas, ya no tengo que poner el nombre del formulario cuando se usa mjugadores. De esta forma, además, te sirve para cualquier variable y no sólo la variable fjuego.

ozsWizzard
14-05-2013, 13:09:31
He simplificado mucho me temo.

La declaración del procedimiento ha de ir dentro de la sección public (o private, según de donde se llame) del formulario. (hablo de las secciones que viene por defecto)