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

Задание размерности массива через константный параметр функции

12.02.2018, 20:37. Показов 1364. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день. пробую писать игру на с++... как говорится хочешь выучить язык пиши на нем программы. есть такая проблема...

C++
1
2
3
4
5
6
7
8
9
struct locat//локации 
{string nam,path; 
int n_obj;//кол обьектов 
locat(){} 
}; 
 
void read_const(int win_x,int win_y,int id,int nom_loc,const int kol_lok ) 
{ 
locat tabl[kol_lok+1];
структура которую я описываю должны по размерности быть константной... и хотя я вроде ввожу ее в функцию как константную все равно выдается ошибка... как быть?

//пс. вся эта функция находится в файле iso.сpp, к которому подключен заголовочный файл iso.h и он в свою очередь подключен к главной функции main. то есть я вызываю эту функцию чтобы из текстовых файлов набрать данных и распихать по структуре, которая будет использована для построения локаций в игре(это уже другие функции). именно поэтому мне важно передать из головного файла константы, которые потом будет использовать игра.
проблема есть не только с этой структурой. locat o_tabl[kol_lok+1][nl+1]; - вот такую структуру я тоже использую для построения обьектов локаций. но мне бу пока ходя бы с более простой разобраться
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2018, 20:37
Ответы с готовыми решениями:

Передача размерности массива как параметр из одной функции в другую.
Вообщем написал программу. Всё работает как надо, кроме одного, никак не могу сделать чтобы размерность массива, которая вводится в...

Задание размерности массива неконстантным членом класса
Вопрос к знатокам стандарта. Есть фрагмент кода class Test { int sz; void do() { int array; } };

Быстрее ли вывов функции, переданной через параметр шаблона, чем через простой указатель на функцию?
Здравствуйте! Есть два варианта передачи некоторой переменной типа "указатель на функцию" в класс - через параметр шаблона и...

10
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
12.02.2018, 21:19
Лучший ответ Сообщение было отмечено jedimaks как решение

Решение

Цитата Сообщение от jedimaks Посмотреть сообщение
C++
1
locat tabl[kol_lok+1];
Размер массива, по стандарту, должен быть константным выражением, т.е. известным на момент компиляции. Выделяй память через new[] (или std::vector используй):
C++
1
locat* tabl = new locat[kol_lok+1];
Добавлено через 8 минут
Цитата Сообщение от jedimaks Посмотреть сообщение
C++
1
locat o_tabl[kol_lok+1][nl+1];
C++
1
2
3
    locat** o_tabl = new locat* [kol_lok + 1];
    for (int i = 0; i < kol_lok + 1; ++i)
        o_tabl[i] = new locat[nl + 1];
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
12.02.2018, 23:27
Цитата Сообщение от jedimaks Посмотреть сообщение
как говорится хочешь выучить язык...
... RTFM (Страуструпа сначала 3е издание, потом 4е)
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 21
14.02.2018, 07:20  [ТС]
спасибо. это то что нужно. давно над этим голову ломаю
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 21
14.02.2018, 07:37  [ТС]
теперь ошибка появляется уже при запуске приложения...
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
14.02.2018, 15:07
Цитата Сообщение от jedimaks Посмотреть сообщение
теперь ошибка появляется уже при запуске приложения.
Теперь нужно увидеть код, который вызывает эту ошибку.
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 21
15.02.2018, 16:01  [ТС]
спасибо, все работает. я немного накосячил в другом месте с размерностью массивов. можно еще вопрос - как полученный массив (o_tabl[kol_lok+1][nl+1]) правильно передавать другим функциям? это ведь не целочисленное и не массив как бы... я с этими структурами наверно ***** скоро...
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
15.02.2018, 16:13
Массивы всегда передаются как указатели (адрес начала выделенной памяти), но тут (если через new[] память выделял) и массивов (как типов данных) нет, есть указатели, вот их и передавай. Если указатели в функции не будут меняться (работа, в функциях, предполагается с данными в памяти), то передавай по значению, если будут - то по ссылке, чтобы изменение указателя сохранилось при выходе из функции. Ну, и размерность нужно передать.
1
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 21
17.02.2018, 22:22  [ТС]
если честно я ничего не понял). сейчас выглядит моя программа примерно так...
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
void draw_loc( lokat *loc_tabl,menu *m_tabl,int nl){
 
    Event event;
    Sprite s_fon,s_obj,s_menu;
    Texture t_fon, t_obj,t_menu;
    t_fon.loadFromFile (loc_tabl[nl].path);
    s_fon.setTexture (t_fon);
    s_fon.setPosition (0,0);
 
        window.clear();
        
        window.draw (s_fon);
 
        window.display();
        cadr++; 
        if (cadr>7) {cadr=0;}
}
 
void bas_game(lokat *loc_tabl,menu *m_tabl){
    Event event;
    Mouse mouse;    
 
        window.create (VideoMode(win_x,win_y), "777");
     while (window.isOpen()){       
        
        while (window.pollEvent(event)){
            if (event.type == Event::Closed){window.close();}
            }
        draw_loc(loc_tabl,m_tabl,p_tabl.loc_number );//прорисовка локации
....
и вроде все нормально работает)
только почему то спрайты в структурах не держатся. вроде все передал а он не отображается..?

Добавлено через 32 минуты
это уже не относится к смене размерности массивов)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
18.02.2018, 15:06
Цитата Сообщение от jedimaks Посмотреть сообщение
все нормально работает
Непонятно, зачем в draw_loc() передаёшь указатель на блок данных (lokat *loc_tab), если используешь только одно значение из этого блока? И зачем передаёшь туда menu *m_tabl ?
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 21
18.02.2018, 16:04  [ТС]
вот три структуры которые я использую в программе
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
struct player{
        int user_id;
        int res[4];//золото-мифрил-пыль-кристаллы
        int p_inv[12];// инвентарь
        int p_ekip[12];// экипировано
        int p_pok[4];//основные показатели
        int loc_number;//локация пользователя
        player ()
        {user_id = 1;
        res[4]= (1,2,3,4);//золото-мифрил-пыль-кристаллы
        p_inv[12]=(0,0,0,0,0,0,0,0,0,0,0,0);//вещи инвентарь
        p_ekip[12]=(0,0,0,0,0,0,0,0,0,0,0,0);//вещи экипированные
        p_pok[4] = (1,1,0,0);//атака-защита-м_сила-знания
        loc_number=1;}
    }p_tabl;
    
struct lokat{
    string name;// название локации
    string path;// путь к фону локации
    int kol_obj;// количество обьектов локации
    
    struct obj{
        string o_path;//путь к картинке обьекта
        int x,y; // координаты
        int go_to;
        bool anim;// обьект анимирован
        int rsize_x,rsize_y; // реальные размеры обьекта
    }loc_obj[100];
}loc_tabl[100];
 
struct menu{
    string name;// название кнопки
    string path;// путь к иконке
    int x,y; //
    bool vid;//
    bool anim;//
    int rsize_x,rsize_y; // реальные размеры обьекта
} m_tabl[100];
на куске что я выше дал только часть обработки... в этой функции считываются данные из файлов и по ним впоследствии будет строиться локация... программе еще в процессе изменения и если честно я вымучился...
дело в том что я пытаюсь засунуть это в отдельный класс в отдельном файле...
ибо кода очень много и я уже путаюсь. чтобы это организовать я начинаю разбивать программу на файлы и часть функций запихнуть в классы.
сейчас все выглядит как то так:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
void lokation::iniall(){
    
    Texture t;
    Sprite s;
    int nnn_loc;//всего количество локаций
    int x_obj,y_obj;//координаты обьекта
    int nnn;
    string stok;
    cadr = 0;
 
    stok = readini("grafon/loc/loc0.txt" , "NNN");  nnn_loc =  atoi(stok.c_str());//чтение количества локаций
    max_loc=nnn_loc;
    //lokat* loc_tabl = new  lokat[nnn_loc+1];
    
     stok = readini("grafon/menu/mobj.txt" , "NNN");    nnn_loc =  atoi(stok.c_str());//чтение количества локаций
     //menu* m_tabl = new menu[nnn_loc+1];
 
 
    for (int f=1;f<nnn_loc+1;f++){
        loc_tabl[f].path = readini("grafon/loc/loc0.txt" , "LOC"+ to_string (f) + "FON"); 
        loc_tabl[f].name = readini("grafon/loc/loc0.txt" , "LOC"+ to_string (f) + "NAM"); 
        stok = readini("grafon/loc/loc0.txt" , "LOC"+ to_string (f) + "NOB"); loc_tabl [f].kol_obj  =  atoi(stok.c_str());
        
        // lokat::obj* loc_obj = new  lokat::obj[loc_tabl [f].kol_obj+1];
        
        for (int g = 1; g< loc_tabl [f].kol_obj +1;g++){
 
            stok = readini("grafon/loc/" + to_string (f) + "/locobj.txt", ("OBJ" + to_string (g) + "ANIM"));nnn =  atoi(stok.c_str());
            loc_tabl[f].loc_obj[g].anim  = false;
            
            if (nnn!=0){loc_tabl[f].loc_obj[g].anim  = true;}
 
            loc_tabl[f].loc_obj[g].o_path = readini("grafon/loc/" + to_string (f) + "/locobj.txt", ("OBJ" + to_string (g) + "PATH")); 
        stok = readini("grafon/loc/" + to_string (f) + "/locobj.txt", ("OBJ" + to_string (g) + "GOTOLOC")); loc_tabl[f].loc_obj[g].go_to  = atoi(stok.c_str());
            if (loc_tabl[f].loc_obj[g].o_path !=""){
        Texture t0; t0.loadFromFile (loc_tabl[f].loc_obj[g].o_path);
            Sprite s0; s0.setTexture(t0);
        loc_tabl[f].loc_obj[g].rsize_x=s0.getTextureRect().width;
        loc_tabl[f].loc_obj[g].rsize_y=s0.getTextureRect().height;
            }
 
            if (loc_tabl[f].loc_obj[g].anim){
            stok = readini("grafon/loc/" + to_string (f) + "/locobj.txt", ("OBJ" + to_string (g) + "SIZEX"));
            loc_tabl[f].loc_obj[g].rsize_x =  atoi(stok.c_str());
            stok = readini("grafon/loc/" + to_string (f) + "/locobj.txt", ("OBJ" + to_string (g) + "SIZEY")); 
            loc_tabl[f].loc_obj[g].rsize_y =  atoi(stok.c_str());
            }
 
            stok = readini("grafon/loc/" + to_string (f) + "/locobj.txt", ("OBJ" + to_string (g) + "X")); loc_tabl[f].loc_obj[g].x  = atoi(stok.c_str());
            stok = readini("grafon/loc/" + to_string (f) + "/locobj.txt", ("OBJ" + to_string (g) + "Y")); loc_tabl[f].loc_obj[g].y  = atoi(stok.c_str());
        }
    }
 
    for (int f=1;f<15;f++){
    m_tabl[f].path = readini("grafon/menu/mobj.txt", ("OBJ" + to_string (f) + "PATH")); 
 
            stok = readini("grafon/menu/mobj.txt", ("OBJ" + to_string (f) + "ANIM"));nnn =  atoi(stok.c_str());
            m_tabl[f].anim  = false;
            if (nnn!=0){m_tabl[f].anim  = true;}
            if (m_tabl[f].path !=""){
        Texture t0; t0.loadFromFile (m_tabl[f].path);
        Sprite s0; s0.setTexture(t0);
        m_tabl[f].rsize_x=s0.getTextureRect().width;
        m_tabl[f].rsize_y=s0.getTextureRect().height;
            }
            if (m_tabl[f].anim){
            stok = readini("grafon/menu/mobj.txt", ("OBJ" + to_string (f) + "SIZEX")); m_tabl[f].rsize_x   =  atoi(stok.c_str());
            stok = readini("grafon/menu/mobj.txt", ("OBJ" + to_string (f) + "SIZEY")); m_tabl[f].rsize_y   =  atoi(stok.c_str());
            }
 
            stok = readini("grafon/menu/mobj.txt",  ("OBJ" + to_string (f) + "X")); m_tabl[f].x  = atoi(stok.c_str());
            stok = readini("grafon/menu/mobj.txt",  ("OBJ" + to_string (f) + "Y")); m_tabl[f].y  = atoi(stok.c_str());
    
    }
}
именно здесь внутри класса lokat* loc_tabl = new lokat[nnn_loc+1]; уже не работает... сейчас пытаюсь понять почему...

Добавлено через 4 минуты
пришлось эти важные части кода просто закомментировать и взять структуры в виде массивов с огромным запасом. мне это жутко не нравится...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct lokat{
    string name;// название локации
    string path;// путь к фону локации
    int kol_obj;// количество обьектов локации
    
    struct obj{
        string o_path;//путь к картинке обьекта
        int x,y; // координаты
        int go_to;
        bool anim;// обьект анимирован
        int rsize_x,rsize_y; // реальные размеры обьекта
    }loc_obj[100];
}loc_tabl[100];
а если учитывать что я только разбираюсь в с++ и SFML в частности... то мысль убиться ап стену уже не кажется плохой... но мы упорны в своем невежестве
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2018, 16:04
Помогаю со студенческими работами здесь

С помощью функции определения среднего значения элементов массива обработать два массива разной размерности
Помогите составить программу с использованием только функции. Эту тему прошли, но свое задание я так и не сделал, т.к не совсем разобрался...

Задание размерности массива с клавиатуры
есть работающая программа, нужно сделать так, что бы размерность матрицы вводилась с клавиатуры кто может подсказать? var a:array...

Задание произвольной размерности массива при создании объекта
Создайте проект, в котором опишите класс для решения задачи. Каждый разрабатываемый класс должен содержать следующие...

Возврат значения через параметр функции
Пишу функцию,которая должна создавать динамическую матрицу,а затем возвращать ее через параметр. Правильно ли я понимаю,что для этого надо...

Получение размерности двумерного массива через операцию sizeof();
Подскажите пожалуйста форумчане можно ли получить размерность двумерного массива через операцию sizeof() ? Пример функции для...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru