Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с двумерным динамическим массивом, не могу его заполнить 
:(
    Опции темы
Iwan777
Дата 27.5.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Мне необходимо заполнить двумерный динамический массив, созданный с помощью vector. Этот массив заполняется из StringGrid, размер которого также задаётся динамически, в зависимости от того, сколько значений занесёт пользователь в поля Edit1 и Edit2.

Задаю глобально 3 динамических массива
Код

vector<double> cena;
vector<double> resurs;
vector<vector<double> > rashod;

заполняю вектора cena, resurs и задаю размер StringGrid
Код

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if(Key==13)
{
if(Edit1->Text!="")
{
cena.push_back(StrToFloat(Edit1->Text));
Label3->Caption=FloatToStr(cena.size());
Edit1->Text="";
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if(Key==13)
{
if(Edit2->Text!="")
{
resurs.push_back(StrToFloat(Edit2->Text));
Label4->Caption=FloatToStr(resurs.size());
Edit2->Text="";
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
StringGrid1->ColCount=cena.size();
StringGrid1->RowCount=resurs.size();
}

Пытаюсь занести значения в  двумерный вектор из StringGrid, после заполнения его данными
Код

void __fastcall TForm1::N2Click(TObject *Sender)
{
for(long int i=0;i<resurs.size();i++)
{
 for(long int j=0;j<cena.size();j++)
 {
  rashod[j][i]=StrToFloat(StringGrid1->Cells[j][i]);//здесь что-то не так!
 }
}
}

При компиляции программы Builder не ругается, но после того, как заполню вектора cena, resurs, задам размер StringGrid, заполню его данными, после этого нажимаю кнопку N2 и выскакивает ошибка, на адреса что-то ругается.
Что я сделал не так, подскажите пожалуйста. 
PM MAIL   Вверх
Fazil6
Дата 28.5.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Код

rashod[j][i]=StrToFloat(StringGrid1->Cells[j][i]);//здесь что-то не так!

нельзя заполнять вектор оператором [].
Нужно белать что-то вроде
Код

void __fastcall TForm1::N2Click(TObject *Sender)
{
    rashod.clear();
     for(long int i=0;i<resurs.size();i++)
    {
         std::vector<double> v ;
         for(long int j=0;j<cena.size();j++)
        {
              v.push_back(StrToFloat(StringGrid1->Cells[j][i]));
        }
        rashod.push_back(v);
    }
}

PM MAIL   Вверх
SergKO
Дата 28.5.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: нет
Всего: 20



Цитата(Fazil6 @  28.5.2007,  09:22 Найти цитируемый пост)
нельзя заполнять вектор оператором [].


Заполнять можно, следует сначала сделать resize. 

Код

#include <vector>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::vector<int> v1;

    v1.resize(10);

    for ( int i = 0; i < 10; i++ )
    {
        v1[i] = i;
    }

    for ( int i = 0; i < 10; i++ )
    {
        Memo1->Lines->Add( IntToStr(v1[i]) );
    }
}


Вот только не рекомендуется. Все обращения к элементам следует производить через оператор at().


PM MAIL   Вверх
Iwan777
Дата 28.5.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Всем большое спасибо!!!Заработало!
заполняю вектор так, как посоветовал Fazil6:
Код

rashod.clear();
     for(long int i=0;i<resurs.size();i++)
    {
         vector<double> v ;
         for(long int j=0;j<cena.size();j++)
        {
              v.push_back(StrToFloat(StringGrid1->Cells[j][i]));
        }
        rashod.push_back(v);
    }


для проверки вывожу в текстовый файл следующим образом:
Код

ofstream outfile("savename.txt");
   for(long int i=0;i<resurs.size();i++)
   {
     for(long int j=0;j<cena.size();j++)
        {
        outfile
         <<rashod[i][j]<<"\t";
        }
        outfile
        <<endl;
   }

Всё работает, как нужно.
PM MAIL   Вверх
SergKO
Дата 28.5.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: нет
Всего: 20



Для перебора элементов лучше воспользоваться итератором. Ниже пример. На заполнение не обращайте внимания, просто, как вариант.
Код

#include <vector>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::vector<double> cena;
std::vector<double> resurs;
std::vector<double>::iterator iter_cena;

std::vector<std::vector<double> > rashod;
std::vector<std::vector<double> >::iterator iter_rashod;

double dd = double(0), val = double(0);

    // Заполнение
    rashod.resize(10);
    for ( unsigned i = 0; i < 10; i++ )
    {
        rashod.at(i).resize(10);
        val += 100;
        for ( unsigned j = 0; j < 10; j++ )
        {
            rashod.at(i).at(j) = j+val;
        }
    }

    // Вывод
    for ( iter_rashod = rashod.begin() ; iter_rashod != rashod.end(); ++iter_rashod)
    {
        for ( iter_cena = (*iter_rashod).begin(); iter_cena != (*iter_rashod).end(); ++iter_cena )
        {
            dd = (*iter_cena);
            Memo1->Lines->Add( FloatToStr(dd) );
        }
    }
}


PM MAIL   Вверх
Iwan777
Дата 28.5.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Почему через итератор лучше? Объясните пожалуйста.

И какие отличия между такими записями:

rashod.at(i).at(j) и rashod[i][j], на мой взгляд с квдратными скобками удобнее, хотя бы потому, что меньше писанины. Или я не прав?
PM MAIL   Вверх
Fazil6
Дата 28.5.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(Iwan777 @  28.5.2007,  19:17 Найти цитируемый пост)
rashod.at(i).at(j) и rashod[i][j], на мой взгляд с квдратными скобками удобнее, хотя бы потому, что меньше писанины. Или я не прав?

at() контролирует выход за границы. При обращении по неправильному индексу получишь исключение, при [] обычно никаких проверок не делается(стандарт не требует обязательной проверки) как при работе с массивом

Цитата(Iwan777 @  28.5.2007,  19:17 Найти цитируемый пост)
Почему через итератор лучше? Объясните пожалуйста.

ничем особенным. Дело вкуса. Обычно, когда имеется ввиду "лучше итератор", то имеется ввиду, что конструкция
Код

while( iter != v.end())
{
  ....
  ++iter;
}

воспринимается проще и понятнее чем цикл for(кстати не припомню чтобы когда-нибудь встречал итераторы в цикле for как здесь http://forum.vingrad.ru/index.php?showtopi...&p=1148068)

Так что не переживай, твой способ вполне нормальный. Если уж говорить о STLstyle и как лучше, то вместо циклов стоило бы применять алгоритмы и функторы 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.