Página 1 de 2

Converter ARRAY para STRING

Enviado: 12 Ago 2016 11:11
por rcb2002
Olá pessoal!

Existe alguma forma (usandoMiniGUI Xtended) de converter um vetor aBinary com 25 bits (zeros e uns mesmo) em uma String, pra depois poder guardar num campo char de uma tabela qualquer... Sem ser usando FOR...NEXT?!

Muito Obrigado mais uma vez!

Ricardo César

Converter ARRAY para STRING

Enviado: 13 Ago 2016 11:57
por asimoes
Você já tem a rotina com o vetor pronta?
Tem como postar pra gente analisar?

O harbour possui funções de conversão:

L2bin() -> Converts a numeric value to a signed long binary integer (4 bytes).
I2Bin() -> Converts a numeric value to a signed short binary integer (2 bytes).
W2bin() -> Converts a numeric value to an unsigned short binary integer (2 bytes).

Converter ARRAY para STRING

Enviado: 13 Ago 2016 18:54
por rcb2002
Algo tipo assim... (é o que eu NÃO queria ter - mas o que está funcionando agora).

Código: Selecionar todos

FOR n = 1 TO 25
       cBinary += ALLTRIM( STR(aBinary[n]) )
NEXT

Converter ARRAY para STRING

Enviado: 14 Ago 2016 13:55
por Claudio Soto
En Harbour existe :

HB_VALTOSTR() /* converts any data type to STR Value */
HB_VALTOEXP() /* converts any data type to STR Expression */

Converter ARRAY para STRING

Enviado: 14 Ago 2016 19:53
por asimoes
Sem o uso de For..Next

AEval( aBinary, {|x| cBinary += HB_NTOS(x) } )

Converter ARRAY para STRING

Enviado: 14 Ago 2016 23:15
por JoséQuintas
A solução do Claudio Soto é mais interessante, porque vale pra qualquer coisa.

Código: Selecionar todos

hb_ValToExp( a ) == hb_ValToExp( b )

Converter ARRAY para STRING

Enviado: 15 Ago 2016 19:12
por rcb2002
Certo, compreendi. Mas como disse antes, só uso a MiniGUI Extended: essas funções que começam com HB_ funcionam também aqui (pensei que fossem só pra o Harbour)? Se funcionar, tem como indicar um exemplo dentro da minha realidade? Pq só agora me dei conta de que o código que postei ali em cima funciona em tese: na prática, não to conseguindo concatenar elementos de um vetor (e números, ainda por cima) como se fossem string... Travei aqui. A situação é mais ou menos a seguinte:

Imagina 10 tipos de sinais que podem sair por 10 portas diferentes: eu preciso montar uma matriz (10x10, no caso). Então eu tenho:

Código: Selecionar todos

dbHUM
Porta			Data			Hora			tipoSinal
1			11/07/2016	13:15:28		3
2			08/07/2016	13:15:28		9
4			05/07/2016	13:15:28		7
7			29/07/2016	13:15:28		6
3			17/07/2016	13:15:28		1
1			13/07/2016	13:15:28		1
4			12/07/2016	13:15:28		8
2			12/07/2016	13:15:28		2
O resultado desse trecho seria algo assim:

Código: Selecionar todos

Porta				Sinais
1				1010000000
2				0100000010
3				1000000000
4				0000001100
5				0000000000
6				0000000000
7				0000010000
8				0000000000
9				0000000000
10				0000000000
A solução que eu encontrei foi a seguinte - que me deixou na mão por causa da conversão vetor/string (dbHUM indexado por PORTA):

Código: Selecionar todos

			WHILE .....
				cBinary  := ""; AFILL( aBinary ,0 )
				DO WHILE ! dbHUM->(Eof()) .AND. (dbHUM->Porta) == cPorta
					aBinary[ dbHUM->TIPO ] := 1
					dbHUM->(DBSkip())
				ENDDO
				FOR n = 1 TO 25
					cBinary += aBinary[n]               //              -----> ISSO AQUI DÁ ERRO (com ou sem STR(), não funciona)!
				NEXT
				dbBIN->( DBAppend() )
				dbBIN->Porta	:= cPorta
				dbBIN->Sinais	:= cBinary
			ENDDO

Converter ARRAY para STRING

Enviado: 15 Ago 2016 19:56
por asimoes
Qual é o erro que dá?
Erro no vetor?
Tem como mostrar a mensagem de erro?

Converter ARRAY para STRING

Enviado: 15 Ago 2016 19:57
por asimoes
Esse array tem 25 elementos?
Tentou isolar o problema em um programa de teste harbour console?

Converter ARRAY para STRING

Enviado: 15 Ago 2016 20:08
por rcb2002
Eis o erro...:

Código: Selecionar todos

Application: \Jobs\MiniGUI\Signals\main.exe
Date: 15.08.2016 Time: 16:49:02
Time from start: 0 days 0 hours 0 mins 22 secs
Error BASE/1081 Argument error: +

Called from BUILDBINARY(679) 
Called from FILLBASE(638) 
Called from (b)MAIN(61) 
Called from _DOCONTROLEVENTPROCEDURE(1678) 
Called from EVENTS(1597) 
Called from DOMESSAGELOOP(0) 
Called from _ACTIVATEWINDOW(1395) 
Called from MAIN(40) 
R: Parece que não posso concatenar uma array[n]
R: Sim, o do exemplo só tem 10 elementos mas o real tem 25!
R: Infelizmente não sei usar o harbour console. Na verdade, não uso o harbour, uso a miniGUI. ´o)

Converter ARRAY para STRING

Enviado: 15 Ago 2016 20:26
por rcb2002
Bom... testei com o HB_VALTOEXP(). O resultado vem separado por vírgulas, entre chaves, mas acho q dá pra eu dar um jeito. Quintas, Simões, Claudio: Muito obrigado pelo apoio. Só fiquei me perguntando como é que essa demanda seria resolvida na época do "Clippão brabo" em DOS, com ? pra escrever em tela? A gente sempre achava uma saída com ele. Alguém certamente já deve ter se visto nessa situação... rs

Saudações!

Converter ARRAY para STRING

Enviado: 15 Ago 2016 21:02
por Toledo
Amigo, estou achando estranho esta linha:

Código: Selecionar todos

aBinary[ dbHUM->TIPO ] := 1
Qual o conteúdo de dbHUM->TIPO???

Mostre como está declarando (criando) a array aBinary.

Abraços,

Converter ARRAY para STRING

Enviado: 15 Ago 2016 21:17
por JoséQuintas
Na época do Clipper... seria complicado.
Não sei se Type() serviria, mas recursividade seria útil.

Código: Selecionar todos

Compara( a, b )

FUNCTION ComparaArray( a, b )

   IF Type( "a" ) <> Type( "b" )
      RETURN .F.
   ENDIF
   IF Type( "a" ) ==  "A"
      IF Len( a ) != Len( b )
        RETURN .F.
      ENDIF
   ELSE
       FOR nCont = 1 TO Len( a )
         IF .NOT. Compara( a[ 1 ], b[ 1 ]    
            RETURN .F.
       ENDIF
      NEXT
   ENDIF
   RETURN .T.

Converter ARRAY para STRING

Enviado: 15 Ago 2016 21:17
por asimoes
Boa Toledo,

Qual é o tipo de dbHUM->TIPO ? se for caracter pode ser o erro

Converter ARRAY para STRING

Enviado: 15 Ago 2016 21:20
por JoséQuintas
Não deu tempo de corrigir....rs

Código: Selecionar todos

Compara( a, b )

FUNCTION ComparaArray( a, b )

 IF Type( "a" ) <> Type( "b" )
   RETURN .F.
 ENDIF
 IF Type( "a" ) == "A"
   IF Len( a ) != Len( b )
    RETURN .F.
   ENDIF
   FOR nCont = 1 TO Len( a )
    IF .NOT. Compara( a[ 1 ], b[ 1 ]  
      RETURN .F.
   ENDIF
   NEXT
 ELSE
   RETURN a == b
 ENDIF
 RETURN .T.