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

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

Восстановить пароль Регистрация
 
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 6
01.07.2016, 01:30     Выход за пределы массива #1
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nstwf
86 / 76 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
01.07.2016, 03:45     Выход за пределы массива #2
C++
1
char habr[4] = "habr";
Правильно :
C++
1
char habr[5] = "habr";
Связано это с тем, что последним всегда в массиве символов будет - "\0", означающий, что это конец, а не очередной элемент, т.н. - нуль-терминал .
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 6
01.07.2016, 13:12  [ТС]     Выход за пределы массива #3
Спасибо, больше ошибок не обнаруживает, но выскакивает сообщение Run-Time Check Failure #2 - Stack around the variable 'decoded' was corrupted. Подскажите, пожалуйста в чем проблема
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 6
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;
}
_liv_
83 / 83 / 28
Регистрация: 07.10.2015
Сообщений: 239
01.07.2016, 17:17     Выход за пределы массива #5
C
1
    char decoded[5];
bookread1
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 6
01.07.2016, 19:33  [ТС]     Выход за пределы массива #6
Спасибо, исправил, но теперь выводит ту же ошибку в encoded
Yandex
Объявления
01.07.2016, 19:33     Выход за пределы массива
Ответ Создать тему
Опции темы

Текущее время: 23:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru