• [^] # Re: Quel est l'intéret de la manoeuvre ?

    Posté par . En réponse au message Permutation "sure" de pointeurs en Fortran. Évalué à 1. Dernière modification le 10 janvier 2014 à 11:33.

    Je modifie un tableau de grande taille de façon itérative et je ne peux pas faire la modification sur place car les données ne sont pas indépendantes. Du coup, j’ai le tableau aux itérations n et n+1 et après chaque itération, je voudrais les permuter.

    Une solution pour éviter de permuter les pointeurs c’est avoir un indice (comme le numéro de l’itération) et de piocher dans le bon tableau en fonction de cet indice. Je finirai par adopter cette solution s’il est effectivement impossible de faire la permutation, mais elle pose plusieurs soucis :

    • mes subroutines vont dépendre d’un paramètre supplémentaire qui n’a pas véritablement de sens (ou devenir impures ce que je ne souhaite pas non plus) ;
    • je ne peux pas réutiliser l’espace de stockage pour un usage temporaire entre mes itérations, à moins de communiquer l’indice partout, ce qui modifie tout le reste du code ou me fait gaspiller plein de mémoire.

    Addendum :
    Une solution intermédiaire serait de ne pas permuter les pointeurs mais juste permuter la destination vers laquelle ils pointent (avec a1 et a2 les vrais tableaux) :

    if (mod(iteration, 2) .eq. 0) then
     p1 => a1
     p2 => a2
    else
     p1 => a2
     p2 => a1
    end if
    

    Ceci a sûrement plus de chance de survivre à l’optimisation mais ne résout pas le problème décrit dans ma question vis-à-vis de la norme. Car si le terme de droite peut toujours être une copie dans le contexte d’une subroutine, n’importe quelle association de pointeur est dangereuse si elle est faite dans une subroutine et que le pointeur peut être utilisé ailleurs que dans une subroutine appelée depuis celle où a lieu d’assignation. Dans mon cas, ça forcerait à faire l’association dans le programme principal, ce qui va à l’encontre du découpage en subroutine pour la clarté du code.