Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 8
#1

Выход за пределы массива - C++

01.07.2016, 01:30. Просмотров 303. Ответов 5
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <assert.h>
#include <assert.h>
#include <string.h>
#include <stdint.h>
#include <limits.h>
 
int get_bit(const void *in, size_t n)
{
    return (((const uint8_t*)in)[n / CHAR_BIT] & (1 << (n % CHAR_BIT))) != 0;
}
 
void set_bit(void *out, size_t n, int bit)
{
    if (bit)
        ((uint8_t*)out)[n / CHAR_BIT] |= (1 << (n % CHAR_BIT));
    else
        ((uint8_t*)out)[n / CHAR_BIT] &= ~(1 << (n % CHAR_BIT));
}
 
void flip_bit(void *out, size_t n)
{
    ((uint8_t*)out)[n / CHAR_BIT] ^= (1 << (n % CHAR_BIT));
}
 
size_t encode(void *out, const void *in, size_t in_bits)
{
    size_t i, j, k;
    unsigned s = 0;
 
    for (i = j = 0; j < in_bits; ++i) {
        if ((i + 1) & i) {
            if (get_bit(in, j))
                s ^= i + 1;
            set_bit(out, i, get_bit(in, j));
            ++j;
        }
    }
    for (k = 1; k < i; k <<= 1) {
        set_bit(out, k - 1, s & k);
    }
    return i;
}
 
size_t decode(void *out, const void *in, size_t in_bits, unsigned *out_syndrome)
{
    size_t i, j;
    unsigned s = 0;
 
    for (i = j = 0; i < in_bits; ++i) {
        if (get_bit(in, i))
            s ^= i + 1;
        if ((i + 1) & i) {
            set_bit(out, j, get_bit(in, i));
            ++j;
        }
    }
    *out_syndrome = s;
    return j;
}
 
size_t decode_and_fix(void *out, const void *in, size_t in_bits)
{
    unsigned s;
    size_t out_bits = decode(out, in, in_bits, &s);
 
    if (s && s <= in_bits && (s & (s - 1))) {
        unsigned k;
 
        for (k = 0; 1u << k < s; ++k);
        flip_bit(out, s - k - 1);
    }
    return out_bits;
}
 
int main()
{
    char habr[4] = "habr";
    char encoded[5];
    char decoded[4];
    unsigned s;
    size_t i;
 
    size_t encoded_bits = encode(encoded, habr, sizeof(habr) * CHAR_BIT);
    size_t decoded_bits = decode(decoded, encoded, encoded_bits, &s);
    assert(s == 0);
    assert(encoded_bits == sizeof(habr) * CHAR_BIT + 6);
    assert(decoded_bits == sizeof(habr) * CHAR_BIT);
    assert(memcmp(habr, decoded, sizeof(habr)) == 0);
 
    for (i = 0; i < encoded_bits; ++i) {
        flip_bit(encoded, i);
        decoded_bits = decode(decoded, encoded, encoded_bits, &s);
        decoded_bits = decode_and_fix(decoded, encoded, encoded_bits);
        assert(decoded_bits == sizeof(habr) * CHAR_BIT);
        assert(memcmp(habr, decoded, sizeof(habr)) == 0);
        flip_bit(encoded, i);
    }
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2016, 01:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выход за пределы массива (C++):

Выход за пределы массива - C++
Столкнулся со следующей проблемой. Ввожу по формату: Мой код при выполнении выдаёт ошибку. Выход за пределы массива (Access...

Выход за пределы массива - C++
Где-то здесь происходит выход за пределы массива puti, но я не могу его найти уже второй день. Объясните, пожалуйста, в чем моя проблема и...

Выход за пределы динамического массива - C++
#include &lt;iostream&gt; using namespace std; int main() { int** mas = new int*; for(int i=0; i &lt; 20; i++) mas = new...

Задача коммивояжера - выход за пределы массива - C++
Бьет ошибку! Я так понимаю где-то выход за пределы массива! Народ гляньте кто, а то я уже ничего не вижу! Может свежий взгляд увидит как...

Странно: выход за пределы статического массива - C++
if(mines=='*')++i; if(mines=='*')++i; if(mines=='*')++i; if(mines=='*')++i; if(mines=='*')++i; if(mines=='*')++i; ...

Выход за пределы массива, обработка исключения - C++
Есть такой код, когда я вызываю функцию на вывод массив еще не инициализирован, и я хочу чтобы у меня отлавливалась ошибка, но он заходит в...

5
nstwf
87 / 77 / 32
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 1
01.07.2016, 03:45 #2
C++
1
char habr[4] = "habr";
Правильно :
C++
1
char habr[5] = "habr";
Связано это с тем, что последним всегда в массиве символов будет - "\0", означающий, что это конец, а не очередной элемент, т.н. - нуль-терминал .
1
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 8
01.07.2016, 13:12  [ТС] #3
Спасибо, больше ошибок не обнаруживает, но выскакивает сообщение Run-Time Check Failure #2 - Stack around the variable 'decoded' was corrupted. Подскажите, пожалуйста в чем проблема
0
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 8
01.07.2016, 16:50  [ТС] #4
Run-Time Check Failure #2 - Stack around the variable 'decoded' was corrupted. Помогите, пожалуйста найти ошибку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <assert.h>
#include <string.h>
#include <stdint.h>
#include <limits.h>
 
int get_bit(const void *in, size_t n)
{
    return (((const uint8_t*)in)[n / CHAR_BIT] & (1 << (n % CHAR_BIT))) != 0;
}
 
void set_bit(void *out, size_t n, int bit)
{
    if (bit)
        ((uint8_t*)out)[n / CHAR_BIT] |= (1 << (n % CHAR_BIT));
    else
        ((uint8_t*)out)[n / CHAR_BIT] &= ~(1 << (n % CHAR_BIT));
}
 
void flip_bit(void *out, size_t n)
{
    ((uint8_t*)out)[n / CHAR_BIT] ^= (1 << (n % CHAR_BIT));
}
 
size_t encode(void *out, const void *in, size_t in_bits)
{
    size_t i, j, k;
    unsigned s = 0;
 
    for (i = j = 0; j < in_bits; ++i) {
        if ((i + 1) & i) {
            if (get_bit(in, j))
                s ^= i + 1;
            set_bit(out, i, get_bit(in, j));
            ++j;
        }
    }
    for (k = 1; k < i; k <<= 1) {
        set_bit(out, k - 1, s & k);
    }
    return i;
}
 
size_t decode(void *out, const void *in, size_t in_bits, unsigned *out_syndrome)
{
    size_t i, j;
    unsigned s = 0;
 
    for (i = j = 0; i < in_bits; ++i) {
        if (get_bit(in, i))
            s ^= i + 1;
        if ((i + 1) & i) {
            set_bit(out, j, get_bit(in, i));
            ++j;
        }
    }
    *out_syndrome = s;
    return j;
}
 
size_t decode_and_fix(void *out, const void *in, size_t in_bits)
{
    unsigned s;
    size_t out_bits = decode(out, in, in_bits, &s);
 
    if (s && s <= in_bits && (s & (s - 1))) {
        unsigned k;
 
        for (k = 0; 1u << k < s; ++k);
        flip_bit(out, s - k - 1);
    }
    return out_bits;
}
 
int main()
{
    char habr[5] = "habr";
    char encoded[5];
    char decoded[4];
    unsigned s;
    size_t i;
 
    size_t encoded_bits = encode(encoded, habr, sizeof(habr) * CHAR_BIT);
    size_t decoded_bits = decode(decoded, encoded, encoded_bits, &s);
    assert(s == 0);
    assert(encoded_bits == sizeof(habr) * CHAR_BIT + 6);
    assert(decoded_bits == sizeof(habr) * CHAR_BIT);
    assert(memcmp(habr, decoded, sizeof(habr)) == 0);
 
    for (i = 0; i < encoded_bits; ++i) {
        flip_bit(encoded, i);
        decoded_bits = decode(decoded, encoded, encoded_bits, &s);
        decoded_bits = decode_and_fix(decoded, encoded, encoded_bits);
        assert(decoded_bits == sizeof(habr) * CHAR_BIT);
        assert(memcmp(habr, decoded, sizeof(habr)) == 0);
        flip_bit(encoded, i);
    }
    return 0;
}
0
_liv_
217 / 217 / 83
Регистрация: 07.10.2015
Сообщений: 613
Завершенные тесты: 1
01.07.2016, 17:17 #5
C
1
    char decoded[5];
0
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 8
01.07.2016, 19:33  [ТС] #6
Спасибо, исправил, но теперь выводит ту же ошибку в encoded
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2016, 19:33
Привет! Вот еще темы с ответами:

Массив. Задачка. Выход за пределы массива - C++
Доброе утро. Подскажите пожалуйста есть кусок кода. Он выводит * если елемент массива &lt;10, если &gt;10 то #. А если подряд 3 элемента больше...

Выход за пределы массива. Исправить код - C++
Вот такой результат исполнения кода: 5 17 22 10.5 11.23 12.87 6.64 9.82 15.35 - ввел числа в массив с клавиатуры 5 5 17 17 22 22...

Выход за пределы массива при использовании оператора new - C++
#include &lt;iostream&gt; using namespace std; int main() { int *i = new int; i= 1; cout &lt;&lt; i; return 0;

Выход за пределы массива при его сортировке - C++
#include &quot;stdafx.h&quot; #include &lt;time.h&gt; #include &lt;clocale&gt; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
01.07.2016, 19:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru