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

OpenGL Discussion :

[JOGL] VBO - comportement étrange


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut [JOGL] VBO - comportement étrange
    Bonjour à tous.
    Pour un projet à la fac, je dois me mettre à JOGL. J'essaye d'afficher simplement des maillages triangulaires avec des VBO, mais au lieu d'un triceratops, j'ai des lignes dans tous les sens (quand ça ne crash pas). Le pire c'est que ça ne donne pas le même résultat entre 2 executions

    J'ai pourtant déjà codé la même chose en C sans souci et je ne fais que simplifier (pas d'éclairages, ni double buffering etc...) et adapter le code en JOGL mais ça coince et je suis à court d'idées. J'ai parcouru le forum mais n'ai rien trouvé qui colle à mon problème.

    La classe Main :
    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    public class Main implements GLEventListener, KeyListener{	
     
    	static GLU glu = new GLU();
    	static GLUT glut = new GLUT();
    	static GLAutoDrawable drawable; // pour pouvoir s'en servir dans keyPressed
    	static Frame frame = new Frame("Jogl 3D");
    	static GLCanvas canvas = new GLCanvas();
    	static Animator animator = new Animator(canvas);
    	private Mesh m;
     
    	public void display(GLAutoDrawable GLDrawable) {
    		final GL gl = GLDrawable.getGL();
    		gl.glClear (GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);	
     
    		gl.glMatrixMode (GL.GL_MODELVIEW);
    		gl.glLoadIdentity();
     
    		glu.gluLookAt(0, 0, -5, 0, 0, 0, 0, 1, 0);
     
    		m.afficher(gl);
     
    		// pour se reperer dans l'image pendant le developpement
    		gl.glPushMatrix();		
    		gl.glColor3f(0.0f, 1.0f, 0.0f); 
    		glut.glutSolidTeapot(1.);		
    		gl.glPopMatrix();	
     
    		// ...	
     
    		gl.glFlush();
    	}
     
    	@Override
    	public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
    		// TODO Auto-generated method stub
     
    	}
     
    	public void init(GLAutoDrawable GLDrawable) {
    		GLDrawable.addKeyListener(this);
    		drawable=GLDrawable;
    		final GL gl = GLDrawable.getGL();		
    		gl.glShadeModel(GL.GL_SMOOTH);
    		gl.glClearColor (0.1f, 0.1f, 0.1f, 0); 
    		gl.glClearDepth(1.0f);
    		gl.glEnable(GL.GL_DEPTH_TEST);
    		gl.glDepthFunc(GL.GL_LEQUAL);
    		gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT,GL.GL_NICEST);
     
    		gl.glPolygonMode (GL.GL_FRONT_AND_BACK, GL.GL_LINE);			
     
    		float pos[]={0f,0f,0f};
    		m = new Mesh("triceratops.off",pos,1);
    		m.creerVBO(gl);
    	}
     
        public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) {
        	final GL gl = gLDrawable.getGL();
        	if(height <= 0) {
        		height = 1;
        	}
        	float h = (float)width / (float)height;
        	gl.glMatrixMode(GL.GL_PROJECTION);
        	gl.glLoadIdentity();
        	glu.gluPerspective(50.0f, h, 1.0, 1000.0);
        	gl.glMatrixMode(GL.GL_MODELVIEW);
        	gl.glLoadIdentity();
        }
     
    	public void keyPressed(KeyEvent e) {
    		final GL gl = drawable.getGL();
    		switch (e.getKeyCode()){
    			case KeyEvent.VK_ESCAPE : 	exit();
    										break;					
    		}
     
    	}
     
    	@Override
    	public void keyReleased(KeyEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyTyped(KeyEvent e) {
    		// TODO Auto-generated method stub
     
    	}
     
    	public static void exit(){
    		frame.dispose();
    		animator.stop();
    		System.exit(0);
    	}
     
    	public static void main(String[] args) {
    		canvas.addGLEventListener(new Main());
    		frame.add(canvas);
    		frame.setSize(800, 600);
    		frame.setUndecorated(true);
    		frame.setExtendedState(Frame.MAXIMIZED_BOTH);
     
    		frame.addWindowListener(new WindowAdapter() {
    														public void windowClosing(WindowEvent e) {
    															exit();
    														}
    		    					}
    		);
    		frame.setVisible(true);
    		animator.start();
    		canvas.requestFocus();
     
    	}
     
    }
    Celle qui s'occupe des maillages et des VBO :
    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    public class Mesh {
    	private int nbSommets; // nombre de sommets du maillage
    	private int nbIndex; // nombre d'index du maillage
    	private FloatBuffer sommets; // tableau des coordonnées x,y,z des sommets du maillage
    	private IntBuffer index; // tableau des index des sommets pour les facettes triangulaires
    	private float minY; // coordonnée Y de sommet la plus petite : pour pouvoir poser le maillage sur un autre objet
    	private int[] idBufferSommets = new int[1]; // nom du buffer des sommets
    	private int[] idBufferIndex = new int[1]; // nom du buffer des index pour
    	private float[] position; // position initiale
    	private float scale; // taille
     
    	public Mesh(String nomFich, float[] pos, float sc){
    		position=pos;
    		scale=sc;
    		float centreGx=0,centreGy=0,centreGz=0;
     
    		// lecture du fichier
    		try {
    			Lecteur fichier = new Lecteur(nomFich);
    			fichier.skip(); // on saute OFF
    			nbSommets=fichier.lireInt();
    			nbIndex=fichier.lireInt();
    			fichier.skip(); // on saute le nombre de normales
     
    			//on recupere tous les sommets
    			float som[]= new float[nbSommets*3];
    			for(int i=0;i<nbSommets*3;i++){
    				som[i]=fichier.lireFloat();
    			}
     
    			// calcul du centre de gravite
    			for(int i=0;i<nbSommets*3;i=i+3){
    				centreGx=som[i]+centreGx;
    				centreGy=som[i+1]+centreGy;
    				centreGz=som[i+2]+centreGz;
    			}			
    			centreGx=centreGx/nbSommets;
    			centreGy=centreGy/nbSommets;
    			centreGz=centreGz/nbSommets;
    			// recentrage du maillage
    			for(int i=0;i<nbSommets*3;i=i+3){
    				som[i]=som[i]-centreGx;
    				som[i+1]=som[i+1]-centreGy;
    				som[i+2]=som[i+2]-centreGz;
    			}
     
    			// calcul de la plus grande coord
    			float max=Math.abs(som[0]);
    			for (int i=1;i<nbSommets*3;i++){
    				if(Math.abs(som[i])>max){
    					max=Math.abs(som[i]);
    				}
    			}
    			// redimensionnement
    			for (int i=0; i<nbSommets*3;i++){
    				som[i]=som[i]/max;
    			} 			
     
    			// remplissage du FloatBuffer
    			ByteBuffer bbSom;
    			bbSom=ByteBuffer.allocateDirect( (nbSommets*3)*BufferUtil.SIZEOF_FLOAT);
    			sommets = bbSom.asFloatBuffer().put(som);
     
    			for(int i=0;i<nbSommets*3;i=i+3){
    				System.out.println(sommets.get(i)+" "+sommets.get(i+1)+" "+sommets.get(i+2));
    			}
     
    			// calcul du plus petit Y
    			minY=som[1];
    			for(int i=1; i<nbSommets*3; i=i+3){
    				if(som[i]<minY) minY=som[i];
    			}
     
    			//on recupere les facettes
    			int ind[]= new int[nbIndex*3];
    			for(int i=0;i<nbIndex*3;i=i+3){
    				fichier.skip(); // on saute le nombre de sommets de la facette (toujours 3)
    				ind[i]=fichier.lireInt();
    				ind[i+1]=fichier.lireInt();
    				ind[i+2]=fichier.lireInt();
    			}
    			// on les mets dans le IntBuffer
    			ByteBuffer bbInd;
    			bbInd=ByteBuffer.allocateDirect( (nbIndex*3)*BufferUtil.SIZEOF_INT );
    			index = bbInd.asIntBuffer().put(ind);
     
    		} catch (Throwable e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
     
    	public void creerVBO(GL gl){
    		// VBO des sommets
    		gl.glGenBuffers(1, idBufferSommets, 0);
    		gl.glBindBuffer(GL.GL_ARRAY_BUFFER, idBufferSommets[0]);
    		gl.glBufferData(GL.GL_ARRAY_BUFFER, nbSommets*3*BufferUtil.SIZEOF_FLOAT, sommets, GL.GL_STATIC_DRAW);		
     
    		// VBO des facettes
    		gl.glGenBuffers(1, idBufferIndex, 0);
    		gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, idBufferIndex[0]);
    		gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, nbIndex*3*BufferUtil.SIZEOF_INT, index, GL.GL_STATIC_DRAW);
     
    	}
     
    	public void afficher(GL gl){
    		gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
    		gl.glBindBuffer(GL.GL_ARRAY_BUFFER, idBufferSommets[0]);
    		gl.glVertexPointer(3, GL.GL_FLOAT, BufferUtil.SIZEOF_FLOAT*3, 0);
     
    		// transformations
    		gl.glPushMatrix();
    		gl.glColor3f(0.0f, 0.0f, 1.0f);
    		gl.glTranslatef(position[0], position[1], position[2]);
    		gl.glScalef(scale, scale, scale);		
    		gl.glTranslatef(0.f, -minY, 0.f);
     
    		gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, idBufferIndex[0]);
    		gl.glDrawElements(GL.GL_TRIANGLES, nbIndex*3, GL.GL_UNSIGNED_INT, 0);
    		gl.glPopMatrix();
     
    		gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
    	}
    }
    Tant que j'y suis j'ai une autre question
    Je n'ai pas trouvé de fonction équivalente à glutPostRedisplay pour rafraichir la fenêtre. Comment on fait pour forcer le rafraichissement, dans keyPressed par exemple ? (j'ai eu ce souci en voulant switcher le mode filaire/plein avec l'appui sur 'W').

    Merci d'avance.

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Salut,

    Citation Envoyé par Ceejay Voir le message
    Comment on fait pour forcer le rafraichissement, dans keyPressed par exemple ?
    En faisant un repaint() de ton GLCanvas, ça devrait le faire

    Désolé pour le reste, mais je n'ai pas encore touché aux VBO avec Jogl
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Merci, finalement j'en ai pas besoin tout de suite mais c'est bon à savoir.
    Par contre mes VBO font toujours n'importe quoi, si quelqu'un passe par là et qu'il a une idée, ça me sauverait.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ceejay Voir le message
    Merci, finalement j'en ai pas besoin tout de suite mais c'est bon à savoir.
    Par contre mes VBO font toujours n'importe quoi, si quelqu'un passe par là et qu'il a une idée, ça me sauverait.
    En tout cas, je t'arrête tout de suite si tu laisses entendre que ça vient de JOGL. Cette API est très fiable, plusieurs jeux vidéo s'en servent dont la version bêta de Wakfu. Je vais jeter un coup d'oeil à ton code, tu as peut-être oublié un appel à rewind() ou une autre subtilité du genre, regarde le code source de mon jeu si tu veux un exemple d'utilisation correcte des VBO avec JOGL.

    Edit.: il manque en effet un appel à rewind() au moins avant que tu crées le VBO, il y a aussi quelques autres maladresses (tu ne vérifies pas la taille maximale supportée). Quant à GLUT, disons qu'on évite de s'en servir en JOGL, mieux vaut passer par AWT, créer un GLEventListener et appeler canvas.display() pour raffraîchir le GLCanvas en question.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup pour cette aide. Non non je n'entendais pas que JOGL n'est pas fiable, juste que je ne sais pas m'en servir

    J'ai juste tenté de porter naïvement mon code C en JOGL en réglant les problèmes au fur et à mesure, mais là je bloquais vraiment. Je vais suivre tes indications et ça devrait aller. Merci !

    Edit : pour GLUT, je ne m'en sers que pour afficher la teapot, en attendant que je m'en sorte avec les VBO, mais pour rafraichir je me suis débrouillé avec les canvas. Je vais donc éviter de m'en servir.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ceejay Voir le message
    Merci beaucoup pour cette aide. Non non je n'entendais pas que JOGL n'est pas fiable, juste que je ne sais pas m'en servir

    J'ai juste tenté de porter naïvement mon code C en JOGL en réglant les problèmes au fur et à mesure, mais là je bloquais vraiment. Je vais suivre tes indications et ça devrait aller. Merci !

    Edit : pour GLUT, je ne m'en sers que pour afficher la teapot, en attendant que je m'en sorte avec les VBO, mais pour rafraichir je me suis débrouillé avec les canvas. Je vais donc éviter de m'en servir.
    Normalement, avec mon exemple, tu devrais y arriver :

    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
    package drawer;
     
    import com.sun.opengl.util.BufferUtil;
    import java.nio.FloatBuffer;
    import javax.media.opengl.GL;
    import javax.media.opengl.glu.GLU;
     
     
    class StaticVertexBufferObject extends StaticVertexSet{
     
     
        private int[] id;
     
     
        StaticVertexBufferObject(float[] array,int mode){
            final GL gl=GLU.getCurrentGL();
            this.mode=mode;
            this.buffer=BufferUtil.newFloatBuffer(array.length);
            this.buffer.put(array);	
            this.buffer.position(0);
            this.id=new int[1];
            gl.glGenBuffersARB(1,id,0);
            gl.glBindBufferARB(GL.GL_ARRAY_BUFFER,id[0]);
            gl.glBufferDataARB(GL.GL_ARRAY_BUFFER,BufferUtil.SIZEOF_FLOAT*buffer.capacity(),buffer,GL.GL_STATIC_DRAW_ARB);
            this.buffer.position(0);       
        }
     
        StaticVertexBufferObject(FloatBuffer floatBuffer,int mode){
            final GL gl=GLU.getCurrentGL();
            this.mode=mode;
            this.buffer=BufferUtil.copyFloatBuffer(floatBuffer);
            this.buffer.position(0);
            this.id=new int[1];
            gl.glGenBuffersARB(1,id,0);
            gl.glBindBufferARB(GL.GL_ARRAY_BUFFER,id[0]);
            gl.glBufferDataARB(GL.GL_ARRAY_BUFFER,BufferUtil.SIZEOF_FLOAT*buffer.capacity(),buffer,GL.GL_STATIC_DRAW_ARB);
            this.buffer.position(0);
        }
     
        StaticVertexBufferObject(IVertexSet vertexSet,int mode){
            this(vertexSet.getBuffer(),mode);
        }    
     
        public void draw(){    
            final GL gl=GLU.getCurrentGL();
            //draw the vertex buffer object
            gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
            //gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
            gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
            gl.glBindBufferARB(GL.GL_ARRAY_BUFFER,id[0]);
            gl.glInterleavedArrays(VertexSet.interleavedFormat,0,0);                       
            buffer.rewind();      
            gl.glDrawArrays(mode,0,buffer.capacity()/VertexSet.primitiveCount);
            buffer.rewind();       
            gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);
            //gl.glDisableClientState(GL.GL_NORMAL_ARRAY);
            gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
        }
    }
    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
    frame.setLocation(0,0);//sets the window at the top left corner
    		frame.setUndecorated(true);//makes the decoration disappear
    		frame.setIgnoreRepaint(true);//prevents the system from calling repaint automatically   	
    	    //gets the size of the screen    
    	    screenWidth=(int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
    	    screenHeight=(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();	
    	    frame.setSize(screenWidth,screenHeight);	
    	    //bug fix : under Linux, sometimes the window was drawn below the taskbar
    	    frame.setResizable(true);
    	    //NOTA BENE: exclusive full screen mode doesn't improve the frame rate
    	    //builds a transparent cursor
    	    BufferedImage cursor=new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB);
    	    cursor.setRGB(0,0,0);
    	    frame.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(cursor,new Point(0,0),"empty cursor"));	
    	    GLCapabilities capabilities=new GLCapabilities();
    	    capabilities.setDoubleBuffered(true);//enables double buffering
    	    capabilities.setHardwareAccelerated(true);//enables hardware acceleration
    	    canvas=new GLCanvas(capabilities);
    	    //canvas.setIgnoreRepaint(true);
    	    canvas.setAutoSwapBufferMode(false);//prevents any auto buffer swapping
    	    canvas.addGLEventListener(gameView=new GameGLView(this));	
    	    canvas.addMouseMotionListener(gameMouseMotionController=new GameMouseMotionController(gameView));		
    	    canvas.addMouseListener(gameMouseMotionController);	
    	    canvas.addKeyListener(new GameKeyboardMonitor(gameView));			    
    	    gameView.display();
    	    frame.add(canvas);
    	    frame.setVisible(true);
    	    canvas.requestFocus();
    	    canvas.requestFocusInWindow();

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Encore merci^^
    J'avais recupéré ton code source et j'étais justement en train de regarder StaticVertexBufferObject et j'allais poser d'autres questions (sur le double buffering) mais ton exemple y répond.
    Je vais essayer de placer des rewind aux bons endroits et voir ce que ça donne. Et puis au pire je demanderais des précisions, faut bien être noob à un moment ou à un autre.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ceejay Voir le message
    faut bien être noob à un moment ou à un autre.
    Oui il y a un début à tout

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Au cas où certains aient le même problème que moi, je l'ai réglé en ne passant pas par des ByteBuffer pour faire des Int/FloatBuffer (ce que je faisais de base car j'avais lu sur un autre topic qu'il y avait des problèmes sinon^^) et en faisant un rewind sur chaque buffer juste avant la création des VBO.
    Merci à tous les 2 pour votre aide, ça me permet d'avancer

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

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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