2015-11-28 2 views
-1

Forethought: Если это необходимо, я могу добавить определение класса. Проблема: я получаю STATUS_ACCESS_VIOLATION всякий раз, когда пытаюсь запустить эту функцию в своей программе. Мне было интересно, что происходит. Я где-то за пределами? Если бы я мог сам это сообразить. Но я не могу понять это в одиночку. Я очень близок к тому, чтобы просто нанять кого-то, чтобы отлаживать меня. Это того стоит. Так или иначе, это нужно пересмотреть и дать немного TLC. Заранее спасибо!Почему эта функция продолжает сбой?

int S_Rend::count(bitset<8> alpha, bitset<8> spec) { 

    int bn; 
    vector< bitset<8> > cnt; 
    bitset<8> curr; 
    int chmp; 

    eta = (alpha & spec); 
    theta = (alpha | spec); 

    cnt[0] = eta & alpha; 
    cnt[1] = eta | alpha; 
    cnt[2] = eta & spec; 
    cnt[3] = eta | spec; 
    cnt[4] = theta & alpha; 
    cnt[5] = theta | alpha; 
    cnt[6] = theta & spec; 
    cnt[7] = theta | spec; 
    cnt[8] = cnt[0] & cnt[5]; 
    cnt[9] = cnt[6] | cnt[1]; 
    cnt[10] = cnt[2] & cnt[7]; 
    cnt[11] = cnt[4] | cnt[3]; 

    for (int i=0;i<11;i++) 
     for (int j=i;j<=11;j++) { 
      curr = cnt[i]; 
      if (cnt[j] == curr) 
       bn++; 
      if (bn>chmp) 
       chmp=bn; 
     } 

    return chmp; 
} 

int S_Rend::s_render(ifstream& in, ofstream& out) { 

    int i, n; 
    int t; 
    int chk; 
    in >> lambda; 
    in >> size; 
    in >> delta; 
    in >> chk; 
    t=(int&)beta; 
    int bn=0; 

    while (size-1>=bn) { 
     t=s_nop((int&)t,0); 
     cred.push_back(t); 
     bn++;  
    } 

    if (cred[bn-1]==chk) 
     cout << "\nValidity Pass... Success!" << endl; 
    else { 
     printf("\nValidity Pass...Fail! %u != %u",cred[cred.size()-1],chk); 
     return 1; 
    } 

    cout << "\nWriting to Buffer..." << endl; 
    i=0; 
    spec = lambda; 
int f; 
while (bn-1>=0) { 
    alpha = (int&)cred[bn-1]; 
    f=count(alpha, spec); 
    eta = (int&)f; 
    spec ^= alpha^eta; 
    btrace.push_back(f); 
    cout << f << " "; 
    bn--; 
} 

    cout << "One more second..\n"; 

    while (i<=bn-1) { 
     delta = (int&)btrace[bn]; 
     out << (const char)(int&)delta; 
     i++; 
    } 

    cout << "\nBuffer Written... Exiting..\n"; 
    in.close(); 
    out.close(); 
    printf("*"); 
    return 0; 
} 
+2

Когда используется отладчик, который оператор (ы) вызывает проблему? Каковы значения переменных, используемых в инструкции (-ях)? –

+0

Что вы должны делать с такими линиями? 'delta = (int &) btrace [bn];'? Почему вы выполняете задание int? – PaulMcKenzie

+0

Пожалуйста, не повторяйте тот же вопрос снова и снова. Кроме того, [tag: data-mining] - это * not * bitcoin mining, очевидно. –

ответ

2

В этой точке: в то время как (млрд) { альфа = (целое &) креди [млрд]; f = count (alpha, spec);

bn == размер и размер == cred.size(), поэтому вы читаете uuside вектор. Предполагая, что креди пусто при запуске

+0

Я изменил это, и это не сработало, Джером. Это что-то еще. – thexiv

1

Наиболее очевидная проблема в том, что вы пишете (и чтение) из вектора с недоступными индексами:

int S_Rend::count(bitset<8> alpha, bitset<8> spec) 
{ 
    int bn; 
    vector< bitset<8> > cnt; 
    bitset<8> curr; 
    int chmp; 

    eta = (alpha & spec); 
    theta = (alpha | spec); 

    cnt[0] = eta & alpha; // <-- Illegal access 
    ... 
} 

Ну, мы можем остановить прямо там.

std::vector не имеет размера, поэтому он не может содержать никаких элементов. В последней строке предполагается, что vector может содержать хотя бы один элемент (позиция 0). Таким образом, это неопределенное поведение.

Размер вектора соответственно перед доступом к элементам путем вызова push_back, vector::resize, vector::insert, vector::emplace_back, или построить вектор, выпуская один из конструкторов, что размеры вектора в дополнение к его построения.

std::vector description

Так как кажется, вы хотите 12 пунктов, то вы можете построить его с 12 пунктов.

int S_Rend::count(bitset<8> alpha, bitset<8> spec) 
{ 
    int bn; 
    vector< bitset<8> > cnt(12); 
    bitset<8> curr; 
    int chmp; 

    eta = (alpha & spec); 
    theta = (alpha | spec); 

    cnt[0] = eta & alpha; // <-- ok 
    ... 
} 

Кроме того, в целях отладки помощи, вы могли бы использовать std::vector::at вместо operator [ ], чтобы получить доступ к векторным элементам. С помощью at() было бы немедленно выбрано исключение std::out_of_bounds, указывающее, что вы обращались к вектору с недопустимым индексом (вместо продолжения программы, как будто ничего не случилось).


Вторая вещь, которая кажется сомнительным является вы закидывающими std::bitset к ИНТУ ссылке, или наоборот. Как вы заметили, без броска вы получите сообщение об ошибке. Использование каста C-стиля для «закрытия компилятора» не является хорошей идеей, так как все, что вы делаете, обходит механизм безопасности типов, который C++ имеет место во время компиляции.

Если компилятор говорит вам, что «это не должно быть сделано», а затем вы переопределите его, выпустив приведение в стиле C, подготовьтесь к последствиям, если/когда ваша программа показывает неустойчивое поведение.

Чтобы правильно преобразовать между std::bitset и int, существуют методы для этого, а именно: std::to_ulong.

How to convert from bitset to an int

+0

Я все это исправил, и она бежит, как лошадь галупина, хук. Но мне интересно, если бы я просто использовал шифрование '&', как бы получить это с ключом? Я не могу найти разрушитель шифрования XOR. – thexiv

Смежные вопросы