Fórum StringsLongas e StringsCurtas. Como Defini-las? #203879
02/01/2004
0
String Curto:Tem Caracter Dinámico De Comprimento Entre 1 e 255 etc...
String Longo: é um String De Comprimento Variável.etc...
A Dúvida Que Tenho é Quando se Usar e Porque se Usar Esses Dois Tipos De Definição Se Na Prática, Ao Definirmos Uma Variável Somente Mencionamos Que Ela é Do Tipo String.Não Mencionamos Mais Nada.Exemplo:
Var
NomeDaVariavel:String;
Porque Então Existe Esses Dois Tipos De Strings Que Os Manuais Se Referem.Como e Quando Se Define Essa Diferença,e Qual a Sinta-se Para Isto. Qual o Efeito Real Que Estes Dois Tipos De Definições Prorpociona.
Marco Salles
Curtir tópico
+ 0Posts
02/01/2004
Rômulo Barros
// Exemplo
Var Str1:Char[50]; Str2:String;
Str1=´bola´;
Str2=´bola´;
//Conclusão
A variável do tipo Char irá ter 50 bytes, independentes do total de letras adicionadas a ela. Já a variável do tipo String irá ter apenas 4 bytes. Quando vc defini uma variável do tipo string, apenas os espaços ocupados serão alocados em memória, já a variável do tipo Char sempre ocuparão todo o espaço que for indicado na sua declaração. :roll:
Gostei + 0
02/01/2004
Emilio.cini
Gostei + 0
02/01/2004
Marco Salles
Obrigados Amigos Pela Opiniões. Mas Me Parece Que Esta Havendo Um Certo Conflito.Sem Querer Medir Forças Na Primeira Resposta o Undeclared Identifier Diz:´A variável do tipo Char irá ter 50 bytes, independentes do total de letras adicionadas a ela..... ´ Já Na Opinião Do
Emilio.Cini Que Diz : ´Os 4 bytes obtidos por length é o tamanho do array de char contino no ojeto string, nao o tamanho da classe que deve possuir mais de 50 bytes no exemplo citado.´
Então Me Resta Ainda Algumas Dúvidas. Para Aprofundar Um Pouco Mais O Assunto , Qual a Diferença Das Tres Declarações Abaixo:
Var
Variavel1:String;
Varaiavel2:ShortString;
Variavel3:AnsiString;
Qual a Diferença Entre Definir a Variável Do Tipo String´Para a Definição Do Tipo AnsiString.
Gostei + 0
02/01/2004
Beppe
String equivale a AnsiString.
AnsiString é uma cadeia dinâmica de caracteres de 8 bits. A largura da cadeia é gerenciada em tempo de execução. Uma variável AnsiString na verdade é apenas um ponteiro para esta cadeia. Quando uma AnsiString é atribuída à outra, apenas a referência é copiada.
ShortString equivale a String[255].
String[capacidade] é uma cadeia de caracteres de tamanho fixo. A largura pode variar, mas não passa de [i:2cc81eb5e2]capacidade[/i:2cc81eb5e2] caracteres. Uma variável string de tamanho fixo representa a própria cadeia de caracteres. Quando é atribuída à outra, apenas a cadeia inteira é copiada.
SizeOf(ShortString) = SizeOf(Byte) + 255 = 256
SizeOf(AnsiString) = SizeOf(Pointer) = 4
Um número mais aproximado do tamanho tamanho de AnsiString´s(incluíndo referências) pode-se ser alcançado assim:
function MemoriaStringMerecida(const S: String; ContarRefs: Boolean): Integer; /// <summary> /// apenas para demonstração /// nenhuma pretensão de chegar à quantia exata /// quando S for uma constante /// </summary> /// <param="ContarRefs"> /// se ContarRefs = True, leva em conta a memória /// das variáveis que referênciam esta string /// </param> var RefsTotal: Integer; begin Result := (Length(S) + 15) and not 3 ; if ContarRefs then begin RefsTotal := PInteger(Integer(S) - 8)^; if RefsTotal = -1 then RefsTotal := 1; Inc(Result, RefsTotal * SizeOf(Pointer)); end; end;
Apesar de implementações e representações diferentes, a semântica é a mesma para ambos tipos de strings.
OBS: Para uso geral, AnsiString são preferidas.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)