Переменная Stack Around была повреждена. Что это значит? - PullRequest
0 голосов
/ 29 января 2012

У меня есть приложение, которое, кажется, выполняет весь код, который я ему дал, но все равно выдает ошибку «Ошибка проверки времени выполнения 2 - стек вокруг« val »был поврежден».Я читал, что это может быть потому, что он получает назначение за свои пределы, но я проверил все входные данные, и все они действительны.

Мне интересно, что еще может вызвать это?чувствую, что виновник может быть в нескольких местах.Метод ExtractVals - это то, с чего я начал, и я добавил printf для проверки индексов, и все, кажется, подтвердилось.Запрет звонков нет.Этот метод переназначает значения каждому элементу массива в зависимости от строки, введенной в метод (это метод tolkenizer).Может быть, это может быть причиной ошибки?

Любые советы будут великолепны.

#include <stdio.h>
#include <stdlib.h>
#include <gl/glut.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <string.h>
#include <ctype.h>


void makeLower(char *input);
void extractVals(char *cmd, float *val);

FILE *file;
int g_mainWindow = -1;
float g_lightPos[] = {1, 1, -1, 0};
char commands [50][50];
int fileSize = -1;
int objectdrawn = 0;

int testint = 0;

void display()
{
    int i;
    char cmdTok[10] , *cmd = cmdTok;
    float val[5];
    char commandCpy[10];

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    if ( objectdrawn == 0){

        for(i = 0 ; i <= fileSize ; i++){
            strcpy(commandCpy, commands[i]);
            printf("command = %s\n", commands[i]);
            cmd = strtok(commandCpy, " \n\0");
            printf("command = %s\n", commands[i]);
            switch(*cmd){
            case 'g'://translate object
                extractVals(cmd , val);
                glTranslatef(val[0] , val[1] , val[2]);
                break;
            case 's'://scales an object
                extractVals(cmd , val);
                if (val[4] == 1.){
                    glScalef(val[0],val[0],val[0]);
                }
                else if (val[4] == 3.){
                    glScalef(val[0] , val[1] , val [2]);
                }
                break;
            case 'r'://rotates an object
                break;
            case 'c'://this can call draw cone , cube, or change colors.
                if(strcmp(cmd , "cone") == 0){
                    //printf("drawing a cone\n");
                    glColor3f(1,0,0);
                    glutSolidCone(.5 , 1 , 8, 1);
                } else if (strcmp(cmd , "cube") == 0){
                    //glutSolidCube(1);
                } else if (*cmd == 'c'){
                    extractVals(cmd , val);
                    glColor3f(val[0] , val[1], val[2]);
                }
                break;
            case 't'://draw a torus or tea pot
                break;
            case 'o'://reads a meshfile
                break;
            case 'f'://save current frame buffer.
                break;
            case 'm':
                break;
            }

        }

        objectdrawn = 1;
        i = -1;
        printf("Loop Done!");
    }



    glFlush();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    float aspect = w / (float)h;

    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION_MATRIX);
    glLoadIdentity();
    glOrtho(-aspect, aspect, -1, 1, -1, 1);
    glMatrixMode(GL_MODELVIEW_MATRIX);
}

void idle()
{   
    /* parse a command from file */
    /* store the data for later draw */
    char linebyline [50], *lineStr = linebyline;
    int i=0;

    while(!feof(file) && file != NULL){
        fgets(lineStr , 50, file);
        makeLower(lineStr);
        strcpy(commands[i] , lineStr);
        printf("lineStr = %s\n", lineStr);
        printf("command = %s\n", commands[i]);
        fileSize = i;
        i++;

    }


    glutSetWindow(g_mainWindow);
    glutPostRedisplay();
}

void makeLower(char *input)
{
    while (*input != '\0')
    {
        *input = tolower(*input);
        input++;
    }
}

/*
Using a tolenizer this extracts out values needed for other functions to draw.
*/
void extractVals(char *cmd, float *val){
    int i=0;
    cmd = strtok(NULL, " ,");
    while(cmd != NULL){
        val[i] = atof(cmd);
        printf("val[%d] is %s\n", i , cmd);
        cmd = strtok(NULL, " ,");
        i++;
        testint++;
        printf("Ran this method %d times with a index of %d\n", testint, i);
    }

    //printf("Extracted values %f %f %f\n", val[0] , val[1] , val[2]);

    val[4] = i--;
}


int main(int argc, char **argv)
{
    file = fopen(argv[1], "r");

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
    g_mainWindow = glutCreateWindow("Hello, glut");
    glClearColor(0.5, 0.5, 0.5, 0);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glLightfv(GL_LIGHT0, GL_POSITION, g_lightPos);

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);

    glutMainLoop();
    fclose(file);
}

Выходы для Vals

val[0] is 0
val[1] is 0.5
val[2] is 0

val[0] is 0.25

val[0] is 1
val[1] is 1
val[2] is 1

val[0] is 4

val[0] is 0
val[1] is -0.5
val[2] is 0

val[0] is 1
val[1] is 1
val[2] is 4

val[0] is 1
val[1] is 1
val[2] is 0

1 Ответ

1 голос
/ 29 января 2012

Это Visual Studio, помогающая вам:)

Вы сделали что-то, что сломало стек.

commandCpy [] и cmdTok [] в display () - это два первых места, которые я бы начал искать.

Неопределенная строка в cmd [], которая передается в ExtractVals (), также является отличным местом для поиска:)

Пройдите по коду в отладчике MSVC - это должно привести вас непосредственно к проблеме!

...