нужна помощь в поиске, почему переменная счетчика цикла for изменяется функцией внутри цикла - PullRequest
3 голосов
/ 30 декабря 2011

функция внутри моего цикла как-то меняет значение, по которому я перебираю, и я не уверен, как.извините, если это очень плохо описано.

внутри цикла for

int k;

for( k = 0; k < 512; k++)
{
    // Discardheader(d);      // doesnt actually do anything, since it's a header.f
    int databit = Getexpecteddata(d+4*k+1);
    printf("%d ",k);
    int transmitted = Datasample(&datastate, &datalength, d+4*k+2,dataerr,dataloc, databit);
    printf("%d ",k);
    Clocksample(&clockstate, &clocklength, d+4*k+3,clockerr, transmitted); 
    printf("%d \n",k);

}

я получаю этот вывод

16 16 16
17 17 17
18 18 18
19 19 19
20 20 20
21 1 1
2 2 2
3 3 3
4 4 4

так что каким-то образом Datasample меняет значение k, как только оно достигает 21. d - тип char* d и представляет буфер, в который я читаю файл. Изменение входных файлов не меняет того, что в 21 происходит переключение.Вот код для образца данных:

int Datasample (int* state, int* length, char *d, int *type, int location, int data)
{
    int match = 1;                                  // if data sample and delayed tx match,
    if ( ((d[0] >> location) & 1) != data)
    {
        match = 0;
        if(data)
    {
        type[2]++;  
    }
    else
    {
        type[1]++;
    }   

} 

int ia;
for( ia = 7; ia>=0; ia--)                           
{
    if ( ((d[0] >> ia) & 1) == *state)          // finds an edge
    {
        *length++;
    }
    else
    {
        int distance, deviation,devflag=1;      // distance the edge is from the sample point. should be about 4
        if ( location > 3)                      // deviation is how far the distance then is from 4
        {distance = location - ia;}
        else
        {distance = ia - location;}

        deviation = abs(4-distance);

        if( (deviation >= devmax) && match && devflag)
        {
            devflag =0;    
            if(data)
            {
                type[2]++;  
            }
            else
            {   
                type[1]++;
            }   

        }
        *state = ((d[0] >> ia) & 1);
        *length = 1;
    }

}

return ((d[0] >> location) & 1);

}

что заставляет k откатиться до 1, когда он достигает 21?

заранее спасибо.я понятия не имею, что я делаю.

Ответы [ 5 ]

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

Глядя на ваш вывод, вполне возможно, что функция Datasample делает что-то смешное с памятью.

Первая проблема, которую я вижу, состоит в том, что вы передаете целое число в качестве третьего аргумента функции иуказатель ожидается.Что заставляет меня верить, что вы компилируете без включенных предупреждений.Что является реальной проблемой .

РЕДАКТИРОВАТЬ

В свете последних комментариев выясняется, что d на самом деле является указателем.Тем не менее, я придерживаюсь своего мнения, что что-то в этой функции записывается поверх k.

Поскольку используется gcc в Linux, вы можете попробовать valgrind, чтобы быстро определить проблему.Он должен предупредить вас о незаконных доступах к памяти.

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

Используйте отладчик, например, например. gdb в Linux и установить контрольную точку в k; возможно, некоторая вызванная подпрограмма переполняет свой стек вызовов ....

1 голос
/ 09 января 2012

Я не имею ни малейшего представления о том, что должна делать программа (комментарии не очень помогают, имена переменных не настолько наглядны).Основной проблемой, как представляется, является оператор *lenght++;, который ударяет указатель до неузнаваемости.Последующий *length = 1; выполняет грязную работу.

Дополнительный комментарий к стилю: предпочтительно выполнять битовые операции для беззнаковых типов;расширение знака может привести к появлению битов «1» в нежелательных местах.Также: желательно использовать беззнаковые типы для счетчиков и индексов;это приведет к более серьезному сбою программы при недостаточном потоке.

int Datasample (int *state, int *length, char *d, int *type, unsigned location, int data)
{
    int match = 1;                                  // if data sample and delayed tx match,
    int devflag = 1;        /* hoisted this variable from inner loop */
    unsigned bitpos ;     /* renamed and changed to unsigned ( location as well) */

                          /* Note: shift by zero (or negative) is undefined */
    if ( ((d[0] >> location) & 1) != data) {
        match = 0;
        if(data) type[2]++;
        else type[1]++;
    } 
                        /* Again: shift by zero is undefined */
    for( bitpos = 8; bitpos-- > 0; )                           
    {
          // find an edge
        if ( ((d[0] >> bitpos) & 1) == *state) *length += 1;
        else
        {
            int distance, deviation;
                                  // distance the edge is from the sample point. should be about 4
                                  // deviation is how far the distance then is from 4
            distance = (location > 3) ?  location - bitpos : bitpos - location;
            deviation = abs(4-distance);

            if (deviation >= devmax && match && devflag)
            {
                devflag =0;    
                if (data) type[2]++;
                else type[1]++;
            }
            *state = ((d[0] >> bitpos) & 1);
            *length = 1;
        }

    }

    return ((d[0] >> location) & 1);
}

Кстати, это ожидаемый результат для 0_patterns?

 File contains 5769 events 
 File contains 6938 errors 
 File contains 543 spill errors 
 File contains 6395 nonspill errors 
    Error       nonspill #  spill #     
    Type D      2250        451         
    Type C      0       0           
    Type B      4145        92          

    Case 1      1195        307         
    Case 2      0       20          
    Case 3      1055        124         
    Case 4      0       0           
    Case 5      0       0           
    Case 6      0       0           
    Case 7      0       0           
    Case 8      1160        9           
    Case 9      0       0           
    Case 10a    1472        39          
    Case 10b    1513        29          
    Case 10c    0       15
0 голосов
/ 30 декабря 2011

Очевидно, согласно выводу, что вы пишете в некоторый массив, который запускается за 16 элементов до k.

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

Где и как ты делаешь dataerr? Я полагаю, что, когда вы изменяете ошибку данных в функции, она переполняет размер dataerr, что, вероятно, влияет на переменную k.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...