2016-11-02 1 views
0

J'apprends QBasic et trouvé un code de type example défini par l'utilisateur dans une documentation. Dans cet exemple, il y a un élément de chaîne dans un type défini par l'utilisateur, et cette chaîne n'a pas de longueur définie.Comment déclarer un élément de chaîne any-range dans un type défini par l'utilisateur dans QBasic?

Cependant, mon compilateur lève l'exception "STRING attendu * sur ..." pour cet exemple. Cas de test définissant la longueur de la chaîne:

TYPE Person 
    name AS STRING * 4 
END TYPE 

DIM Matheus AS Person: 
Matheus.name = "Matheus": 

PRINT Matheus.name: 

Il enregistre "Math", attendu "Matheus". Est-il possible d'autoriser une plage pour cette chaîne?

Note: J'utilise le compilateur QB64

Répondre

2

Non, il n'y a pas un moyen d'utiliser une chaîne de longueur variable, même avec QB64. Vous pourriez regarder dans FreeBASIC si vous voulez cette fonctionnalité car elle l'offre.

TYPE crée un type d'enregistrement avec les champs spécifiés et les enregistrements ont une longueur fixe. Regardez la spécification OPEN ... FOR RANDOM:

OPEN Filename$ FOR RANDOM AS #1 [LEN = recordlength%] 
  • recordlength% est déterminée en obtenant la LEN d'une variable TYPE ou une déclaration FIELD.
  • Si aucune longueur d'enregistrement n'est utilisée dans l'instruction OPEN, la taille d'enregistrement par défaut est de 128 octets, sauf pour le dernier enregistrement.
  • Une longueur d'enregistrement ne peut pas dépasser 32767 ou une erreur se produit!

TYPE n'a jamais été destiné à contenir des chaînes qui sont de taille dynamique. Cela permet à un développeur de conserver une taille d'enregistrement réduite. Si vous aviez un carnet d'adresses, par exemple, vous ne voudriez pas que les noms des personnes soient trop grands, sinon le carnet d'adresses ne rentrerait pas dans la mémoire.

QB64 n'a pas supprimé cette restriction, probablement pour garder les choses compatibles avec un code QBASIC plus ancien puisque l'objectif initial était de préserver la compatibilité.

+1

Si vous comprenez comment les données sont structurées en mémoire, vous pourriez être en mesure de surcharger des données supplémentaires en BLOADANT les données à l'adresse du pointeur de la variable. Vous ne serez pas en mesure d'accéder à toutes les données par des moyens normaux, mais si vous pouvez suivre les pointeurs de variables surchargées dans un tableau, vous pouvez obtenir la limitation (sorte de). –