Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Работа с массивом


Автор: Ярослав 9.6.2012, 18:10
Подскажите пожалуйста как мне вытянуть данные из массива чисел. В яве яделал так

Сам масив в отдельном файле

package Meteo;

class Meteo {
static double[][]Tabl = new double[][] {
{0,     -16,    0,      0,      0,      0,      0},
{1,     -16,    1,     1,      1,         1,    1},
{2,     -16,    2,     2,      2,      2,    2},};
}

А так по нажатию на кнопку вытягую данные
W=Meteo.Tabl[1][1];

Так вот вопрос как точно такое сделать в С++ билдер а именно создать это файл с массивом и как ссылатса на него и как вытягивать данные???
Заранее всем спасибо

Автор: Doga 9.6.2012, 19:11
Привет.

Как известно, Ява и С++, как языки программирования, различаюся весьма кардинально. И совсем не удивительно, что элементарные синтаксические конструкции одного языка вызывают непреодолимые трудности, при попытке их реализации в другом (языке).

Вообще, то что Вам нужно, у Сишников, на данный момент, принято записывать так:
Код

  double Tabl[3][7] =
  {
    {0,     -16,    0,      0,      0,      0,      0},
    {1,     -16,    1,     1,      1,         1,    1},
    {2,     -16,    2,     2,      2,      2,    2}
  };


Чувствуете теперь разницу?
 smile 


Если серёзно.

Если Вы желаете хранить данные в текстовом виде - клас TStringList для начала. Записывать в файл элементарно, извлекать данные можно простейшим самописным парсером.
А если в двоичном виде - класс TFileStream. Но тут уже будет сложнее.

И есть ещё куча вариантов с примерами, в т.ч здесь, на форуме. 

Автор: artsb 9.6.2012, 21:10
Есть два способа:
*.H
Код

class Meteo
{
public:
    static double Tabl[3][7];
    double **Tabl_2;

    Meteo(void);
    ~Meteo(void);
}; 

*.CPP
Код

//---------------------------------------------------------------------------
double Meteo::Tabl[3][7] =
{
    {0, -16, 0, 0, 0, 0, 0},
    {1, -16, 1, 1, 1, 1, 1},
    {2, -16, 2, 2, 2, 2, 2}
};
//---------------------------------------------------------------------------
Meteo::Meteo(void)
{
    Tabl_2 = new double* [3];

    for(int i = 0; i < 3; i++)
    {
        Tabl_2[i] = new double;
    }

    // заполняем массив Tabl_2
    // ...
}
//---------------------------------------------------------------------------
Meteo::~Meteo(void)
{
    for(int i = 0; i < 3; i++)
    {
        delete [] Tabl_2[i];
    }

    delete [] Tabl_2;
}
//---------------------------------------------------------------------------

Автор: Doga 13.6.2012, 23:47
Я так понял, что Ярославу требуется объект, формально являющийся матрицей определённого размера, с возможностью записи его содержимого в файл и чтения оного из файла.
Могу предложить такой вариант:

Код

class TDoubleList : public TObject
{
  protected:
    TList *FList;  //Список double*

    int  __fastcall GetCount(void);
    
    double __fastcall GetValue(int AIndex);
    void __fastcall SetValue(int AIndex, double AValue);

    int  __fastcall GetCapacity(void);
    void __fastcall SetCapacity(int ACapacity);

  public:
    __property double Value[int Index] = {read = GetValue, write = SetValue};
    __property int Count = {read = GetCount};
    __property int Capacity = {read = GetCapacity, write = SetCapacity};

    
    void __fastcall Clear(void);
    void __fastcall Add(double AValue);
    void __fastcall Insert(double AValue);
    void __fastcall Delete(int AIndex);
    void __fastcall Assign(TDoubleList *ASourceList);
    void __fastcall SetCount(int ANewSize, double ADefaultValue = 0.0, bool AClearPrevious = false);
    
    void __fastcall LoadFromString(AnsiString &ASourceStr, AnsiString ASeparator = ";", int ACount = 0);
    
    __fastcall TDoubleList(void);
    __fastcall ~TDoubleList(void);
};

class TDoubleTable : public TObject
{
  protected:
    TList *FList;  //Список TDoubleList*

    int  __fastcall GetColCount(void);    
    int  __fastcall GetRowCount(void);

    double __fastcall GetValue(int AColIndex, int ARowIndex);
    void __fastcall SetValue(int AColIndex, int ARowIndex, double AValue);

    int  __fastcall GetColCapacity(void);
    int  __fastcall GetRowCapacity(void);
    
    void __fastcall SetColCapacity(int ACapacity);
    void __fastcall SetRowCapacity(int ACapacity); 

  public:
    __property double Value[int ColIndex][int RowIndex] = {read = GetValue, write = SetValue};
    __property int ColCount = {read = GetColCount};
    __property int RowCount = {read = GetRowCount};
    __property int ColCapacity = {read = GetColCapacity, write = SetColCapacity};
    __property int RowCapacity = {read = GetRowCapacity, write = SetRowCapacity};

    void __fastcall Clear(void);
    void __fastcall AddCol(double ADefaultValue = 0.0);
    void __fastcall AddRow(double ADefaultValue = 0.0);
    void __fastcall InsertCol((int AColIndex, double ADefaultValue = 0.0);
    void __fastcall InsertRow(int AColIndex, double ADefaultValue = 0.0);
    void __fastcall DeleteCol(int AColIndex);
    void __fastcall DeleteRow(int ARowIndex);
    void __fastcall Assign(TDoubleTable *ASourceList);
    void __fastcall SetSize(int ANewColCount, int ANewRowCount, double ADefaultValue = 0.0, bool AClearPrevious = false);

    void __fastcall LoadFromFile(AnsiString AFileName);    
    void __fastcall LoadFromFile(AnsiString AFileName, int AColCount = 0, int ARowCount = 0);    
    void __fastcall SaveToFile(AnsiString AFileName);    

    __fastcall TDoubleTable(void);
    __fastcall TDoubleTable(void);
};


Класс TDoubleTable построен с использованием класса TDoubleList. 
Для хранения объектов обоих классов используется класс TList.

Класс  TDoubleTable предоставляет доступ ко всем элементам таблицы.
Позволяет добавлять/вставлять/удалять колонки/строки таблицы.
Может устанавливать заданный размер таблицы с заданным значением элементов.
Имеет возможность записывать свои данные в файл и читать их из файла.
При этом, при чтении из файла, имеется возможность загрузитиь таблицу определённого размера. 

Автор: xvr 14.6.2012, 14:12
Цитата(Doga @  13.6.2012,  23:47 Найти цитируемый пост)
Я так понял, что Ярославу требуется объект, формально являющийся матрицей определённого размера, с возможностью записи его содержимого в файл и чтения оного из файла.

Судя по оригиналу на Java у ТС он под 'отдельным файлом' понимал отдельный модуль в программе, и речь о чтении/записи матрицы в файл в run-time вообще не шла  smile 

Автор: Doga 14.6.2012, 15:16
Во как!  smile 

Автор: Ярослав 14.6.2012, 21:13
Ребят, смысл в том что есть отдельный клас тоесть массив в котором много рядов и строк с числами, а на форме две ячейки в которых указываетса ряд и строка по нажатию на кнопку выдаёт значение из таблицы которое ранее было указано.
В андроиде я указывал так
Вот отдельный класс с таблицей данных

class Tabl {
static double[][]Tabl = new double[][] {
{0,     -16,    0,      0,      0,      0,      0,        0,            1,            2,            2,           2,           3},
{1,    -16,    1,    1,       1,     1,    1,    2,    3,    3,    3,    4,    4},
};
}
А так я вытягиваю нужные мне данные
gr2_200=Tabl.Tabl[2][1]));
И того мне выдаст 1 

Автор: xvr 14.6.2012, 21:22
Цитата(Ярослав @  14.6.2012,  21:13 Найти цитируемый пост)
Вот отдельный класс с таблицей данных

На С (С++) можно просто сделать массив
Код

doubleTabl[][] = {
{0,     -16,    0,      0,      0,      0,      0,        0,            1,            2,            2,           2,           3},
{1,    -16,    1,    1,       1,     1,    1,    2,    3,    3,    3,    4,    4},
};


Цитата(Ярослав @  14.6.2012,  21:13 Найти цитируемый пост)
А так я вытягиваю нужные мне данные
gr2_200=Tabl.Tabl[2][1]));

И вытаскивать почти так же:
Код

gr2_200=Tabl[1][2];
Только массив должен быть описан там, где вы его используете. Иначе придется делать его предварительное описание с размерами

Автор: Ярослав 16.6.2012, 17:00
О, дабро готов и описать как сделать его в отдельном файле.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)