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

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

15.05.2013, 22:15. Показов 2922. Ответов 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
6102 / 4958 / 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
6102 / 4958 / 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
6102 / 4958 / 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
6102 / 4958 / 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
6102 / 4958 / 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки 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
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru