Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
Unhappy Que estoy haciendo mal en este proceso?

Que tal gente, queria saber porque no me compila este proceso, osea entiendo que es porque el arreglo requiere una constante como dimension pero le mando una constante . Ojala me ayuden.

Nota: no puedo poner un arreglo dinamico porque el File of necesita algo con un rango definido..

Este es el proceso:

Código SQL [-]
procedure PasarAArchivo(const Alto, Ancho: Integer);
type
  Arreglo = Array[0..Ancho,0..Alto] of integer;
var
  Map : Arreglo;
  FMap: File of Arreglo;
begin
  //bloque de instrucciones
end;

Aunque mas que obvios estos son los errores:
http://imagenes.sitiosnc.info/?di=2129961635110

Muchas Gracias.

Saludos, kdemia.

Última edición por kdemia fecha: 08-03-2011 a las 21:38:12.
Responder Con Cita
  #2  
Antiguo 08-03-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola kdemia.

La sintáxis de Delphi no permite el uso de variables o parámetros (aunque sean pasados como constantes) en la declaración de tipo de un array estático.

Incorrecto:
Código Delphi [-]
procedure PasarAArchivo(const Alto, Ancho: Integer);
type
  Arreglo = Array[0..Ancho, 0..Alto] of integer;
La declaración de const en los parámetros es a fin de que el procedimiento o función no pueda alterar los valores de los mismos y también para que el compilador pueda optimizar el transpaso de parámetros (cuando el tamaño de estos supere los 4 bytes ya que evita la copia local de los mismos).

En cambio si es correcto:
Código Delphi [-]
procedure PasarAArchivo(const Alto, Ancho: Integer);
const
  X = 100;
  Y = 100;
type
  Arreglo = Array[0..X, 0..Y] of integer;

Quizá si explicaras que es lo que intentas hacer, encontremos una solución alternativa.
(Por favor tratá de poner títulos más descriptivos del problema, así quien pase por una situación similar podrá encontrar respuesta más
rapidamente.)

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 08-03-2011 a las 22:20:11.
Responder Con Cita
  #3  
Antiguo 08-03-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
bueno lo que quiero hacer es lo siguiente:
yo cargo un TStringList con un archivo de texto que representa un mapa, ese TStringList lo tengo que pasar a un Array para luego guardarlo en un archivo ese array (File of Arreglo),y en otro archivo las dimensiones del arreglo asi despues lo puedo abrir sabiendo las dimensiones.. el problema es que no puedo guardar un array dinamico en un archivo porque delphi no lo permite, si hay alguna manera de definir las dimensiones de un array estatico en tiempo de ejecucion, hacer eso seria lo ideal..
Responder Con Cita
  #4  
Antiguo 08-03-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola kdemia.

Cita:
si hay alguna manera de definir las dimensiones de un array estatico en tiempo de ejecucion, hacer eso seria lo ideal..
Es que si se pudiese hacer eso, los arrays estáticos dejarían de ser estáticos y por ende, ya no tendría sentido la existencia de los arrays dinámicos.

Segun lo veo yo, vas a tener que definir un arreglo lo suficientemente grande como para contener el maximo de ocurrencias factibles si queres guardarlo como archivo tipado.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 08-03-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
no totalmente que dejarian de tener gracia los arreglos dinamicos pero no fue lo que quice decir, osea no quiero cambiarle el tamaño al array en tiempo de ejecucion simplemente quiero definirle el tamaño en el momento de la declaracion.. pero bueno tendre que rebuscarmela por otro lado.. muchisimas gracias por todo
Responder Con Cita
  #6  
Antiguo 08-03-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Puedes modificar las dimensiones de un arreglo dinámico con la función SetLength.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #7  
Antiguo 08-03-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
totalmente, pero no lo puedo guardar en un archivo :/ File of array_dinamico no se puede hacer
Responder Con Cita
  #8  
Antiguo 08-03-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por kdemia Ver Mensaje
totalmente, pero no lo puedo guardar en un archivo :/ File of array_dinamico no se puede hacer
Sinceramente nunca había escuchado eso de File of... Te compila esa línea?
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #9  
Antiguo 09-03-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
si es para manejar archivos.. osea en vez de usar base de datos asi automaticas como mysql y esas cosas uso archivos..
Responder Con Cita
  #10  
Antiguo 09-03-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por kdemia Ver Mensaje
si es para manejar archivos.. osea en vez de usar base de datos asi automaticas como mysql y esas cosas uso archivos..
Hola kdemia.

Precisamente por el archivo tipado (File of) que te limita al uso estático, es que me parece que la solución es dimensionar el array lo suficientemente grande para contener las máximas cotas posibles. Pero claro, en varios casos se va a desperdiciar espacio.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 09-03-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Acabo de leer un poco en delphi.about sobre esta declaración File of, que sinceramente desconocía. Según leí, puedes utilizar File of con arreglos dinámicos.

El problema que veo es que quieres definir una nueva clase que sería nada más que un arreglo dinámico. Esto no se puede hacer. Lo que debes hacer es crear el arreglo dinámico como variable (al igual que otro cualquier arreglo dinámico) y luego asignarle su longitud con la rutina SetLength. Deduzco, que no es necesario utilizar SetLength cuando estés abriendo un archivo, sino sólo para guardarlo. Más o menos creo que sería así:
Código Delphi [-]
procedure PasarAArchivo(const Alto, Ancho: Integer);
var
    Arreglo: Array of array of Integer;
    OIFile: File of Array of array of Integer;
    I: Integer;
begin
    // definir las longitudes bidimencionales de Arreglo
    SetLength(Arreglo, Alto, Ancho);

    // rellenar los datos de Arreglo ....
    // .....

    // guardar el arreglo en un archivo.
    try
        AssingFile(IOFile, 'archivo_a_guardar.dat');
        Rewrite(IOFile);
        for I := 0 to Max(Arreglo) do
            Write(IOFile, Arreglo[i]);
    finally
        CloseFile(IOFile);
    end;
end;

Creo que también deberías considerar utilizar registros en lugar de arreglos polidimencionales. Los registros son más fáciles de leer y entenderse para el programador.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #12  
Antiguo 09-03-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Chris.

Hasta donde sé, desde Pascal 5.5 hasta Delphi 7 incluido, no permiten usar arreglos dinámicos en archivos tipeados.
Dado que los archivos con tipo, son archivos de acceso directo, no creo que sus registros pudieran tener diferentes tamaños.

Con el código que adjuntas (usando Delphi 7) en la línea donde se declara el archivo con tipo, obtengo el siguiente error de compilacion:
Cita:
Type 'dynamic array' needs finalization - not allowed in file type.
Lo que ciertamente ignoro, si esto es así para las versiones posteriores de Delphi.

También coincido con vos que es mucho más sencillo y práctico utilizar registros en lugar de arreglos multi-dimensionales.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 09-03-2011 a las 20:00:35.
Responder Con Cita
  #13  
Antiguo 09-03-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Hola ecfisa!

Gracias por la aclaración. Creo que mi ignoracia al respecto de File of se ha notado . Entonces no se me ocurre otra cosa, a menos que talvez se pueda simplemente utilizar la declaración File of Array of Integer para la variable IOFile y verificar que con eso los datos se guarden correctamente.

Pero bueno, talvez la declaración:
Código Delphi [-]
type
  Arreglo = Array[0..Ancho, 0..Alto] of integer;
en registros se puede traducir como:
Código Delphi [-]
type
    Arreglo = record
        ArregloInterno: array of integer;
    end;
y de ahí utilizarla a cómo el compañero había querido hacerlo.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #14  
Antiguo 10-03-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
Chris me sigue tirando el mismo error, lo que pasa es que un archivo necesita saber cuando espacio se tiene que reservar antes de procesar por eso no deja poner un array dinamico... por eso lo que yo quice hacer es mandar las dimensiones a un proceso donde definia el array con esas dimensiones.. pero no se puede, yo una vez en visual basic lo hice y funciono, pero por lo visto no delphi no lo permite, y prefiero delphi a visual basic asi que no se cambia el lenguaje :P

ecfisa tu solucion del arreglo gigante es una solucion valida, pero como bien dijiste voy a desperdiciar muchas veces espacios, y dado que los arreglos llegan a contener muchisimos numeros seria un desperdicio de espacio en aquellos arreglos donde tenga que guadar pocos numeros.

el tema es asi, a mi me viene un documento de texto supongamos:
111111111
100000001
100000001
100000001
111111111
que es un mapa de un juego no? donde cada numero implica un tile, el tema que por cada numero yo lo tengo que desarmar en una matriz de 20 x 20(porque cada tile lo desarmo en pixeles por razones especiales), armar esa gran matriz, es decir pasar cada numero a 20*20 numeros, ya esta hecho, lo que se me complica es, como guardo ese gran arreglo dinamico en un archivo(no hay drama en guardarlos en una estructura uni dimensional ya que ya tengo resuelto como convertirla en matriz), sin ser guardado numero a numero, porque muchos me diran: hace un file of integer y guarda el arreglo celda a celda, pero al momento de leer el archivo tardo una banda ya que el acceso a rigido es muy lento.. si a alguien se le ocurre como puedo guardar toda esa informacion en un archivo, solamente usando una estructura le estoy infinitamente agradecido...

NOTA: esa matriz que mande como ejemplo es de 9*5 no? entonces la matriz de pixeles quedaria: 180*100, es decir guardado en un arreglo (de una dimension) tendria 18000 celdas..

Última edición por kdemia fecha: 10-03-2011 a las 15:47:59.
Responder Con Cita
  #15  
Antiguo 11-03-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola kdemia.

Si tenés en mente utilizar un archivo con tipo no veo otra posibilidad que declarar la matríz lo suficientemente grande para contener el caso mayor.
Los archivos con tipo, como bién dice su nombre trabajan con un tipo determinado (record, char, array, etc). Los datos se guardan en un registro dentro de un archivo congruentemente a su formato en memoria.
El tamaño de estos debe ser fijo ya que se accede a ellos mediante un índice que referencia al registro directamente a su posicion en el archivo ( de allí su denominación 'acceso directo o aleatorio' ).
Si cada registro tuviera un tamaño indeterminado, el solapamiento de datos sería inevitable.

Una cosa que podrías probar, es utilizar un TClientDataSet en memoria para guardar el arreglo celda a celda. Sólo tendrías un retardo en la carga de los datos al iniciarse la aplicación, luego residirían en memoria.
O quizá, replantear la forma de representar los píxeles, pero bueno para opinar sobre eso tendríamos que ver un poco mas...

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 11-03-2011 a las 15:33:42.
Responder Con Cita
  #16  
Antiguo 11-03-2011
kdemia kdemia is offline
Miembro
 
Registrado: may 2010
Posts: 109
Poder: 14
kdemia Va por buen camino
el tema del clientdataset es que casi que se desconoce el numero de mapas que hay, cuando se quiere cambiar de mapa hay una serie de puntos que cuando te posicionas ahi cargaria a otro mapa, evidentemente me voy a tener que buscar otra manera de "encriptar" el mapa de texto.. sino cada vez que cargue un mapa (pensando en la opcion del arreglo dinamico con el file of integer) es cada vez que se leen del archivo los numeros lanzo un splash screen con un texto como "cargando mapa", es la unica que se me ocurre..

Igualmente muchas gracias a los dos por interesarce..

Saludos.
Responder Con Cita
  #17  
Antiguo 16-11-2011
pofi pofi is offline
Registrado
NULL
 
Registrado: abr 2011
Posts: 1
Poder: 0
pofi Va por buen camino
Salvar dynamic Arrays en File

me he encontrado con el mismo problema, en mi caso al definir MyFile= file of String.
el problema viene siendo el mismo, los archivos (file) necesitan finalizacion.

se me ha ocurrido una solucion para guardar este tipo de datos siempre que los datos puedan ser interpretados como una cadena de caracteres (String o AnsiString) usando la propiedad de TStringList.SaveToFile y el formato de archivo '.csv' (datos separados por comas), se puede hacer algo asi:
Código SQL [-]
Procedure PassarArchivo(Arreglo: Array of Array of Integer; Alto, Ancho: Integer);
Var    
  i,j: integer;
  Fila: String; // o AnsiString si se necesita mas espacio, aunque todo tiene un limite;
  Tabla: TStringList;
Begin
   Tabla:=TStringList.Create;
   For i:=0 to Alto do
   begin
      Fila:= ''; // Vaciar Fila
      For j:=0 to Ancho do
         Fila:= Fila+IntToStr(Arreglo[i,j])+';'; // no olvidarse del ';' que separa los valores
     Tabla.add(Filla) // usando la funcion add, no hace falta definir la magnitud
   end;
   Tabla.SaveToFile('direccion\nombreArchivo.csv');
   Tabla.Destroy; //libera la memoria
end;

**El formato de archivo *.csv tiene la ventaja de poder-se abrir desde Excel.

Desgraciadamente esta solucion no sirve en mi caso porque los datos que quiero guardar son mas complejos, asi que sigan pensando en otra solucion. gracias
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Que estoy haciendo mal ? piolillo Internet 8 28-07-2011 17:23:24
Que estoy haciendo mal con este trigger @-Soft Firebird e Interbase 6 25-01-2011 02:37:35
Uso de clases, ¿que estoy haciendo mal? gerardorom C++ Builder 2 26-12-2007 15:35:38
Que estoy haciendo Mal esimon SQL 4 04-07-2006 21:55:25
Que estoy Haciendo mal jostrix PHP 1 01-11-2004 01:29:16


La franja horaria es GMT +2. Ahora son las 15:30:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi