IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Problème de pointeurs avec un tableau


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Problème de pointeurs avec un tableau
    Bonjour,

    J'essaye de mettre les coordonees d'un poyedre compose de triangles dans deux tableaux.
    Le premier contient les coordonees de chaque sommet et le second indique les sommets respectifs pour chaque face.
    Je pensais utiliser des pointeurs dans le second tableau pour indiquer quel sont les points a utiliser.
    Malheuresement le compilateur (absoft) refuse cette utilisation des pointeurs:
    "the pointer-object in a pointer assignment statement must have the pointer attribute."



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
     
    real, target, dimension(3,4) :: vertex_1 ! coordonnee des points
    real, target, dimension(3,4) :: vertex_2 
     
    real, pointer, dimension (3,4) :: face_1 ! points pour chaque face
    real, pointer, dimension (3,4) :: face_2
     
    !vertex 1 - ployedron 1
    Vertex_1 (1,1) = 0
    Vertex_1 (2,1) = 5
    Vertex_1 (3,1) = 5
     
    !vertex 2 - ployedron 1
    vertex_1 (1,2) = 0
    vertex_1 (2,2) = 0
    vertex_1 (3,2) = 7
     
    !vertex 3 - ployedron 1
    vertex_1 (1,3) = 5
    vertex_1 (2,3) = 0
    vertex_1 (3,3) = 0
     
    !vertex 4 - ployedron 1
    vertex_1 (1,4) = 0
    vertex_1 (2,4) = 0
    vertex_1 (3,4) = 2
     
    !vertex 1 - ployedron 2
    Vertex_2 (1,1) = 0
    Vertex_2 (2,1) = 7
    Vertex_2 (3,1) = 5
     
    !vertex 2 - ployedron 2
    vertex_2 (1,2) = 0
    vertex_2 (2,2) = 3
    vertex_2 (3,2) = 7
     
    !vertex 3 - ployedron 2
    vertex_2 (1,3) = 5
    vertex_2 (2,3) = 3
    vertex_2 (3,3) = 0
     
    !vertex 4 - ployedron 2
    vertex_2 (1,4) = 0
    vertex_2 (2,4) = 3
    vertex_2 (3,4) = 2
     
    !face 1 - ployedron 1
    face_1 (1,1) => Vertex_1 (1,:) ! ca pose probleme a partir d'ici
    face_1 (2,1) => vertex_1 (2,:)
    face_1 (3,1) => vertex_1 (3,:)
     
    !face 2 - ployedron 1
    face_1 (1,2) => Vertex_1 (1,:)
    face_1 (2,2) => vertex_1 (3,:)
    face_1 (3,2) => vertex_1 (4,:)
     
    !face 3 - ployedron 1
    face_1 (1,3) => Vertex_1 (1,:)
    face_1 (2,3) => vertex_1 (2,:)
    face_1 (3,3) => vertex_1 (4,:)
     
    !face 4 - ployedron 1
    face_1 (1,4) => vertex_1 (2,:)
    face_1 (2,4) => vertex_1 (3,:)
    face_1 (3,4) => vertex_1 (4,:)
     
    !face 1 - ployedron 2
    face_2 (1,1) => vertex_2 (1,:)
    face_2 (2,1) => vertex_2 (2,:)
    face_2 (3,1) => vertex_2 (3,:)
     
    !face 2 - ployedron 2
    face_2 (1,2) => vertex_2 (1,:)
    face_2 (2,2) => vertex_2 (3,:)
    face_2 (3,2) => vertex_2 (4,:)
     
    !face 3 - ployedron 2
    face_2 (1,3) => vertex_2 (1,:)
    face_2 (2,3) => vertex_2 (2,:)
    face_2 (3,3) => vertex_2 (4,:)
     
    !face 4 - ployedron 2
    face_2 (1,4) => vertex_2 (2,:)
    face_2 (2,4) => vertex_2 (3,:)
    face_2 (3,4) => vertex_2 (4,:)
     
    !pour apres l'utiliser ici:
    !tester chaque arrete du premier polyedre avec chaque face du second polyedre
    do m = 1, 4 ! 4 est le nombre d'arretes du poly 1
     
    	do i = 1, 4 ! 4 est le nombre de faces du poly 2
     
    		call ray_intersecting_polygon (face_2 (1,i), face_2 (2,i), face_2 (3,i), face_1 (1,m), face_1(2,m), collision)
    		call ray_intersecting_polygon (face_2 (1,i), face_2 (2,i), face_2 (3,i), face_1 (2,m), face_1(3,m), collision)
    		call ray_intersecting_polygon (face_2 (1,i), face_2 (2,i), face_2 (3,i), face_1 (1,m), face_1(3,m), collision)
     
    	enddo
     
    enddo
    Comment resoudre mon probleme?

    Merci.

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!

    Pendant longtemps, les pointeurs ont été inconnus en Fortran; il semblent qu'ils n'ont été introduits que pour satisfaire les besoins de ceux qui les avaient utilisés dans d'autres langages, mais on peut très bien s'en passer. Je me souviens d'un cours du prof. Ch. Rapin, de l'EPF-Lausanne, qui traitait toutes les structures d'information (piles, queues, listes diverses) à l'aide de tableaux et d'indices qui étaient des entiers.

    Pour ton problème, j'essaierais par exemple
    Real*8 Vertex(1000,3)
    Integer Face(2000,3)
    en admettant que tu limites ton programme à 1000 sommets et 2000 faces.

    Bonne chance
    Jean-Marc Blanc

  3. #3
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Oui c est vrai Jean Marc,
    Dans tout les cours que j ai vu jusqu a present en Fortran, j ai pas vu la notion de Pointeurs la dedant,
    tu connais une reference qui traite les pointeur en fortran?
    merci

  4. #4
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!

    Pendant longtemps, les pointeurs ont été inconnus en Fortran; il semblent qu'ils n'ont été introduits que pour satisfaire les besoins de ceux qui les avaient utilisés dans d'autres langages, mais on peut très bien s'en passer. Je me souviens d'un cours du prof. Ch. Rapin, de l'EPF-Lausanne, qui traitait toutes les structures d'information (piles, queues, listes diverses) à l'aide de tableaux et d'indices qui étaient des entiers.

    Pour ton problème, j'essaierais par exemple
    Real*8 Vertex(1000,3)
    Integer Face(2000,3)
    en admettant que tu limites ton programme à 1000 sommets et 2000 facec.

    Bonne chance
    Jean-Marc Blanc

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par feynman Voir le message
    Oui c est vrai Jean Marc,
    Dans tout les cours que j ai vu jusqu a present en Fortran, j ai pas vu la notion de Pointeurs la dedant,
    tu connais une reference qui traite les pointeur en fortran?
    merci
    Tu pourra trouver ca dans les cours de IDRIS cours 95

    http://gershwin.ens.fr/vdaniel/Doc-L...rs.html#Chap-7

    Mais j'ai pas compris grand chose. Il doit me manquer quelques connaissances.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Sans discuter de la pertinence ou non d'utiliser des pointeurs, ton problème semble surtout être un problème de rang. Dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    real, target, dimension(3,4) :: vertex_1 ! coordonnee des points
    ...
    real, pointer, dimension (3,4) :: face_1 ! points pour chaque face
    ...
    face_1 (1,1) => Vertex_1 (1,:)
    Tu essaie d'utiliser un pointeur réel scalaire pour pointer sur un vecteur...

    Correction

    Mauvais diagnostic (voir la réponse suivante de SB). Comme on ne peut pas avoir de vecteur de pointeur, on ne peut pas avoir Pointeur(indice) => ...

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Sylvain Bergeron Voir le message
    Tu essaie d'utiliser un pointeur réel scalaire pour pointer sur un vecteur...
    Oui, c'est exactement ca mon probleme!!!
    Donc si je pointe sur l'adresse et non pas sur la valeur ca devrai fonctionner.
    Je vais essayer de faire ca.

    Merci de toutes vos reponses.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par Tom_Tom_RoF Voir le message
    Donc si je pointe sur l'adresse et non pas sur la valeur ca devrai fonctionner.
    Ça sent le programmeur C... Un pointeur Fortran, c'est plus qu'une adresse.

    Mais, Ah, j'ai trouvé où ça coince :

    En Fortran, tu ne peux pas avoir un vecteur de pointeur. Ce n'est pas prévu par le langage. La solution est de passer par des types :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type TPtrPoint
       real, pointer :: Ptr(:)
    end type
    type (TPtrPoint) :: Face(n) ! J'ai maintenant un vecteur de n pointeur (pointant sur des points 3D)
     
    ...
     
    Face(k)%Ptr => Vertex(j,:)
    ...

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Sylvain Bergeron Voir le message
    Ça sent le programmeur C
    Ce serai plutot un programmeur qui a juste approcher le C et qui doit faire un gros projet en fortran!!

    Sinon ta solution est a mon avis ce qu'il me faut.
    Reste a bien tout comprendre et a l'interger a mon code.

    Merci du coup de main!

    PS: je metterai en resolu quand je serai sur que c'est le cas.
    PPS: a a l'air bon!!! Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/05/2008, 00h55
  2. problème de code avec un tableau
    Par richard038 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/05/2006, 17h35
  3. problème de pointeur avec les listes chainees
    Par innosang dans le forum C
    Réponses: 9
    Dernier message: 30/12/2005, 15h46
  4. Problèmes de pointeurs avec les arbres
    Par thierry57 dans le forum C
    Réponses: 17
    Dernier message: 22/12/2005, 23h35
  5. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo