Visual c++, fonction save [Résolu]

williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 19 juin 2008 à 14:45 - Dernière réponse : williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention
- 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++
Afficher la suite 

30 réponses

Répondre au sujet
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 19 juin 2008 à 15:02
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BunoCS
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 19 juin 2008 à 15:13
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BunoCS
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 19 juin 2008 à 15:24
+3
Utile
slt buno!
merci pr tes psites.
Mais l'erreurs persisitent tjrs

williamc++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de williamcplusplus
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 19 juin 2008 à 15:39
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BunoCS
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 20 juin 2008 à 15:37
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BunoCS
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 24 juin 2008 à 18:39
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BunoCS
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 19 juin 2008 à 15:12
0
Utile
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...
Commenter la réponse de BunoCS
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 20 juin 2008 à 13:29
0
Utile
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++
Commenter la réponse de williamcplusplus
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 20 juin 2008 à 13:57
0
Utile
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...
Commenter la réponse de BunoCS
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 20 juin 2008 à 14:38
0
Utile
resalut buno!
tu le declare comme cet objet string.j'essaie depuis tt à l'heure mais ça m'affiche tjrs des erreurs.
thanks
williamc++
Commenter la réponse de williamcplusplus
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 20 juin 2008 à 14:55
0
Utile
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...
Commenter la réponse de BunoCS
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 20 juin 2008 à 15:07
0
Utile
ça ne reconnait pas l'identificatuer string.
ça m'affiche:
error C2065: 'string' : identificateur non déclaré

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

williamc++
Commenter la réponse de williamcplusplus
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 20 juin 2008 à 15:37
0
Utile
c bon je l'ai resolu
merci bonu

williamc++
Commenter la réponse de williamcplusplus
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 20 juin 2008 à 16:30
0
Utile
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...
Commenter la réponse de BunoCS
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 23 juin 2008 à 12:24
0
Utile
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++
Commenter la réponse de williamcplusplus
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 24 juin 2008 à 09:25
0
Utile
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...
Commenter la réponse de BunoCS
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 24 juin 2008 à 17:59
0
Utile
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++
Commenter la réponse de williamcplusplus
williamcplusplus 20 Messages postés mercredi 4 juin 2008Date d'inscription 16 juin 2009 Dernière intervention - 24 juin 2008 à 19:23
0
Utile
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++
Commenter la réponse de williamcplusplus
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 25 juin 2008 à 09:27
0
Utile
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...
Commenter la réponse de BunoCS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

visual c++, fonction save - page 2