Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Aidez moi pour mon prog svp ;-) (2eme probleme)


Messages recommandés

Posté(e) (modifié)

Resalut, je reedite le code de mon prog qui tourne bien mais j'ai une erreur et je sait pas d'où elle provient en fait kan j'envoi ma requête, la réponse se met bien dans ma ListBox mais une erreur apparait, c'est un pop-up disant ceci : "Opération de pointeur incorrecte"

 

Voici donc le code au cas ou ce serait du a une erreur dedans :

 

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

 

#include "ihm.h"

#include <TMySQLD.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

TMySQL *bdd;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

// Variables

bool connect;

AnsiString AdresseIP, NomUtilisateur, Password, NomBase;

unsigned int NumPort;

// Création de l'objet bdd

bdd = new TMySQL();

 

// Récupération des entrées de l'utilisateur

AdresseIP = Edit1 -> Text;

NomUtilisateur = Edit2 -> Text;

Password = Edit3 -> Text;

NomBase = Edit4 -> Text;

NumPort = Edit5 -> Text.ToInt();

 

// Affiche un pop-up si un des champs n'est pas rempli

if((AdresseIP=="")||(NomUtilisateur=="")||(NomBase==""))

ShowMessage("Un des champs n'est pas rempli");

 

// Connection à la base de donnée

connect = bdd->ouvrirConnexion(AdresseIP.c_str(), NomUtilisateur.c_str(),

Password.c_str(), NomBase.c_str(), NumPort);

 

if(connect) // Cas ou la connection a réussi

{

Shape1->Brush->Color = clLime;

Button2->Enabled = true;

Button3->Enabled = true;

}

else // Cas ou la connection a échouée

{

Shape1->Brush->Color = clRed;

Button2->Enabled = false;

Button3->Enabled = false;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

bdd->fermerConnexion(); // Deconnexion

Shape1->Brush->Color = clRed;

Button2->Enabled = false;

Button3->Enabled = false;

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button3Click(TObject *Sender)

{

AnsiString requete, donnee;

int reponse;

unsigned int i,j; // Variables de boucle

unsigned int nb_champs, nb_enregistrements;

 

// Récupération de la requête

requete = Edit6->Text.c_str();

 

// Récupération de la réponse et test si la requête est valide

reponse = bdd->envoyerRequete(requete.c_str());

if(reponse == -1)

ShowMessage("Requête invalide");

else // Cas ou la requête est valide

{

// Réservation de l'espace nécéssaire

bdd->reponseRequete();

 

// Récupération du nombre de champs et du nombre d'enregistrements

nb_enregistrements = bdd->nbEnregistrements();

nb_champs = bdd->nbChamps();

 

// Pour chaque enregistrement, on récupère chaque champ et on l'ajoute

// a la ListBox

for(i=0 ; i<nb_enregistrements; i++)

{

bdd->recupererEnregistrement();

for(j=0 ; j<nb_champs; j++)

{

donnee = bdd->recupererColonne(j);

ListBox1->Items->Add(donnee);

}

}

// Libération de l'espace utilisé

bdd->libererRessource();

}

}

//---------------------------------------------------------------------------

 

 

Encore merci d'avance pour votre aide :P

Modifié par BBig

Posté(e)

Salut,

 

Le problème est effectivement là :

char *AdresseIP = new char;

char *NomUtilisateur = new char;

char *Password = new char;

char *NomBase = new char;

Ceci créée des pointeurs mais ne réserve pas la mémoire nécessaire pour stocker les contenus de ces variables.

 

Tu es en C++ builder, autant prendre des AnsiString et ne convertir que lors de l'appel de la fonction.

AnsiString AdresseIP, NomUtilisateur, Password, NomBase;

AdresseIP = Edit1 -> Text.c_str();

NomUtilisateur = Edit2 -> Text.c_str();

Password = Edit3 -> Text.c_str();

NomBase = Edit4 -> Text.c_str();

NumPort = Edit5 -> Text.ToInt(); // Attention ! Si la case ne contient pas un chiffre cela génère une exception (voir ToIntDef() par exemple)

connect = bdd->ouvrirConnexion(AdresseIP.c_str(), NomUtilisateur.c_str(), Password.c_str(), NomBase.c_str(), NumPort.c_str());

Evidemment, tu peux faire encore plus simple en passant directement les Text.c_str() des cases concernées.

Posté(e)

Salut _Michel_ et merci bien pour cette aide maintenant sa tourne, par contre je n'ai pas vraiment compris le principe de convertir une 2eme fois dans la fonction ouvrirConnexion pourrait tu éclaicir mon exprit sur ce point. :P

Posté(e)

Salut _Michel_ et merci bien pour cette aide maintenant sa tourne, par contre je n'ai pas vraiment compris le principe de convertir une 2eme fois dans la fonction ouvrirConnexion pourrait tu éclaicir mon exprit sur ce point. :P

En fait, en copiant ton code, j'ai fait une petite erreur. Les Text des editbox sont des AnsiString, il n'y a pas besoin d'utiliser c_str().

AnsiString AdresseIP, NomUtilisateur, Password, NomBase;

AdresseIP = Edit1 -> Text;

NomUtilisateur = Edit2 -> Text;

Password = Edit3 -> Text;

NomBase = Edit4 -> Text;

NumPort = Edit5 -> Text.ToInt(); // Attention ! Si la case ne contient pas un chiffre cela génère une exception (voir ToIntDef() par exemple)

connect = bdd->ouvrirConnexion(AdresseIP.c_str(), NomUtilisateur.c_str(), Password.c_str(), NomBase.c_str(), NumPort.c_str());

Ceci dit, cela ne change rien au bon fonctionnement du code.

 

Sinon, je suis parti sur le principe que la fonction ouvrirConnexion() prend des char* comme paramètres. Il faudrait avoir son protype. As tu essayé de passer directement les paramètres sans mettre .c_str() ?

c_str() ne fait pas à proprement parler de conversion, il se contente de fournir un pointeur de type char* sur le contenu de l'AnsiString.

Posté(e)

En fait, en copiant ton code, j'ai fait une petite erreur. Les Text des editbox sont des AnsiString, il n'y a pas besoin d'utiliser c_str().

 

Ceci dit, cela ne change rien au bon fonctionnement du code.

 

Sinon, je suis parti sur le principe que la fonction ouvrirConnexion() prend des char* comme paramètres. Il faudrait avoir son protype. As tu essayé de passer directement les paramètres sans mettre .c_str() ?

c_str() ne fait pas à proprement parler de conversion, il se contente de fournir un pointeur de type char* sur le contenu de l'AnsiString.

 

OK je te remercie, concernant la fonction en fait dans notre TP la DLL nous est fournie donc le prototypage g pas sinon sans les c_str() sa marche pas.

 

En tout cas encore merci pour ton aide.

@pluche :P

Posté(e)

Est-ce que quelqu'un peut m'expliquer l'interêt d'initialiser des variables (au hasard AdresseIP) en leur réservant de la mémoire (le "= new xxxxx" qui se trouve derrière) si c'est pour leur affecter juste après l'adresse d'un autre objet ?

A part éviter d'avoir un plantage si on tente d'utiliser la variable lorsqu'elle n'est pas encore affectée (ce qui est très mauvais quand on tente de débugger un programme qui ne done pas les résultats attendus, soit dit en passant), je ne vois pas... La mémoire réservée est inutilement perdue...

Posté(e)

Encore un soucis, j'ai mis a jour mon code en haut et expliqué mon probleme pour ne pas prendre trop de place :P

Posté(e)

Suite de http://forum.zebulon.fr/index.php?showtopic=81079 ...

 

Est-ce que tu as réussi à trouver dans quelle partie de ton code se situe l'affichage de ce message ? Ca serait pas mal parce que là il y a trop à faire pour pouvoir t'aider rapidement et efficacement...

Fais un bon gros débug à l'ancienne : affichage d'un message avant / après les lignes qui paraissent louches afin de voir si c'est elles qui génèrent le message.

Essaie également de trouver le contexte qui permet d'être certain que ces lignes planteront.

 

-- edit --

C'était bien tenté d'éditer le premier post du topic, mais tu as oublié d'utiliser les balises [ code ] et [ / code ] pour coier-coller ton code ;-)

Posté(e)

Je peut pas dire dans quelle partie l'erreur se trouve car en fait le programme s'execute impecable tout marche mais cette erreur s'affiche, et je viens de penser, j'utilise une DLL qui nous est fournie par le prof, sa peut peut etre venir de sa non ??

Posté(e)

Hum... Commencer par chercher le problème dans la partie dont tu n'as aucun contrôle, c'est peut-être pas la meilleure chose à faire.

Si on part du principe que l'erreur peut se trouver dans ton code, est-ce qu'en plaçant un point d'arrêt où que ce soit dans ton code tu n'arrives pas à avoir une ligne qui "fait apparaitre" le message ?

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...