Pointer la matrice

Un pointer la o matrice

Cu umilință, răspundeți. Ca și în pointerul Delphi către Array of Real
este tradus la elementul specificat al matricei. Dacă în C ++ se întâmplă acest lucru






dacă scriem p [i], atunci în Delphi # xA0; primul element pe care îl prezintă și orice alt element
nu vrea.

Șablonul a crăpat.
Traduceți în rusă.

Nu aveți nevoie de un indicator. În Delphi, acest lucru este mai ușor:

var
# xA0; P: matrice [0..9] de extensie; // real este un tip învechit.
.
# xA0; pentru i: = 0 până la 9 nu
# xA0; # xA0; P [i]: = 1;

Sau cu o matrice dinamică:

tip
# xA0; TP: matrice extinsă;
var
# xA0; P: TP;
.
# xA0; SetLength (P, 10);
# xA0; pentru i: = 0 până la 9 nu
# xA0; # xA0; P [i]: = 1;

> Există 2 matrice, în funcție de starea casetei de verificare pe care trebuie să o procesați
elemente ale unuia sau ale celuilalt


tip
TDAExt = matrice extinsă;
var
Arr1, Arr2, Temp: TDAExt;

începe
dacă Checkbox1.Checked apoi
# xA0; Temp: = Arr1
altfel
# xA0; Temp: = Arr2;
cu Temp do
începe
se încheie;
se încheie;

var
# xA0; arr: matrice [False..True] de matrice de Integer;
începe
# xA0; arr [CheckBox1.Checked].
se încheie;

Este posibil prin IfThen sau cam asa ceva:


var
arr: array [boolean] de matrice de Integer;
începe
arr [CheckBox1.Checked].
se încheie;

În C ++ cu indicii deja dat afară?
Atunci mă voi bucura. Indicatorii din Delphi de la sichnyas nu diferă. Dacă nu ați înțeles, atunci de ce a trebuit să adăugați C ++ aici?


> Să nu scrieți de multe ori dacă.

De ce sa scrieti acelasi lucru mereu? Scrie o dată.

Totuși. Cât prin pointerul de pe o matrice pentru a primi elementul i-a unei matrice?


> La fel. ca prin pointer la matrice obține elementul i
> matrice?

dacă prin "pointerul la matrice", atunci aproape ca în C, P ^ [i], cu condiția ca P să fie de tip ^ array [limite] de tip.

const
# xA0; arr. matrice [0..2] de prelungire = (1,3,0,3,5,4);

procedura TForm1.Button1Click (expeditor: TObject);
var
# xA0; p. ^ extins;
# xA0; extins;
începe
# xA0; p: = @arr;
# xA0; a: = p ^ [1];
se încheie;

[Error] Unit1.pas (36): Este necesar tipul de matrice

Înțeleg că fac o greșeală proastă.

> [Eroare] Unit1.pas (36): Este necesar tipul de matrice
pointerul nu este niciodată o matrice. nu este nevoie să amestecați sintaxa.

> Fac o greșeală proastă.
nu stupid, idiotic. Încercați să scrieți pe C în Delphi.
în 2 exemple bune, decât nu aranjează?

p aveți un pointer să fie extins, dar trebuie să faceți un pointer la o gamă extinsă. "În general, nu aveți nevoie de pointeri deloc, cred.


> # xA0; și aritmetica pointerului nu-i place foarte mult

Din ce este.

Limitată de indicatorii de caractere

> Puteți utiliza operatorii + și - pentru a crește și a micșora offsetul
> un pointer de caractere. De asemenea, puteți utiliza - pentru a calcula diferența
între două compensări.

Și numai operațiunea de redenumire este obișnuită.

tip
# xA0; PExtended = ^ Extended; // pointer la un singur Extended
# xA0; TExtendedArray = matrice [0..MaxInt div Sizeof (Extended) -1] din Extended;
# xA0; PExtendedArray = ^ TExtendedArray; // aproape ceea ce aveți nevoie

const
arr. matrice [0..2] de prelungire = (1,3,0,3,5,4);

procedura TForm1.Button1Click (expeditor: TObject);
var
p. PExtendedArray;
a. extins;
începe
p: = @arr;
a: = p ^ [1]; // Ar trebui să funcționeze
se încheie;
dar pentru a lucra la Sishnoy, este la modă să facă acest lucru

const
arr. matrice [0..2] de prelungire = (1,3,0,3,5,4);

procedura TForm1.Button1Click (expeditor: TObject);
var
p. ^ Extins; // la fel
a. extins;
I: Integer;
începe
p: = @arr;
a: = 0;
pentru I: = 0 la 2 nu începe
a: = a + # xA0; p ^;
Inc (p); // aproape p ++
se încheie;
se încheie;


> Limitate de indicatori de caractere

Există Inc și Dec. Dacă Th.

și în cele din urmă codul asm generat nu va fi mai bun, decât mai rău decât din [2]. dar nu este deloc rău. va da ocazia să cerceteze delfinul în stilul "bine, acest pește murdar este murdar".

Se pare că el însuși nu a vrut, din cauza lipsei sale de alfabetizare, el a atins pe cei slabi
locul Delphi. Se pare că în locul a două mese trebuie să vă ocupați de trei,
al treilea - artificial - o copie a uneia dintre matricele necesare sau în loc de 2 simple pentru a face una multidimensională, sau # xA0; scrieți o mulțime de tip -es.


> Se pare că el însuși nu a vrut, în analfabetismul său atins
> slab
> locul Delphi.

Se pare că "X, Y, Z"

Vă rog să nu vă faceți griji, mi sa părut că totul ar fi mai ușor.

> punct slab al Delphi.
acest punct slab al minții slabe.
cu mai multe opțiuni pentru a ignora normal, pentru a alege cel mai pervertit și, după plâns, "ah, aici!", el nu poate face acest lucru.

------------------------
A apărut lanțuri de fierastraie japoneze puternice din Rusia, a început să o testeze, în lama de ferăstrău
- Nașpa! - Saw a spus și a tăiat o bucată de lemn.
- Ah, b **! - spuse mushikii ruși și împinse un bord în ferăstrău.
- Aduceți-o! - Saw a spus și a tăiat tabla.
- Wu, b **! - spuse mushikii frați din Rusia și fixă ​​un ferăstrău în ferăstrău.
- Vzhzhzhzhik! - Saw a spus și a tăiat jurnalul.
- Wu, b **. - au spus oamenii ruși și au pus ferăstrăul în ferăstrău.
- Hrrr-jin - a spus că a văzut și a rupt.
- Ah-ha, b **. - au spus țăranii ruși și au mers să taie pădurea cu axe.

> mi sa părut că totul ar fi mai ușor.
Ce este complex în [2].

În măsura în care înțeleg, probabil este greșit, propune Yuri Zotov
copiați matricea dorită și lucrați cu ea. Bineînțeles. este ușor. Sunt așa
se gândea să facă, dar spera # xA0; că sfătuiesc ceva mai interesant.








> Am crezut, dar speram # xA0; că sfătuiesc ceva mai interesant.

Omoară-te, salvează lumea.
Dar nu, nu ucide. Du-te la muncă. Salariul meu se va ridica, dacă astfel veți fi foarte mult.


> [29]

Sarcina îmi pare a fi așa:

tip
# xA0; PMyData = ^ TMyData;
# xA0; TMyData = matrice [0..9] din Extended;

var
# xA0; MyData: array [Boolean] din TMyData = (
# xA0; (1.1, 2.2, ...);
# xA0; (5.5, 6.7, ...)
# xA0;);

funcția ConquerTheWorldWith (const AData: TMyData);
începe
...
se încheie;

> a face o copie a matricei dorite și a lucra cu ea.
de unde "droves"? în [2] nu există copii, nici sfaturi pentru a le face.

> dar speram # xA0; că sfătuiesc ceva mai interesant.
și cum este posibil acest lucru dacă nu există nici o problemă? ci faptul că există o traducere în limba rusă.

> Sarcina îmi pare a fi așa:
ați fi atent să nu dați codul unei persoane care nu cunoaște elementele de bază. el percepe totul prin "oglinda strâmbă a prezentării sale". foarte strâmb, în ​​dolphi nu știe nimic, în C crede că știe.

imediat # xA0; din nou, vor exista concluzii în stilul de "pește fault".

Cunoștințele mele despre C și Delphi sunt nesemnificative, așa că îmi cer propria mea
întrebări. Voi fi foarte recunoscător dacă îmi vor explica ce nu am înțeles în consiliu
Yuri Zotov.

> Yuri Zotov propune să facă o copie a matricei dorite și să lucreze cu ea.

Am căutat mult timp, de unde i-am sugerat. Nu am găsit.

Lucrul cu indicii în Delphi Nimic altceva decât SYNTAX nu diferă de lucrul cu coeficienții din C. Și fără "puncte slabe". Nu există deficiențe - toate SAME, ca și în S.

În [11] ai scris deja totul. Cu o singură greșeală, pe care ați arătat-o ​​deja în [13]. Ce altceva este necesar?

tip
# xA0; TArr. array [0..2] de extensie;
# xA0; PArr = ^ TArr;

const
# xA0; arr. TArr = (1,3,0,3,5,4);

procedura TForm1.Button1Click (expeditor: TObject);
var
# xA0; p. somonului tânăr; // Avem nevoie de un pointer la MASSIVE, nu este extins
# xA0; extins;
începe
# xA0; p: = @arr;
# xA0; a: = p ^ [1];
se încheie;

> p. somonului tânăr; // Avem nevoie de un pointer la MASSIVE, nu este extins
ce diferență, permiteți-i să fie un indicator al prelungirii

const
# xA0; arr. matrice [0..2] de prelungire = (1,3,0,3,5,4);

procedura TForm1.Button1Click (expeditor: TObject);
var
# xA0; p. ^ extins;
# xA0; extins;
începe
p: = @arr;
a: = p ^;
se încheie;

la fel. pentru că vreau să fiu prin pointeri. dar nu au nevoie de ele, ca un al cincilea picior al câinelui. (acest lucru nu este deloc, ci aplicat la "aici")

Mulțumesc, acum totul este clar. Îmi cer scuze pentru prostie și importanță.


> În sfatul [2], nu am înțeles de ce ar trebui să fie atribuite toate elementele matricei 1

facepalm.jpg

Pentru a finaliza imaginea:

Dar în construcție [38], am spus compilatorului că variabila p indică un număr, nu un matrice. Și nu putem aplica indexul la NUMBER, deci variabila a va conține elementul ZERO al matricei.

Și în construcție [35], am spus compilatorului că variabila p indică la matrice în sine. Prin urmare, putem aplica indexul, iar variabila a va conține elementul FIRST al matricei, deoarece indexul 1 este specificat explicit.

const
# xA0; arr. text # xA0; = (1,3,0,3,5,4);

procedura TForm1.Button1Click (expeditor: TObject);
var
# xA0; p. PExt;
# xA0; extins;
# xA0; i. întreg;
începe
# xA0; i: = 1;
# xA0; p: = PExt (întreg (@arr) + i * SizeOf (Extended));
# xA0; a: = p ^;
se încheie;

Sunt, dar numai în spatele scenei

Prin urmare, în [2] sa spus că accesul la elementul dat poate fi mai simplu, fără indicii.


> Doar acum mi-ar explica cineva cum funcționează în acest caz?

A. Par să înțeleg. Dar aceasta nu este aritmetica care este în C. Sau mă înșel?

Dec - reduce cu aceeași sumă.


> Dar în C, dacă scleroza mea nu mă schimbă, simplă
operațiuni aritmetice pe indicatori. Ceea ce nu depinde
> de la ce indica acest indicator.


procedura TForm8.Button1Click (expeditor: TObject);
var
# xA0; i: Integer;
# xA0; p: PInteger;
# xA0; arr: matrice [0..1] de Integer;
începe
# xA0; arr [0]: = 44332211 dolari;
# xA0; arr [1]: = 88776655 dolari;

# xA0; p: = @arr [0];
# xA0; pentru i: = 1 la 4 nu
# xA0; începeți
# xA0; Cardinalul (p): Cardinalul (p) + 1;
# xA0; # xA0; Memo1.Lines.Add (IntToHex (p ^, 8));
# xA0; sfârșitul;
se încheie;


> Aceasta nu este echivalentul lui * (p + 1)

Cardinalul (p): = Cardinalul (p) + 1;
Aceleași ouă, numai pe partea laterală.


> Opțiune # xA0; (08/16/11 08:48) [54]
> Aceasta nu este echivalentul lui * (p + 1),

Și care este diferența?

Pentru asta, Inc este


> # xA0; pentru # xA0; pointer la char nici o diferență

Nu este în aia voastră. Și noi aici, în timpul iernii, facem sex, schimbând PChar în PByte

P.S. În general, nu sunt prima dată când am întâlnit o astfel de amăgire clară că "numai PChar" poate fi folosit. Și cu oameni pe care nu m-aș fi gândit niciodată.
Poate ce moștenire Turbo Pascal, sau acolo Delphi 3?


> Asta este în a ta acolo. Și noi, aici, în iarna am futut, schimbând
> PChar pe PByte

Și nu doar meu Si :-) Apropo, Pbyte corespunde mai mult # xA0; caracterele nesemnate *. Caracterul real este un caracter mai larg # xA0; în pascal.
Și există o diferență pentru SI. Controlul tipurilor este mai slab. Dar rezultatul poate fi obținut de altul # xA0 și în programul de pe C, dacă confundați tipurile.


> Opțiune # xA0; (08/16/11 09:11) [58]

Deci, adăugați nu 1 a sizeof (element)

Char în SI nu este un caracter


> Char în SI nu este un caracter

Сhar în SR nu numai Char LOL :-)

> 1 este înmulțită implicit cu sizeof (tipul elementului).
Același lucru face Inc

> sau este considerat. că pointerul de tip char depinde de compilator
Dar aceasta este o ambuscadă serioasă. Același cod sursă se poate comporta diferit.

> Cardinalul (p): = Cardinalul (p) + 1; unde P este pointerul, cel mai probabil
> în Delphi va fi o greșeală.


> Cardinalul (p): = Cardinalul (p) + 1; unde P este pointerul
> totul în Delphi va fi o greșeală.

procedura TForm8.Button1Click (expeditor: TObject);
var
i: Integer;
p: Pintere;
arr: array [0..1] de Integer;
începe
arr [0]: = 44332211 $;
arr [1]: = 88776655 $;

p: = @arr [0];
pentru i: = 1 la 4 nu
începe
# xA0; Cardinalul (p): = Cardinalul (p) + 1;
# xA0; Memo1.Lines.Add (IntToHex (p ^, 8));
se încheie;
se încheie;

Rezultat în memo1:
55443322
66554433
77665544
88776655

Totul este așa cum a fost planificat.


> Nu am înțeles această frază, la ce?

O nebună este casa unui prost, se aplică la char

Ca diferența explicată, sau nu foarte clar explicată? # xA0; Pot încerca un exemplu dacă este necesar?

Și cum rămâne cu cei mai bogați sau mai săraci, # xA0; sincer nu mă interesează ce limbă este mai bogată sau mai săracă, este important pentru mine care este mai convenabil pentru unul sau altul. Și tot ceea ce faceți în formă de conversie a indicelui la un număr, puteți face același lucru și în, credeți-mă. Și aici este posibil să împartă indicatorul nici acolo și nici acolo ;-) Acum, adesea în unele probleme folosesc limba în general, fără indicii și grabi


> # xA0; acum, adesea în unele probleme folosesc limba în general
> fără indicii și lipsește

În rusă fără indicii este rău. Mai ales în metrou din centru.


> # xA0; De ce așa face? Care ar fi posibilitatea unor probleme?

Am aratat oportunitatea de a face atat prin Inc, cat si prin tipuri de turnare.
Cum o fac personal? În funcție de sarcină.

Și ce face acest cod?


> Și ce face acest cod?

Memo se completează cu numere.


> Mesajul se umple cu numere.

Vă voi oferi sfaturi cu privire la optimizare, este mai ușor:

doar o singură linie față de 16

Ei bine, nu există semne explicite (instrucțiuni)

Și mereu + pentru a nu intra într-o slăbiciune, astăzi este un exemplu de astfel de scufundare,
întrebare Stânga.
Și, de regulă, ambele versiuni conduc la aceeași comandă de asamblare.


> Este bine că nu există încă DELPHI64.

Ei bine, există practic

> Care sunt bucuriile traducerilor tipurilor de date pe care le pregătim?

Pointerul va fi de 8 octeți.

Suntem smulși de nebuni și de drumuri, sunt doar proști.

> Opțiune # xA0; (08/16/11 15:46) [88]

Creierul lui Anatoly a trecut mult timp într-o stare calitativă nouă, generând construcții idiomatice supermetasmulare cu mai multe straturi)







Articole similare

Trimiteți-le prietenilor: