asis1
Messages postés6Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention24 janvier 2005
-
18 janv. 2005 à 12:24
asis1
Messages postés6Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention24 janvier 2005
-
24 janv. 2005 à 08:58
Bonjour à tous,
J'ai une erreur du genre "L'instruction à l'adresse @ emploie l'adresse memoire @. la memoire ne peut pas être "Read" ouu "write" suivant que je tente d'écrire ou de lire de la mémoire. Merci de m'aider car je perds du temps...
Peace Asis1
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 18 janv. 2005 à 12:52
En général cela provient d'un dépassement lors de l'accès à un tableau où l'accès à un pointeur non valide (déjà libéré, non initialisé)
Pour s'en sortir
=> vérifier avant d'accèder à un élément du tableau s'il est valide (à l'aide de macro ASSERT par exemple).
=> mettre à NULL un pointeur qui vient d'être libéré ou déclaré (permettra un test à NULL pour vérifier la validité).
asis1
Messages postés6Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention24 janvier 2005 18 janv. 2005 à 13:52
Merci.
Au fait j'utilise des pointeurs.....mais j'ai essayé de faire ce que tu m'as dit mais rien n'y fait, voilà une portion de mon programme:
char* id="ab", *nom="mon nom", *comment="no comment";
int num=12;
critere* crit=NULL;
crit->createcritere(id,nom,comment,num);//c'est làou l'erreur survient lors de l'execution
merci de me faire part de votre aide
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 18 janv. 2005 à 14:32
On ne manipule pas les chaînes de caractères comme cela :
on déclare un tableau de char ou on alloue avec malloc et on recopie dedans avec strcpy ou bien ou déclare et on initialise en même temps :
1)char id[3];
strcpy(id, "ab");
2) char* id = malloc(3);
strcpy(id, "ab");
3) char id[3] = "ab";
on peut néanmoins faire
char* id = "ab";
mais attention, la chaîne de caractère sera readonly, tu ne pourras pas la modifier avec
strcpy(id, "12");
critere* crit=NULL;
crit->createcritere(id,nom,comment,num);
=> c'est normal que ça plante car tu accèdes à une fonction d'un pointeur NULL (où alors il y ades lignes en plus entre ces 2 là), crit doit être initialiser à autre chose que NULL (avec un objet existant ou avec malloc/new) avant d'être utilisé
asis1
Messages postés6Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention24 janvier 2005 18 janv. 2005 à 14:47
Au fait la déclaration je lui remis comme cela mais ça plante tjours. Désolé de t'embeter avec ça mais je suis nul en c++.
critere *crit;
String idet="M1",name="Moyen",comment="No comment";
float va=10.0;
int nb=5;
crit=new criterion(10);
crit->createcriterion(idet,name,comment,va,nb);
Peace Asis1
Vous n’avez pas trouvé la réponse que vous recherchez ?
asis1
Messages postés6Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention24 janvier 2005 18 janv. 2005 à 15:05
dans la classe critere.h j'ai juste mis ça:
void createcriterion(char*,char*,char*,float,int);
et dans le .cpp j'ai mis ça:
static critere* crit;
static tabcritere *tabcrit;
void critere::createcriterion(char* ident, char* name, char* comment, float val, int nb)
{
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 18 janv. 2005 à 15:15
ces variables là sont-elles initialisées quelque part ?
static critere* crit;
static tabcritere *tabcrit;
les pointeurs id et valmat, ils sortent d'où ? Je me demande si tu as bien compris la notion d'objet en c++ (variables et fonctions membres...) car dans la classe critere, tu utilise une fonction membre pour initiliser un objet critere static.
je pense qu'il faudrait l'ensemble du prog( si c'est pas trop long) ou au moins l'ensemble de la classe critere et les varibles globales utilisées.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 19 janv. 2005 à 12:20
les variables static sont à virer.
la fonction createcriterion est une fct membre de la classe critere donc appelée avec un objet critere, inutile d'en crée un dedans, opn a accès implicitement à l'appelant par le pointeur this.
void critere::createcriterion(char* ident, char* name, char* comment, float val, int localnb)
{
id= new identifier();
id->setident(ident);
id->setname(name);
id->setcomment(comment);
valmat = new valeurMatrice();
valmat->setvaleurmatrice(val);
crit->nb=localnb;
tabcrit->setcriterion(crit);
};
dans la classe Identifier :
- soit tu utilise des String qui gère automatiquement la mémoire auquel cas tu ne doit pas faire delete[] dessus dans le destructeur (doit pas compilé d'ailleurs)
- doit tu utilise des char* qu'il faut allouer lors de la recopie et libérer dans le destructeur :