StringsLongas e StringsCurtas. Como Defini-las?
Os Manuais De Delphi Descrevem Em Seus Tópicos o Segunite:
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.
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
Curtidas 0
Respostas
Rômulo Barros
02/01/2004
Caro amigo: Veja a diferença:
// 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:
// 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
Emilio.cini
02/01/2004
O objeto string tem 4 bytes pq é um ponteiro, todo ponteiro possui o tamanho de 4 bytes que indica seu local na memoria, ou se vc esta se referindo aos 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. Vc tbm pode alocar dinamicamente a memoria para um array de char. Para uma string curta vc pode usar a classe ShortString que suporta ate 256 caracteres.
GOSTEI 0
Marco Salles
02/01/2004
O objeto string tem 4 bytes pq é um ponteiro, todo ponteiro possui o tamanho de 4 bytes que indica seu local na memoria, ou se vc esta se referindo aos 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. Vc tbm pode alocar dinamicamente a memoria para um array de char. Para uma string curta vc pode usar a classe ShortString que suporta ate 256 caracteres.
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
Beppe
02/01/2004
Até a versão 7 do Delphi, nas opções padrão:
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:
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.
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