Comando para guardar variaveis de memoria em uma matriz

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Comando para guardar variaveis de memoria em uma matriz

Mensagem por juniorcamilo »

Amigos... o Getlist guarda a variaveis que estao em gets, existe um comando para guardar as variaveis de memoria em uma matriz, sei que o comando 'save all like xxx to yyy' guarda as varaiveis de memoria em arquivo e o comando 'restore' recupera, mas para guardar em um matriz?
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Comando para guardar variaveis de memoria em uma matriz

Mensagem por Pablo César »

Oi Junior. O SAVE TO <arquivo_MEM> guarda apenas variáveis e não MATRIZES ou VETORES, não existe comando para isso. O que dá para fazer é convertir VETOR em variáveis, claro que dependendo da situação isto pode provocar saturação de memória, visto que iriam ser declaradas tantas variáveis quanto forem o número de elementos contiver cada matriz. No entanto você pode fazer como o MIRO faz, isto é, criando um arquivo texto, onde guarda cada valor de uma determinada matriz. Isto é utilizado para guardar as configurações de cores do sistema e na abertura do programa é lido esse arquivo com MEMOREAD e SUBSTRING por SUBTRING até compor a quantidade pre-definida e que será armazenado em MATRIZ.

A rotina de gravar em arquivo MEM, eu nunca usei e iria demandar fazer uma propria rotina recursiva para poder processar uma estrutura de vetores aninhados. Então aqui vai um exemplo de como guardar em arquivo TEXTO o conteúdo de um vetor unidimensional:

Código: Selecionar todos

// Este primeiro bloco é utilizado no início do sistema para LER o arquivo e passar para VETOR
CONTECOR := {}
IF FILE( "PROGRAMA.CFG" )
   VAR := MEMOREAD( "PROGRAMA.CFG" )
   FOR CONTAR = 1 TO 13
      AADD( CONTECOR, SUBS( VAR, ( CONTAR * 5 ) - 4, 5 ) )
   NEXT
ELSE
   CONTECOR := { "09/01","00/07","15/04","15/01","00/03","00/07","04/07","08/07","15/03","15/02","15/04","14/07","15/03" }
ENDIF

// A seguir é utilizado para a saída do sistema, que guardará o conteúdo do VETOR em arquivo texto
VAR := ""
FOR CONTAR = 1 TO 13
   VAR += CONTECOR[ CONTAR ]
NEXT
MEMOWRIT( "PROGRAMA.CFG", VAR )
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Uso este recurso, salvando o conteúdo de matrizes em arquivo texto. Realmente todo o conteúdo deve ser convertido para string. Mas só quero lembrar que não será possível converter qualquer tipo de dados. Me refiro aos blocos de códigos.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Comando para guardar variaveis de memoria em uma matriz

Mensagem por ANDRIL »

Qual seria a utilidade??? visto que uma matriz para conter as variáveis talvez ocuparia a mesma quantidade de memória (se for este o intuíto) a não ser que vc esteja com problema de quantidade de nome de variáveis declaradas... seria isso?

No caso de salvar os nomes de variáveis dentro de um array, crie um com 3 elementos no qual o 1o elemento seria o nome da variavel, o 2o elemento o conteudo, o 3o elemento o tipo ("CNLD"), para que ao recuperar a variável soubesse o tipo correto de quando foi salvas.

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Dependendo da forma como se programa, o uso de matrizes facilita muito o trabalho. Muito mais do que o uso de variáveis simples. Além disso, há uma economia substancial no uso da tabela de símbolos.

Mas guardar nomes de variáveis em matrizes é uma forma de trabalho que nunca vi. Realmente não consigo ver a utilidade disso. O que costumo salvar em arquivo são informações de configuração, que por si só nunca dependeriam de variáveis para existir. Se variáveis são mais fáceis por questão de nome, o comando #DEFINE resolve isso.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Comando para guardar variaveis de memoria em uma matriz

Mensagem por rochinha »

Amiguinho

Eu usei por muito tempo este codigo:

Código: Selecionar todos

#command SAVE GET TO <var> => PUBLIC <var> := M->GetList; M->GetList := {}
#command RESTORE GET FROM <var> => M->GetList := <var>
Só náo tenho um exemplo muito explicativo, somente este trecho de codigo:

Código: Selecionar todos

// Salva conteudo do ultimo conjunto de GETs e READ
SAVE GET TO ED_LISTA
// Cria nova entrada
M->RET_CAMPO := space(20)
@ 10,10 GET M->RET_CAMPO PICT "@!"
SET CURSOR ON
READ
SET CURSOR OFF
// Restaura conteudo de GETs salvos anteriormente
RESTORE GET FROM ED_LISTA
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Re: Comando para guardar variaveis de memoria em uma matriz

Mensagem por juniorcamilo »

o motivo foi que eu quero restaurar as variaveis contidas no arquivo criado pelo save like dentro de uma funcao elaborada que nao é a funcao main(), quando eu restauro as variaveis pelo comando restoure like dentro da funcao definida ele torna as variaveis restauradas privadas e nao publicas, ai sei la uma solucao penso eu era de restaurar estas variaveis para dentro d uma matriz e atribuilas a publica para que depois seja reconheciada no sistema todo... fui claro?
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Comando para guardar variaveis de memoria em uma matriz

Mensagem por ANDRIL »

O comando RESTORE FROM arquivo.mem ao recuperar as variáveis seus escopos ficam perdidos salvo se for utilizar em uma função/procedure de nível mais baixo que a que chamou o comando.

Neste caso, após o uso das variáveis tem que salvá-las novamente no arquivo.mem e chamar este arquivo nas regiões onde serão utilizadas novamente já que não ficam disponíveis globalmente.

Não teria como criá-las desde o inicio como PUBLIC???

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

juniorcamilo escreveu:uma solucao penso eu era de restaurar estas variaveis para dentro d uma matriz e atribuilas a publica
Serial algo horrível de se fazer. Mas você poderia usar uma matriz pública. não?
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Migao
Usuário Nível 1
Usuário Nível 1
Mensagens: 17
Registrado em: 28 Out 2011 17:39
Localização: São Paulo

Comando para guardar variaveis de memoria em uma matriz

Mensagem por Migao »

Só pra comentar, no XBase++ (Clipper 32 bits) tem algumas coisas muito interessantes :

- Não há limitação de tamanho de array.

- Vc consegue "puxar" as MEMVAR pra um ARRAY ! A função SymbolInfo() te retorna um array com a lista de Public e/ou Private e/ou Funções etc. Inclusive funções implícitas da linguagem. Seria como entrar no meio do comando SAVE TO e pegar o que ele está gravando....

- Vc também pode salvar um CodeBlock ou array em um campo memo. A função VAR2BIN converte qq coisa em binário. Inclusive OBJETOS ! Então vc pode salvar num campo MEMO (foxpro) as suas variáveis... Por exemplo vc pode salvar um Array enorme (que pode conter inclusive Code Blocks) pra dentro de um campo Memo ! Muito legal...

Mas é isso aew !
Migao
Usuário Nível 1
Usuário Nível 1
Mensagens: 17
Registrado em: 28 Out 2011 17:39
Localização: São Paulo

Comando para guardar variaveis de memoria em uma matriz

Mensagem por Migao »

Ah lembrei também de um uso legal pra essa função que joga as memvar num array :

Sempre uso um ErrorBlock customizado meu, próprio. Apresento uma tela padrão pro usuário (simplesmente falando que deu pau .. rs).

Por baixo eu formato um Email e mando pra mim mesmo.

Nesse email eu coleto o máximo de informações possível sobre o ambiente do erro. Então jogo um DUMP das MEMVAR com seus nomes e valores , pra facilitar a depuração. Faço o mesmo pros DBFs abertos e o conteudo dos campos de cada um.

E também um ScreenShot da tela (função ScreenStr da CaToolsIII que tb existe no XBase++). Outra função legal é EnvParam também da CaTools, que puxa as variaveis ambiente (SET PATH/etc)...

Ajuda MUITO na depuração !

Quando o usuário liga reclamando do problema, eu já tô com o email na mão sabendo qual foi o erro / etc etc.

Caso haja interesse no assunto eu posto uma amostra do email que formato aqui blz ?

T+
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Comando para guardar variaveis de memoria em uma matriz

Mensagem por Pablo César »

Se bem que pode ser gravado em arquivo texto qualquer variável, até mesmo vetores e pelo tempo que já transcreveu este tópico, possivelmente não precise de solução. Mas fica aqui outra dica que grava matrizes ou vetores em arquivos .MEM, leia este tópico, mesmo o exemplo ter sido apresentado em Harbour/HMG, o código pode-se adaptado para Clipper.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Migao
Usuário Nível 1
Usuário Nível 1
Mensagens: 17
Registrado em: 28 Out 2011 17:39
Localização: São Paulo

Comando para guardar variaveis de memoria em uma matriz

Mensagem por Migao »

Ah obrigado pelo retorno.

Eu uso XBase++ e nele temos funções extensivas para tratamento de Arrays.Uma delas é VAR2BIN (Variável para Binário).

Por exemplo :

Código: Selecionar todos

charbin:=Var2Bin(meuArray) // charbin fica sendo um char, daí vc pode dar um MEMOWRIT nele
// ou

STRFILE(charbin,"C:\TEMP\VAR.BIN") // STRing 2 File da CATOOLS
A função simétrica ao Var2Bin seria a Bin2Var.

Provavelmente no Harbour haja algo semelhante, ou até melhor.

Abraço !
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Comando para guardar variaveis de memoria em uma matriz

Mensagem por Pablo César »

Migao escreveu:Eu uso XBase++ e nele temos funções extensivas para tratamento de Arrays.Uma delas é VAR2BIN (Variável para Binário).
Ehhh a função VAR2BIN e BIN2VAR são poderosas funções. Seria bom se pudéssemos contar com os fontes para ver a sua composição. Visto que há diferenças de tipos de variáveis e para cada tipo tem uma forma de converter.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Marcelo Baliza
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 24 Nov 2012 10:33
Localização: Montes Claros/MG

Comando para guardar variaveis de memoria em uma matriz

Mensagem por Marcelo Baliza »

Eu uso o save all like....

guardo as variaveis em um arquivo do tipo .MEM

Depois e restauro.

Tem como listar todas as variaveis contidas no campo .MEM ?
Responder