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

Присвоение массива к функции

15.05.2013, 22:15. Показов 2861. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Занялся написанием консольной рпг-квеста и столкнулся с рядом проблём, о чём - ниже.
Суть - есть код:
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
#include <iostream>
 
using namespace std;
 
enum
{
    coordX,
    coordY,
    pfBuildLocation,
    ENUM_SIZE
};
 
void loc1( int x, int y )
{
    cout << "Loc1 x: " << x << ", y: " << y << endl;
}
void loc2( int x, int y )
{
    cout << "Loc2 x: " << x << ", y: " << y << endl;
}
 
typedef void (*pf)(int x, int y);
 
int main()
{
    using namespace std;
    
    int arr[][ENUM_SIZE] = //массив основанный на константах enum'a
    {
        {1, 1, (int)loc1},
        {1, 2, (int)loc2}
    };
    
    int* begin = arr[0];
    int* end = arr[ sizeof(arr) / sizeof(arr[0]) ];
    
    for( int* i = begin; i < end; i += ENUM_SIZE )
    {
        ((pf)i[pfBuildLocation])(i[coordX], i[coordY]);
    }
    
    return 0;
}
Над чем долго парился, а именно - с созданием координат массива для функции. Далее - столкнулся с еще одной диллемой:
Каким образом собственно, сделать переход к функции, сравнивая две переменные с первым двумя константами enum'a? Пробовал так, но компилятор не разрешает:
C++
1
2
3
4
5
6
world location;//класс world
while(1)//бесконечный цикл
{
if( arr[coordX] == x && arr[coordY] == y )//сравнение изменяемых переменных координат, с содержимым массива
location.[pfBuildLocation];//переход к функции, которая подходит к проверенным выше числам. Аля - {1, 1,...(int)location0}, если X и Y равны единицам, то происходит переход на location0, такие дела.
}
Что именно я делаю не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2013, 22:15
Ответы с готовыми решениями:

Присвоение элементу массива значения другого элемента этого же массива
Всем доброго времени суток! Возникла проблема следующего толка: пишу программу для определения кратчайших расстояний и кратчайших...

Присвоение элементам массива значений элементов другого массива
Здравствуйте. Есть два массива (один пустой). Как можно присвоить этому пустому массиву значения элементов другого массива (по порядку)?

Присвоение переменной функции
Кто знает, как сделать, чтобы статическая переменная класса/структуры была по умолчанию равна значению функции? Например: class MyClass {...

14
9 / 9 / 3
Регистрация: 12.05.2013
Сообщений: 23
15.05.2013, 22:35
Сразу извиняюсь за лень, на практике не проверял. Но как минимум, отдельные условия нужно брать в скобки. Т.е.
C++
1
if ((arr[coordX] == x) && (arr[coordY] == y))
Дальше компилятор ругаться не должен.
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
15.05.2013, 23:29  [ТС]
Цитата Сообщение от vadtsyb Посмотреть сообщение
Сразу извиняюсь за лень, на практике не проверял. Но как минимум, отдельные условия нужно брать в скобки. Т.е.
C++
1
if ((arr[coordX] == x) && (arr[coordY] == y))
Дальше компилятор ругаться не должен.
Ругань идет на "==", ругаясь именно на несовместимость операндов с int*.
Столкнулся и еще одной проблемой. В рамках класса, функции не присваиваются к строкам массива.
Как можно по типу
C++
1
  location.[pfBuildLocation]
вызывать функцию, без класса?

На счёт "==", пробовал два варианта, в обоих случаях ошибки, во вложениях.


Весь код целиком.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "StdAfx.h"
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
using namespace std;
int Entered;
int x, y;
enum
{
    coordX,
    coordY,
    pfBuildLocation,
    ENUM_SIZE
};
 
 
 
    void location0(int x, int y)// стартовая локация
    {
        int Entered;// Вводимые данные
        cout << "Text "
             << "text.\n\n"
             << "Ваши действия:\n1.View.\n\nВвод:\n ";
        cin >> Entered;
    }
 
    void location0view()//осмотр стартовой локации
    {
        int Entered;// Вводимые данные
        cout << "sever"
             << " zapad"
             << " ug.\n"
             << "Ваши действия:\n1.zapad\n2.sever\n3.vostok\n4.ug\n"
             << "\nВвод:\n ";
        cin >> Entered;
 
 }
    void location1sever()// Север
    {
        int Entered;// Вводимые данные
        cout << "boat"
             << " key\n"
             << "Ваши действия:\n1.Осмотреться.\n2.Items \n3.Return.\n\nВвод:\n ";
        cin >> Entered;
    }
 
void location1severview()// осмотр севера
{
}
void location1severitems()// поиск предметов
{
    cout << "location1severitems"
        << " Ваши действия:\n1.Осмотрется. \n\nВвод:\n ";
}
 
typedef void (*pf)(int x, int y);
int main()
{
    int Entered; // Вводимые данные
    setlocale(LC_ALL,"Russian");
 
using namespace std;
    
    int arr[][ENUM_SIZE] = //массив основанный на константах enum'a
    {
        {1, 1, (int)location0},
        {1, 2, (int)location0view}
    };
    
    int* begin = arr[0];
    int* end = arr[ sizeof(arr) / sizeof(arr[0]) ];
    
    for( int* i = begin; i < end; i += ENUM_SIZE )
    {
        ((pf)i[pfBuildLocation])(i[coordX], i[coordY]);
    }
 
    x = 1;
    y = 1;
    while(1)//бесконечный цикл
     {
     
    if ((arr[coordX] == x) && (arr[coordY] == y))
//сравнение изменяемых переменных координат, с содержимым массива
      location.[pfBuildLocation];//переход к функции, которая подходит к проверенным выше числам. Аля - {1, 1,...(int)location0}, если X и Y равны единицам, то происходит переход на location0, такие дела.
}
    return 0;
}
Миниатюры
Присвоение массива к функции   Присвоение массива к функции  
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.05.2013, 23:47
у вас arr - двумерный массив интов.
поэтому тип выражения arr[index] - это указатель на инт. чтобы было значение, не хватает еще []
как должно быть у вас - мне непонятно. код хитрый и вникать в него не хочется.
есть два варианта:
arr[some_correct_index][coordX] == x
или
arr[coordX][some_correct_index] == x

ну и в целом реализация кривая какая-то, т.е. непонятно что там происходит.
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
15.05.2013, 23:52  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
у вас arr - двумерный массив интов.
поэтому тип выражения arr[index] - это указатель на инт. чтобы было значение, не хватает еще []
как должно быть у вас - мне непонятно. код хитрый и вникать в него не хочется.
есть два варианта:
arr[some_correct_index][coordX] == x
или
arr[coordX][some_correct_index] == x

ну и в целом реализация кривая какая-то, т.е. непонятно что там происходит.
А что из себя представляет [some_correct_index]?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.05.2013, 23:54
divergere, откуда мы знаем? arr[coordX] - это массив. То есть
C++
1
int[] b = arr[coordX];
нельзя сравнивать массив с интом
C++
1
if (b == 8) //ошибка
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:02
some_correct_index - это целое число, индекс для доступа к ячейке массива, такое, чтобы не было выхода за пределы массива. конкретное значение я не знаю, т.к. не осознал, что вы вообще пытаетесь сделать.
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:08  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
divergere, откуда мы знаем? arr[coordX] - это массив. То есть
C++
1
int[] b = arr[coordX];
нельзя сравнивать массив с интом
C++
1
if (b == 8) //ошибка
Каким образом тогда в цикле проводить постоянное сравнения X,Y с константами enum'a? Именно - если X=1 и Y=1 сравниваются с [coordX] и [coordY], в виде сравнения X Y со строками массива. То должен быть переход в функцию под этими координатами.
{1, 1, (int)location0}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.05.2013, 00:19
У вас ошибка в архитектуре и понимании происходящего. Непонятный энум (зачем он?). Если вы создаете массив, то зачем клетке знать, какие у нее координаты? Привожу пример змейки (на C#, но не суть
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public enum TerrainInfo
    {
        LastHead,
        Food,
        NewHead,
        Tail,
    } // никаких координат!
 
...
        private void DrawCell(Point? coords,TerrainInfo terrain)
        {
            if (coords == null)
                return;
            var p = new Point(coords.Value.X * CellSize, coords.Value.Y * CellSize);
            for (int i = 1; i < CellSize - 1; i++)
                for (int j = 1; j < CellSize - 1; j++)
                    map.SetPixel(p.X + i, p.Y + j, dict[terrain]);
        }
Добавлено через 3 минуты
Имеем фактически
C++
1
2
3
4
TerrainInfo ti[10][10];
ti[1][1] = TerrainInfo.Head;
ti[2][6] = TerrainInfo.Food;
...
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:22  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
У вас ошибка в архитектуре и понимании происходящего. Непонятный энум (зачем он?). Если вы создаете массив, то зачем клетке знать, какие у нее координаты? Привожу пример змейки (на C#, но не суть
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public enum TerrainInfo
    {
        LastHead,
        Food,
        NewHead,
        Tail,
    } // никаких координат!
 
...
        private void DrawCell(Point? coords,TerrainInfo terrain)
        {
            if (coords == null)
                return;
            var p = new Point(coords.Value.X * CellSize, coords.Value.Y * CellSize);
            for (int i = 1; i < CellSize - 1; i++)
                for (int j = 1; j < CellSize - 1; j++)
                    map.SetPixel(p.X + i, p.Y + j, dict[terrain]);
        }
А вот тут по подробнее. Суть:
Весь мой код - кусок текстового рпг-квеста. Подразумевалось такое:
Есть массив, строки которого отвечают за координаты и присвоены к функциям-локациям. Имеются две координаты и присваивание функции (coordX, coordY и (int)loc1). И после, в бесконечном while цикле, проводится сравнение переменных X и Y(о них ниже), с их аналогами в массиве(если есть схожесть строк, то переход на функцию этой строки). X и Y, две переменные предназначенные для манипуляции координатами и перехода между локациями. По принципу четырех switch, каждый - предназначенный для количества вариантов ответа. По принципу
C++
1
case '1':++x, ++y;break;
. Может, подскажете как это написать более... ээм. Оптимально и логично? Да, оптимально и логично.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.05.2013, 00:25
варианта 2: первый, не нужен массив(по крайней мере двумерный). Второй: если вы хотите координаты хранить в самой клетке,то есть вместо
C++
1
a[2][2] = АдскаяКрепость
писать
C++
1
2
3
4
5
6
for(int i = 0; i < n; i++) 
   if (a[i].X == x && a[i].Y == y)
   { 
      a[i].Building = АдскаяКрепость; 
      break; 
   }
, то пожалуйста.
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:36  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
варианта 2: первый, не нужен массив(по крайней мере двумерный). Второй: если вы хотите координаты хранить в самой клетке,то есть вместо
C++
1
a[2][2] = АдскаяКрепость
писать
C++
1
2
3
4
5
6
for(int i = 0; i < n; i++) 
   if (a[i].X == x && a[i].Y == y)
   { 
      a[i].Building = АдскаяКрепость; 
      break; 
   }
, то пожалуйста.
Склоняюсь к оптимальности кода, потому - вопрос по первому варианту(
C++
1
a[2][2] = АдскаяКрепость
), каким образом можно делать проверку, подобную тому, что я написал выше, не меняя сами значения массива? Тобишь - каким образом проверить что x и y = a[2][2], дабы перейти в саму функцию. И вот еще - данный вариант имеет место жить, если функции типа void?(Класса нет).
Миниатюры
Присвоение массива к функции  
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.05.2013, 00:46
divergere, у вас должен быть двумерный массив "земли", то есть задавая X и Y получаем координаты, а a[x][y] - тип земли по этим координатам. Покажу на примитивном примере: пусть у нас есть обычный массив интов, 0 - пусто, 1 - барьер. Тогда просто
C++
1
2
3
4
a[0][0] = 0;
a[0][1] = 1;
a[1][0] = 1;
a[1][1] = 0;
Вот и все.
Теперь нам стало интересно, какая земля по координатам (1,0), узнаем
C++
1
2
3
4
if (a[1][0])
   cout << "БАРЬЕР" << endl;
else 
   cout << "ПУСТОТА" << endl;
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:54  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
divergere, у вас должен быть двумерный массив "земли", то есть задавая X и Y получаем координаты, а a[x][y] - тип земли по этим координатам. Покажу на примитивном примере: пусть у нас есть обычный массив интов, 0 - пусто, 1 - барьер. Тогда просто
C++
1
2
3
4
a[0][0] = 0;
a[0][1] = 1;
a[1][0] = 1;
a[1][1] = 0;
Вот и все.
Теперь нам стало интересно, какая земля по координатам (1,0), узнаем
C++
1
2
3
4
if (a[1][0])
   cout << "БАРЬЕР" << endl;
else 
   cout << "ПУСТОТА" << endl;
Никак не допру - как же это адаптировать именно по текстовый рпг-квест. Я изначально предполагал такое:
Допустим, есть группа массивов координат как выше:
C++
1
2
3
a[1][1] = loc1;
a[1][2] = loc2;
a[2][2] = loc3;
Планировалось проверять два числа в массиве [2][2] которые, и на их основании, переводить на следущую локацию. А изменение - с помощью switch. Но столкнулся с проблемой - нельзя объявить a[x][y] не объявляя x и y как константы. Как быть в таком случае?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.05.2013, 07:50
Все зависит от того, есть ли алгоритм определения соседних точек или нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2013, 07:50
Помогаю со студенческими работами здесь

Присвоение функции переменной
что делает такое присвоение? p = print('hell') типа &quot;вызывая&quot; p, я получаю только возвращаемое значение? и как это называется(на англ...

Присвоение переменной значения функции
Как на блок схеме изобразить, что переменной присваивается значение функции? Например, kay=showmenu(); Добавлено через 5 часов 35...

Присвоение значения переменной из функции
Доброго времени суток!!! Например в Pascal можно так: procedure myinc(var a:integer); begin a:=a+1; end; begin ...

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

Присвоение функции значения ячейки
Требуется присвоить (считать с листа) функцию из ячейки A1 для дальнейших вычислений. Подобное присвоение не осуществляется по указанному...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru