Строковый массив, как мне его использовать? Реализация - PullRequest
4 голосов
/ 19 ноября 2010

Итак, я пишу консольную игру как мой первый проект на C ++, и я хочу реализовать функцию look. Вот что он делает:

получить текущую координату читать описание из 2d массива строк описание cout

Но я не могу заставить работать этот массив двухмерных строк.

  string zoneid[100][100];
    zoneid[1][1] = "text";
    cout << "You see " << zoneid[1][1] << endl;

Это дает мне ошибку - ожидаемый конструктор, деструктор или преобразование типа перед токеном '=' в первой строке. Я пробовал с фигурными скобками, фигурные скобки, до сих пор не помогает. Гугл тоже не сильно помог.

Обновление: здесь полный код, но ошибка только в строке zoneid [1] [1] = "text";

    #include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <stdlib.h>
#include "genlib.h"
#include "strutils.h"
#include <time.h>
#include <string>

int inventory_array[49];

int coordsX;
int coordsY;
std::string zoneid[100][100];
zoneid[1][1] = "Text";


void init_inv()
{
    for (int i=0; i < 50; i++) {
        inventory_array[i] = 0;
    }

}

void introduce() {
    cout << "Welcome to Diablo 2! "
         << endl;
}

void inventory() {

    cout << endl << "Your inventory:" << endl;
    for (int i = 0; i < 50; i++) {
        if (inventory_array[i] != 0) {
            cout << i << ". " << "something" << endl;

        }

    }

}

int itemRoll()
{

    int item_id = 0;
    item_id = (rand() % 1000);
    return item_id;

}



void look(int x, int y)
{
    cout << "You see " << zoneid[1][1] << endl;

}
























void inputController()
{
    while (true) {
        cout << "Please enter command!" << endl;
        string command;
        getline(cin, command);


        if (command == "inv") {
            inventory();
        }


        if (command == "look") {
            look(coordsX, coordsY);
        }





        if (command == "roll") {
            for (int i=0; i < 50; i++) {
                cout << itemRoll() << endl;
            }
            cout << itemRoll() << endl;
        }



        if (command == "kill") {
                cout << "KILL COMMAND ACTIVATED" << endl;
            }


                if (command == "quit") {

                    cout << "FAILED TO INTERPRET" << endl;
                    break;


                } 



            }


    }


    void ending()
    {
        cout << "Thanks for playing Diablo 2";
    }



int main(int argc, char ** argv) {
    srand(time(NULL));
    introduce();
    init_inv();
    coordsX = 1;
    coordsY = 1;                
    inputController();
    ending();
    return 0;
}

Ответы [ 6 ]

5 голосов
/ 19 ноября 2010

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

Итак:

int a;
a = 5; // Error

int b = 5; // OK, definition in same line as declaration

int c;

int main()
{
   c = 5; // OK, definition within a function body.
}
3 голосов
/ 19 ноября 2010

ОК, вот в чем проблема:

int inventory_array[49];

int coordsX;
int coordsY;
std::string zoneid[100][100];
zoneid[1][1] = "Text";

Этот код находится в области видимости файла. То есть это не в функции. Но zoneid[1][1] = "Text" - это исполняемый код - он должен быть в функции.

Вы можете поместить инициализатор в main():

int main()
{
  zoneid[1][1] = "Text";
  // ...
}
1 голос
/ 19 ноября 2010

Вы не можете инициализировать свой массив таким образом вне функции. Вы можете сделать это, хотя:

string zoneid[][] = { {"text"} };

Но делать это для массива размером 100 * 100 нецелесообразно. Так что, вероятно, лучше просто переместить инициализацию в начало main.

0 голосов
/ 19 ноября 2010

В C ++ запрещается иметь исполняемые операторы (такие как zoneid[1][1] = "Text";) вне функций.

Если вы переместите это назначение в функцию (например, в самое начало main)), тогда он должен работать лучше (но я не проверял остальную часть кода на наличие ошибок).

0 голосов
/ 19 ноября 2010

Вы должны включить заголовок для строк

#include <string>
0 голосов
/ 19 ноября 2010

РЕДАКТИРОВАТЬ: (без обновления)

Вы не можете назначить строковое значение в глобальной области видимости. Вы можете объявить только глобальные переменные. Кстати, объявление глобальных переменных обычно считается плохой практикой в ​​любом случае .

...