Tipuri de array.
bun venit
# xA0; Întrebarea este:
# xA0; Aici este tipul meu:
# xA0; TByteArray = șir de octeți;
# xA0; Și funcțiile:
№1
procedura TForm1.SomeFunc (var A: TByteArray);
începe
# xA0; SetLength (A, 20);
se încheie;
procedura TForm1.SomeFunc2;
var
# xA0; A: matrice de octeți;
începe
# xA0; SomeFunc (A);
se încheie;
Compilatorul jură:
[Error] Unit1.pas (38): Tipurile parametrilor var și formal trebuie să fie identici
№2
procedura TForm1.SomeFunc (var A: matricea byte);
începe
# xA0; SetLength (A, 20);
se încheie;
ce:
[Error] Unit1.pas (31): Tipuri incompatibile
O întrebare despre cum să provoace funcția SomeFunc (A); de la exemplul numărul 1. Și să declare
A: TByteArray; este imposibil.
Și o altă întrebare este de ce nu puteți apela SetLength pe o serie de Byte
Există mai multe scheme pentru a determina dacă tipurile de două obiecte sunt echivalente. Cele două scheme utilizate cel mai frecvent sunt echivalența structurală a tipurilor și echivalența nominală a tipurilor. În conformitate cu schema de echivalență structurală a tipurilor, două obiecte sunt echivalente numai dacă structura tipurilor lor este aceeași. În conformitate cu schema de echivalență nominală, două obiecte sunt echivalente dacă definițiile lor utilizează un nume de un singur tip.
Obiectul Pascal acceptă o echivalență nominală.
Prin urmare:
> Și anunță
> A: TByteArray; este imposibil.
Nu este imposibil, ci necesar.
> Și o altă întrebare este de ce nu puteți apela SetLength pe o matrice
> gama Byte
Și unde ai făcut asta, nu poți? Poți!
> Și o altă întrebare este de ce nu puteți apela SetLength pe o matrice
> gama Byte
procedura TForm1.SomeFunc2;
var
A: o mulțime de octeți;
începe
SomeFunc (TByteArray (A));
se încheie;
Am încercat. Doar un exemplu nu este foarte corect.
Iată situația pe care o am:
procedura TForm1.SomeFunc (A: matricea byte);
începe
# xA0; SomFunc (TByteArray (A));
se încheie;
procedura TForm1.SomFunc (A: TByteArray);
începe
# xA0; SetLength (A, 10);
se încheie;
Dacă A este o variabilă lok, atunci distribuția a ajutat. Și dacă da, atunci
# xA0; [Error] Unit1.pas (30): Transmisie de tip nevalidă
> Și o altă întrebare este de ce nu puteți apela SetLength pe o matrice
> gama Byte
Și unde ai făcut asta, nu poți? Poți!
Ei bine, cum poți
[Error] Unit1.pas (31): Tipuri incompatibile
Ar fi de dorit, în general, de la aceste tipuri de tip TByteArray va scăpa.
> Și anunță
> A: TByteArray; este imposibil.
Nu este imposibil, ci necesar.
Este imposibil pentru că nu vreau ca modulele să folosească un fel de tipuri străine. A scris modulul și el este singur - foarte util. Și astfel trebuie să realizăm un modul în care astfel de tipuri sunt obligate să le conecteze peste tot.
La 2 întrebare - de ce este imposibil să cauți SetLength pentru o mulțime de Byte
Deoarece în acest caz parametrul nu este o matrice dinamică, ci un parametru deschis (Open Array Parameters)
Pe primul - nu văd motivele pentru care în toate cazurile dvs. să nu utilizați tipul de dyin preformat de dvs. mulțime
Deoarece în acest caz parametrul nu este o matrice dinamică, ci un parametru deschis (Open Array Parameters)
Văd. Aceștia pot transfera și stat statutul.
> Puteți trece și stări matrice.
Da, și chiar construi-o SomeFunc ([1,2,3])
Este clar. Multumesc tuturor :)