NullReferenceException: La référence d'objet
Fermé
cutpan
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011
-
13 févr. 2011 à 13:04
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 févr. 2011 à 15:47
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 févr. 2011 à 15:47
5 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 13/02/2011 à 13:35
Modifié par KX le 13/02/2011 à 13:35
Je ne connais pas le C# mais bon je pense pouvoir t'aider quand même, car tous ces langages objets se ressemblent un peu...
Je pense que tes eleme et elem1 ne servent à rien vu le code que tu nous donnes.
En effet dans ta boucle while, tu devrais mettre directement T[i] pour le faire varier sinon ta boucle ne remonte pas les informations une à une, mais propage T[j-1]...
La confiance n'exclut pas le contrôle
Je pense que tes eleme et elem1 ne servent à rien vu le code que tu nous donnes.
En effet dans ta boucle while, tu devrais mettre directement T[i] pour le faire varier sinon ta boucle ne remonte pas les informations une à une, mais propage T[j-1]...
for (int j=1; j<T.Length; j++) { int xj = T[j].getWidth(); int yj = T[j].getHeight(); for (int i=j-1; i >= 0; i--) { int xi = T[i].getWidth(); int yi = T[i].getHeight(); if (xi>xj || (xi==xj && yi>=yj)) break; T[i+1].setWidth(xj); T[i+1].setHeight(yj); } }
La confiance n'exclut pas le contrôle
cutpan
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011
13 févr. 2011 à 14:31
13 févr. 2011 à 14:31
Merci bien pour votre réponse
En fait j'ai essayé votre proposition mais malheureusement j'ai eu la meme erreur et c'est pour l'instruction : int xj = T[j].getWidth();
j'ai pas compris pourquoi j'ai l'erreur NullReferenceException
En fait j'ai essayé votre proposition mais malheureusement j'ai eu la meme erreur et c'est pour l'instruction : int xj = T[j].getWidth();
j'ai pas compris pourquoi j'ai l'erreur NullReferenceException
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 13/02/2011 à 14:49
Modifié par KX le 13/02/2011 à 14:49
Trouve moi pour quelle valeur de j cela plante. Et donne moi aussi la valeur de T.Length...
Par exemple en faisant un affichage sur la ligne juste avant celle qui plante.
À mon avis, tu vas obtenir 100 pour T.length, et pour j tu vas avoir le nombre d'éléments de ton files et ce ne seront pas les mêmes...
Dans ce cas il faudra rajouter dans ta boucle quelquechose du genre &&T[j]!=NULL
Par exemple en faisant un affichage sur la ligne juste avant celle qui plante.
À mon avis, tu vas obtenir 100 pour T.length, et pour j tu vas avoir le nombre d'éléments de ton files et ce ne seront pas les mêmes...
Dans ce cas il faudra rajouter dans ta boucle quelquechose du genre &&T[j]!=NULL
cutpan
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011
13 févr. 2011 à 15:07
13 févr. 2011 à 15:07
T.Lengh= 5
il comprends 5 objet de type Element
chaque objet a deux propriétés width et height voici les 5 objets
obj1:width= 3 et height= 7
obj2:width= 8 et height= 1
obj3:width= 10 et height= 2
obj4:width= 5 et height= 4
obj5:width= 2 et height= 1
Mon objectif est de trier le tableau T dans l'ordre décroissants en se basant sur width des elements et dans le cas ou on a la meme valeur de width alors le tri sera en se basant sur height
public void sort ( )
{
Problem[] tab = new Problem[100];
tab = files();
Element[] T = new Element[100];
T = tab[0].getElements();
for (int j=1; j<T.Length-1; j++)
{
int x = T[j].getWidth();
int y = T[j].getHeight();
int i = j-1;
while (i >= 0 && ((T[i].getWidth() < x) || ((T[i].getWidth() == x) && (T[i].getHeight() < y))))
{ {
T[i] = T[i+1];
Console.WriteLine("dddd" + T[i].getWidth()+ T[i].getHeight());
i = i-1;
}
T[i + 1].setWidth(x);
T[i + 1].setHeight(y);
Console.WriteLine(" zzz" + T[i + 1].getWidth() + T[i + 1].getHeight());
Console.ReadLine();
}
voici l'affichage
dddd 8 1
zzz 8 1
dddd 10 2
dddd 10 2
zzz 10 2
zzz 5 4
zzz 2 1
Puis l'affichage de l'erreur
il comprends 5 objet de type Element
chaque objet a deux propriétés width et height voici les 5 objets
obj1:width= 3 et height= 7
obj2:width= 8 et height= 1
obj3:width= 10 et height= 2
obj4:width= 5 et height= 4
obj5:width= 2 et height= 1
Mon objectif est de trier le tableau T dans l'ordre décroissants en se basant sur width des elements et dans le cas ou on a la meme valeur de width alors le tri sera en se basant sur height
public void sort ( )
{
Problem[] tab = new Problem[100];
tab = files();
Element[] T = new Element[100];
T = tab[0].getElements();
for (int j=1; j<T.Length-1; j++)
{
int x = T[j].getWidth();
int y = T[j].getHeight();
int i = j-1;
while (i >= 0 && ((T[i].getWidth() < x) || ((T[i].getWidth() == x) && (T[i].getHeight() < y))))
{ {
T[i] = T[i+1];
Console.WriteLine("dddd" + T[i].getWidth()+ T[i].getHeight());
i = i-1;
}
T[i + 1].setWidth(x);
T[i + 1].setHeight(y);
Console.WriteLine(" zzz" + T[i + 1].getWidth() + T[i + 1].getHeight());
Console.ReadLine();
}
voici l'affichage
dddd 8 1
zzz 8 1
dddd 10 2
dddd 10 2
zzz 10 2
zzz 5 4
zzz 2 1
Puis l'affichage de l'erreur
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 13/02/2011 à 15:19
Modifié par KX le 13/02/2011 à 15:19
En fait ce qu'il m'intéresserait pour t'aider c'est l'affichage de ceci :
for (int j=1; j<T.Length; j++) { Console.WriteLine("j="+j+"/"+T.Length); int xj = T[j].getWidth(); int yj = T[j].getHeight(); for (int i=j-1; i >= 0; i--) { int xi = T[i].getWidth(); int yi = T[i].getHeight(); if (xi>xj || (xi==xj && yi>=yj)) break; T[i+1].setWidth(xj); T[i+1].setHeight(yj); } }
cutpan
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011
13 févr. 2011 à 15:26
13 févr. 2011 à 15:26
l'affichage c'est
j=1/ 5
j=2/5
j=3/ 5
j=4/5
j=5/5
j=1/ 5
j=2/5
j=3/ 5
j=4/5
j=5/5
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 13/02/2011 à 15:37
Modifié par KX le 13/02/2011 à 15:37
C'est étonnant que j aille jusqu'à 5 alors qu'on lui dit de ne continuer que pour j<5 !
Mais l'erreur est bien ici, puisque que T[5] n'existe pas, T[5].getWidth() génère une exception.
C'est totalement stupide, mais rajoute une instruction if (j>=T.Length) break; juste avant la commande d'affichage...
Mais l'erreur est bien ici, puisque que T[5] n'existe pas, T[5].getWidth() génère une exception.
C'est totalement stupide, mais rajoute une instruction if (j>=T.Length) break; juste avant la commande d'affichage...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
cutpan
Messages postés
6
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
13 février 2011
13 févr. 2011 à 15:42
13 févr. 2011 à 15:42
j=1/ 100
j=2/100
j=3/ 100
j=4/100
j=5/100
Mais l'erreur reste encore pour l'instruction : int xj = T[j].getWidth();
j=2/100
j=3/ 100
j=4/100
j=5/100
Mais l'erreur reste encore pour l'instruction : int xj = T[j].getWidth();
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 13/02/2011 à 15:52
Modifié par KX le 13/02/2011 à 15:52
Ah bah cet affichage me plaît mieux ;-)
Comme je le pensais T.Length est égal à 100, la taille d'allocation mémoire.
Or toi tu ne veux l'utiliser que jusqu'à 5, puisque c'est ton nombre de données.
Donc comme je le précisais plus haut, il faut que tu rajoutes une condition pour t'arrêter quand il n'y a plus de données :
Comme je le pensais T.Length est égal à 100, la taille d'allocation mémoire.
Or toi tu ne veux l'utiliser que jusqu'à 5, puisque c'est ton nombre de données.
Donc comme je le précisais plus haut, il faut que tu rajoutes une condition pour t'arrêter quand il n'y a plus de données :
for (int j=1; j<T.Length && T[j]!=null; j++) { Console.WriteLine("j="+j+"/"+T.Length); ... }