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?
Moderador: Moderadores
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Ascan = seek em matrizes?
Amigo, tente o seguinte:
Abraços,
Código: Selecionar todos
casal = 'MarcosJosefa'
i=ASCAN(casas,{|e| e[4]+e[5] == casal})
tipo = casas[i,1]Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Ascan = seek em matrizes?
Toledo,
Pra garantir que não vai dar erro:
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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Ascan = seek em matrizes?
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.Se fosse um arquivo de dados seria fácil
Mas e se essa matriz, com o uso, acabar ficando muito grande?
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.
Esse seek, com o “Marcos”+”Josefa”, me parece meio estranho. Se vc postou só como exemplo, tudo bem.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 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?
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.
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?
Lembrando que o limite para vetor em clipper é 4096 elementos.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Ascan = seek em matrizes?
Não lembro mais, mas tenho na cabeça que com Blinker isso aumenta um pouco, mas pouco mesmo, coisa talvez de 10%.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/

