Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 8
1

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

01.07.2016, 01:30. Просмотров 540. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2016, 01:30
Ответы с готовыми решениями:

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

Выход за пределы массива
Заполняю динамический массив случайными числами и вывожу его на экран. Дебажная куча жалуется на...

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

Выход за пределы массива
По мойму нарушение границ массива в c++ не допускается. Это будет выход за пределы массива и...

5
91 / 80 / 57
Регистрация: 19.02.2016
Сообщений: 336
01.07.2016, 03:45 2
C++
1
char habr[4] = "habr";
Правильно :
C++
1
char habr[5] = "habr";
Связано это с тем, что последним всегда в массиве символов будет - "\0", означающий, что это конец, а не очередной элемент, т.н. - нуль-терминал .
1
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
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
Модератор
Эксперт CЭксперт С++
3641 / 3296 / 580
Регистрация: 07.10.2015
Сообщений: 6,749
01.07.2016, 17:17 5
C
1
    char decoded[5];
0
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 8
01.07.2016, 19:33  [ТС] 6
Спасибо, исправил, но теперь выводит ту же ошибку в encoded
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2016, 19:33

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Выход за пределы массива
в одном из обучающих видео уроков наткнулся на ТАКОЕ. алгоритм sort получает в себя начало и...

Выход за пределы динамического массива
Почему возможна такая операция? int *a = new int; a = 9; cout &lt;&lt; a &lt;&lt; endl; И оно выведет 9,...

Проверка на выход за пределы массива
Есть самый обычный массив int veg; вот так заполняется for (int i = 0; i &lt; 3; i++) { ...

Выход за пределы массива, устранение
Всем, привет! Дано задание: Определить последовательность элементов массива, возрастает,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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