Ir para conteúdo
Fórum Script Brasil
  • 0

Vetor Dinâmico


rodfraga

Pergunta

Fala galera...

Eu estou com um problema vejam só:

Eu tenho um vetor dinâmico(acho que esse é o termo). Acontece, que tenho uma função que o preenche automaticamente com muitos itens... O problema é que eu quero que aconteça uma coisa diferente quando o programa estiver adicionando o PRIMEIRO ITEM. Porém, eu já esperava que isso fosse ocorrer.

Eu pensei em

If Ubound(vetor) = LBound(vetor) Then

Mas antes mesmo de executar percebi que havia um erro...Se o vetor não tinha itens, creio que não tinha indice, ou seja, seria inutil procurar pelo ultimo ou primeiro indice se nem ao menos existem.

Eu gostaria de saber, como que eu sei que um vetor não tem conteudo ainda, para poder nesse primeiro caso, adicionar o conteudo e no resto fazer de forma padrão.

Abraços

Rodrigo

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Criei a seguinte função para isso:

Public Function EstáVazio(ByRef v())
    On Error Resume Next
    unk = UBound(v)
    If Err.Number = 9 Then
        vazio = True
    Else
        vazio = False
    End If
    On Error GoTo 0
    EstáVazio = vazio
End Function
Daí, faça o teste:
    Dim k()
    MsgBox EstáVazio(k)
    
    Dim j()
    ReDim j(0)
    MsgBox EstáVazio(j)

Confesso que a solução da função não é das mais elegantes, mas não achei outro meio.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Eita, valeu! Elegancia não é tudo...

Eu tava pensando em botar assim na função:

On Error Goto adicionaprimeiro
'Aqui o código da função
adicionaprimeiro:
If Err.Number = 9 Then
vetor(0) = eita(0)
Else
End If
Seria uma boa solução? E outra, num vetor dinamico, da pra adicionar o primeiro item, como fiz ali, e depois fazer assim:?
For i = LBound(eita) to UBound(eita)
If i = 0 Then
'não faz nada, já que tratando por erro, o primeiro item já foi adicionado, ou seja, precisa usar o indice 0.
Else
vetor(Ubound(vetor)+1).nome = eita(i)
End If
Next i-

não ligo muito no inicio para elegancia( tongue.gif ), mas sim para aprender.

*Acho que o Graymalkin já entendeu pra que eu quero isso... rolleyes.gif *

Obrigado ai,

Abraços

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0
Eita, valeu! Elegancia não é tudo...

Eu tava pensando em botar assim na função:

On Error Goto adicionaprimeiro
'Aqui o código da função
adicionaprimeiro:
If Err.Number = 9 Then
vetor(0) = eita(0)
Else
End If
Seria uma boa solução? E outra, num vetor dinamico, da pra adicionar o primeiro item, como fiz ali, e depois fazer assim:?
For i = LBound(eita) to UBound(eita)
If i = 0 Then
'não faz nada, já que tratando por erro, o primeiro item já foi adicionado, ou seja, precisa usar o indice 0.
Else
vetor(Ubound(vetor)+1).nome = eita(i)
End If
Next i-
não ligo muito no inicio para elegancia( tongue.gif ), mas sim para aprender. *Acho que o Graymalkin já entendeu pra que eu quero isso... rolleyes.gif * Obrigado ai, Abraços Rodrigo
Sim, também é uma solução possível (mas continua não elegante assim como a minha... hehehe... biggrin.gif ). Em relação a preencher o próximo elemento (usando UBound(vetor)+1) também dá pra fazer, porém você tem que redimensioná-lo antes (usando Redim). Exemplo:
n = Ubound(vetor)+1
Redim Preserve vetor(n)
vetor(n).nome = eita(i)

* Isso seria para guardar variáveis? unsure.gif *

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela dica...

Sim pra guardar variaveis!!!! biggrin.gif Claro que não é a melhor maneira, mas eu to tentando não consultar muito a XScript, pois se eu quero aprender, pra poder continua-la, não vou ficar copiando-a...

Link para o comentário
Compartilhar em outros sites

  • 0

Até a última vez que mexi na XScript, eu usava Collections para guardar as váriaveis e seus valores. Daí, percebi que usar vetores melhorava o desempenho e troquei tudo. Com as Collections não se tem esse tipo de problema (só não me lembro se fiz algo assim quando me deparei com esse problema).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Por curiosidade... O que voce diz ser "elegante"? tongue.gif... e o que faz da solução que eu mostrei deselegante? Como tornar alguma solução elegante?... Claro, eu entendo que provocar um erro, pra se aproveitar dele no programa não é nada muito, digamos... Correto, porém eu acho uma solução legal... laugh.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Por curiosidade... O que voce diz ser "elegante"? tongue.gif... e o que faz da solução que eu mostrei deselegante? Como tornar alguma solução elegante?... Claro, eu entendo que provocar um erro, pra se aproveitar dele no programa não é nada muito, digamos...  Correto, porém eu acho uma solução legal...  laugh.gif

Acho deselegante justamente o fato de gerar o erro para capturá-lo. Seria muito mais "elegante" se pudéssemos fazer assim:

if len(vetor)=0 then
  primeiro=true
endif
Ou se pelo menos UBound() e LBound() retornassem -1 (um indíce que não existe em um vetor). Daí, poderia se fazer:
if Ubound(vetor)=-1 then
  primeiro=true
endif
Ou ainda, (mas aí eu já estou querendo demais em relação a VB), se um vetor fosse tratado como um objeto e tivesse uma propriedade ou método que retornasse a quantidade de elementos. Daí, se poderia fazer (ah, isso é válido para o VB.NET):
if vetor.length=0 then
  primeiro=true
endif

Na minha opinião, tratamento de erros deveria ser usado apenas em situções onde um erro possa ocorrer em relação ao exterior da aplicação (ao tentar gravar um arquivo em disco, por exemplo, onde o disco pode estar cheio, o disquete pode não ter sido inserido ou estar fechado para gravação). Não acho que deveria ser usado para testar situações dentro da própria linguagem.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...