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

Компилятор шутит. Как его успокоить? - C++

Восстановить пароль Регистрация
 
ogcjm
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 34
19.01.2013, 23:11     Компилятор шутит. Как его успокоить? #1
Ниже приведён код, который по алгоритму Фано должен строить коды. В функции Fano компилятор сам по себе, там где это отмечено в коментарии изменят совершенно не то, что ему говорят. В чём может быть дело?
Вот код:

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
#define MAX_CODE 8
//функция вычисления медианы массива freq
//отсортирвоанного по убыванию
int Median(const int freq[], int start, int end){
    int sumL, sumR;
    int d, i, m;
 
    //считаем сумму в левой части
    sumL = 0;
    for(i = start; i < end; i++)
        sumL += freq[i];
 
    //сумма в правой части на 1 шаге
    sumR = freq[end];
 
    //ищем медиану
    m = end;
    do{
        d = sumL - sumR;
        m--;
        sumL -= freq[m];
        sumR += freq[m];
    }while(abs(sumL - sumR) <= d);
 
    return m;
}
 
//freq - массив вероятностей букв
//start и end - индексы начала и конца обрабатываемой части массива freq
//code - массив, в который записываются элементарный коды букв
//k - длина уже построенных кодов в обрабатываемой части массива code
void Fano(const int freq[], int start, int end, char code[][MAX_CODE + 1], int k){
    int i, m;
 
    if(end > start){
        m = Median(freq, start, end);
 
        for(i = start; i <= m; i++)
            code[i][k] = '0';
        for(; i <= end; i++)
            code[i][k] = '1';       //при первом вызове функции, вот здесь меняется freq[1]
        k++;                        //в последующих рекурсивных вызовах изменяются и другие элементы
 
        Fano(freq, start, m, code, k);
        Fano(freq, m + 1, end, code, k);
    }
}
 
int main(void){
    const int size = 4;
    const int freq[size] = {60, 25, 10, 5};
    char code[][MAX_CODE + 1] = {0};
    
    Fano(freq, 0, size - 1, code, 0);
 
    for(int i = 0; i < size; i++){
        cout << "freq: " << freq[i] << endl;
        cout << "code: " << code[i] << endl << endl;
    }
 
    return 0;
}
Добавлено через 11 минут
Причём, надо заметить, что параметр объявлен как const и это не мешает компилятору. Что это?

Добавлено через 2 минуты
Вот ещё одна странность, если в main объявления массивов freq и code поменять местами, то элементы массива freq не изменяются, не изменяются но всё равно есть ошибка связанная уже с массивом code.

Добавлено через 5 минут
Вот нашёл способ исправления. Надо указать первую размерность тоже в массиве code. Но чем была вызвана ошибка мне непонятно, пока.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2013, 23:11     Компилятор шутит. Как его успокоить?
Посмотрите здесь:

C++ определения минимального элемента и его индекса в одномерном массиве(компилятор выдаёт ошибку)
C++ Компилятор оптимизировал мой код, и я не могу его отладить
нужно найти ошибки в задаче на языке C/ их в районе 10 как выдает компилятор но я не могу их исправить (не знаю как) C++
Подскажите хороший компилятор, как его установить, как им пользоваться? C++
C++ Как создать сервер компилятор?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SeaMonster
 Аватар для SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 23:28     Компилятор шутит. Как его успокоить? #2
Я если честно скорее чайник, и вопросы могут быть пальцем в небо, но попробую помочь.
1_ Вообще очень и очень напоминает Выход За Пределы массива.
Особенно вот это "Вот ещё одна странность, если в main объявления массивов freq и code поменять местами, то элементы массива freq не изменяются, не изменяются но всё равно есть ошибка связанная уже с массивом code.
" В случае переполнения так и должно быть наверно, сначала одно меняло, потом когда на его месте другое, то уже его...
Проверь все в этом ключе.
2_ Конкретно
char code[][MAX_CODE + 1] = {0};
вообще не знал, что компилятор такое откомпилит, но си на то и си, чтобы почти все компилить. Как работает такой код? (вместо размера массива просто скобки пустые). Не лучше ли полностью явно задать размер массива?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
19.01.2013, 23:42     Компилятор шутит. Как его успокоить? #3
Цитата Сообщение от ogcjm Посмотреть сообщение
char code[][MAX_CODE + 1] = {0};
Это счастье интерпретируется компилятором как массив code[1][MAX_CODE + 1]
ogcjm
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 34
19.01.2013, 23:44  [ТС]     Компилятор шутит. Как его успокоить? #4
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Это счастье интерпретируется компилятором как массив code[1][MAX_CODE + 1]
А как можно инициализировать массив, аналогичным образом, не используя циклы, нулями?

Добавлено через 14 секунд
Двумерный конечно же.
SeaMonster
 Аватар для SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
19.01.2013, 23:57     Компилятор шутит. Как его успокоить? #5
Вообще сам в таких случаях примитивно циклами.

Поискал http://forum.ixbt.com/topic.cgi?id=40:467 тема где это обсуждают. подходящим выглядит вариант
int array[1000][1000];
ZeroMemory(array, sizeof(array));
но это предлагаю безответственно, может код по такой схеме новые глюки какие-то даст...
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
19.01.2013, 23:59     Компилятор шутит. Как его успокоить? #6
Цитата Сообщение от ogcjm Посмотреть сообщение
как можно инициализировать массив
Хмм. Например можешь явно указать количество элементов в массиве. И тогда
запись code[13][18] = {0}; обнулит все элементы.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,047
20.01.2013, 00:03     Компилятор шутит. Как его успокоить? #7
Цитата Сообщение от SeaMonster Посмотреть сообщение
но это предлагаю безответственно, может код по такой схеме новые глюки какие-то даст...
не должен
статические многомерные массивы расположены в памяти друг за другом
значит ZeroMemory обнулит всю память начиная с адреса array размером с массив
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 09:47     Компилятор шутит. Как его успокоить?
Еще ссылки по теме:

C++ Как работает компилятор С++
Sublime text 2 как установить компилятор c++ ? C++
C++ Как компилятор сохраняет константы?

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
20.01.2013, 09:47     Компилятор шутит. Как его успокоить? #8
Цитата Сообщение от SeaMonster Посмотреть сообщение
C++
1
2
int array[1000][1000];
ZeroMemory(array, sizeof(array));
но это предлагаю безответственно, может код по такой схеме новые глюки какие-то даст...
Имхо, подключать windows.h ради одной функции ZeroMemory глупо, ибо:
C++
1
2
3
4
#define RtlFillMemory(d,l,f) memset((d), (f), (l))
#define RtlZeroMemory(d,l) RtlFillMemory((d),(l),0)
#define FillMemory RtlFillMemory
#define ZeroMemory RtlZeroMemory
Yandex
Объявления
20.01.2013, 09:47     Компилятор шутит. Как его успокоить?
Ответ Создать тему
Опции темы

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