Newsgroup: it.comp.lang.c++
Titolo: Perchè non funziona questo codice????

ho trovato questo codice nel cd-rom allegato ad una rivista di
programmazione ma non riestco a farlo girare sul mio computer perchč??.
Utilizzo un compilatore borland c++ 5.01.
Il linker mi dą l'errore  " unresolved external 'auxWireTorus' referenced
from module scena1.c "
Ho controllato e questa funzione č contenuta nella header glaux.h presente
sotto la directory c:\bc5\include\gl come specificato nelle opzioni del
progetto.
L'unica incognita per me č il file resouces.h che include. Questo non č
presente nel cd e non sņ cosa potrebbe contenere.
Naturalmente ho inserito questo file in un progetto.
Questo č il codice che ho provato.
/*
 *  Una prima semplice scena con animazione......
 */
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "GL/glaux.h"
LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);
void SetDCPixelFormat (HWND, HDC); // Procedura che definisce il Pixel
Format Descriptor.....
void InitializeRC (void);   // Isoliamo qui le inizializzazioni necessarie
per la scena....
void DrawScene (HDC, double, double); // Qui ci sono le istruzioni per
disegnare la scena....
HPALETTE hPalette = NULL;
HINSTANCE g_hInstance;
/*
 *  Funzioni principali.
 */
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpszCmdLine, int nCmdShow)
{
    static char szAppName[] = "Sphere and Torus";
 WNDCLASS wc;
    HWND hwnd;
    MSG msg;
    g_hInstance = hInstance;
 wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC) WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szAppName;
    RegisterClass (&wc);
    hwnd = CreateWindow (szAppName, szAppName,
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        HWND_DESKTOP, NULL, hInstance, NULL);
    ShowWindow (hwnd, nCmdShow);
    UpdateWindow (hwnd);
    while (GetMessage (&msg, NULL, 0, 0)) {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
    return msg.wParam;
}
/*
 *  WndProc, elabora i messagi inviati alla finestra principale.
 */
LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HDC hdc;
    static HGLRC hrc;
    GLdouble gldAspect;
    GLsizei glnWidth, glnHeight;
    static double nAngle = 0;
 static double nStep = 0;
    static UINT nTimer;
    switch (msg) {
  case WM_CREATE:
   //
   // creiamo il Rendering Context e impostiamo il timer....
         //
   hdc = GetDC (hWnd);   // ricaviamo il Device Context....
      SetDCPixelFormat (hWnd, hdc); // impostiamo il PFD...
   hrc = wglCreateContext (hdc); // creiamo il Rendering context...
   wglMakeCurrent (hdc, hrc);   // associamolo al DC....
   InitializeRC ();     // impostazioni per la scena...
   nTimer = SetTimer (hWnd, 1, 50, NULL); //creaiamo un timer...
   break;
  case WM_SIZE:
         //
   // quando la finestra cambia di dimensioni aggiusta di conseguenza la
   // viewport e la prospettiva....
   //
   glnWidth = (GLsizei) LOWORD (lParam);
   glnHeight = (GLsizei) HIWORD (lParam);
   gldAspect = (GLdouble) glnWidth / (GLdouble) glnHeight;
   glMatrixMode (GL_PROJECTION);   // scegliamo la matrice di clipping...
   glLoadIdentity ();    // azzeriamola....
   gluPerspective (30.0,           // Angolo del punto di vista
       gldAspect,      // Aspect ratio dell'area di visualizzazione
       1.0,            // Distanza minima dal piano di rappresentazione
       100.0);         // Distanza massima....
         glViewport (0, 0, glnWidth, glnHeight); // imposta la viewport
all'intera finestra....
   break;
  case WM_PAINT:
         //
   // si disegna la scena
   //
   DrawScene (hdc, nAngle, nStep);
   SwapBuffers(hdc);        // scambiamo il buffer video con quello di
lavoro...
   ValidateRect(hWnd, NULL);  // validiamo la client-area...
   break;
  case WM_TIMER:
         //
   // aggiorniamo i valori per l'animazione e forziamo il
   // ridisegno della client-area
   //
   nStep += 5.1;
   nAngle += 2;
   if (nAngle >= 360)
             nAngle = 0;
   InvalidateRect (hWnd, NULL, FALSE); // invalida la client-area,
                                       // Windows č costretto a ridisegnrla
   break;
     case WM_DESTROY:
   //
   // operazioni di uscita
   //
   wglMakeCurrent (NULL, NULL);
   wglDeleteContext (hrc);
   ReleaseDC (hWnd, hdc);
   if (hPalette != NULL) DeleteObject (hPalette);
   KillTimer (hWnd, nTimer);
   PostQuitMessage (0);
   break;
 }
 return DefWindowProc (hWnd, msg, wParam, lParam);
}
/*
 *  SetDCPixelFormat imposta il pixel format per il device context in
 *  preparazione per la creazione del rendering context.
 *
 *
 */
void SetDCPixelFormat (HWND hWnd, HDC hdc)
{
    HANDLE hHeap;
    int nColors, i;
    LPLOGPALETTE lpPalette;
    BYTE byRedMask, byGreenMask, byBlueMask;
    static PIXELFORMATDESCRIPTOR pfd = {
        sizeof (PIXELFORMATDESCRIPTOR),             // dimensione della
struttura
        1,                                          // numero di versione
        PFD_DRAW_TO_WINDOW |                        // Flags
        PFD_SUPPORT_OPENGL |
        PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,                              // RGBA pixel values
        24,                                         // 24-bit color
        0, 0, 0, 0, 0, 0,                           // non hanno
importanza....
        0, 0,                                       // Nessun alpha buffer
        0, 0, 0, 0, 0,                              // Nessun accumulation
buffer
        32,                                         // 32-bit depth buffer
        0,                                          // Nessun stencil buffer
        0,                                          // Nessun auxiliary
buffers
        PFD_MAIN_PLANE,                             // Layer type
        0,                                          // Reservato (deve
essere 0)
        0, 0, 0                                     // Nessun layer masks
    };
    int nPixelFormat;
    nPixelFormat = ChoosePixelFormat (hdc, &pfd);  // sceglie il PFD...
    SetPixelFormat (hdc, nPixelFormat, &pfd);    // lo imposta....
    DescribePixelFormat (hdc, nPixelFormat, sizeof (PIXELFORMATDESCRIPTOR),
        &pfd);  // ricava le informazioni sul PFD scelto...
 // se il PFD scelto ha necessita di una palette, allora la imposta...
 if (pfd.dwFlags & PFD_NEED_PALETTE) {
        nColors = 1 << pfd.cColorBits;
        hHeap = GetProcessHeap ();
        (LPLOGPALETTE) lpPalette = HeapAlloc (hHeap, 0,
            sizeof (LOGPALETTE) + (nColors * sizeof (PALETTEENTRY)));
        lpPalette->palVersion = 0x300;
        lpPalette->palNumEntries = nColors;
        byRedMask = (1 << pfd.cRedBits) - 1;
        byGreenMask = (1 << pfd.cGreenBits) - 1;
        byBlueMask = (1 << pfd.cBlueBits) - 1;
        for (i=0; i<nColors; i++) {
            lpPalette->palPalEntry[i].peRed =
                (((i >> pfd.cRedShift) & byRedMask) * 255) / byRedMask;
            lpPalette->palPalEntry[i].peGreen =
                (((i >> pfd.cGreenShift) & byGreenMask) * 255) /
byGreenMask;
            lpPalette->palPalEntry[i].peBlue =
                (((i >> pfd.cBlueShift) & byBlueMask) * 255) / byBlueMask;
            lpPalette->palPalEntry[i].peFlags = 0;
        }
        hPalette = CreatePalette (lpPalette);
        HeapFree (hHeap, 0, lpPalette);
        if (hPalette != NULL) {
            SelectPalette (hdc, hPalette, FALSE);
            RealizePalette (hdc);
        }
    }
}
/*
 * Inizializzazioni...
 */
void InitializeRC (void)
{
  // Qui possiamo inserire il codice per le inizializzazioni....
  // ad esempio, scegliamo il colore per lo sfondo della finestra....
  glClearColor(0.0f, 1.5f, .45f, 1.0f);
}
/*
 * Disegnamo la scena....
 *
 */
void DrawScene (HDC hdc, double nAngle, double nStep)
{
    //
    // pulisce il color ed il depth buffers.
    //
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 //
    // imposta la matrice per lo spostamento degli oggetti.....
    glMatrixMode (GL_MODELVIEW);
 glLoadIdentity ();
 glPushMatrix();
 glTranslatef(-5.0f, 0.0f, -50.0f);    // sposta l'oggetto rispetto al
centro degli assi...
 glRotatef ((GLfloat) nAngle, 0.0f, 1.0f, 0.0f); // ruota l'oggetto...
 glColor3f(1.0f, 1.0f, 1.0f);     // assegna un colore...
 auxWireTorus(4.0, 8.0);       // l'oggetto č il toroide...
 glPopMatrix();
 glPushMatrix();  // evita che le impostazioni per il nuovo oggetto, la
sfera
      // creino problemi al toroide gią presente sulla scena...
 glTranslatef (-5.0f, -0.2f, -50.0f);
    glRotatef (30.0f, 1.0f, 0.0f, 0.0f);
    glRotatef ((GLfloat) nAngle, 0.0f, 0.0f, 1.0f);
    glColor3f(1.0f, 0.0f, 0.0f);
 auxWireSphere(4.0);
 glPopMatrix();  // riattiva il toroide....
}



 
Il problema e' presto risolto: la definizione della funzione non viene
trovata; nel file glaux.h ci sara' la dichiarazione come si usa fare
negli header.
Probabilmente c'e' un file del tipo glaux.c o glaux.cpp con dentro la
definizione che non linki insieme nel progetto.
Ciao.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |


(si tratta di opengl)
Il file che devi includere nel progetto e' glaux.LIB , la libreria
statica che permette poi il collegamento dinamico a glaux.dll
ciao Bonf

from module scena1.c "
Manca un qualche opportuno PIPPO.LIB nel tuo comando di
link, per un qualche valore di PIPPO.  Includere un h, ahime`,
non necessariamente tira dentro il .LIB opportuno:-(.
Alex

ho trovato questo codice nel cd-rom allegato ad una rivista di
programmazione ma non riestco a farlo girare sul mio computer perchč??.
Utilizzo un compilatore borland c++ 5.01.
Il linker mi dą l'errore  " unresolved external 'auxWireTorus' referenced
from module scena1.c "
Ho controllato e questa funzione č contenuta nella header glaux.h presente
sotto la directory c:\bc5\include\gl come specificato nelle opzioni del
progetto.
L'unica incognita per me č il file resouces.h che include. Questo non č





aggiungi queste librerie nel progetto e vedrai che funziona.
opengl32.lib glu32.lib glaux.lib