Tableau 2 dimensions

Résolu
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008 - 22 févr. 2008 à 13:19
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008 - 23 févr. 2008 à 18:03
Bonjour je m'explique je voudrais avec un string que j ai récupéré(contient des coordonées de X,Y par exemple) remplir un tableau à 2 dimensions mais pour éa récupération du string il est pas mieux de séparer chaque valeur par un espace parce que j'ai des valeurs a 10,14 etc et ça vau2 2 chars mais quand je remplirais mon tableau lui il va les prendre séparement en 1 0 1 4 etc... et je voudrais pas trop..

Voici mon code:
....
var
  Form1: TForm1;

implementation

{$R *.DFM}

function ExcludeChars(const S : string; const CS : TSysCharSet) : string;
var pCh : PChar;
    L,J,I: integer;
begin
  L := Length(S);
  J := 0;
for I := 1 to L do
  if S[I] in CS then
    begin
      J := J + 1;
      J := L - J;
    end;
  if J= 0 then
    begin
      result := '';
      exit;
    end
  else
    begin
      SetLength(result, J);
      pCh := PChar(result);
    for I := 1 to L do
      if not (S[I] in CS) then
        begin
          pCh[0] := S[I];
          inc(pCh);
        end;
      end;
  end;
procedure TForm1.Button1Click(Sender: TObject);
var
Chaine : string;
Resultat : string;
i,j : integer;
tab : array[0..15] of char;
const
Carac_exclu: TSysCharSet = [':','[',']',','];

begin
Chaine := '099:[1,6][1,7][1,8][1,9][1,10][2,5][2,11][3,5][3,11][4,5][4,11][5,6][5,10]:5'; //Exemple pour des points y,x pour dessiner une lettre
Resultat := ExcludeChars(Chaine,Carac_exclu);
Label1.Caption := Resultat[1]+Resultat[2]+Resultat[3]; //Récuperer le code ascii

for i := 4 to length(Resultat) do //la boucle part du 4ème caractere
  begin
   for j := 0 to length(Resultat) do
     begin
       tab[j] := Resultat[i];
     end;
  end;
end;

end.

14 réponses

cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
22 févr. 2008 à 13:29
P.S j'ai juste créer un tableau normal dans mon code pour faire des essais mais je voudrias réellement stocker dans un à 2 dimensions pour avoir des coordonées X,Y.
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 févr. 2008 à 15:44
deux types de tableau possible :

TPtArray = array[0..n] of TPoint;
ou en dynamique
TPtDynArray = array{Y} of TPoint;

pour le stockage de tes points, le mieux etant de ne pas travailler avec des chaines! mais avec des données brute (serait mieux) dans un stream.

ce qui permettrais au lieu de faire des trucs alambiqué de convertion et decoupage de chaine de faire :

type
  pPtDynArray = ^TPtDynArray;
  TPtDynArray = array of TPoint;

procedure LoadTable(const FileName: string; out PtDa: TPtDynArray);
var
  Size : integer;
begin
  // ouverture du stream en mode lecture
  with TFileStream.Create(FileName, fmOpenRead) do
  try
    // recuperation des dim du tableau
    ReadBuffer(Size, 4);

    // preparation du tableau
    SetLength(PtDa, Size);

    // lecture du tableau
    ReadBuffer(PtDa, Size*8);
  finally
    Free;
  end;
end;

procedure SaveTable(const FileName: string; const PtDa: TPtDynArray);

var
  Size : integer;

begin
  // ouverture du stream en mode creation/ecriture

  with TFileStream.Create(FileName, fmCreate) do

  try
    // recuperation de la taille du tableau
    Size := Length(PtDa);

    // ecriture de la taille du tableau

    WriteBuffer(Size, 4);

    // ecriture du tableau
    WriteBuffer(PtDa, Size*8);

  finally

    Free;

  end;

end;
      
 


3
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
22 févr. 2008 à 20:14
Merci de ta réponse mais a la base mes données des tout mes points sont stocké dans un fichier texte. Je me suis fait aufait une sorte de police moi meme parce que j essaye de faire u affichage style LEDS on peut voir un exemple sur ce site :

http://www.programmingforfun.com/Programs/Scrolling_LEDs.htm

mon fichier texte ce présente de cette maniere un peu comme ma chaine sur mon programme plus haut:

032:[0,0]:5
097:[1,6][1,9][1,10][2,5][2,8][2,11][3,5][3,8][3,11][4,5][4,8][4,10][5,6][5,7][5,8][5,9][5,10][5,11]:5
065:[1,10][1,11][2,8][2,9][3,6][3,7][3,8][4,3][4,4][4,5][4,8][5,2][5,8][6,3][6,4][6,5][7,6][7,7][7,8][8,8][8,9][9,10][9,11]:9
098:[1,2][1,3][1,4][1,5][1,6][1,7][1,8][1,9][1,10][1,11][2,6][2,11][3,5][3,11][4,5][4,11][5,6][5,7][5,8][5,9][5,10]:5
066:[1,2][1,3][1,4][1,5][1,6][1,7][1,8][1,9][1,10][1,11][2,2][2,6][2,11][3,2][3,6][3,11][4,2][4,6][4,11][5,2][5,6]
etc.....

les 3 premiers caracteres correspondent au code ascii de la lettre que je rentrerais dans un Edit. La suite c'est mes points X,Y qui correspondent a la forme de la lettre et le dernier caractère après les deux points(:) c'est la largeur de la lettre.
J'ai déja fait ma function pour convertir la/les lettres en code ascii. et aussi fait mon affichage(simple Image)
Après avec ces valeurs ascii que j ai récupéré je voudrais parcourir mon fichier texte à la recherche de la bonne correspondance de lettre
et par la suite stocker les points [1,6][1,9][1,10][2,5][2,8][2,11] etc dans un tableau a deux dimensions qui correnspont aux X,Y de mon TImage. Dans mon tableau je pourrais faire genre:

tab[1,6] := 1
tab[1,9] := 1 etc..

Atribuer la valeur 1 pour dire que la "led" est alumée et l afficher.
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 févr. 2008 à 21:19
hehe :

type
  TPtDynArray = Array of TPoint;

  TLed = record
    Ch       : char;
    ChSize   : integer;

    PtsCount : integer;
    Pts      : TPtDynArray;
  end;

  TLedsData = record
    LedCount : integer;
    Leds     : array of TLed;
  end;
   
procedure LoadTable(const FileName: string; out LD: TLedsData);
var
  n : integer;
begin
  with TFileStream.Create(FileName, fmOpenRead) do
  try
    ReadBuffer(LD.LedCount, 4);
    SetLength(LD.Leds, LD.LedCount);
    ReadBuffer(LD.Leds, LD.LedCount*8);
    for N := 0 to LD.LedCount-1 do
    begin
      ReadBuffer(LD.Leds[N], 9);
      SetLength(LD.Leds[N].Pts, LD.Leds[N].PtsCount);
      ReadBuffer(LD.Leds[N].Pts, LD.Leds[N].PtsCount*8);
    end;
  finally
    Free;
  end;
end;

procedure SaveTable(const FileName: string; const LD: TLedsData);
var
  sz: int64;
  n : integer;
begin
  with TFileStream.Create(FileName, fmCreate) do
  try
    sz := 4;
    for N := 0 to LD.LedsCount-1 do
      sz := sz + 9 + (LD.Leds[N].PtsCount*8);
    WriteBuffer(LD, sz);
  finally
    Free;
  end;
end;

avous que c'est quand meme plus simple d'utilisation (surtout niveau performance!)
aprés t'as plus qu'a developper un tout petit editeur pour remplir les fichiers.

voila.

sinon travail avec des fichiers INI ce sera carrement plus simple.


3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 févr. 2008 à 10:43
Salut,


bien que je suis à 100% d'accord avec F0xi je te propose quand même

un petit bout de code qui colle parfaitement à ta demande ...

à savoir : extraire les valeurs et les placer dans un tableau à deux dimensions

{
Tu mets :
  1 TButton
  1 TListBox

Sur une nouvelle Fiche (Form)
et tu complète comme suit ...

}

Unit Unit1;

Interface

Uses
  Windows,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs,
StdCtrls;

Type
  TForm1 = Class (TForm)

    Button1: TButton;


    ListBox1: TListBox;

    Procedure
Button1Click(Sender: TObject);

  Private

     { Private declarations }

  Public
    {
Public declarations }

  End;

Var
  Form1: TForm1;

Implementation

{$R
*.dfm}
Uses StrUtils; {Indispensable pour PosEx}

{Déclaration d'un Tableau à deux dimensions}

Type TIntArray = Array[0..1] Of Integer;


      TCoordArray = Array  Of TIntArray;

{Récupère une chaine inconnue contenue entre deux
chaines connues SLeft & SRight
 Renvoie le résultat dans Result et
supprime
 SLeft+Result+SRight de S (Permet de passer au suivant)}
Function MidNIncStr(Var S: String;
Const SLeft, SRight: String): String;

Var
  PosLeft, PosRight: Integer;

Begin
  Result : = EmptyStr;


  PosLeft := Pos(SLeft, S);

  If
PosLeft < 1  Then
Exit;

  Inc(PosLeft, Length(SLeft));

  PosRight :=
PosEx(SRight, S, PosLeft);

   If PosRight
< 1  Then Exit;


  Result : = Copy(S, PosLeft, PosRight - PosLeft);

  S := Copy(S,
PosRight+1, High(Integer));
End ;

{Converti deux
valeurs contenues dans une Chaine S séparées par SSep
En entiers et les
place dans un tableau [0..1] Of Integer}
Function GetDblIntVal(Const
S, SSep: String): TIntArray;

Var
  Int1, Int2 : String;

  Idx : Integer;
Begin
  Int1 : = EmptyStr;

  Int2 :=
EmptyStr;

  Idx := Pos(SSep, S);

  If
Idx > 1  Then 
Begin
    Int1 := Copy(S, 1, Idx-1);

    Int2 := Copy(S, Idx+1, High(Integer));

   End ;

  {Si il y a un
problème lors de la conversion on renvoi -1}

  Result[0] : = StrToIntDef(Int1, -1);


  Result[1] := StrToIntDef(Int2, -1);
End ;

{Extrait les valeurs entières par deux et les
place dans un tableau
 à deux dimensions}
Function GetIntValues(Const
S, SLeft, SRight, SSep: String):
TCoordArray;
Var aStr, ResStr : String;
Begin

  aStr : = S;

  Repeat

    ResStr := MidNIncStr(aStr, SLeft, SRight);

     If ResStr <> EmptyStr Then
      Begin
        SetLength(Result,
Length(Result) + 1);

        Result[High(Result)]
: = GetDblIntVal(ResStr, SSep);

      End;


  Until ResStr = EmptyStr;
End ;

{Et pour
tester la chose}
Procedure
TForm1.Button1Click(Sender: TObject);
Var
Chaine : String;

    aArr :
TCoordArray;

    I : Integer;
Begin

  Chaine : = '099:[1,6][1,7][1,8][1,9][1,10][2,5][2,11][3,5][3,11][4,5][4,11][5,6][5,10]:5';


  aArr := GetIntValues(Chaine, '[', ']', ',');


   For I : = 0  To High(aArr) Do

    ListBox1.Items.Add(Format('P1 := %d / P2
:= %d', [aArr[I][0], aArr[I][1]]))
End ;

End.
<center>Highlighted with Pas2HTML </center>

 
@+
Cirec

<hr siz ="" />
3
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
23 févr. 2008 à 10:44
Merci beaucoup pour vos réponses
3
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
23 févr. 2008 à 10:49
le fichier Uses StrUtils pour le PosEx je dois le créer? Qu'est ce que t'entend pas le PosEx?
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 févr. 2008 à 10:52
Uses
StrUtils; {Indispensable pour PosEx}
Function MidNIncStr(Var S: String; Const SLeft, SRight: String): String;
Var
  PosLeft, PosRight: Integer;
Begin
  Result := EmptyStr;
  PosLeft := Pos(SLeft, S);
   If PosLeft < 1  Then Exit;
  Inc(PosLeft, Length(SLeft));
  PosRight : = PosEx(SRight, S, PosLeft);
  If PosRight < 1  Then Exit;
  Result := Copy(S, PosLeft, PosRight - PosLeft);
  S := Copy(S, PosRight+1, High(Integer));
End ;

Tu n'as rien à créer c'est une unité qui est présente dans Delphi
il faut la déclarer dans les "Uses" pour pouvoir utiliser la fonction PosEx

 
@+
Cirec

<hr siz ="" />
3
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
23 févr. 2008 à 10:57
Je travaille sur Delphi 5 est ce que il existe aussi StrUtils je pense pas sinon il me mettrais pas de message d'ereur soit disant qu'il trouve pas ce Uses.
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 févr. 2008 à 11:01
Aïe ... désolé mais StrUtils n'est disponible qu'à partir de D7 ...

si j'ai un peut de temps dans la journée je regarde si je peu bidouiller un truc en remplacement de StrUtils & PosEx

 
@+
Cirec

<hr siz="" />
3
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
23 févr. 2008 à 11:03
C est se que je pensais ouais essaye merci a toi quand même
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 févr. 2008 à 11:09
En fait c'est à partir de D6 ...

essaye déjà ceci :
http://www.koders.com/delphi/fidDF48A5F25F06E3C6B1419E0691B806FF60260646.aspx

Tu copies le code ... tu l'enregistres sous StrUtils.pas et tu le places dans le répertoire de ton application et tu peux, normalement, tester mon code

tiens moi au courant
 
@+
Cirec

<hr siz="" />
3
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
23 févr. 2008 à 11:18
Yes ça marche parfaitement merci beaucoup t'as assuré
3
cs_lusitano69 Messages postés 21 Date d'inscription mardi 10 octobre 2006 Statut Membre Dernière intervention 26 février 2008
23 févr. 2008 à 18:03
ArrXY((1,6),(1,7),(1,8)...ect

Une fois que j'ai tout mes points stocker dans mon tableau comment je pourrais faire pour dessiner un rectangle aux coordonés X,Y de mon tableau?? (je veux dessiner un rectangle pour faire un effet de zoom sur l image comme si on voyait des pixels.)
3
Rejoignez-nous