goimard
Messages postés11Date d'inscriptionmercredi 8 novembre 2000StatutMembreDernière intervention 2 octobre 2008
-
24 avril 2008 à 11:57
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 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;
goimard
Messages postés11Date d'inscriptionmercredi 8 novembre 2000StatutMembreDerniè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.
goimard
Messages postés11Date d'inscriptionmercredi 8 novembre 2000StatutMembreDerniè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;
goimard
Messages postés11Date d'inscriptionmercredi 8 novembre 2000StatutMembreDerniè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
Messages postés11Date d'inscriptionmercredi 8 novembre 2000StatutMembreDerniè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 !)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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 ?!