1

Même si c'est pas du web, ça reste du PHP, alors :
voilà, j'ai une fonction qui me construit un tableau $topo
function topologicalOrder(& $vertices) {
        [...]
        for($w = 0; $w < count($topo); $w++) {
                echo " classe de $w ", get_class($topo[$w]), " \n";
        }
        return $topo;
}

j'appelle cette fonction plus loin :
$topo = topologicalOrder($vertices);
for($w = 0; $w < count($topo); $w++) {
       echo " classe de $w ", get_class($topo[$w]), " \n";
}
for($w = 0; $w < count($topo); $w++) {
        echo " classe de $w ", get_class($topo[$w]), " \n";
        foreach($topo[$w]->out as $v) {
                $v = & $topo[$v];
              [...]
       }
}

A priori, les trois boucles for devraient afficher exactement la même chose, non ? (dans le [...], rien ne modifie $topo)
Et pourtant...

 classe de 0 scheduleVertex 
 classe de 1 scheduleVertex 
 classe de 2 scheduleVertex 
 classe de 3 scheduleVertex 
 classe de 4 scheduleVertex 
 classe de 5 scheduleVertex 
 classe de 6 scheduleVertex 
 classe de 7 scheduleVertex 
 classe de 8 scheduleVertex 
 classe de 9 scheduleVertex 
 classe de 10 scheduleVertex 
 classe de 11 scheduleVertex 
 classe de 12 scheduleVertex 
 classe de 13 scheduleVertex 
 classe de 14 scheduleVertex 
 classe de 15 scheduleVertex 
 classe de 16 scheduleVertex 
 classe de 17 scheduleVertex 
 classe de 18 scheduleVertex 
 classe de 0 scheduleVertex 
 classe de 1 scheduleVertex 
 classe de 2 scheduleVertex 
 classe de 3 scheduleVertex 
 classe de 4 scheduleVertex 
 classe de 5 scheduleVertex 
 classe de 6 scheduleVertex 
 classe de 7 scheduleVertex 
 classe de 8 scheduleVertex 
 classe de 9 scheduleVertex 
 classe de 10 scheduleVertex 
 classe de 11 scheduleVertex 
 classe de 12 scheduleVertex 
 classe de 13 scheduleVertex 
 classe de 14 scheduleVertex 
 classe de 15 scheduleVertex 
 classe de 16 scheduleVertex 
 classe de 17  
 classe de 18 scheduleVertex 

Il y a un trou pour n° 17, dans la seconde boucle for...
et dans la troisième :
 classe de 0 scheduleVertex 
 classe de 1 scheduleVertex 
 classe de 2 scheduleVertex 
 classe de 3 scheduleVertex 
 classe de 4 scheduleVertex 
 classe de 5 scheduleVertex 
 classe de 6 scheduleVertex 
 classe de 7 scheduleVertex 
 classe de 8  

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 598

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600

Warning: Invalid argument supplied for foreach() in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600
 classe de 9  

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 598

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600

Warning: Invalid argument supplied for foreach() in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600
 classe de 10  

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 598

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600

Warning: Invalid argument supplied for foreach() in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600
 classe de 11  

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 598

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600

Warning: Invalid argument supplied for foreach() in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600
 classe de 12  

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 598

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600

Warning: Invalid argument supplied for foreach() in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600
 classe de 13 scheduleVertex 
 classe de 14 scheduleVertex 
 classe de 15 scheduleVertex 

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 602

Warning: Attempt to assign property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 604

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 605

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 605

Warning: Attempt to assign property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 605
 classe de 16  

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 598

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600

Warning: Invalid argument supplied for foreach() in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600
 classe de 17  

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 598

Notice: Trying to get property of non-object in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600

Warning: Invalid argument supplied for foreach() in /Users/flanker/Documents/ecole/these/experiences/SteadyState/classes.inc on line 600
 classe de 18 scheduleVertex 


J'ai donc l'impression que des éléments de $topo sont supprimés, alors que je ne fais que des lectures dans le tableau trifus
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

2

heu, si ton tableau est gros, pour la création, tu ne ferais pas mieux de passer $tpdo en référence à ta fonction topologicalOrder ?

sinon, heu... je sèche là sad
Ancien pseudo : lolo

3

non, vu que je n'ai pas envie de faire un tri sur place.
Par contre, les objets dans le nouveau tableau sont des références à ceux de l'ancien, ça a d'ailleurs de venir de là :
si je fais des
$topo[] = & $original[$father];s la 2nde boucle for, qui disparaît quand je fais un $topo[] = $original[$father];, j'ai le trou pour n° 17 dan
mais ça ne change rien pour la 3ème boucle sad
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

4

ça serait pas une connerie du genre durée de vie de variables ? (genre du fait une copie d'un pointeur, plutot que des copie de valeurs) sur le retour de la fonction) mais la variable retourné est petit a petit effacé et reutilisé ailleurs ce qui provoque ton soucis...

(c'est une idée)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

5

Oui, je pense que c'est ça, mais je ne vois vraiment pas comment corriger ça... :/ les variables existent encore, elles n'ont pas à être effacées !
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

6

Le code de ton premier post est insuffisant pour trouver le problème, si tu utilises des références ailleurs il y a de grandes chances que ce soit ça qui fasse n'importe quoi :/

(vérifie par exemple que tu ne fais pas de "$var = null;" quand "$var" est une référence, et que tu appelles bien unset() à la place)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

Zephyr (./6) :
Le code de ton premier post est insuffisant pour trouver le problème, si tu utilises des références ailleurs il y a de grandes chances que ce soit ça qui fasse n'importe quoi :/

(vérifie par exemple que tu ne fais pas de "$var = null;" quand "$var" est une référence, et que tu appelles bien unset() à la place)

Oui, j'utilise des références un peu partout, mais uniquement en lecture seule, je ne change jamais la variable d'origine... c'est ça que je ne comprends pas sad

function topologicalOrder(& $vertices) {
        $topo = array();
        $numerical = array();
        $original = array();
        $visited = array();
        foreach($vertices as $key => & $vertex) {
                $idV = $vertex->idV;
                $numerical[$idV] = new vertex($vertex->idV, 0);
                $numerical[$idV]->out = $vertex->out;
                $numerical[$idV]->in = $vertex->in;
                $original[$idV] = & $vertex;
                $visited[$idV] = FALSE;
        }
        while(count($numerical) > 0) {
                $v = FALSE;
                // on cherche un sommet sans père
                foreach($numerical as $idV => & $vertex) {
                        if(count($vertex->in) == 0) { $v = & $vertex; break; }
                }
                if($v === FALSE) return FALSE;// le graphe contient au moins un cycle
                // on ajoute ce sommet à la fin de la liste
                $father = $v->idV;
                $topo[] = & $original[$father];
                // il faut le supprimer des parents de ses fils
                foreach($v->out as $son) {
                        foreach($numerical[$son]->in as $key => $value) {
                                if($value == $father) { unset($numerical[$son]->in[$key]); }
                        }
                }
                // on le supprime
                unset($numerical[$father]);
        }
        for($w = 0; $w < count($topo); $w++) {
                echo " classe de $w ", get_class($topo[$w]), " \n";
        }
        return $topo;
}

sachant que le tableau vertices est initialisé proprement, avec une boucle du genre
vertices[] = new vertex(.... )
(et je n'utilise que des unset)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

8

Dans ta boucle "while(count($numerical) > 0)", tu affectes à $v une référence, mais il n'y a pas de "unset" à la fin. Si ta boucle fait plus d'un tour tu vas coller un "FALSE" à la place de ton objet.

Un autre truc : vérifie que tu gagnes effectivement du temps en utilisant des références dans tes foreach, parceque même si intuitivement ça semble être intéressant, ça n'est pas toujours le cas. (je ne sais pas comment PHP s'y prend pour que ça arrive à être plus lent dans certains cas d'ailleurs, et je crois que je ne veux pas le savoir grin)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

La vraie raison d'utiliser massivement les références partout, c'est que je veux être sûr de pouvoir modifier les objets à l'emplacement d'origine ou à leur nouvel emplacement...
les perfs, je m'en fous un peu (même si le script met 2-3 secondes à s'exécuter, le calcul qui vient après peut mettre une demi-heure... – enfin, y a quand même une version du script qui meurt par manque de RAM, avec un memory_limit à 2Go tritop)

(j'ai essayé de mettre unset($v) à la fin, mais ça ne change rien)

n'empêche, j'en viens à regretter le C++ pour le coup sad
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

10

tiens, regarde ce que donne ca :

;
	$a = 'toto';
	$b = 'titi';
	$c = 'tata';
	echo $a.' - '.$b.' - '.$c.'<br>';
	
	$lst = array();
	$lst['a'] = &$a;
	$lst['b'] = &$b;
	$lst['c'] = &$c;
	
	foreach($lst as $k => $v)
	{
		$v = &$lst[$k];
	}
	echo $a.' - '.$b.' - '.$c.'<br>'


ca peut s'apparenter à ce que tu fais dans ta deuxième boucle

tu devrais donc mieux faire

foreach($topo[$w]->out as $out) { 
                $v = & $topo[$out]; 
              [...] 
       } 


pour ne pas t'auto-effacer tes références
Ancien pseudo : lolo

11

Ça avance ! plus qu'un seul problème cheeky le n° 17 de la seconde boucle for... (mais alors, pourquoi le 17 ? trifus il n'a aucune caractéristique particulière... )

$v = & $topo[$out];
Pour info, soit je fais foreach($topo[$w]->out as $out) {  
             

ais le unset($v)Soit je f, les deux fonctionnent (je fais les deux, du coup ^^)
En tout cas, merci, ça m'aide pas mal sur la compréhension des références...
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

12

pour ton dernier problème, je sèche ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

13

bon, si je remplace la ligne
]; $topo[] = & $original[$father
ther]; par $topo[] = $original[$fa
Ça marche, mais je ne comprends pas bien pourquoi... et je ne sais pas trop comment se comportent les références dans les objets copiés sad
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

14

ben je pensais à ca, mais je me suis dit que si ca venait de là, tu n'aurais pas perdu que le 17...


très zarb...
Ancien pseudo : lolo

15

Ton PHP perds la tete smile
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.