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

Ошибка при компиляции

21.11.2017, 19:19. Показов 1023. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем присутствующим. При компиляции программы в функции RandInterv() выдает ошибку, если происходит перебор элементов массива за счет цикла for основанного на диапазоне.
Происходит ошибка только, когда заявлен С-массив.
С контейнером Array такой проблемы нету. Функция находится в отдельном файле функций myFunction.cpp.
Вопрос почему именно с контейнером нету ошибки, хотя если заставить вывести тот же самый диапазон, но в главном файле, и также работая с С-массивом. Все работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Solving linear array problems
Filling of array A by criterion, by pattern or by 
elements of another array B */
#include <iostream>
#include <iterator>
#include <array>
#include "myFunction.h"
using namespace std;
 
int main() {
    const int N = 20;
    int mas[N] {};
    array<int, 30> mas2;
    NaturNum(mas, N);
    ArithProg(mas, N);
    RandInterv(mas, N);
    return 0;
}
Далее файл myFunction.cpp:
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
#include <iostream>
#include <ctime>
#include <random>
#include <iomanip>
#include <array>
#include <iterator>
#include "myFunction.h"
using namespace std;
 
void NaturNum(int ar[], const int &k) {
    cout << "Source array filled with natural numbers: \n";
    for (int i = 0; i < k; i++) {
        ar[i] = i + 1;
        cout << i << setw(4);
    }
    cout << endl;
}
 
void ArithProg(int ar[], const int &k) {
    cout << "Array filled with arithmetic progression: \n";
    for (int i = 0; i < k;) {
        i += 2;
        cout << i << setw(4);
    }
    cout << endl;
}
 
void RandInterv(int ar[], const int &k) {                          // ar - имя массива, k - размер массива
    static default_random_engine rnd(time(0));
    static uniform_int_distribution<unsigned> d(5, 55);
    cout << "Array filled with random numbers from the interval [5, 55]: \n";
    for (auto &i : ar) {                                               // здесь ни auto, ни int, не меняют разницы
        i = d(rnd);
        cout << i << setw(4);
    }
    cout << endl;
}
Далее файл myFunction.h прототипы:
C++
1
2
3
4
5
6
#ifndef MYFUNCTION_H_
#define MYFUNCTION_H_
void NaturNum(int[], const int&);
void ArithProg(int[], const int&);
void RandInterv(int[], const int&);
#endif
Если меняем функцию на прием аргумента от контейнера array и меняем прототип на array массив, без аргумента размера массива. То ошибки нету. Почему for основанный на диапазоне работает c
C++
1
array<int, 20> &ar2
, но отказывается с
C++
1
int ar[]
.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2017, 19:19
Ответы с готовыми решениями:

Ошибка при компиляции. Где ошибка? (Работа с классом)
Уважаемые форумчане! При компиляции проекта возникает ошибка &quot; undefined reference to `MeterNZiF::MeterNZiF()' &quot; на 7 строку...

Ошибка памяти при выполнении, при компиляции не выводит ошибки
ПОмогите плс программа вводит строку символов до точки, а после вычисляет процент согласных в этой строке и выводит их в обратном порядке....

Не является внутренней или внешней командой - ошибка не при компиляции а при работе программы
В VS скомпилировал код #include &lt;iostream&gt; using namespace std; int main() { int a; cout&lt;&lt;&quot;Hallo&quot;; cin&gt;&gt;a; ...

8
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.11.2017, 20:29
Лучший ответ Сообщение было отмечено hjujet как решение

Решение

C++
1
void NaturNum(int (&ar)[20], const int& k);
Но размер должен быть фиксированный.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.11.2017, 20:36
Лучший ответ Сообщение было отмечено hjujet как решение

Решение

Цитата Сообщение от hjujet Посмотреть сообщение
C++
1
int ar[]
Здесь в функцию массив передаётся как указатель на начало массива, по которому невозможно вычислить размер массива. Контейнеры знают свой размер.
1
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 7
21.11.2017, 20:58  [ТС]
Спасибо большое. Всё понял по своей ошибке.
Всё дело в аргументе. Если через С-массив, то необходим размер в аргументах указывать.
Прототипы остаются такими же. Меняем только в .cpp функцию. Также подумал можно объявить в файле функций константу аналогичную, основному коду.
C++
1
const int N = 20;
и
C++
1
void RandInterv(int (&ar)[N], const int& k);
а место указания ссылки я так понял не имеет значения в синтаксисе : const int& k, const int & k, const int &k
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.11.2017, 22:37
Цитата Сообщение от hjujet Посмотреть сообщение
а место указания ссылки я так понял не имеет значения в синтаксисе
Здесь ссылка вообще не нужна. int передаётся по значению.

Добавлено через 54 секунды
И чем плох вариант с array?
0
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 7
22.11.2017, 02:23  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
И чем плох вариант с array?
Нет. Наверное и не плох. Чисто научный интерес.

Но вот после изменения, в программе функции на
C++
1
2
3
void RandInterv(int (&ar)[20], const int &k) {             // myFunction.cpp - функция
}    
void RandInterv(int[], const int&); // myFunction.h - прототип
уже другая ошибка. До этого работало, после перекомпиляции не работает. Больше ничего не менял.
main.o main.cpp: (.text+0xf8): undefined reference to `RandInterv(int*, int const&)'
collect2.exe [Error] ld returned 1 exit status

с array работает, повторюсь.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.11.2017, 03:27
Лучший ответ Сообщение было отмечено hjujet как решение

Решение

Цитата Сообщение от hjujet Посмотреть сообщение
C++
1
void RandInterv(int[], const int&); // myFunction.h - прототип
C++
1
void RandInterv(int (&)[20], const int&);
1
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 7
22.11.2017, 19:19  [ТС]
Программа работает. Спасибо ещё раз.
По одному из ответов по ссылкам, я так понял, здесь вообще лишний на данный момент аргумент const int& и const int &k.
C++
1
2
3
RandInterv(mas, N);               // вызов ф-ции
void RandInterv(int (&ar)[20], const int &k);            // функция
void RandInterv(int (&)[20], const int&);          // прототип
Получается раз передающийся массив имеет размер,то аргумент размера не имеет значения, т.к. ни где не задействован отдельно, и правильно будет.
C++
1
2
3
RandInterv(mas);               // вызов ф-ции
void RandInterv(int (&ar)[20]);            // функция
void RandInterv(int (&)[20]);           // прототип
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.11.2017, 19:42
Цитата Сообщение от hjujet Посмотреть сообщение
Получается раз передающийся массив имеет размер
Тип данных массив всегда имеет размер. Так как в данном случае передаётся ссылка на массив (т.е., как-бы, сам массив), то, при необходимости, можно вычислить размер переданного массива, в отличие от случая, когда передаётся указатель на начало массива в памяти.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2017, 19:42
Помогаю со студенческими работами здесь

Использование шаблонов при наследовании, ошибка при компиляции
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

При компиляции ошибка. Ошибка c++ C2678
Ошибка c++ C2678 #include &lt;windows.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include...

Ошибка при компиляции
Решил посмотреть что из себя предстовляет DirectX . Установил SDK набрал код из примера , компилирую ... и ошибка Сам код ...

Ошибка при компиляции
При компиляции программы выбивает ошибку на этой строке ( v - vector &lt;std::string&gt; v) : sort(begin(v), end(v)); Пишет: error...

Ошибка при компиляции
Не могу понять в чём ошибка #include &lt;iostream&gt; #include &lt;cmath&gt; double my_sum(const double, int*pkol); using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru