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

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

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

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

19.01.2013, 23:11. Просмотров 373. Ответов 7
Метки нет (Все метки)

Ниже приведён код, который по алгоритму Фано должен строить коды. В функции 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++
пишу лабу одногруппнице. задание: определить двунаправленный циклический список. элементы типа char* реализовать функции: 1. проверка...

определения минимального элемента и его индекса в одномерном массиве(компилятор выдаёт ошибку) - C++
#include &lt;iostream&gt; using namespace std; int main() {int count,min,num; cout&lt;&lt;&quot;count (N): &quot;; cin&gt;&gt;count; int *a; ...

Как работает компилятор С++ - C++
Подскажите, как происходит компиляция исходного кода, написанного на С++? К примеру мы имеем файл test.cpp, в котором написан код...

Как создать сервер компилятор? - C++
Как создать сервер компилятор? Чтобы компилировала gnu c++ Я ЧАЙНИК!!!

Как компилятор сохраняет константы? - C++
Вопрос такой. Компилятор на этапе компиляции умножает константы в коде типа 1000 * 5, M_PI * 5 или допустим если функция несколько раз...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
883 / 622 / 125
Регистрация: 28.07.2012
Сообщений: 1,662
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
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
883 / 622 / 125
Регистрация: 28.07.2012
Сообщений: 1,662
19.01.2013, 23:59     Компилятор шутит. Как его успокоить? #6
Цитата Сообщение от ogcjm Посмотреть сообщение
как можно инициализировать массив
Хмм. Например можешь явно указать количество элементов в массиве. И тогда
запись code[13][18] = {0}; обнулит все элементы.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
20.01.2013, 00:03     Компилятор шутит. Как его успокоить? #7
Цитата Сообщение от SeaMonster Посмотреть сообщение
но это предлагаю безответственно, может код по такой схеме новые глюки какие-то даст...
не должен
статические многомерные массивы расположены в памяти друг за другом
значит ZeroMemory обнулит всю память начиная с адреса array размером с массив
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 09:47     Компилятор шутит. Как его успокоить?
Еще ссылки по теме:

Как добавить компилятор C++ на сайт - C++
пожалуйста подскажите как добавить компилятор на сайт

Как запустить компилятор в parallel studio - C++
Как запустить компилятор в parallel studio? То есть саму студию. Не могу ярлык найти, только для VS есть и различных либ.

Sublime text 2 как установить компилятор c++ ? - C++
sumbit text 2 как установить компилятор c++ ?

Как в VS2013 добавить компилятор от VS2010 - C++
Здравствуйте! Возникла такая проблема: по работе мне от стороннего разработчика свалился исходный код dll`ки (c++), исходник сделан...


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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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     Компилятор шутит. Как его успокоить?
Ответ Создать тему
Опции темы

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