Visual c++, fonction save

Résolu
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009 - 19 juin 2008 à 14:45
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009 - 4 juil. 2008 à 13:14
bjr tt le monde!


je developpe une interface d'acquisition d'image avec visual studio c++, masi j'ai du mal enregistrer mes images. l'idée est d'enregistrer un certain nombre d'image (imnumber), leur donner un nom (imname); il faut noter que le nom comprend un numéro (imnumero) incrémenter automatiquement.
j'utilise la fonction save (windows forms) pour faire l'enregistrement.
mon code est:
int imnumero=12;



int



imnumber=15;


char



name[80];


char



nom[80]=

"image"
;


int



*pnumber=&imnumber;


int



*pimnumero=&imnumero;



int



counter=0;


for
(;counter<*pnumber;)

{


for
(

int
i = 0; i< 80;i++) {

name[i] = 0;


//sprintf_s(name,"image%03d.bmp", imnumero);




sprintf_s(name,




"%s.%d.bmp"
, nom, imnumero);}

counter++;

dialog_expert::pictureBox1->Image->Save(


"c:\\name"
);*pimnumero+=1;

}

}

Dès que je compile ça m'affiche un message du genre:




dialog_expert.obj : error LNK2022: échec de l'opération sur les métadonnées (80131187) : Déclarations de méthodes incohérentes dans des types dupliqués
dialog_expert.obj : error LNK2022: échec de l'opération sur les métadonnées (80131187) : Déclarations de méthodes incohérentes dans des types dupliqués


dialog_expert.obj : error LNK2022: échec de l'opération sur les métadonnées (801311D6) : Nombre différent de méthodes dans des types dupliqués
dialog_expert.obj : error LNK2022: échec de l'opération sur les métadonnées (80131188) : Déclarations de champs incohérentes dans des types dupliqués
dialog_expert.obj : error LNK2022: échec de l'opération sur les métadonnées (80131188) : Déclarations de champs incohérentes dans des types dupliqués
dialog_expert.obj : error LNK2022: échec de l'opération sur les métadonnées (801311D7) : Nombre différent de champs dans des types dupliqués
Image_visible.obj : error LNK2022: échec de l'opération sur les métadonnées (80131187) : Déclarations de méthodes incohérentes dans des types dupliqués
Image_visible.obj : error LNK2022: échec de l'opération sur les métadonnées (80131187) : Déclarations de méthodes incohérentes dans des types dupliqués
Image_visible.obj : error LNK2022: échec de l'opération sur les métadonnées (801311D6) : Nombre différent de méthodes dans des types dupliqués
Image_visible.obj : error LNK2022: échec de l'opération sur les métadonnées (80131188) : Déclarations de champs incohérentes dans des types dupliqués
Image_visible.obj : error LNK2022: échec de l'opération sur les métadonnées (80131188) : Déclarations de champs incohérentes dans des types dupliqués (types : Ekta.dialog_expert ; champs : button8) : (0x04000019).


Image_visible.obj : error LNK2022: échec de l'opération sur les métadonnées (801311D7) : Nombre différent de champs dans des types dupliqués






Merci pr vos conseils

williamc++

30 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
19 juin 2008 à 15:02
Hello,
y'a un souci dans la façon de faire: "C:\\name" est une chaine de caractères qui représente le répertoire nommé name du disque C. J'imagine que tu voulais que name soit interprété. Dans ce cas, il faut que ton sprintf soit plus complet et contienne le chemin de ton image (et pas juste le nom)

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
19 juin 2008 à 15:13
Bien sur, il faut modifier la fonction Save comme suit:
dialog_export::pictureBox1->Image->Save(name);

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
19 juin 2008 à 15:24
slt buno!
merci pr tes psites.
Mais l'erreurs persisitent tjrs

williamc++
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
19 juin 2008 à 15:39
ok, tu as ptet un souci alors dans la déclaration de ton objet dialog_export et/ou dans les prototypes de ses fonctions. Le message d'erreur semble indiqué qu'il est déclaré plusieurs fois, mais pas avec les mêmes prototypes de fonctions...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3

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

Posez votre question
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
20 juin 2008 à 15:37
J'ai trouvé ça:
http://dotnet.developpez.com/faq/cppcli/?page=conversion#chartostring
ça t'aide?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
24 juin 2008 à 18:39
Ah ok...
Sorry, j'étais à côté de la plaque.
Alors, l'idée du timer est donc, effectivement, de lancer à intervalle régulier une action. Dans ton exemple, tu as crée un timer qui, toutes les 10 secondes, appelera la fonction "OnTimedEvent()". Or toi, tu veux appeler la fonction save(), qui se trouve être la fonction button9_Click()

Dans ton cas, il te suffit donc de remplacer
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
par
aTimer.Elapsed += new ElapsedEventHandler(button9_Click);

Ai-je répondu à ta question?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
19 juin 2008 à 15:12
2e lecture: en fait, tu t'es pris la tête pour pas grand-chose. Je me suis permis de faire du ménage dans ton code:

int imnumero=12;
int imnumber=15;
char name[80];
char nom[80]="C:\\image" ;

for (int counter=0; counterImage->Save("c:\\name");
    imnumero++;
}

Sauf erreur de ma part, ce bout de code va sauvegarder 15 images: C:\image.12.bmp, C:\image.13.bmp, ..., C:\image.26.bmp

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
20 juin 2008 à 13:29
slt encore un ti souci!
mon code pour l'enregistrement d'image est:
int

imnumero=12;
int

imnumber=15;
char

name[80];
//char nom[80]="C:\\image" ;

char

nom[80]=
"c:\\image";
for

(
int counter=0; counter"%s%d.png" , nom, imnumero);

this->pictureBox1->Image->Save(name);imnumero++;

}

}

le programme n'accepte pas que je lui passe name en paramètre. Normalement, je devrais mettre de guillemets, mais comme name reuslte de sprintf_s,  je ne peux pas "name"à la fonction save .
le message d'erreur est du genre:

error C2664: 'void System::Drawing::Image::Save(System::String ^)' : impossible de convertir le paramètre 1 de 'char [80]' en 'System::String ^'

Raison : impossible de convertir de 'char *' en 'System::String ^'

Aucun opérateur de conversion défini par l'utilisateur disponible, ou

Impossible de convertir un type non managé en type managé

merci pour vos conseils.

williamc++
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
20 juin 2008 à 13:57
Attention! Tu es en train de mélanger le C++ et le C#
Du coup, il faut d'abord que tu crée un objet String (genre String maString=name;) avant de le passer en paramètre de la fonction Save.

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
20 juin 2008 à 14:38
resalut buno!
tu le declare comme cet objet string.j'essaie depuis tt à l'heure mais ça m'affiche tjrs des erreurs.
thanks
williamc++
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
20 juin 2008 à 14:55
Je ferais comme cela:
string maString = new string(name);

ça marche?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
20 juin 2008 à 15:07
ça ne reconnait pas l'identificatuer string.
ça m'affiche:
error C2065: 'string' : identificateur non déclaré

williamc++
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
20 juin 2008 à 15:17
ça ne marche pas.
ça m'affiche:
error C2065: 'string' : identificateur non déclaré

williamc++
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
20 juin 2008 à 15:37
c bon je l'ai resolu
merci bonu

williamc++
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
20 juin 2008 à 16:30
De rien...mais moi, c'est Buno

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
23 juin 2008 à 12:24
slt!le code pour l'enregistrement que j'ai écrit est finalement:
private: System::Void button9_Click(System::Object^  sender, System::EventArgs^  e){
int imnumero=12;
int imnumber=15;
char name[80];
char nom[80]= "c:\\image";




for (int counter=0; counterpictureBox1->Image->Save(gcnew String(name));


     imnumero++;
}
   }
___________________________________________________________
Mais je voudrais intégrer un chronomètre pour pouvoir déterminer l'intervalle de temps entre chaque enregistrement.
sur le site de microsoft  http://msdn.microsoft.com/fr-fr/library/k0wdddfy(VS.80).aspx
le code ressemble à ceci:
using System;
using System.Timers;

publicclass Timer2
{
    publicstaticvoid Main()
    {
                // Create a timer with a ten second interval.
        System.Timers.Timer aTimer = new System.Timers.Timer(10000);

        // Hook up the event handler for the Elapsed event.
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        // Only raise the event the first time Interval elapses.
        aTimer.AutoReset = false;
        aTimer.Enabled = true;

        Console.WriteLine("Press the Enter key to exit the program.");
        Console.ReadLine();

        // Keep the timer alive until the end of Main.
        GC.KeepAlive(aTimer);
    }

    // Specify what you want to happen when the Elapsed event is
    // raised.
    privatestaticvoid OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("Hello World!");
    }
}
Mais je n'arrive pas l'intégrer.
Merci

williamc++
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
24 juin 2008 à 09:25
Salut,
Les timers ne me semblent pas appropriés dans ce cas.
Tu n'as pas réussi avec les infos que je t'ai filées? L'objet DateTime te permet de faire ce que tu veux:: Dans ta classe, tu déclares un membre de type DateTime que t'initialise à DateTime.Now. Ensuite, à chaque enregistrement, tu fais la différence entre DateTime.Now et la valeur de ta variable membre: tu auras le delta tmeps entre chaque appel à la fonction enregistrement

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
24 juin 2008 à 17:59
slt buno! je n'ai pas consulté ma boite depuis hier.je crois ke je m'étais mal exprimé.
si tu veux mon but était de déclencher l'enregistrement après un temps donné( intervalle). et non calculer l'intervalle de temps entre chaque enregistrement. par exemple , je veux qu'il y ait 10 secondes entre le premier et le deuxième enregistrement.

Merci pour tes conseils
williamc++
0
williamcplusplus Messages postés 20 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 juin 2009
24 juin 2008 à 19:23
merci buno.
encore une dernière question.
mon intervalle de temps, je l'ai à partir d'un textbox. J'ai vu sur msdn que je peux récuperer les données entrées dans ce text box grâce à la fonction: virtual void GetDlgItem(
   int nID,
   HWND* phWnd
) const;
ou int GetWindowText(      
    HWND hWnd,
    LPTSTR lpString,
    int nMaxCount
);

mais le problème est que le compilateur ne reconnait pas item (pour la fonction getdlgitem)
Je peux par exemple écrire:

williamc++
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
25 juin 2008 à 09:27
Hello,
Attention mon petit WilliamC++, pour ton interface, tu as utilisé les WinForms. Les fonctions que tu me cite sont pour les MFC pour pour l'API Win32 directement.
Si je ne dis pas de bêtises, pour les WinForms, tu peux directement accéder au texte en faisant maTexBox.Text, aussi bien en lecture qu'en écriture d'ailleurs

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Rejoignez-nous