私は、与えられたすべてのコードを実行しているように見えるアプリケーションを持っていますが、 "Run Time Check Error 2 - 'val'の周りのスタックが壊れています。私はそれがその範囲外の課題を取得していることが原因である可能性がありますが、私はすべての入力をチェックして、すべてが有効であることを読んだ。スタック変数が壊れていました。これは何を意味するのでしょうか?
他に何が原因か分かりませんか?
私は、犯人がいくつかの場所にいる可能性があると感じます。 ExtractValsメソッドはIVEが始まった場所で、Iveはインデックスをテストするために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);
}
出力はヴァルス
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
'extractVals'の出力は何ですか?許可されている範囲を超えないように安全性が含まれていません。 –
ExtractValsの出力を追加 – meriley