2012-01-29 9 views
0

私は、与えられたすべてのコードを実行しているように見えるアプリケーションを持っていますが、 "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 
+1

'extractVals'の出力は何ですか?許可されている範囲を超えないように安全性が含まれていません。 –

+0

ExtractValsの出力を追加 – meriley

答えて

1

のためにこれは、Visual Studioあなたがスタックをゴミ箱に何かをした

:)あなたを助けています。

display()内のcommandCpy []とcmdTok []は、私が探し始める最初の場所の2つです。

ExtractVals(に渡され、CMDで終端されていない文字列[]は、)、またMSVCデバッガ内のコードを通じて:)

ステップ探すための素晴らしい場所です - を直接表示することができます必要があります問題!

+0

私はArgvからファイルIOを使用せずにプログラムを実行し、もっと多くの情報を得ました。問題は確かにcommandCpyでした – meriley

関連する問題