/ / Conversione di stringhe C in stringhe Pascal: c, string, pascal

Conversione di stringhe C in stringhe Pascal: c, string, pascal

Quando si converte una stringa C in una stringa Pascal,perché la lunghezza della stringa originale dovrebbe essere inferiore o uguale a 127 anziché a 256? Capisco che un int unsigned va da 0 a 256 e quello firmato va da -128 a 127, ma non è il primo carattere di una stringa Pascal senza segno?

risposte:

2 per risposta № 1

La stringa Pascal a cui si fa riferimento è probabilmente quella usata nei precedenti Pascal (chiamata ShortString ad es. Delphi e FreePascal, le implementazioni Pascal più popolari in questi giorni). Questo può contenere 255 caratteri a byte singolo (char in C). Non è necessario limitarlo a 127 caratteri.

Forse stavi pensando al fatto che 255i byte possono contenere solo 127 punti di codice UTF-16. Ma queste stringhe erano popolari nei vecchi giorni CP / M e DOS, quando nessuno sapeva ancora nulla di Unicode, e furono fatti per contenere ASCII o "ASCII Esteso" (8 bit, usando le code page).

Ma le implementazioni Pascal più moderne ti permettonoutilizzare stringhe fino a 2 GB di dimensione. Lì, l'indicatore della lunghezza non viene più memorizzato come primo elemento, ma solo vicino ai dati del testo. E in questi giorni, la maggior parte di queste stringhe può contenere anche Unicode, sia come UTF-16 che come utf-8, a seconda del tipo di stringa scelto (le moderne implementazioni Pascal hanno diverse diverso tipi di stringhe per scopi diversi, quindi non c'è più un solo "tipo stringa Pascal").

Alcune lingue hanno la capacità di limitare le dimensioni di a ShortString, come le cosiddette stringhe "contate":

var
s: string[18];

Quella stringa ha un massimo di 18 byte di dati di testo e 1 byte di lunghezza dati (all'indice 0). Tali stringhe più corte possono essere utilizzate, ad esempio, in record, così da non diventare troppo grandi.


1 per risposta № 2

Il wiki di FreePascal ha una grande pagina che mostra tutti i tipi di stringhe supportati da Pascal (almeno questa implementazione): http://wiki.freepascal.org/Character_and_string_types - include i tipi di stringa con lunghezza prefissata e con terminazione null. Nessuno dei tipi in quella pagina ha una restrizione di lunghezza di 127.

Il tipo di stringa a cui ti stai riferendo corrisponderebbe ShortString che ha un prefisso di un singolo byte, tuttavia la loro documentazione afferma che accetta 0-255.

Sono a conoscenza di un tipo di stringa che ha a lunghezza variabile integer prefisso, che limiterebbe la lunghezza della stringa a 127 caratteri se si desidera che la rappresentazione in memoria sia compatibile con ShortString, essendo 128 caratteri o più, si imposta il bit MSB 1 che in interi a lunghezza variabile significa che il numero intero è lungo almeno 2 byte anziché 1 byte.