我声明以下数组
  string names[4]  = { "grass" , "smallGrassBlock" , "dirt" , "sand" };
接着
extern string names [];`
但是,当我这样做时它会崩溃:
string ss=names[0];
所有相关代码:
主要的:
     #include<stdlib.h>
        #include<windows.h>
        #include<GL/glut.h>
        #include<GL/freeglut.h>
        #include<iostream>
        #include <vector>
        #include "include/Block.h"
        #include <string>
        extern string names [];
        void initTextures();
        GLint GetTexture(string file);
        void IdleFunction();
        void removeBlock(int x,int y);
        int xOffset,yOffset = 0;
        using namespace std;
        string to_string(int number);
        void placeBlock(int x,int y);
        void drawBitmapText(char *string, float x, float y, float z);
        void reshape(int w, int h);
        void render(void);
        void keyboard(unsigned char c,int x,int y);
        void mouse(int button,int state, int x, int y);
        void arrows(int key, int x, int y );
        std::vector <Block> blockList;
        GLuint  textures[1];
        int screenXSize=800;
        int screenYSize=800;
        int selectedBlockType = 1;
        int main(int argc, char ** argv){
        blockList.push_back(Block(0,-111,-111));
        string s = blockList.at(0).getName();
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowPosition(100,100);
        glutInitWindowSize(screenXSize,screenYSize);
        glutCreateWindow("TITLE");
        glutDisplayFunc(render);
        glutReshapeFunc(reshape);
        glutKeyboardFunc(keyboard);
        glutIdleFunc(IdleFunction);
        glutSpecialFunc(arrows);
        glutMouseFunc(mouse);
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        initTextures();
        glutMainLoop();
        }
        void initTextures(){
         for(int i =0; i<=2; i++){
            string file = "C:/Users/Samuel/Documents/Documents/projects/test/MapCreator/"+names[i]+".png";
            textures[i]=GetTexture(file);
}
        }
       GLint GetTexture(std::string Filename)
{
    GLuint tex_ID;
    tex_ID = SOIL_load_OGL_texture(
                Filename.c_str(),
                SOIL_LOAD_AUTO,
                SOIL_CREATE_NEW_ID,
                SOIL_FLAG_POWER_OF_TWO
                | SOIL_FLAG_MIPMAPS
                | SOIL_FLAG_MULTIPLY_ALPHA
                | SOIL_FLAG_COMPRESS_TO_DXT
                | SOIL_FLAG_DDS_LOAD_DIRECT
                | SOIL_FLAG_INVERT_Y
                );
        if( tex_ID > 0 )
        {
            glEnable( GL_TEXTURE_2D );
            glBindTexture( GL_TEXTURE_2D, tex_ID );
            return tex_ID;
        }
        else{
            cout<<"Texture failed to load";
            return 0;
}}
        void arrows(int key, int x, int y ){
        if(key==101){
           selectedBlockType++;
           if(selectedBlockType > blockList.at(0).getTotal()){
            selectedBlockType=1;
           }
        }
        if(key==103){
            selectedBlockType--;
           if(selectedBlockType < 0){
            selectedBlockType=blockList.at(0).getTotal();
           }
        }
        }
        void IdleFunction()
{
    glutPostRedisplay();
}
        void mouse(int button,int state, int x, int y){
y+=15;
x-=15;
            if(button==GLUT_RIGHT_BUTTON){
        removeBlock(x,y);
            }
             if(button==GLUT_LEFT_BUTTON){
        placeBlock(x,y);
            }
        }
        void keyboard(unsigned char c,int x,int y){
    //wasd
        if(c==119){
           yOffset+=30;
        }
        if(c==97){
            xOffset-=30;
        }
            if(c==115){
            yOffset-=30;
        }
        if(c==100){
            xOffset+=30;
        }
            if (c==27){
                exit(0);
            }
        }
    void removeBlock(int x, int y){
    y-= yOffset;
    x+=xOffset;
    y-=400;
    y*=-1;
    y+=400;
int xmod = x%30;
    x-=xmod;
    if(xmod>=15){
        x+=30;
    }
    int ymod = y%30;
    y-=ymod;
    if(ymod>=15){
        y+=30;
    }
   for(int i = 0; i<blockList.size();i++){
        if(blockList.at(i).getX()==x){
           if(blockList.at(i).getY()==y){
            blockList.erase(blockList.begin()+i);
           }
        }
    }
    }
        void placeBlock(int x, int y){
            y-= yOffset;
            x+=xOffset;
    y-=400;
    y*=-1;
    y+=400;
    //gets it on the grid lines
    int xmod = x%30;
    x-=xmod;
    if(xmod>=15){
        x+=30;
    }
    int ymod = y%30;
    y-=ymod;
    if(ymod>=15){
        y+=30;
    }
    bool there=false;
    for(int i = 0; i<blockList.size();i++){
        if(blockList.at(i).getXMin()<=x&&blockList.at(i).getXMax()>=x&&blockList.at(i).getYMin()<=y&&blockList.at(i).getYMax()>=y){
            there=true;
            cout<<"cannot place there!"<<endl;
        }
    }
    if(!there){
    blockList.push_back(Block(selectedBlockType, x, y));
    }
        }
    void reshape(int w, int h)
    {
       glViewport (0, 0, (GLsizei) w, (GLsizei) h);
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
       gluOrtho2D (0, (GLdouble) 800, 0, (GLdouble) 800);
       glutReshapeWindow(screenXSize,screenYSize);
    }
    void drawBitmapText(char *string, float x, float y, float z)
    {
        char *c;
        glRasterPos3f(x, y, z);
        for (c=string; *c != '\0'; c++)
        {
            glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *c);
        }
    }
        void render(void){
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    for(int i = 0; i<blockList.size();i++){
     blockList.at(i).render(xOffset,yOffset,textures[blockList.at(i).getType()]);
    }
    glColor3f(0,0,0);
    //This creates the grid
    //Should be broken every 30
        for(float f = 0;f<800; f+=30){
        glBegin(GL_LINE_STRIP);
            glVertex2f(f,0);
            glVertex2f(f,800);
            glEnd();
            glBegin(GL_LINE_STRIP);
            glVertex2f(0,f);
            glVertex2f(800,f);
            glEnd();
        }
    glColor3f(0.35,0.35,0.35);
    string s = to_string(selectedBlockType);
string ss=names[0];
cout<<"YAY"<<endl;
cout<<ss;
cout<<endl<<"Selected"<<selectedBlockType;
    s=s+" "+names[selectedBlockType];
cout<<"YAY"<<endl;
    char *c = (char*)s.c_str();
        drawBitmapText(c,5,760,0);
        glutSwapBuffers();
        glFlush();
        }
        string to_string(int number){
        string number_string = "";
        char ones_char;
        int ones = 0;
        while(true){
            ones = number % 10;
            switch(ones){
                case 0: ones_char = '0'; break;
                case 1: ones_char = '1'; break;
                case 2: ones_char = '2'; break;
                case 3: ones_char = '3'; break;
                case 4: ones_char = '4'; break;
                case 5: ones_char = '5'; break;
                case 6: ones_char = '6'; break;
                case 7: ones_char = '7'; break;
                case 8: ones_char = '8'; break;
                case 9: ones_char = '9'; break;
            }
            number -= ones;
            number_string = ones_char + number_string;
            if(number == 0){
                break;
            }
            number = number/10;
        }
        return number_string;
    }
块头:
    #ifndef BLOCK_H
#define BLOCK_H
#include <string>
#include <iostream>
#include<GL/freeglut.h>
#include <soil.h>
using namespace std;
class Block
{
    public:
        int getXMax();
        int getXMin();
        int getYMin();
        int getYMax();
        Block(int,int,int);
       int getX();
       int getY();
       static int getTotal();
       int getType();
       void render(int,int,GLuint);
       string getName();
       string getNType(int i);
        virtual ~Block();
    protected:
    private:
 int x,xsize,ysize,y,Type,size;
};
#endif // BLOCK_H
堵塞:
     #include "../include/Block.h"
        #include <string>
        #include <iostream>
        #include<GL/freeglut.h>
        #include <soil.h>
        using namespace std;
  string names[4]  = { "grass" , "smallGrassBlock" , "dirt" , "sand" };
        Block::Block(int type, int X,int Y)
        {
            size=3;
            Type=type;
            x=X;
            y=Y;
            switch(Type){
    case 0:
        xsize=546;
        ysize=217;
        break;
        case 1:
        xsize = 200;
        ysize=95;
        break;
        default:
            xsize=30;
            ysize=30;
            break;
            }
        }
         int Block:: getTotal(){
        return 3;
        }
        int Block::getX(){
            return x;
        }
        int Block::getY(){
            return y;
        }
        int Block::getXMin(){
        return x-(xsize/2);
        }
        int Block::getYMin(){
        return y-(ysize/2);
        }
        int Block::getXMax(){
        return x+(xsize/2);
        }
        int Block::getYMax(){
        return y+(ysize/2);
        }
        int Block::getType(){
        return Type;
        }
        string Block::getName(){
        return names[Type];;
        }
        string Block::getNType(int i){
        return names[i];
        }
        void Block:: render(int xOffset,int yOffset,GLuint texture){
        if(texture==0){
        }
        x-=xOffset;
        y-=yOffset;
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
         glEnable( GL_BLEND );
         glClearColor(0.0,0.0,0.0,0.0);
         glEnable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D, texture);
            glBegin(GL_POLYGON);
                glTexCoord2f(1,1);  glVertex2f(x+(xsize/2), y+(ysize/2));
              glTexCoord2f(1,0);  glVertex2f(x+(xsize/2), y-(ysize/2));
                glTexCoord2f(0,0);  glVertex2f(x-(xsize/2), y-(ysize/2));
              glTexCoord2f(0,1);  glVertex2f(x-(xsize/2), y+(ysize/2));
            glEnd();
            glDisable(GL_TEXTURE_2D);
            glDisable( GL_BLEND );
            glClearColor(1.0,1.0,1.0,0.0);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
             glPopAttrib();
        x+=xOffset;
        y+=yOffset;
        }
        Block::~Block()
        {
            //dtor
        }
更多信息:程序在获取 0 以外的任何有效元素时不会崩溃,也不会提供错误消息。