2016-11-06 2 views
2

J'ai un extrait de code très simple que vous pouvez vérifier ici:Comment jeter et passer un argument correctement dans delphi

type 
    TMatrix = array of array of Byte; 
    PMatrix = ^TMatrix; 

const 
testarray:array [0..2,0..2] of Byte=(
(1,2,3), (4,5,6), (7,8,9)); 

function PickValue(input:PMatrix):Byte; 
begin 
    Result:=input^[1,3]; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Showmessage(inttostr(PickValue(@testarray))); 
end; 

end. 

Comment puis-je jeter TestArray correctement pour passer à la fonction PickValue? Le code ci-dessus se bloque sous sa forme actuelle. J'utilise Delphi 2007.

Merci d'avance!

+0

Cela aide-t-il si vous indexez testarray comme 1..3.1..3? Je ne vois pas pourquoi vous devriez le faire, mais peut-être que cela donnera un indice au lecteur? –

+0

Voir aussi [Passing Static Arrays en tant que paramètres pour Dynamic Arrays dans Delphi] (http://stackoverflow.com/q/1593535/576719). –

Répondre

7

Vous ne pouvez pas transformer ce tableau statique en tableau dynamique. Ces types sont tout simplement incompatibles. Le tableau statique est disposé dans un bloc de mémoire contigu. Le tableau dynamique a une indirection pour les tableaux de taille variable à chaque dimension. En effet, pensez-y comme ^^Byte avec la gestion du compilateur supplémentaire et les métadonnées. Aucune quantité de casting ne peut vous aider.

Vous avez, au moins, les options suivantes:

  1. Copiez le contenu du tableau statique à un tableau dynamique. Passez ensuite ce tableau dynamique à votre fonction.
  2. Changez votre tableau statique en tableau dynamique afin qu'aucune conversion ne soit nécessaire.
  3. Disposez que votre fonction accepte les tableaux statiques plutôt que les tableaux dynamiques, encore une fois pour éviter une conversion.
  4. Avoir la fonction accepter un pointeur sur le premier élément et la dimension interne. Ensuite, effectuez l'indexation manuellement. L'élément i,j est au décalage linéaire i*innerDim + j.

Votre type de pointeur PMatrix n'est probablement pas nécessaire. Les tableaux dynamiques sont déjà implémentés en tant que pointeurs. Cela semble être un niveau d'indirection trop loin.

Bien sûr, demander l'élément 3 quand les indices de matrice ne vont que jusqu'à 2 n'est pas juste, mais c'est actuellement le moindre de vos soucis. N'oubliez pas que les tableaux dynamiques sont basés sur zéro et que vous avez spécifié zéro en fonction de votre tableau statique.

Je me bats pour être en mesure de recommander quelle est la meilleure solution, car je ne comprends pas vos vrais objectifs et l'utilisation basée sur l'exemple simplifié présenté ici.

+0

Fondamentalement, je voudrais passer 2 tableaux à 2 dimensions à la fonction, mais la taille des dimensions sont différentes. La première matrice est de dimensions 0..15,0..15, tandis que la seconde est 0..4,0..4. – unknown1

+0

Les options 2 et 4 semblent les plus susceptibles de convenir –