GARANTIR DESCONTO

Fórum StringsLongas e StringsCurtas. Como Defini-las? #203879

02/01/2004

0

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.


Marco Salles

Marco Salles

Responder

Posts

02/01/2004

Rômulo Barros

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:


Responder

Gostei + 0

02/01/2004

Emilio.cini

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.


Responder

Gostei + 0

02/01/2004

Marco Salles

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.


Responder

Gostei + 0

02/01/2004

Beppe

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:
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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar