C-программа не входит в цикл, но выполняет все до - PullRequest
2 голосов
/ 30 декабря 2011

по какой-то причине при запуске программы она отказывается вводить цикл 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 очень странно и неудобно для меня сейчас.компилятор не выдает никаких предупреждений или чего-либо еще

спасибо за вашу помощь заранее.

edit: для 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 ]

4 голосов
/ 30 декабря 2011

Возможно, у вас возникли проблемы с буферизацией в printf.Попробуйте добавить \ n к печати внутри цикла for.(Как и на некоторых предыдущих отпечатках)

Возможно, выполняется весь код, но вы не видите напечатанный результат.

0 голосов
/ 30 декабря 2011

Если вы пытаетесь поймать какую-то проблему с помощью прерывистой печати, используйте ее с fflush'es. \ n работает как таковой тоже. Или вы не можете ничего сказать, глядя на кажущееся висящее приложение.

0 голосов
/ 30 декабря 2011

Глядя на

  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 не исправлено, ваша программа не может работать правильно.

0 голосов
/ 30 декабря 2011

eventlen не определено до этой строки:

int events = filelen/eventlen; 

Используйте printf, чтобы увидеть его значение.

0 голосов
/ 30 декабря 2011

Вам необходимо использовать отладчик - gdb

Что такое eventlen здесь?Каков его тип?Каково его значение и значение filelen?

int events = filelen/eventlen;  

Возможно, ваш event отрицателен и поэтому отказывается входить в этот цикл!

for( i = 0; i < events; i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...