IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Probleme de type avec Array


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut Probleme de type avec Array
    je voudrais dans une procédure utiliser un parmi plusieurs tableaux suivant une selection .
    Exemple,Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm3.Button5Click(Sender: TObject);
      Const Tab1:Array[0..7] of extended = (21.5,21.6,21.8,22.1,22.6,23.5,23.1,22.9);
      Tab2:Array[0..7] of extended = (11.5,1.6,211,20,22.6,25.5,23.1,22.9);
      Tab3:Array[0..7] of extended = (25.5,25.6,208,20.1,20.6,23.5,23.1,22.9);
     
     Var 
       tab:Array[0..7]of extended ;
    begin
     If RadioGroup1.ItemIndex =0 then Tab:=Tab1;
     If RadioGroup1.ItemIndex =1 then Tab:=Tab2;
     If RadioGroup1.ItemIndex =2 then Tab:=Tab3;
    le compilateur m'indique ;types incompatibles, pourtant j'affecte un tableau à une variable tableau d'une même taille ?
    quelle est la bonne méthode?
    Merci

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case RadioGroup1.ItemIndex of
      0 : Move(Tab1, Tab, sizeof(Tab));
      1 : Move(Tab2, Tab, sizeof(Tab));
      2 : Move(Tab3, Tab, sizeof(Tab));
    end;
    Et encore mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const
      Tabs : array[0..2] of array[0..7] of Extended = (
        (21.5,21.6,21.8,22.1,22.6,23.5,23.1,22.9),
        (11.5,1.6,211,20,22.6,25.5,23.1,22.9),
        (25.5,25.6,208,20.1,20.6,23.5,23.1,22.9)
      );
    var
      Tab : array[0..7] of Extended;
    begin
      Move(Tabs[RadioGroup1.ItemIndex], Tab, sizeof(Tab));
    end;
    Légèrement moins lisible, mais ô combien plus efficace, surtout si tu n'as donné qu'un exemple et que tu as en fait beaucoup plus de tableaux Tabx
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type 
      MyTab: array[0..7] of Extended;
    const
     Tab1: MyTab = (21.5,21.6,21.8,22.1,22.6,23.5,23.1,22.9);
    pour qu'ils soient du même type : à tester, mais sjrd a donné une solution élégante (on peut se passer des move avec des pointeurs sur tableaux)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par tourlourou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type 
      MyTab: array[0..7] of Extended;
    const
     Tab1: MyTab = (21.5,21.6,21.8,22.1,22.6,23.5,23.1,22.9);
    c'est la bonne méthode

    Citation Envoyé par tourlourou
    (on peut se passer des move avec des pointeurs sur tableaux)
    c'est vrai, c'est pourqoi les pointeurs exist,
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    J'avais, sur le post d'origine, donné un exemple avec des tableaux statiques pout faire imple, mais en fait, mon application utilise des tableaux statiques.
    J'ai bien essayé de transposer vos conseils, mais de gros souci de plantage soit de l'apilcation soit de windows compltement (obligé de couper l'ordi + scan disques etc)

    Je place carrement le code sur ce post

    les tableaux dynamiques déclarés en Array ofArray sont complété au fil de l'application en allouant une valeur suppl avant cahaque aquisition.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Setlength(tabsalle,length(tabsalle)+1); 
          Tabsalle[length(tabsalle)-1]:= T_salle;
          Setlength(tabatelier,length(tabatelier)+1); 
          Tabatelier[length(tabatelier)-1]:= T_atelier;
    ensuite pour avoir une procedure commune, je transfertt en fonction d'un choix un tableau dans tab
    puis je construis la courbe
    Quand j'appelle la procédure Btcourbeclick, les valeurs dans tab sont justes et la courbe se trace correctement l mais si j'appelle une seconde fois la procédure , je plante tout. Soit une message me dit "opération avec virgule flottante non correcte" et / ou le programme va être arrêté car il a effectué une opération non conforme
    voici la procédure en question
    je suppose qu'i sagit d'un probleme de mémoire allouée pour ce tab mais ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    procedure TForm3.BtcourbeClick(Sender: TObject);
     Var i: integer;
      larg:extended;
     tab:array of extended;
    begin
    case Radiogroup1.ItemIndex of
     0:Move (tabsalle, tab, sizeof(tab));
     1:Move (tabext, tab, sizeof(tab));
     2:Move (tabcons1, tab, sizeof(tab));
    .
    .
    .
     else showmessage('il faut choisir une courbe ');
     end;
     
    Edit1.Text:=IntTostr(length(tab));
    For i:=0 to  length(tab) -1 do
    Memo1.lines.add(FloatTostr(tab[i]));
    // me permet de visualiser ce que le tab a comme valeurs
    max:=SpinEdit1.Value;
    min:=SpinEdit2.value;
    If min >= max then   // verrrouillage pour que max soit strictement > min
      begin
      showmessage('max doit être > min');
      exit;
      end;
    // contrôle taille du tracé / taille du tableau
    If (SpinEditfin.value > length(tab))or (SpinEditfin.value=0 ) then  SpinEditfin.value :=length(tab);
     
    // controle pour valeurs positives
    If (SpinEditdebut.Value < 0) or (SpinEditfin.Value <2 )then
      begin
      showmessage('le début de la plage du tracé doit être > ou = 0 et la fin de courbe au moins > ou 2');
      exit;
      end;
    If (SpinEditfin.Value -SpinEditdebut.Value)<2 then
      begin
      showmessage('l''écart entre le début et la fin de la courbe doit être au moins de 2 ');
      exit;
      end;
    Btcourbe.Enabled:=false; // rend inactif le bouton pendant le tracage
     // le spinEdit3 définit la hauteur de la courbe
    h:= SpinEditplage.value/((max-min)*100);
    decal:= ((clientheight-110 + SpinEditplage.value)div 2);
    Larg:= Form3.width  /((spinEditfin.Value-SpinEditdebut.value)+1) ;
        If Larg > 50 then larg:=50; // au début avec peu de mesures
     
         Edit2.Text:=FloatTostr(larg);
        // tracage des limites
        Canvas.Pen.Color:=clblack;
        Canvas.Pen.width:=1;
        Canvas.MoveTo(0,-Round((max-min)*100*h)+decal);
        Canvas.LineTo(clientwidth, -Round((max-min)*100*h)+decal);
        Canvas.MoveTo(0,-Round((min-min)*100*h)+decal);
        Canvas.LineTo(clientwidth, -Round((min-min)*100*h)+decal);
        Application.ProcessMessages;
        Canvas.Pen.Color:=clred;
        Canvas.MoveTo(0,-Round((StrToFloat(Form1.edit_maison.text)-min)*100*h)+decal);
        Canvas.LineTo(clientwidth, -Round((StrToFloat(Form1.edit_maison.text)-min)*100*h)+decal);
        Labelmax.top:=-Round((max-min)*100*h)+decal;
        Labelcons.top:=-Round((StrToFloat(Form1.edit_maison.text)-min)*100*h)+decal;
        Labelmin.top:=-Round((min-min)*100*h)+decal;
        Labelmax.caption:=IntToStr(max);
        Labelcons.caption:=Form1.edit_maison.text;
        Labelmin.caption:=IntToStr(min);
        Labelmax.visible:=true;
        Labelcons.visible:=true;
        Labelmin.visible:=true;
        Application.ProcessMessages;
     
      //traçage de la courbe par rapport aux limites de d&but et fin
      For i:=spinEditdebut.value to spinEditfin.value-2 do
        begin
        Canvas.Pen.Color:=clBlue;
        Canvas.Pen.width:=1;
        Canvas.MoveTo(Round((i-spinEditdebut.value)*larg)+5,-Round((Tab[i]-min)*100*h)+decal);
        Canvas.LineTo(Round((i-spinEditdebut.value+1)*larg)+5,-Round((Tab[i+1]-min)*100*h)+decal);
      end;
    end;
    Mille excuses pour la longueur de cet extrait de code mais le premier post avait éte trop court et du coup non représentatif
    Merci par avance procedure

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Ouf, j'ai finalement trouvé le problème, il s'agissait d'une erreur: une variable locale et une globale qui portaient le même nom

    Merci pour les conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de type avec la fonction strtok
    Par latitude38 dans le forum C
    Réponses: 5
    Dernier message: 14/01/2011, 15h46
  2. probleme de type avec sqlParameter
    Par cinou01 dans le forum C#
    Réponses: 1
    Dernier message: 13/02/2010, 11h09
  3. Réponses: 3
    Dernier message: 28/08/2009, 11h06
  4. Probleme de type avec une formule
    Par elombre dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/06/2009, 08h26
  5. Petit probleme avec Arrays.Sort(...)
    Par Seth77 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 15/01/2006, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo