Tableau 2 dimensions [Résolu]

cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 22 févr. 2008 à 13:19 - Dernière réponse : cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention
- 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.
Afficher la suite 

14 réponses

Répondre au sujet
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 22 févr. 2008 à 13:29
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 22 févr. 2008 à 15:44
+3
Utile
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;
      
 


Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 22 févr. 2008 à 20:14
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 22 févr. 2008 à 21:19
+3
Utile
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.


Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 févr. 2008 à 10:43
+3
Utile
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 ="" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 23 févr. 2008 à 10:44
+3
Utile
Merci beaucoup pour vos réponses
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 23 févr. 2008 à 10:49
+3
Utile
le fichier Uses StrUtils pour le PosEx je dois le créer? Qu'est ce que t'entend pas le PosEx?
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 févr. 2008 à 10:52
+3
Utile
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 ="" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 23 févr. 2008 à 10:57
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 févr. 2008 à 11:01
+3
Utile
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="" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 23 févr. 2008 à 11:03
+3
Utile
C est se que je pensais ouais essaye merci a toi quand même
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 23 févr. 2008 à 11:09
+3
Utile
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="" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 23 févr. 2008 à 11:18
+3
Utile
Yes ça marche parfaitement merci beaucoup t'as assuré
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69
cs_lusitano69 21 Messages postés mardi 10 octobre 2006Date d'inscription 26 février 2008 Dernière intervention - 23 févr. 2008 à 18:03
+3
Utile
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.)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_lusitano69

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.