Comportement étrange des tableaux dynamiques dans delphi 2007 [Résolu]

Signaler
Messages postés
11
Date d'inscription
mercredi 8 novembre 2000
Statut
Membre
Dernière intervention
2 octobre 2008
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Bonjour


je vient de trouver un comportement qui me semble étrange. Le code suivant génère une erreur dans Delphi 7, ce qui me parait logique. Cependant il fonctionne sous Delphi 2007 ?!!!!
N'y aurait il pas un gros souci ?


procedure TForm1.Button1Click(Sender: TObject);
var
   iCounter : integer;
   tableau : array of integer;
   chaine : string;
begin
   tableau[25]:=1;
   chaine:=InttoStr(tableau[25]);
   label1.Caption:=chaine;
   chaine:=InttoStr(length(tableau));
   label2.Caption:=chaine;
end;

13 réponses

Messages postés
11
Date d'inscription
mercredi 8 novembre 2000
Statut
Membre
Dernière intervention
2 octobre 2008

Bon ca y est j'ai trouvé le souci pour D2007.

Le problème est au niveau de mes option de compilation. Il faut activer la vérification des limites dans les options de compilation. Il semble que par défaut elle ne soit pas coché. mais après avoir refais le test pour delphi 7 dans un projet vierge (en fait j'ai réutilisé un projet qui me sert pour faire mes tests, je n'ait pourtant pas cette option de coché et j'ai l'erreur). Il doit y avoir une vérification intrinsèque dans D7 mais pas dans D2007.

Merci pour l'aide

Goimard 
Messages postés
4718
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
14 janvier 2021
14
Bonjour goimard,

ton tableau dynamique n'est pas dimensionné..

begin
Setlength(tableau,26);
Messages postés
11
Date d'inscription
mercredi 8 novembre 2000
Statut
Membre
Dernière intervention
2 octobre 2008

Effectivement j'ai oublié cette ligne au début de la proc dans Delphi 7 :
   
   Setlength(tableau,10);

Du coup cela fonctionne sur D7 et D2007.

Mais cela ne devrait il pas provoquer une erreur selon toute logique ?
Messages postés
4718
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
14 janvier 2021
14
si tu fais :



procedure TForm1.Button1Click(Sender: TObject);


var
tab : array of integer;
begin
tab[25] := 1;
ShowMessage(IntToStr(tab[25]));
end;


tu as droit à une belle violation d'accès..

merci de cliquer "réponse acceptée"

cantador
Messages postés
11
Date d'inscription
mercredi 8 novembre 2000
Statut
Membre
Dernière intervention
2 octobre 2008

merci cantador, mais si je fais cela , je n'ai pas de violation d'accès et en plus le label1 m'indique bien '1' et le label2 m'indique bien la taille de mon tableau qui est de 10. Ou donc est stocké en mémoire la valeur tableau[25] ?
y a t'il un risque d'anoir la valeur d'une autre variable (dans un emplacement contigue en mémoire) écrasé?

procedure TForm1.Button1Click(Sender: TObject);
var
   iCounter : integer;
   tableau : array of integer;
   chaine : string;
begin
   setlength(tableau,10);
   tableau[25]:=1;
   chaine:=InttoStr(tableau[25]);
   label1.Caption:=chaine;
   chaine:=InttoStr(length(tableau));
   label2.Caption:=chaine;
end;
Messages postés
4718
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
14 janvier 2021
14
merci cantador, mais si je fais cela , je n'ai pas de violation d'accès

Sous D7 ou D2007 ?

cantador

Salut,

Son tableau n'est aussi ni initializer, ni finalizer.

Tu n'as pas de violation daccess ? Je soupconne fortement que tu nous communiques pas tous les éléments vu la remarque que je viens de faire .

A++
Messages postés
11
Date d'inscription
mercredi 8 novembre 2000
Statut
Membre
Dernière intervention
2 octobre 2008

Avec les 2 en fait. Au départ je croyais que c'était que 2007 mais en fait sous delphi 7 c'est pareil et ça m'intrigue (mon erreur initiale était copier coller incomplet!)

goimard

Désolé mais sous D6 et D7 le code donne une violation d'acces : ce qui est  normal. Il manque donc des éléments dans ton code
Messages postés
11
Date d'inscription
mercredi 8 novembre 2000
Statut
Membre
Dernière intervention
2 octobre 2008

Salut Francky23012301,

En fait le code que j'ai envoyé est la totallité du code puisque j'ai fait le test dans un projet vierge sans plus de paramétrage. Ou alors c'est que mes deux installation delphi (D7 et D2007) ont un mauvais paramétrage par défaut. (je n'ait fait que modifier des couleurs de l'éditeurs!)
Ou alors c'est moi qui suit neuneu ! (je vais finir par le croire !)

goimard
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
35
Oui verification des limites dans le compilo.

sinon quand tu fait :

Tableau[index] cela renvois une valeur a partir de l'adresse du tableau blablabla chinois blablabla.

en gros:

@ de Tableau = $00000000
@ de Tableau[1] = @ de Tableau + 1 = $00000001
@ de Tableau[25] = ... idem ... + 25 = $00000019

(c'est plus compliqué que ça, mais je simplifie)

mais ce n'est jamais qu'un pointeur. aprés tout depent comment le compilo gere derriere les tableaux.
donc aprés, admettons que le compilo fonctionne de maniere a si il peu lire l'addresse, qu'elle soit alloué ou non pour le tableau, il ne genere pas d'erreur fonctionnement a la con gros bugs chiant a trouver.
Il est preferable donc, que le compilo genere une erreur si l'addresse n'est pas allouée au tableau, peut importe si l'addresse memoire est valide ou pas.

en gros :
tableau pas alloué : addresses depart/fin = $00000000 / $00000000
requette de $00000019 = erreur
tableau alloué : addresses depart/fin = $00000000 / $00000064requette de $00000019 dans l'interval des addresses du tableau retour de valeur contenue en $00000019

pouf.

<hr size="2" width="100%" />
Messages postés
4718
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
14 janvier 2021
14
Japee en D2007 ?
çà s'arrose !

cantador
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
35
ouai j'aime pas trop l'ajout de souplesse.

souplesse = surbugage en cas de non maitrise du langage.

suffit de voir les jeux qui sortent depuis 5 ans ... C++/C++ Like, trop de souplesse, graphiste servant de coder = bug bug bug bug et attente de 3 mois avant la sortie d'un patch (le temps de trouver un vrai coder C++ capable de comprendre le code du bouzin que le graphiste a fait).

bon par contre, toujours de ++, --, += et -= en D2007 ?!

<hr size="2" width="100%" />