C程序不进入循环,但直到执行所有操作

时间:2011-12-30 06:11:59

标签: c for-loop

由于某些原因,在运行程序时它拒绝输入for循环,而只是挂起。

main()
{      

    char *buffer;
    int chunk_offset, current_chunk_number, total_chunks;
    int filelen;

    filelen = ReadFileintoBuffer( buffer);  
        printf("file read \n");                             // error break point 1


    int events = filelen/eventlen;      // number of 512 + 2 32 bit events events with timecode

    int sp = 0;
    int i,j;
    int toterror[25];
    printf("file of length %d has %d events \n", filelen, events);
    printf(" i = %d \n", i);
    for( i = 0; i < events; i++)
    {
        printf("analyzed %d events of %d", i, events);
        sp=0;
        int error[13];

        Analyzeevent(buffer+i*eventlen, error);

        if(error[0])
        {
            sp = 12;
        }
        for( j =1; j < 13; j++)
        {
            toterror[j+sp] += error[j];
        }

    }
    printf("post for loop");
    Printerrs(toterror, events);
    exit(0);

}  

它将所有内容打印到i =(在这种特殊情况下为9727988),然后什么也没有。一切都停止了。知道发生了什么事吗?我学习了c ++,用c编程对我来说非常奇怪和尴尬。编译器不会抛出任何警告或任何东西

提前感谢您的帮助。

编辑:对于ring0继承了ReadFileintoBuffer的代码:

int ReadFileintoBuffer( char *buffer)
{ 
    int filelen;
    char text[200];
    printf("Input File:  " );
    scanf( "%s" ,text);
    FILE *file = 0;

    int i;


    //Open file
    file = fopen(text, "rb");
    if (!file)
    {
            fprintf(stderr, "Unable to open file \n");
        exit(0);

    }

    //Get file length
    fseek(file, 0, SEEK_END);               // find the end of the file
    filelen=ftell(file);                    // set the current pointer (currently at end from above) as file length
    fseek(file, 0, SEEK_SET);               // set pointer back to beginning of file

    //Allocate memory
    buffer=(char *)malloc(filelen+1);
    if (!buffer)
    {
        fprintf(stderr, "Memory error! \n");
                                fclose(file);
        return;
    }

    //Read file contents into buffer
    fread(buffer, filelen, 1, file);
    fclose(file);                           // clse the file, all in buffer now
    return filelen;
}

5 个答案:

答案 0 :(得分:4)

你可能会遇到一些printf的缓冲问题。尝试在for循环中添加\ n到\ n的打印。 (就像你之前的一些版画一样)

它可能正在执行所有代码,但您没有看到打印结果。

答案 1 :(得分:0)

您需要使用调试器 - gdb

这里eventlen是什么?它的类型是什么?它的价值和filelen的价值是多少?

int events = filelen/eventlen;  

您的event可能是否定的,因此拒绝进入此循环!

for( i = 0; i < events; i++)

答案 2 :(得分:0)

eventlen未在此行之前定义:

int events = filelen/eventlen; 

使用printf查看其值。

答案 3 :(得分:0)

看着

  char *buffer;
  filelen = ReadFileintoBuffer( buffer); 
似乎有些事情不对。
我们没有看到ReadFileintoBuffer的代码,但它无法以任何方式使用buffer参数:

  • buffer是未分配的字符串
  • 其值,而不是其引用,将传递给函数

因此,

    应在调用buffer之前分配
  • ReadFileintoBuffer(),例如使用malloc()或
  • 应该传递其引用,例如

    filelen = ReadFileintoBuffer( &buffer); 
    

这完全取决于ReadFileintoBuffer()函数。


根据 ReadFileintoBuffer() 代码

进行修改

代码与buffer一样存在问题。
本地buffer参数在函数中分配,但其指针值不会复制到调用者的buffer中。

有几种方法可以解决这个问题 - 如上所述,其中一种方法是将引用传递给buffer指针,而不是它对函数的值。

  filelen = ReadFileintoBuffer( &buffer); // note the &

功能本身 - buffer相关:

int ReadFileintoBuffer( char **buffer) // note the **
{ 
    // ...

    //Allocate memory ( using *buffer instead of buffer )
    *buffer=(char *)malloc(filelen+1);

    if (!*buffer)
    {
      // ...
    }

    //Read file contents into   *buffer
    fread(*buffer, filelen, 1, file);
    // ...
}

这样main()缓冲区变量分配实际上是由该函数执行的。

请注意,您批准的解决方案无法解决问题:它只会清空printf缓冲区...除非buffer已修复,否则您的程序无法正常运行。

答案 4 :(得分:0)

如果你试图通过间歇性的printf来解决一些问题,那就不要和fflush'es一起使用了。 \ n也可以这样做。或者你不能说看似挂着的应用程序。