Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 22.09.2012
Сообщений: 34

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

19.01.2013, 23:11. Показов 687. Ответов 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. Но чем была вызвана ошибка мне непонятно, пока.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2013, 23:11
Ответы с готовыми решениями:

Как успокоить систему безопасности Windows ?
Добрый день При запуске exe-файла через сеть появляется вот такое предупреждение. Каждый раз приходится подтверждать. Несмертельно, но...

Подскажите хороший компилятор, как его установить, как им пользоваться?
Подскажите хороший компилятор, как его установить, как им пользоваться??

Он еще и шутит...
и всем сразу смешно, все обиды на некорректную выдачу забыты, ведь у Яши круглый год 1 апреля

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

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

Поискал http://forum.ixbt.com/topic.cgi?id=40:467 тема где это обсуждают. подходящим выглядит вариант
int array[1000][1000];
ZeroMemory(array, sizeof(array));
но это предлагаю безответственно, может код по такой схеме новые глюки какие-то даст...
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.01.2013, 23:59
Цитата Сообщение от ogcjm Посмотреть сообщение
как можно инициализировать массив
Хмм. Например можешь явно указать количество элементов в массиве. И тогда
запись code[13][18] = {0}; обнулит все элементы.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
20.01.2013, 00:03
Цитата Сообщение от SeaMonster Посмотреть сообщение
но это предлагаю безответственно, может код по такой схеме новые глюки какие-то даст...
не должен
статические многомерные массивы расположены в памяти друг за другом
значит ZeroMemory обнулит всю память начиная с адреса array размером с массив
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
20.01.2013, 09:47
Цитата Сообщение от 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
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2013, 09:47
Помогаю со студенческими работами здесь

Google шутит.
Google - первая по популярности (77,04 %) в мире поисковая система, обрабатывающая 41 млрд 345 млн запросов в месяц (доля рынка 62,4 %)....

Контакт шутит?
&quot;Мы обнаружили на странице В* подозрительную активность и временно заморозили её, чтобы вырвать из рук злоумышленников. Если у Вас есть...

BIOS шутит
в общем такая история... принесла НDD с работы подоткнула его к своему компу (на тот же шлейф слейвом что и мой HDD). Поставила в BIOS...

Новые теги HTML или MS шутит
Из ms word сохранил таблицу в html, после очистки Adobe Dreamweaver CC 2017 остались теги o, f и n &lt;n...

Опять подводные грабли или Delphi 7 шутит?
Все началось со вчерашнего вечера, сидел я дома, наслаждался выходным. После чего, мне написал человек, мол: &quot; у меня ничего не...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru