Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
divergere
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
#1

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

15.05.2013, 22:15. Просмотров 538. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2013, 22:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Присвоение массива к функции (C++):

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

Указатели функции, присвоение значения константе - C++
#include &lt;iostream&gt; using namespace std; void conv(char const *s); int main() { char d = '5'; conv(&amp;d); ...

Присвоение элементов массива - C++
Подскажите, возможно ли присвоить сразу несколько элементов одного массива нескольким элементам другого?

Присвоение массиву массива - C++
Здравствуйте. Создаю конструктор структуры, содержащей массивы. Присвоение массива массиву выдает ошибку: Can not assign to array type...

Возврат и присвоение объекта из функции без копирования - C++
Возможно ли в С++ вернуть объект (то есть записать данные объекта) напрямую в область памяти, выделенную в функции-приемнике? Наверно...

Стрктуры: присвоение элемента массива - C++
Добрый день. Нужно присвоить элемент одного массива одной структуры дргому элементу другой структуры. Подскажите где ошибки. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vadtsyb
9 / 9 / 1
Регистрация: 12.05.2013
Сообщений: 23
15.05.2013, 22:35 #2
Сразу извиняюсь за лень, на практике не проверял. Но как минимум, отдельные условия нужно брать в скобки. Т.е.
C++
1
if ((arr[coordX] == x) && (arr[coordY] == y))
Дальше компилятор ругаться не должен.
0
divergere
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
15.05.2013, 23:29  [ТС] #3
Цитата Сообщение от 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
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.05.2013, 23:47 #4
у вас arr - двумерный массив интов.
поэтому тип выражения arr[index] - это указатель на инт. чтобы было значение, не хватает еще []
как должно быть у вас - мне непонятно. код хитрый и вникать в него не хочется.
есть два варианта:
arr[some_correct_index][coordX] == x
или
arr[coordX][some_correct_index] == x

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

ну и в целом реализация кривая какая-то, т.е. непонятно что там происходит.
А что из себя представляет [some_correct_index]?
0
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
15.05.2013, 23:54 #6
divergere, откуда мы знаем? arr[coordX] - это массив. То есть
C++
1
int[] b = arr[coordX];
нельзя сравнивать массив с интом
C++
1
if (b == 8) //ошибка
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:02 #7
some_correct_index - это целое число, индекс для доступа к ячейке массива, такое, чтобы не было выхода за пределы массива. конкретное значение я не знаю, т.к. не осознал, что вы вообще пытаетесь сделать.
0
divergere
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:08  [ТС] #8
Цитата Сообщение от 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
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
16.05.2013, 00:19 #9
У вас ошибка в архитектуре и понимании происходящего. Непонятный энум (зачем он?). Если вы создаете массив, то зачем клетке знать, какие у нее координаты? Привожу пример змейки (на 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
divergere
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:22  [ТС] #10
Цитата Сообщение от 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
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
16.05.2013, 00:25 #11
варианта 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
divergere
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:36  [ТС] #12
Цитата Сообщение от 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
Миниатюры
Присвоение массива к функции  
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
16.05.2013, 00:46 #13
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
divergere
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 7
16.05.2013, 00:54  [ТС] #14
Цитата Сообщение от 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
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
16.05.2013, 07:50 #15
Все зависит от того, есть ли алгоритм определения соседних точек или нет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2013, 07:50
Привет! Вот еще темы с ответами:

Присвоение массиву значение массива - C++
Здравствуйте, помагите пожалуйсто, как присвоеть масиву значения масива. Ну вернее я хочю чтобы в масиве был бы масив. Ну или...

Присвоение значений всем элементам массива - C++
Как присвоить значение всем элементам массива наиболее простым способом думал что double massiv={1}; присваивает...

Присвоение ячейке массива буквенное значение - C++
Доброго времени суток! Подскажите пожалуйста, как присвоить ячейке массива буквенное значение? Что-то такое int m m='овал'; ...

Присвоение значения случайному элементу массива - C++
Всем привет. Такой вопрос. Вот есть у меня массив, скажем, A, состоящий из десяти элементов. Необходимо, что девять из десяти элементов...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.05.2013, 07:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru