2010-02-16 5 views
0

J'ai une procédure qui accepte 2 paramètres de chaîne, l'un d'entre eux a une valeur par défaut. Dans la procédure, je veux concaténer l'un et l'autre et certains littéraux pour former une plus grande chaîne. D'une certaine manière, je reçois un AV ... des idées?Quelle est la cause de cette violation d'accès lors de la concaténation de chaînes dans D2007?

Code

est quelque chose comme ça

{$WRITEABLECONST ON} 
constructor MyClass.Create(s1: string; s2: string = GlobalConstant); 
var s3: string; 
begin 
    .... 
    if (s2 = '') then s2 := GlobalConstant + ' (' + s1 + ')';  // AV here 
    .... 
end; 

Si je cède GlobalConstant + ' (' + s1 + ')-s3, puis attribuez-lui s3-s2 l'AV disparaît. Pourquoi? Quel est le problème avec l'écriture directe sur le paramètre de chaîne?

+0

en utilisant le code que vous avez fourni, je ne peux pas reproduire avec d2007. – glob

+0

Il n'y a rien de mal avec ce code. Difficile d'imaginer pourquoi il serait là-bas. Comment "GlobalConstant" a-t-il été déclaré? –

+0

@Nick Hodges. Je sais que c'est bien parce que le code fonctionne dans une autre itération. Hier, il a échoué à la sixième itération, aujourd'hui il a échoué le troisième ... et j'ai eu des AV dans d'autres endroits aussi, alors je me penche vers la réponse de Paul-Jan. Quelque chose d'autre est un manque. Merci quand même Nick, je l'apprécie. – Sam

Répondre

6

Quelque chose d'autre dans votre code est erronée, entraînant indirectement une violation d'accès à cet emplacement (corruption). Utilisez FastMM avec FullDebugMode pour savoir de quoi il s'agit et comment le résoudre.

+0

@ Paul-Jan, Merci, me semble plausible. Je vais essayer et faire un rapport demain. – Sam

+0

J'ai lu la page pour laquelle vous avez fourni le lien, et la 2 qu'elle recommande également. J'utilise FastMM4, activé FullDebugMode (en utilisant l'interface graphique FastMM4OptionsInterface), UseDebugDCUs, Stack Frames, Symboles locaux, Informations de référence ... reconstruit Project et exécuté, mais je ne reçois pas un fichier journal (ou peut-être que je ne peux pas trouvez-le!) ou n'importe quel MessageBox. Je reçois toujours un AV, mais maintenant le code casse à l'intérieur de la fonction de classe TObject.InheritsFrom (AClass: TClass): Boolean; dans WIN32 \ RTL \ SYS \ System.pas ... :-) J'ai eu une tête pleine de cheveux hier, tout sera parti demain! – Sam

+0

Oups, vous avez oublié de créer un fichier .map! Options de projet - Lieur - Fichier de carte détaillé. (Allez, désolé pour le débutant.) – Sam

Questions connexes