Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Seyro97 en 6 Diciembre 2014, 00:33 am



Título: (Ayuda) Entender un código
Publicado por: Seyro97 en 6 Diciembre 2014, 00:33 am
Hola, ¡muy buenas forer@s! Hoy os traigo una duda un tanto elemental, es decir, bastante básica a mi parecer.

Me preguntaba si alguien tendría la amabilidad de explicarme este código. He de decir que ando muy perdido en cuanto a librerías en C++, puesto que he pasado de programar con iostream a programar con la API de Windows y OpenGL. Bueno, aquí os dejo el código (me podéis explicar, si queréis, siendo técnicos, para que tengáis que escribir menos):

Código
  1. bool CShader::loadShader(string sFile, int a_iType)
  2. {
  3.   FILE* fp = fopen(sFile.c_str(), "rt");
  4.   if(!fp)return false;
  5.  
  6.   // Get all lines from a file
  7.  
  8.   vector<string> sLines;
  9.   char sLine[255];
  10.   while(fgets(sLine, 255, fp))sLines.push_back(sLine);
  11.   fclose(fp);
  12.  
  13.   const char** sProgram = new const char*[ESZ(sLines)];
  14.   FOR(i, ESZ(sLines))sProgram[i] = sLines[i].c_str();
  15.  
  16.   uiShader = glCreateShader(a_iType);
  17.  
  18.   glShaderSource(uiShader, ESZ(sLines), sProgram, NULL);
  19.   glCompileShader(uiShader);
  20.  
  21.   delete[] sProgram;
  22.  
  23.   int iCompilationStatus;
  24.   glGetShaderiv(uiShader, GL_COMPILE_STATUS, &iCompilationStatus);
  25.  
  26.   if(iCompilationStatus == GL_FALSE)return false;
  27.   iType = a_iType;
  28.   bLoaded = true;
  29.  
  30.   return 1;
  31. }

Notas:
* No hace falta que me expliqueis esto: uiShader = glCreateShader(a_iType), esto: glShaderSource(uiShader, ESZ(sLines), sProgram, NULL); ni esto: glCompileShader(uiShader);

* Explicad solo lo que sepais, y así todos podrán ayudar y nadie se confundirá ;)

¡MUCHAS GRACIAS POR SU ATENCIÓN Y POR SU AYUDA!


Título: Re: (Ayuda) Entender un código
Publicado por: leobr6 en 6 Diciembre 2014, 15:34 pm
En lo que respecta a la primera parte del programa:

Código
  1. bool CShader::loadShader(string sFile, int a_iType)
  2. {
  3.   FILE* fp = fopen(sFile.c_str(), "rt"); /* Abre el archivo sFile para lectura (la "t" se usa para explicitar que es "texto", es un modificador adicional, que depende de la implementacion de la funcion fopen, es decir, puede ser valido como no, o ignorado -corrijanme si me equivoco-) */
  4.   if(!fp)return false;    /* Si no pudo abrir el archivo, retorna false */
  5.  
  6.   // Get all lines from a file
  7.  
  8.   vector<string> sLines;
  9.   char sLine[255];
  10.   /* La expresion que se evalua en el while obtiene las lineas desde el archivo (fp) de a 255 caracteres copiando en el arreglo de char 'sLine'. Cuando encuentra EOF (o error) retorna. */
  11.   while(fgets(sLine, 255, fp))
  12.           sLines.push_back(sLine);  /* En el cuerpo del while, en cada iteracion agrega un elemento al vector de strings 'sLines'*/
  13.   fclose(fp);    /* Cierra el archivo sFile */
  14.  
  15.   const char** sProgram = new const char*[ESZ(sLines)]; /* Crea sProgram para almacenar el vector de strings como un arreglo de char* */
  16.   FOR(i, ESZ(sLines))sProgram[i] = sLines[i].c_str(); /* Convierte cada string del vector a un string de c (char*) y lo almacena en sProgram */
  17.  
  18.   uiShader = glCreateShader(a_iType);
  19.  
  20.   glShaderSource(uiShader, ESZ(sLines), sProgram, NULL);
  21.   glCompileShader(uiShader);
  22.  
  23.   delete[] sProgram; /* Elimina el arreglo de chars sProgram */
  24.  
  25.   int iCompilationStatus;
  26.   glGetShaderiv(uiShader, GL_COMPILE_STATUS, &iCompilationStatus);
  27.  
  28.   if(iCompilationStatus == GL_FALSE)return false;
  29.   iType = a_iType;
  30.   bLoaded = true;
  31.  
  32.   return 1;
  33. }
  34.  

Saludos


Título: Re: (Ayuda) Entender un código
Publicado por: Seyro97 en 6 Diciembre 2014, 17:05 pm
¡Muchas gracias! Creo que ya lo entiendo :D