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 :

Pb d'allocation dynamique


Sujet :

Langage Delphi

  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut Pb d'allocation dynamique
    Bonjour,

    désolé de vous déranger à nouveau mais j'ai besoin d'explication.
    Dans l'exemple que j'essaie len=3
    Les différence sont tab : array of char ; -> tab : array[0..32] of char ;
    et mise en commentaire de SetLength
    Voici le code ci-dessous (qui ne fonctionne pas) :

    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
    procedure CatValue(Registre : TRegistry; key : TStrings) ;
    Var i, j : integer ;
        RegDataInfo : TRegDataInfo ;
        tmp : string ;
        tab : array of char ;
        len : integer ;
    begin
    // vérifier que value exist
    // multi value
    // afficher selon contenue sous forme valuename=
        For i := 1 to key.Count -1 do
        begin
            if Registre.ValueExists(key[i])
            then begin
                if Registre.GetDataInfo(key[i], RegDataInfo)
                then begin
                    case RegDataInfo.RegData of
                         rdString, rdExpandString : tmp := Registre.ReadString(key[i]) ;
                         rdInteger : tmp := IntToStr(Registre.ReadInteger(key[i])) ;
                         rdBinary  : begin
                                         len := RegDataInfo.DataSize ;
                                         SetLength(tab, len) ;
                                         Registre.ReadBinaryData(key[i], tab, len) ;
    // sort de la boucle for et termine le programme en indiquant une erreur d'écriture mémoire
    for j := 0 to len do
    begin
        write(tab[j]) ;
    end ;
                                     end ;
                    else
                                            tmp := 'Unknow       '
                    end ;
                end ;
            end
            else
                ErrorStd('"' + key[i] + '" does''nt exists') ;
        end ;
    end ;
    Ce code fonctionne pourquoi ?

    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
    procedure CatValue(Registre : TRegistry; key : TStrings) ;
    Var i, j : integer ;
        RegDataInfo : TRegDataInfo ;
        tmp : string ;
        tab : array[32] of char ;
        len : integer ;
    begin
    // vérifier que value exist
    // multi value
    // afficher selon contenue sous forme valuename=
        For i := 1 to key.Count -1 do
        begin
            if Registre.ValueExists(key[i])
            then begin
                if Registre.GetDataInfo(key[i], RegDataInfo)
                then begin
                    case RegDataInfo.RegData of
                         rdString, rdExpandString : tmp := Registre.ReadString(key[i]) ;
                         rdInteger : tmp := IntToStr(Registre.ReadInteger(key[i])) ;
                         rdBinary  : begin
                                         len := RegDataInfo.DataSize ;
                                         //SetLength(tab, 32) ;
                                         Registre.ReadBinaryData(key[i], tab, len) ;
    for j := 0 to len do
    begin
        write(tab[j]) ;
    end ;
                                     end ;
                    else
                                            tmp := 'Unknow       '
                    end ;
                end ;
            end
            else
                ErrorStd('"' + key[i] + '" does''nt exists') ;
        end ;
    end ;
    Où est mon erreur ? (erreur de débutant certainement, mais depuis le temps que je programme en delphi ça m'embête)

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    je mettrais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Registre.ReadBinaryData(key[i], tab[0], len)
    tab étant un pointeur
    tab[0] l'adresse du premier octet du tableau

    tab et tab[0] pour array[32] of char, c'est la même chose, l'adresse du premier octet du tableau

    ... toutes les petites choses cachées de Delphi sur la gestion des tableaux dynamiques ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre actif
    Profil pro
    DEV
    Inscrit en
    Août 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DEV

    Informations forums :
    Inscription : Août 2006
    Messages : 182
    Points : 211
    Points
    211
    Par défaut
    Attention aussi avec le SetLength
    Ton SetLenght(tab,Len); ou len = 3
    alloue un tableau de 3 char allant de 0 à 2 ...
    regarde dans l'aide sur les tableau dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for j := 0 to len do
    begin
        write(tab[j]) ; // Ceci te provoquera une erreur d'écriture quand j = 3 ;)
    end ;

  4. #4
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Merci ShaiLeTroll en mettant tab[0] ça fonctionne. Je pensais que tab et tab[0] c'était la même chose mais apparement non.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Tu peux écrire pour acceder au second element:

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

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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