C# et Array non dimensionné ? - C#/.NET managed - Programmation
Marsh Posté le 26-08-2005 à 22:52:54
En tout cas, le "ref" fait pas ce que je veux...
Code :
|
Si le lance :
Code :
|
Ben ça affiche "0, " donc il n'a pas levé l'exception là où il aurait dû
Marsh Posté le 26-08-2005 à 23:04:24
quel con, si, ça marche, c'est juste que je suis un gros blaireau
faut faire un throw de l'exception
Marsh Posté le 26-08-2005 à 23:05:56
Pourquoi ne pas utiliser un ArrayList?
La classe est prevue justement pour ce genre de chose.
Marsh Posté le 26-08-2005 à 23:10:14
Bon, il ne me reste plus qu'à trouver comment faire un Array redimensionnable pour éviter de raiser l'exception exp3...
Code :
|
Marsh Posté le 26-08-2005 à 23:17:09
Arjuna a écrit : Bon, il ne me reste plus qu'à trouver comment faire un Array redimensionnable pour éviter de raiser l'exception exp3... |
T'aime pas les ArrayList ou l'équivalent en generics?
Dans system collection il a pas mal de structure de données toutes prêtes, pourquoi s'en passé
La tu va refaire la gestion d'un tableau de taille dynamique alors que le framework a deja ce qu'il te faut
Marsh Posté le 26-08-2005 à 23:49:43
ben c'est parceque je sais pas ce que c'est
je regarde ça
merci !
Marsh Posté le 27-08-2005 à 00:11:39
Yes !
Merci, ça marche super bien
Sinon, ma gestion d'erreurs, elle est pas trop pourrie ?
Code :
|
Code :
|
Marsh Posté le 27-08-2005 à 02:01:22
# Node a = new Node(0,0);
# a.LinkToNode(ref a);
c'est le truc le plus stupide que j'ai jamais vu ...
Marsh Posté le 27-08-2005 à 19:04:25
Arjuna a écrit : |
Bon j'ai un peu de temps pour repondre a cette question, il existe deux types de type( ) en csharp les types passés par référence, et ceux passés par valeur.
Les classes sont des types passés par référence, tu n'as donc pas besoin de te trainer des ref partout dans ton code.
Des petit bout de l'aide de csharp a ce sujet(comme toujours je te conseille fortement d'aller y mettre le nez dedans ):
Citation : class |
Marsh Posté le 28-08-2005 à 14:10:33
Taz a écrit : # Node a = new Node(0,0); |
Ouais, Arjuna, c'est pas glop ta 2eme ligne (pkoi lier un node à lui meme ? tu risque de faire des boucle infinies en parcourant ton arbre. Pi, inutile de passer une ref).
Marsh Posté le 28-08-2005 à 18:29:49
oliv5 a écrit : Ouais, Arjuna, c'est pas glop ta 2eme ligne (pkoi lier un node à lui meme ? tu risque de faire des boucle infinies en parcourant ton arbre. Pi, inutile de passer une ref). |
Peut être pour tester ce si ce code marche bien?
Code :
|
Marsh Posté le 28-08-2005 à 18:39:13
chagarou a écrit : Peut être pour tester ce si ce code marche bien?
|
C'est à ça que servent les tests unitaires normalement
Marsh Posté le 29-08-2005 à 00:11:00
Taz a écrit : # Node a = new Node(0,0); |
C'est pas stupide, c'est un test.
Quand j'aurai mon prog terminé, je ne suis pas à l'abrit d'une tentative d'une telle référence.
Je veux coder un jeu où une personne va construire une voie ferrée. Je ne suis pas à l'abri qu'un blaireau tente de créer un point dans sa ligne, puis tenter de faire un rail qui tourne sur lui-même pour revenir à ce point, sans passer par un autre point.
Marsh Posté le 29-08-2005 à 00:19:06
Sinon, pour le coup du ref et pas ref, y'a un truc qui me choque quand même.
Bon, déjà, je viens du VB, et en VB, une class aussi est passée par référence. Mais si on stipule explicitement ByVal ou ByRef, alors le comportement est différent, même si le ByVal reste de la référence.
Explication :
ByRef sur une class, ca veut dire que si je modifie les attributs de mon objets via le lien (ou pointeur) passé ByRef, alors ça modifie l'objet.
Si je tue l'objet (= Nothing) alors je détruis l'objet.
ByVal, ça marche pareil, sauf que si j'affecte à Nothing, je ne fait que détruire le pointeur, l'objet original reste actif. Y'a une autre différence, mais je ne sais plus laquelle (en tout cas, y'a pas de recopie, dans aucun des deux cas).
Vu qu'en C#, à partir du moment où on tente de passer un objet sans mettre ref alors qu'il est déclaré ref dans la méthode, il plante à la compilation. J'en déduis que lui aussi doit avoir un mécanisme qui diffère si on passe ByRef ou non.
Ceci dit, en écrivant ces lignes, je m'apperçois que c'est plutôt le comportement VB "ByVal" que je veux : je dois pouvoir déduire un lien entre deux nodes sans détruire la node liée... Donc mes ref semble erronés. En tout cas, je suis presque certain que le comportement diffère, ou alors y'a un souci dans le compilo.
Marsh Posté le 29-08-2005 à 00:20:03
masklinn a écrit : C'est à ça que servent les tests unitaires normalement |
Bah oui, je voulais juste vérifier que l'exception se levait bien en cas d'erreur.
Marsh Posté le 29-08-2005 à 00:27:56
Ah, oui, la différence entre ByVal et ByRef sur un objet en VB, c'est qu'on peut réaffecter un pointeur passé ByVal, mais pas un pointeur passé ByRef
Si je réaffecte un nouvel objet à une variable ByRef, alors je tue l'objet initial, et je le recrée avec sa nouvelle déclaration (scope global).
Si je réaffecte un nouvell objet à une variable ByVal, le lien se brise, l'objet original reste, et je crée un nouvel objet de scope local.
En y repensant, je suis sûr que ça fait pareil en C#, j'essaierai demain :
public class toto
{
public string val;
public toto(string val)
{
this.val = val
}
public string testequitue(ref toto link, string newVal)
{
link = new toto(newVal);
return link.val;
}
}
toto v1 = new toto("v1" );
Console.Write(toto.testquitue(ref toto, "v2" ));
Console.Write(toto.val);
=> Normalement, il affiche "v2v2"
Si je vire les "ref", alors normalement, à la sortie, "v2v1" devrait s'afficher.
par contre, dans les deux cas, qui le "testquitue" fait avant le new
link.val = newVal;
=> à la sortie, l'objet toto sera dans les deux cas modifié
Marsh Posté le 29-08-2005 à 00:35:18
Arjuna a écrit : Bah oui, je voulais juste vérifier que l'exception se levait bien en cas d'erreur. |
Et c'est le rôle des tests unitaires bordel
Marsh Posté le 29-08-2005 à 02:23:43
( jme fais tapper si je dis que c'est quand même vachement plus simple la notation pointeurs/* ? )
Marsh Posté le 29-08-2005 à 10:59:41
ReplyMarsh Posté le 29-08-2005 à 11:00:55
0x90 a écrit : ( jme fais tapper si je dis que c'est quand même vachement plus simple la notation pointeurs/* ? ) |
Justement, ça marche pas, et si je ne m'abuse, c'est ma question initiale...
(mais comme d'hab, les gens préfèrent critiquer la façon de coder plutôt que répondre à la question... c'est pas toujours inintéressant, mais ça sert pas toujours à grand chose si on n'a pas de réponse à sa question initiale...)
Marsh Posté le 29-08-2005 à 11:21:55
Arjuna a écrit : Et c'est quoi ça justement ?. |
Grosso merdo, ce sont les tests de validité d'une fonction, d'une classe, d'un objet, ...
Le principe, c'est qu'avant de créer un élément tu connais ses entrées/sorties et les réactions que sont censées avoir ses méthodes aux différents évènements (que ce soient des réussites, des algos ou des erreurs/exceptions).
Donc tu crées des ensembles de tests pour vérifier si l'objet réagit bien comme il le doit (lance des erreurs quand il devrait planter et sort ce qu'il devrait sortir).
T'es censé faire ça pour tous tes objets, et pour tous les cas d'utilisation (tu peux en oublier, naturellement, et quand tu t'en rends compte tu crées de nouveaux tests pour vérifier ce que tu avais oublié).
Ca permet d'être sûr que tes objets se comportement correctement quelles que soient les modifications que tu y apportes.
Dans les méthodologies agiles, et XP en particulier, les tests unitaires doivent même être écrits avant les objets testés (ou en parallèle): ils sont à la vois le carcan, le guide et la documentation de l'objet.
http://www.sdmagazine.com/columnists/martin/
pour une introduction romancée à la chose
http://butunclebob.com/ArticleS.UncleBob
pour un peu plus d'infos
Marsh Posté le 29-08-2005 à 12:26:30
Je te demande pas ce qu'est un test unitaire, j'en fais suffisament comme ça pour savoir exactement ce que c'est
Quand j'ai une fonction qui ne contiens rien que des trucs censés faires planter ma class, ou exploiter ce qu'elle fait, le tout codé à la fois en dur et avec des noms de variables bidons, je te demande justement à quoi ça te fait penser
Marsh Posté le 29-08-2005 à 12:27:31
Arjuna a écrit :
|
=> C'est pourtant suffisament explicite ! Je cherchais bien a faire planter ma classe et vérifiant que l'exception à propos des liens en boucles...
Marsh Posté le 29-08-2005 à 12:29:29
Au fait, dans un catch, je me rends compte que l'exception levée n'est pas bloquante, je peux faire un résume du code dans le try ou pas ?
Comme le "continue" après un break si mes souvenirs sont bons.
En VB, c'est "Resume Next"
Parceque faire des try {} catch {} à chaque instruction, c'est un peu lourd...
Marsh Posté le 29-08-2005 à 12:38:46
Arjuna a écrit : Je te demande pas ce qu'est un test unitaire, j'en fais suffisament comme ça pour savoir exactement ce que c'est |
T'as qu'à être clair dans tes réponses, et aprendre à faire des quotes et des multiquotes
Citation : Quand j'ai une fonction qui ne contiens rien que des trucs censés faires planter ma class, ou exploiter ce qu'elle fait, le tout codé à la fois en dur et avec des noms de variables bidons, je te demande justement à quoi ça te fait penser |
À une émulation d'un vrai framework de tests unitaire qui fonctionne
Marsh Posté le 29-08-2005 à 14:25:09
1) C'est pas à moi de répéter 25 fois ce que je viens de dire. Depuis mes deux premiers posts, je pense avoir été suffisament explicite quant à mes tests. Ca se voit à 20 kilomètres que je fais des tests sur ma class.
2) Généralement, moi c'est comme ça que je bosse : je cherche pas à faire la class d'un coup, j'avance points par point et je rempli une fonction de tests au fur et à mesure que j'ajoute des cas. Donc il est impossible que mon truc ait une tête de framework avant même qu'il soit écrit. Je rappelle aussi que je débute en C#, mais aussi niveau algo : le cheminement dans un graph, j'ai vu ça en maths à l'IUT, et j'ai non seulement jamais mis en pratique, mais en plus j'ai tout oublié. Par conséquent, j'aurai du mal à faire un code nickel chrome comme ça...
Là, ma class node est très loin d'être terminée, d'autant plus qu'afin d'optimiser le finding path computing, je veux que chaque node indique en interne quelles nodes suivre pour aller vers une node précise, ainsi que la distance. Rien que pour ça, j'ai réfléchis des heures dessus, et je n'ai aucune idée de comment faire... L'initialisation, c'est chaud, mais surtout, quand je supprime une node, ou que j'en ajoute une au milieu d'un lien existant, il faut impacter ces valeurs sans recalculer tout l'arbre.
En effet, ce que je veux modéliser dans ce graph, c'est un réseau ferroviaire. Vu qu'il y aura virtuellement des centaines de train, et certainement plusieur dizaines de milliers de nodes, je dois impérativement optimiser au maximum la recherche du plus court chemin disponible pour me rendre d'une gare à une autre : c'est à dire que je ne dois pas me contenter de suivre le plus court chemin, si un train plus lent est déjà engagé sur la voie, ou vient en sens inverse, je dois tenter de trouver une alternative... Rechercher le chemin dans un tel graph à chaque passage à une node (parceque les trains ça bouge, donc le meilleur chemin peut évoluer dans le temps), c'est la mort, ça n'avancera pas.
Mais si au contraire je fais une usine à gaz lors de la création de chaque node, c'est le contraire, le joueur ne pourra pas modéliser ses voies dans de bonnes conditions.
Bref, la tannée
Sans compter que si une node A est liée à une node B, et que cette dernière est liée à une node C, le chemin pour aller de A à C n'existe pas forcément, à cause du sens d'embranchement des voies. Encore un truc que je dois résoudre, et là c'est pas gagné
Marsh Posté le 29-08-2005 à 14:33:51
Arjuna a écrit : 1) C'est pas à moi de répéter 25 fois ce que je viens de dire. Depuis mes deux premiers posts, je pense avoir été suffisament explicite quant à mes tests. Ca se voit à 20 kilomètres que je fais des tests sur ma class. |
Et pourtant, marrant, personne a l'air d'avoir compris ça
Citation : 2) Généralement, moi c'est comme ça que je bosse : je cherche pas à faire la class d'un coup, j'avance points par point et je rempli une fonction de tests au fur et à mesure que j'ajoute des cas. Donc il est impossible que mon truc ait une tête de framework avant même qu'il soit écrit. |
Et alors?
Je vois pas en quoi ça empêche d'utiliser les frameworks de tests unitaires existants (NUnit ou CSUnit en C#)
Ni même d'écrire les tests avant d'avoir implémenté les actions dans la classe
edit: tu devrais aller voir les liens que je t'ai filés, quand même
Marsh Posté le 29-08-2005 à 15:15:26
Ben voilà, au lieu de me parler de tests unitaire, donne l'info complète. Il s'agit donc d'une fonction de VS. C'est peut-être ça le plus intéressant dans ton post non ?
Ceci dit, franchement, je ne vois pas l'intérêt d'utiliser ces trucs, m'enfin si ça peut te faire plaisir, je peux toujours aller voir à quoi ça ressemble.
Sinon, là je suis au boulot. Je suis allé vite fait suivre tes liens et euh... Nan, pas moyen, je me coltine pas les 25 articles qu'il y a sur chaque page pour trouver lequel est intéressant... Si t'avais un lien direct vers l'utilisation de ces trucs, ça m'arrangerait un peu.
J'en chie déjà assez avec l'algo pour pas m'emmerder à passer la soirée à chaque fois que je veux me documenter sur un truc.
Marsh Posté le 29-08-2005 à 15:22:30
Arjuna a écrit : Ben voilà, au lieu de me parler de tests unitaire, donne l'info complète. Il s'agit donc d'une fonction de VS. C'est peut-être ça le plus intéressant dans ton post non ? |
C'est pas une fonction de Visual Studio
Ptin, tu me dis que tu connais les tests unitaires mais tu ne sais même pas qu'existent des frameworks de test
Citation : Ceci dit, franchement, je ne vois pas l'intérêt d'utiliser ces trucs, m'enfin si ça peut te faire plaisir, je peux toujours aller voir à quoi ça ressemble. |
À automatiser et systémiser les tests unitaires et à disposer d'un ensemble de fonctions d'assertions standard
Citation : Sinon, là je suis au boulot. Je suis allé vite fait suivre tes liens et euh... Nan, pas moyen, je me coltine pas les 25 articles qu'il y a sur chaque page pour trouver lequel est intéressant... Si t'avais un lien direct vers l'utilisation de ces trucs, ça m'arrangerait un peu. |
Ce ne sont pas des tutoriels, ce sont des présentations "en cas réel" sur la méthodologie XP, vu que tu ne sembles pas savoir comment ça fonctionne
Citation : J'en chie déjà assez avec l'algo pour pas m'emmerder à passer la soirée à chaque fois que je veux me documenter sur un truc. |
Marsh Posté le 29-08-2005 à 15:54:43
Bon, ben écoute. Désolé de te décevoir, mais je ne vois pas à quoi ça pourrait me servir ton truc si c'est juste encapsuler mes tests dans une classe spécifique.
Je suis pas en train de faire un FrameWork, je fais juste une classe qui va me servir pour mon programme. J'ai rien à redistribuer, et une fois mes tests validés, je n'ai aucune utilité de les garder dans un coin.
On a chacun notre méthode pour faire les tests unitaires, et visiblement c'est pas la même. Moi, je bosse tout seul, alors faire un truc super découpé dans tous les sens et super architecturé, ça me servira à rien mise à part me faire perdre mon temps. L'important dans un jeu de test, c'est qu'il soit réfléchit et éxécuté avec succès. Point
Marsh Posté le 29-08-2005 à 17:25:54
Arjuna a écrit : Bon, ben écoute. Désolé de te décevoir, mais je ne vois pas à quoi ça pourrait me servir ton truc si c'est juste encapsuler mes tests dans une classe spécifique. |
C'est justement le but, une architecture de test stable, avec des helpers pour facilement mettre en place les tests
Ce qui permet entre autre de lancer une suite de 500 ou 600 tests en une seule commande
Citation : une fois mes tests validés, je n'ai aucune utilité de les garder dans un coin. |
Bien sûr que si, tu vas construire des structures sur tes structures existantes, tu vas résoudre des bugs, tu vas modifier des classes... conserver et activer fréquement ses tests unitaires permet d'être sûr qu'on ne "casse" pas un module, et permet de savoir aisément ce qui a cassé.
De plus tout bug ou problème détecté résulte en la génération de tests unitaires (afin de vérifier, après patch, que le problème a bien été résolu) qui jouent simultanément le rôle de tests de non régression
Citation : c'est qu'il soit réfléchit et éxécuté avec succès |
Et qu'il reste exécuté avec succès
Marsh Posté le 29-08-2005 à 18:28:53
Arjuna a écrit : Au fait, dans un catch, je me rends compte que l'exception levée n'est pas bloquante, je peux faire un résume du code dans le try ou pas ? |
Le probleme fondamentale, c'est que C# n'est pas VB (..,4,5,6) et qu'il permet de faire des choses bien plus puissantes et propres, il ne faut pas raisonner de la meme maniere entre les 2 langage et prendre au moins les bases du C# (concernant les passage par reference ou par valeur... -> MSDN)
D'ailleur, si VB.Net tranche radicalement des précédentes version de VB, c'est qu'il est calqué sur le fonctionnement du C# (même s'il reste toujours possible de faire des choses tordues à la sauce VB)
Le Resume next etait une horreur du VB, à bannir autant que les GOTO... s'il y a exception, il faut la gerer et basta, ou alors c'est que le code est mal pensé...
dans toutes fonction on devrait retrouver une structure
Code :
|
C'est pas plus compliqué, et ça evite bien des erreurs
Marsh Posté le 29-08-2005 à 19:01:24
Le seul souci avec ton système, c'est que je veux gérer les "warning" comme des exceptions.
Par exemple, si l'utilisateur tente de faire une action interdite, je veux que dans mon code ça gère une exception, afin de traîter l'action proprement, et sans mettre des tests à toutes les sauces.
Hors, dans le cas d'un warning, moi je veux pas planter l'éxécution du code, et encore moins foutre des erreur handlers toutes les lignes, si le Resume Next utilisé à mauvais escient ("On Error Resume Next" ) il s'avère à la fois très propre et sûre quand on l'utilise correctement dans l'EventHandler.
Et je suis parfaîtement sûr qu'il existe un équivalent en C#, tout comme le "continue" dans un Break (qui pourtant est autrement plus pourri !)
Marsh Posté le 29-08-2005 à 20:42:05
Bon, histoire de faire plaisir à Masklinn, j'ai fait une classe de tests, sinon il va bouder dans son coin et va plus m'aider
Sauf que là, y'a un léger souci ! Ca fait total n'importe quoi !
Il lance des bouts de code dans tous les sens n'importe comment !!!
C'est quoi ce délire ?
Voici le code de ma class "Node" et des exceptions qui vont avec :
Code :
|
La class de test (et va pas dire que c'est pas ce qu'il faut faire sinon je t'étripe et je te noie dans ton sang )
Code :
|
Et enfin, le lancement des tests dans le Main de mon projet :
Code :
|
Sortie DEBUG :
Code :
|
C'est quoi ce délire ? Dès le début, pourquoi il passe deux fois dans mon contructeur ?
Puis fait tous les tests en double !
Et ensuite, pourquoi est-ce que pendant le "testAlreadyLinked" il écrit un débug normalement écrit dans la "testRecursiveLink" ?
Du coup, ça déconne à plein tube et à la fin il raise une erreur qui ne devrait pas se déclencher, parceque je m'escrime à faire du nettoyage dans à la fin de mes tests et normalement les nodes devraient toujours être dans un état vide à la fin de chaque test...
Marsh Posté le 30-08-2005 à 22:11:14
Problème ci-dessus résolu.
Nouvelle question à propos des Array : Est-ce qu'on peut passer outre la limitation de 2^15 - 1 lignes pour un tableau "simple" ? Ou si je dois passer par un objet ArrayList ?
Pourtant, y'a une propriété .LongLength, j'en déduit que l'index peut être un long
Marsh Posté le 26-08-2005 à 22:33:41
Salut, je suis en train d'écrire une classe "Node" me permettant de modéliser un graph.
Alors...
Une node comporte deux propriétés A et B
Une node peut être liée à d'autres nodes
J'ai donc commencé à écrire le code suivant :
Sauf qu'évidement, il n'aime pas "Node[] linkedNodes = new Node[];".
Si je ne fais pas de "new", alors il n'aime pas plus, il m'indique que pour pouvoir utiliser mon array, je dois l'avoir instancié avec un new.
Comment faire ?
Deplus, plutôt que me trimballer des "ref" un peu partout, j'aurais préféré utiliser des pointeurs. C'est quoi la différence d'ailleurs entre un "ref" et un pointeur ? Un "ref", ça correspond bien à un "*variable" ou si ça n'a rien à voir ? (si c'est le cas, alors ça devrait aller)
M'enfin mon vrai problème pour le moment, c'est ce array.
Ca m'ennuie de le dimensionner à l'avance, car non seulement je vais me retrouver avec une limitation en nombre de nodes liées à une node, mais en plus, et surtout, je sais pas trop ce que je vais mettre dedans ! Des valeurs "null" ?
Message édité par Arjuna le 26-08-2005 à 22:38:57