Comportement étrange des tableaux dynamiques dans delphi 2007

Résolu
goimard Messages postés 11 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 2 octobre 2008 - 24 avril 2008 à 11:57
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 27 avril 2008 à 03:22
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

goimard Messages postés 11 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 2 octobre 2008
24 avril 2008 à 14:55
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 
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
24 avril 2008 à 12:10
Bonjour goimard,

ton tableau dynamique n'est pas dimensionné..

begin
Setlength(tableau,26);
0
goimard Messages postés 11 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 2 octobre 2008
24 avril 2008 à 12:26
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 ?
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
24 avril 2008 à 13:39
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
0

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

Posez votre question
goimard Messages postés 11 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 2 octobre 2008
24 avril 2008 à 13:58
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;
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
24 avril 2008 à 14:20
merci cantador, mais si je fais cela , je n'ai pas de violation d'accès

Sous D7 ou D2007 ?

cantador
0
Utilisateur anonyme
24 avril 2008 à 14:36
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++
0
goimard Messages postés 11 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 2 octobre 2008
24 avril 2008 à 14:36
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
0
Utilisateur anonyme
24 avril 2008 à 14:42
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
0
goimard Messages postés 11 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 2 octobre 2008
24 avril 2008 à 14:42
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
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
24 avril 2008 à 19:08
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%" />
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
25 avril 2008 à 18:43
Japee en D2007 ?
çà s'arrose !

cantador
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
27 avril 2008 à 03:22
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%" />
0
Rejoignez-nous