I have an application that appears to be executing all the code Ive given it, but still prompting an error “Run Time Check Error 2 – stack around ‘val’ was corrupted.” I have read this could be because it is getting an assignment out of its bounds, but I checked all inputs and they are all valid.
Im curious on what else could cause this?
I feel the culprit could be in a number of places. ExtractVals method is where ive started, and Ive added a printf to test the indexes and all seems to check out. No out of bounds calls. This method does reassign values to each element of the array depending on the string inputted to the method (Its a tolkenizer method). Maybe this could be causing the error?
Any tips would be great.
#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);
}
Outputs for 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
This is Visual Studio helping you out 🙂
You did something that trashed the stack.
commandCpy[] and cmdTok[] in display() are two of the first places I’d start looking.
An unterminated string in cmd[], which is passed in to ExtractVals(), is also an excellent place to look 🙂
Step through the code in the MSVC debugger – that should take you directly to the problem!