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

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

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

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

19.01.2013, 23:11. Просмотров 378. Ответов 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++
Подскажите хороший компилятор, как его установить, как им пользоваться??

Что такое компилятор, и где его взять? - 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; ...

Компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7. Посоветуйте другой компилятор - C++
Здравствуйте! Я недавно начал заниматься С++, но мой компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7 Посоветуйте какой...

нужно найти ошибки в задаче на языке C/ их в районе 10 как выдает компилятор но я не могу их исправить (не знаю как) - C++
#include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main() { int xa, ya, xb, yb; cprintf(&quot;vvod xa, ya, xb, yb&quot;); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
906 / 645 / 133
Регистрация: 28.07.2012
Сообщений: 1,753
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
906 / 645 / 133
Регистрация: 28.07.2012
Сообщений: 1,753
19.01.2013, 23:59 #6
Цитата Сообщение от ogcjm Посмотреть сообщение
как можно инициализировать массив
Хмм. Например можешь явно указать количество элементов в массиве. И тогда
запись code[13][18] = {0}; обнулит все элементы.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.01.2013, 00:03 #7
Цитата Сообщение от SeaMonster Посмотреть сообщение
но это предлагаю безответственно, может код по такой схеме новые глюки какие-то даст...
не должен
статические многомерные массивы расположены в памяти друг за другом
значит ZeroMemory обнулит всю память начиная с адреса array размером с массив
Croessmah
Модератор
Эксперт CЭксперт С++
13139 / 7402 / 829
Регистрация: 27.09.2012
Сообщений: 18,243
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 09:47
Привет! Вот еще темы с ответами:

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

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

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

Как прикрутить компилятор к Notepad++? - C++
Может вопрос окажется глупым, но всё же В Notepad++ ввожу самый простой код для с++, жму F5 и вылазит табличка( не понятно что в ней...


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

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

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