Retourner une structure [Résolu]

Signaler
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
-
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
-
J'ai trouve un lien qui en parle... mais il me semble pas très juste:
189261 http://www.csharpfr.com/forum.v2.aspx?ID=189261

Voilà mon cas:

public struct struct_motor
{
public int OO;
public int PP;
}
....
public struct_motor motor_config;
....
motor_config = new struct_motor();

//Appel

Axe_move motor_class = new Axe_move();
motor_config =motor_class.gauche(motor_config);

//Ma class

public class Axe_move
{
//Attribu
private Test_moteur.f_moteur.struct_motor motor_struct_class;
//méthodes
public motor_struct_class gauche(Test_moteur.f_moteur.struct_motor structure_config)
{
this.motor_struct_class=structure_config;
this.motor_struct_class.OO=48;
return motor_struct_class;
}
A voir également:

15 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Ca me semble etre ca plutot :



public class Axe_move

{

//Attribu

private Test_moteur.f_moteur.
struct_motor motor_struct_class;



//méthodes



public struct_motor gauche(Test_moteur.f_moteur.
struct_motor structure_config)

{

this.motor_struct_class=structure_config;

this.motor_struct_class.OO=48;

return this.motor_struct_class;

}

Mx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
<!--StartFragment --> Attention, je crois qu'il y a eu confusion (ou incompréhension).
On reprend depuis qques messages en haut, ou tu me dis

Mon problème est comment je fais pour faire un return de ma struture dans la class motor_move ! Je suis embeté car j'utilise un thread... comment m'y prendre?

Ce que j'ai compris, c'est que tu aimerais que le Thread te retourne la structure. Pour ce faire, dans cette class (la classe contenant le Thread), tu déclares ton délégué et ton event.
Dans la fonction du Thread, (la ou tu aurais aimé faire un return), tu mets
Call_Axe(la structure que tu veux retourner);

Ensuite, depuis la classe depuis laquelle tu veux appeler ce Thread, il faut que ton objet inscrive l'évenement Call_Axe (ca ne se fait pas en instanciant)

Tiens, je t'ai fait un exemple concret, parce que sinon tu risques de galérer encore beaucoup (j'ai du mal a expliquer les choses ^^)


using
System;
using System.Threading;

namespace Test
{

public class ThreadClass
{
public delegate void MonEvent(MaStruct laStruct);
public event MonEvent monEvent;
public Thread t;

public MaStruct laStruct;

public ThreadClass(MaStruct laStruct)
{
t = new Thread(new ThreadStart(MethodeThread));
this.laStruct = laStruct;
}

public void StartThread()
{
t.Start();
}

private void MethodeThread()
{
Console.WriteLine("Lancement du thread");
laStruct.str = "bbb";
monEvent(laStruct);
}
}

public struct MaStruct
{
public string str;

}

public class CallingClass
{
MaStruct maStruct;
ThreadClass tc;

public CallingClass()
{
maStruct.str = "aaa";
Console.WriteLine("valeur de la structure avant lancement du thread " + maStruct.str);
tc = new ThreadClass(maStruct);
tc.monEvent += new Test.ThreadClass.MonEvent(tc_monEvent);
tc.StartThread();
}

private void tc_monEvent(MaStruct laStruct)
{
maStruct = laStruct;
Console.WriteLine("valeur de la structure apres lancement du thread " + maStruct.str);
Console.ReadLine();
}

public static void Main()
{
CallingClass c = new CallingClass();
}
}

Si cela ne résoud pas ton probleme, alors il faudra nous donner le code de toutes les classes incriminées, ou alors reprendre depuis le début ce qu'il ne va pas, sinon on va tourner en rond ;)

Mx
Messages postés
74
Date d'inscription
lundi 30 juin 2003
Statut
Membre
Dernière intervention
18 octobre 2006
2
public struc struct_motor

{

int OO;

int PP;

public struct_motor( int oo ,int pp)

{

OO = oo;

PP = pp;

}

}

.....

struc_motor strmotor;

strmotor = new struct_moto(1,1);

......



AP
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
encore un problème..

motor_move move = new motor_move(this.motor_struct_class);
Time_break_motor_X = new Thread(new ThreadStart(move.axe_x));

donc la j'envoie la strucutre motor_struct_class
et j'appel ma class.

dans ma classe:

private class motor_move
{
private Test_moteur.f_moteur.struct_motor motor_struct_class;
int[] v_moteur = new int[4];



public motor_move(Test_moteur.f_moteur.struct_motor structure_config)
{
this.motor_struct_class=structure_config;
}

Mon problème est comment je fais pour faire un return de ma struture dans la class motor_move ! Je suis embeté car j'utilise un thread... comment m'y prendre?

(encore juste une question bete: comment fait-on pour tester une décimal ? --> par exemple je voudrais tester :est-ce que 7.23 est plus grand que .5 ou plus petit .5 --> dans ce cas plus petit..)
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Je suis pas sur d'avoir compris, mais je te dirais que tu dois pouvoir utiliser les délégués pour retourner ta struct.

Renvoyer des données depuis un thread est une question assez recurrente
sur le site, tu dois pouvoir trouver pas mal de chose la dessus comme
ici : http://www.csharpfr.com/forum.v2.aspx?ID=373183




Pour comparer ton Decimal, tu as la méthode tonDecimal.CompareTo(); ou la méthode static Decimal.Compare();



Mx
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Le problème avec les délégates...

j'arrive pas à envoyer une structure:

ex:
normal:
delegate void Call_axe();
(envoie rien return rien..)

mais avec une structure ??
delegate structure Call_axe(); //ca passe pas.. comment faire ?

Je voudrais envoyer et la retourner..

Merci pour les decimals !
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Dans la class ou il y a ton thread tu déclares :



public delegate void CallAxeEvent(TaStruct taStruct);

public event CallAxeEvent Call_Axe;



Dans la fonction de ton thread

Call_Axe(taStruc); // Retourne ta struc




Ensuite, tu as plus qu'a inscrire ton objet a l'évenement CallAxeEvent



Par contre, essaie d'etre un peu plus clair avec tes noms d'objets ;) En tout cas, j'ai du mal a suivre moi

Mx
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Merci je vais tester ca !
Je vais faire pour être plus clair la prochaine fois!!
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Alors je résume:

Je déclare:

//Déclaration du delegate
public delegate void CallAxeEvent(Test_moteur.f_moteur.struct_motor structure_config);
//De event..
public event CallAxeEvent Call_Axe;

Puis dans ma classe:
//La stucture s'appel this.motor_struct_class dans ma class.

CallAxeEvent MoveAxe = new CallAxeEvent(motor_move.AxeXY);
this.motor_struct_class.v_pas=48;
this.motor_struct_class=MoveAxe(this.motor_struct_class); //Appel de l'autre class.

Ensuite dans mon autre class qui est : motor_move.AxeXY :

private class motor_move
{
private Test_moteur.f_moteur.struct_motor motor_struct_class;

public static void AxeXY(Test_moteur.f_moteur.struct_motor structure_AxeXY)
{
structure_AxeXY.v_pas =96;
Call_Axe(structure_AxeXY); //Pour le return..
}
}

Voilà le compilateur me marque les erreurs sont en rouge:
[C# Erreur] Motor_class.cs(24): Impossible de convertir implicitement le type 'void' en 'Test_moteur.f_moteur.struct_motor'
[C# Erreur] Motor_class.cs(61): Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'Axe_move.Call_Axe'
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Merci !! 1000 fois !!!

Je dois dire que ton code est parfait ! J'ai beaucoup appris !
C'est vraiment sympa !

Encore merci !
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Y'a pas de quoi :)



Bon courage pour la suite

Mx
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Encore juste un petit problème ! Mais beaucoup moins compliqué !

Toujours dans un retour,

Je veux revoyé ma stucture, mais je veux qu'il la renvoie quand v_end==true;

Alors le code:

public class Axe_move
{
//Attribu
private Test_moteur.f_moteur.struct_motor motor_struct_class;


public Test_moteur.f_moteur.struct_motor gauche(Test_moteur.f_moteur.struct_motor structure_config)
{


if(this.motor_struct_class.v_end==true)
{
return this.motor_struct_class; //Donc je retourne ICI ma stucture
}
}

Le problème : c'est que le compilateur me dit:
Axe_move.gauche(Test_moteur.f_moteur.struct_motor)' : tous les chemins de code ne retournent pas nécessairement une valeur

...B'en oui...ca compile si j'enleve le if... mais il faut qu'il envoie tant qu'il a pas eu la confirmation.. Comment faire ?
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Il faut que tu retourne obligatoirement une valeur, en dehors du if. ;)


Mx
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Le problème c'est que les valeurs qui m'interesse arrive 2-3 secondes après qu'il soit passé au return.. le "true" était une confirmation que les valeurs etait bien initialisées !
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Alors tu passes ta fonction a void, puis délégués, evenements, ....

Tu vas pas avoir le choix

Mx