Página 1 de 1

Ascan = seek em matrizes?

Enviado: 27 Dez 2015 09:53
por rmlazzari
Um exemplo: tenho a seguinte matriz

casas{'c',1,2,'Pedro','Maria','.t.)
casas{'a',1,3,'João','Leda',.t.)
casas['s ',2,1,'Marcos','Josefa',.f.)
(...)
casas{'m',1,2,'Paulo','Marta',.f.}
casas{'b',3,2,'Marcos','Rosana',.t.}

Na primeira coluna tem um caracter que indica o tipo de moradia. casa, apartamento, sobrado, mansão, barraco etc.
Na segunda, a quantidade de rádios que a família tem
Na terceira, panelas
Na quarta e na quinta, nomes de cada cônjuge
Na sexta, se são casados ou não

Para saber o tipo de casa que tem 'Marcos' e 'Josefa"...

Se fosse um arquivo de dados seria fácil
index on <nome do 4o. campo> + <nome do quinto campo> to nomintx.ntx
seek 'Marcos' + Josefa'

Mas como se trata de uma matriz, estou fazendo:

for i = 1 to len(casas)
if casas[4] = 'Marcos' .and. casas[5] = 'Josefa'
tipo := casas[1]
exit
endi
next

ou

casal = 'MarcosJosefa'
for i = 1 to len(casas)
if casas[4]+casas[5] = casal
tipo = casas[1]
exit
endi
next

Ou seja, estou varrendo a matriz toda! Mas e se essa matriz, com o uso, acabar ficando muito grande?
Será que não há um outro modo, um ascan modificado, tipo aseek?

Ascan = seek em matrizes?

Enviado: 27 Dez 2015 10:39
por Toledo
Amigo, tente o seguinte:

Código: Selecionar todos

casal = 'MarcosJosefa'
i=ASCAN(casas,{|e| e[4]+e[5] == casal})
tipo = casas[i,1]
Abraços,

Ascan = seek em matrizes?

Enviado: 27 Dez 2015 17:22
por asimoes
Toledo,

Pra garantir que não vai dar erro:

Código: Selecionar todos

casal = 'MarcosJosefa'
i=ASCAN(casas,{|e| e[4]+e[5] == casal})
If I > 0
   tipo = casas[i,1]
Endif

Ascan = seek em matrizes?

Enviado: 27 Dez 2015 21:52
por Eolo
Se fosse um arquivo de dados seria fácil
Mas e se essa matriz, com o uso, acabar ficando muito grande?
A pergunta é sobre matrizes, então as respostas deveriam ser sobre matrizes. Mas vou voltar um passo atrás, fazer um comentário que não sei se tem algo a ver.

Pelo jeito, vc está armazenando dados em uma matriz, é isso?

Bom, eu posso estar errado, mas eu acho que matriz não é bem pra isso. Pode até funcionar, mas pra que armazenar dados em matriz, com todas suas limitações, se no Clipper tem o DBF com NTX/CDX/Seek etc? Com essas ferramentas, vc filtra os dados e simplesmente usa um DBEdit pra mostrar os resultados filtrados onde quiser.

Tem vários exemplos aqui no Forum, com a cláusula FOR no Index, com o SDX etc etc.
Se fosse um arquivo de dados seria fácil
index on <nome do 4o. campo> + <nome do quinto campo> to nomintx.ntx
seek 'Marcos' + Josefa'
Esse seek, com o “Marcos”+”Josefa”, me parece meio estranho. Se vc postou só como exemplo, tudo bem.

Mas se os campos 4 e 5 têm digamos 10 caracteres cada um e o índice contém “Marcos****Josefa****", com 20 caracteres, incluindo os espaços (representados por *), quando vc mandar procurar por “MarcosJosefa” (resultado da concatenação do seu exemplo, acima), o Seek não vai achar nada... Ainda, se o Marcos foi criado como "Marcos" e vc mandar procurar pelo "MARCOS", o seek vai dizer que não achou nada...

A conferir.

Ascan = seek em matrizes?

Enviado: 28 Dez 2015 12:31
por rmlazzari
Grato aos amigos! ASCAN() funciona que é uma beleza! Não sei se o CLD não depura o passo-a-passo do código de bolco ou se o Clipper o executa realmente "de uma só tacada". O fato é que, visto através do CLD, a rotina ficou infinitamente mais rápida. E fora do CLD, pode ser impressão minha, mas também parece ter ficado mais rápida. Uma coisa é certa: o programa está mais racional, usando uma "roda" já criada pelo Clipper, em vez de eu mesmo tentar "recriar a roda".

Quanto a levar os dados para a ram e trabalhar tudo por lá mesmo, é para evitar I/O de disco, tanto pela velocidade quanto para evitar "gastar" o disco... bobagens num tempo em que os HDs já são muito melhores do que os antigos, rs... O "sistema" que estou fazendo é para jogar Sudoku. Como disse pode ser bobagem mas fico com dó de mover a cabeça de leitura/gravação - e tudo o que isso demanda - só para gravar um unzinho (1) num arquivo .DBF. E vai que mais adiante a pessoa decida que naquele quadradinho não era 1 mas sim 2... Pronto: lá vai o sistema todo se mobilizar para regravar no disco apenas um doizinho, ou pior, um espaço em branco... Estou tentando fazer tudo na ram mesmo e, num ESC de cansaço ou vitória do usuário, levo todas as alterações para o disco de uma vez só.

Agora, quanto aos espaços em branco, estou usando ALLTRIM() o tempo todo, inclusive porque campo definido em DBF tem tamanho fixo mas em matriz, não.

Grato novamente e à disposição sempre.

Ascan = seek em matrizes?

Enviado: 28 Dez 2015 13:23
por asimoes
Lembrando que o limite para vetor em clipper é 4096 elementos.

Ascan = seek em matrizes?

Enviado: 28 Dez 2015 17:36
por JoséQuintas
Não lembro mais, mas tenho na cabeça que com Blinker isso aumenta um pouco, mas pouco mesmo, coisa talvez de 10%.