Delphi copie de la Mémoire avec l'inscription à un autre Enregistrement
Je vais avoir des problème avec la logique. Je n'ai aucune idée de comment copier un enregistrement à un autre enregistrement dans Delphi.
TypeA = record
value1 : word;
value2 : word;
value3 : word;
end;
TypeB = record
b1 : byte;
b2 : byte;
end;
J'ai mes deux dossiers TypeA et TypeB. Pour exemple, j'ai découvert que les données dans TypeA enregistrement est appartiennent à TypeB enregistrements. Remarque: TypeA a plus de Longueur de Données.
Question: Comment puis-je copier TypeA de la mémoire et de la placer dans TypeB record?
CopyMemory(@TypeA, @TypeB, Length(TypeB))
Quand j'ai essayé CopyMemory et ai une erreur (Incompaible types).
PS: je ne veux pas de copie ou de l'affecter comme ci-dessous.
TypeB.b1 := TypeA.valeur1 && $FF;
TypeA et TypeB sont que des exemples, des enregistrements. La plupart des thecases, enregistrement TypeA et TypeB peut contenir plusieurs enregistrements et il
sera plus difficile de les attribuer forme TypeA et d'attribuer à la TypeB enregistrement.
Merci d'avance
----Outre la question:
Est-il un moyen de copier Delphi record de tableau d'Octets et comment? Si il y est,
- TypeA record de Tableau d'Octets
- Tableau d'octets de Type B
Sera cette logique de travail?
Merci pour votre commentaire. Je ne suis pas très bien moi-même comment obtenir de la logique aussi. J'ai eu droit à l'information est TypeA enregistrement de données appartenant à TypeB enregistrement de données. C'est mal placée. Je veux récupérer les données et les enregistrer dans TypeB.
Essayez
Move()
au lieu de CopyMemory()
par exemple: Move(TypeA, TypeB, SizeOf(TypeB));
Pourquoi? Les deux
MoveMemory
et CopyMemory
sont mis en œuvre comme Move(Source^, Destination^, Length);
Vous avez deux problèmes. Vous essayez d'obtenir l'adresse de types. Vous devez déclarer quelques variables. Et vous avez besoin d'utiliser sizeof plutôt que la longueur.
OriginalL'auteur sMah | 2012-02-23
Vous devez vous connecter pour publier un commentaire.
si
a
est de typeTypeA
etb
est de typeTypeB
.Il nécessite également un avertissement: si
TypeB
inclut tous les domaines de la gestion des types, c'est de jouer avec Delphi utiliser des compteurs et sera susceptible de provoquer une introuvableAV
.OriginalL'auteur Andreas Rejbrand
Variante dossiers:
OriginalL'auteur Martin James
ou (avec les Mathématiques de l'unité)
OriginalL'auteur Sean B. Durkin
pour copier Un dossier B dossier il ya une bonne façon - la surcharge d'opérateur; dans ce cas, vous pouvez simplement surcharge Implicite et Explicite des opérations et écrire du code comme
b := a
:vous pouvez utiliser TBytesStream de copie de tableau d'octets:
ou tout simplement de définir la taille du tableau d'octets à
sizeof(A)
et puiscopyMemory
OriginalL'auteur teran
Toutes les autres réponses sont les variations de la copie de la mémoire directement, mais je pense que c'est la mauvaise approche. Il est de bas niveau et que vous êtes en utilisant un langage de haut niveau, il est facile de faire des erreurs, et il est risqué si votre dossier contient les types de données gérés.
Si vous essayez d'obtenir les deux premiers octets de l'un des éléments d'un dossier, essayez d'utiliser un variante enregistrement (en C, une union.) C'est une section d'un dossier qui peut être abordé de plusieurs façons, et ici, vous voulez l'adresse, soit comme un mot ou d'une série d'octets.
Essayer quelque chose de ce genre (pas testé, juste de taper dans l'éditeur):
Alors pour le code:
Qu'est-ce vous donner c'est mieux que la copie de la mémoire?
case ... of
' la syntaxe pour ce qui est idiot, mais c'est une autre discussion... :))Quelques remarques:
Word
àSmallInt
depuis que j'ai trouverWord
confusion - ce n'est pas vraiment le mot "taille" de la machine, c'est sur 16 bits.packed record
", le justification pour ce qui est douteux... .Ils ne sont pas maintenant, mais ils étaient quand j'ai commencé à écrire ceci 🙂
OriginalL'auteur David
Vous pouvez omettre CopyMemory() (unité Windows) utilisation par:
OriginalL'auteur g2mk
DÉPLACER au lieu de CopyMemory si vous voulez simplement copier les octets d'un endroit à l'autre.
Et pour obtenir la taille d'un enregistrement utilisation de SizeOf au lieu de la Longueur.
MoveMemory
etCopyMemory
sont mis en œuvre commeMove(Source^, Destination^, Length);
MoveMemory()
etCopyMemory()
exiger laWindows
unité, qui est une plate-forme spécifique.Move()
est dans leSystem
unité et est disponible sur toutes les plateformes.OriginalL'auteur HeartWare