Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33

Ошибка с работой массива

24.12.2013, 02:51. Показов 964. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть код (данные в массив берутся из файла Excel):
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
TForm2 *Form2;
Variant Excel, Sheet;
int i,j;
float nmas[8][40], rmass[4][7], rmast[4][1];
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
float Dmin, Dmax;
int D, K;
int a ,b; //счетчики массива rmass
Dmin=StrToFloat(Edit1->Text);
Dmax=StrToFloat(Edit2->Text);
D=StrToFloat(ComboBox1->Text);
K=StrToFloat(ComboBox2->Text);
if (ComboBox2->ItemIndex==0) { z=i; } else
if (ComboBox2->ItemIndex==1) { z=i+5; } else
if (ComboBox2->ItemIndex==2) { z=i+10; }  else
if (ComboBox2->ItemIndex==3) { z=i+15; } else
if (ComboBox2->ItemIndex==4) { z=i+20; } else
if (ComboBox2->ItemIndex==5) { z=i+25; } else
if (ComboBox2->ItemIndex==6) { z=i+30; } else z=i+35;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
    Variant Excel = CreateOleObject("Excel.Application");
   //   Excel.OlePropertySet(WideString("Visible"), true);
    Variant Book = Excel.OlePropertyGet(WideString("Workbooks")).OlePropertyGet
        (WideString("Open"), WideString("C:\\data2.xlsx"));
    Variant Sheet = Book.OlePropertyGet("Worksheets", 1);
    // активация последней заполненной ячейки
   Excel.OlePropertyGet("Cells").OlePropertyGet("SpecialCells",
     XlCellType::xlCellTypeLastCell).OleProcedure("Activate");
    // Получаем значение последней строки
    int rows = Excel.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
    // Получаем значение последней колонки
    int cols = Excel.OlePropertyGet("ActiveCell").OlePropertyGet("Column");
    StringGrid1->ColCount = cols;
    StringGrid1->RowCount = rows;
    for (int j = 0; j < rows; j++)
        for (int i = 0; i < cols; i++)
        {
                this->StringGrid1->Cells[i][j] =
                Sheet.OlePropertyGet(WideString("Cells"), j + 1, i + 1);
                nmas[i][j]=StrToFloat(StringGrid1->Cells[i][j]);
        }
    Excel.OleProcedure(WideString("Quit"));
}
//---------------------------------------------------------------------------
Но когда начинаю работать с массивом, например:
C++
1
2
3
4
5
6
for (i = z; i < z+4; i++)
for (j = 0; j < 7; j++)
{
    rmass[a][b]=nmas[j][i];
    a+=1; b+=1;
}
Сразу же ошибка.. (Этот код вставляю после условий с Combobox'ом).
Что я делаю не так.?
Подскажите пожалуйста.
Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2013, 02:51
Ответы с готовыми решениями:

Ошибка с работой БД по локальной сети
Здравствуйте. Создал БД Акесс и написал приложение на дельфи для работы с ней. Проблема; на моём ПК( на котором разрабатывался данный...

В чём разница между работой по RDP и работой по RDP через браузер?
Доброго времени суток, прошу помощи у вас форумчане разобраться со столь непростой ситуацией для начинающего сисадмина. Стоит задача...

Бинарное дерево и работа с текстами. В коде возникает ошибка с работой памяти
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;map&gt; #include &lt;string&gt; int main() { setlocale(LC_ALL, &quot;Russian&quot;); ...

15
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
24.12.2013, 08:29
Цитата Сообщение от Ises Посмотреть сообщение
C++
1
int a ,b; //счетчики массива rmass
Вы объявили счетчики, но я не вижу где они используются...
Цитата Сообщение от Ises Посмотреть сообщение
C++
1
rmass[a][b]=nmas[j][i];
Поэтому эта запись думаю некорректна.
Чтоб проверить мою догадку, сделайте так
C++
1
int a=1 ,b=1;  //счетчики массива rmass
а потом попробуйте использовать Ваш код.
1
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
24.12.2013, 11:57  [ТС]
Запускается без ошибки, но если пытаюсь вывести массив, то он никак не выводиться, а после закрытия программы все равно ошибка.. Вывожу так:
C++
1
2
3
4
5
6
for (a = 0; a < 4; a++)
for (b = 0; b < 7; b++)
{
    StringGrid2->Cells[j][i]=FloatToStr(rmass[a][b]);
    a+=1; b+=1;
}
Если вы можете, помогите пожалуйста..
Если нужно, могу скинуть исходник..
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
24.12.2013, 12:01
Ises, описание ошибки как минимум. Проект лишним не будет.
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
24.12.2013, 13:25  [ТС]
Цитата Сообщение от Kulgar Посмотреть сообщение
Ises, описание ошибки как минимум. Проект лишним не будет.
Вроде с этим разобрался, но при выходе из программы возникает ошибка и .. Если же запускать просто *.exe, то пишет только о некорректном завершении программы.
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
24.12.2013, 13:34  [ТС]
Цитата Сообщение от Ises Посмотреть сообщение
Вроде с этим разобрался, но при выходе из программы возникает ошибка Вложение 346729 и Вложение 346730.. Если же запускать просто *.exe, то пишет только о некорректном завершении программы.
Project1 (tds).rar

задача.rar

data3.xlsx

Это файлы проекта, если поможет..
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
24.12.2013, 13:34
Цитата Сообщение от Ises Посмотреть сообщение
C++
1
2
3
4
5
6
for (a = 0; a < 4; a++)
for (b = 0; b < 7; b++)
{
* * StringGrid2->Cells[j][i]=FloatToStr(rmass[a][b]);
* * a+=1; b+=1;
}
Причина скорее всего в этом
C++
1
StringGrid2->Cells[j][i]=FloatToStr(rmass[a][b]);
StringGrid2->Cells[j][i] на данном этапе берутся значения которые либо не изменяются (будет присваивать все значения массива ячейкам i и j в StringGrid2) либо еще не имеют параметров (ошибка).
Исходник бы посмотреть =)
Скиньте исходник файла .cpp
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
24.12.2013, 13:40  [ТС]
Ошибку, которая теперь, описал в сообщении (время сообщения 13:25), а в следующее сообщение прикрепил все файлы проекта (время сообщения 13:34).
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
24.12.2013, 14:13
Цитата Сообщение от Ises Посмотреть сообщение
Это файлы проекта, если поможет..
Файлы проекта *.bpr, *.cpp, *.h, *.dfm.
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
24.12.2013, 14:20  [ТС]
Там архив, в котором находиться проект. Файлы проекта отдельно загружать запрещено (если вы не знали).
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
24.12.2013, 15:39
Цитата Сообщение от Ises Посмотреть сообщение
Там архив, в котором находиться проект. Файлы проекта отдельно загружать запрещено (если вы не знали).
Я и не подумал искать файлы проекта в архиве "задача".

Убрал повторное объявление переменных Excel и Sheet. Заменил блок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    a = 0;
    b = 0;
    for (i = z; i < z + 4; i++)
        for (j = 0; j < 7; j++)
        {
            rmass[a][b] = nmas[j][i];
            a += 1;
            b += 1;
        }
    a = 0;
    b = 0;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 7; j++)
        {
            StringGrid2->Cells[j][i] = FloatToStr(rmass[a][b]);
            a += 1;
            b += 1;
        }
этим:
C++
1
2
3
4
5
6
    for (i = z; i < z + 4; i++)
        for (j = 0; j < 7; j++)
            rmass[j][i] = nmas[j][i];
    for (i = 0; i < 4; i++)
        for (j = 0; j < 7; j++)
            StringGrid2->Cells[j][i] = FloatToStr(rmass[j][i]);
Ошибка ушла. Проверяйте логику этих циклов.

А вот с этого:
C++
1
2
3
4
5
6
7
if (ComboBox2->ItemIndex==0) { z=i; } else
if (ComboBox2->ItemIndex==1) { z=i+5; } else
if (ComboBox2->ItemIndex==2) { z=i+10; }  else
if (ComboBox2->ItemIndex==3) { z=i+15; } else
if (ComboBox2->ItemIndex==4) { z=i+20; } else
if (ComboBox2->ItemIndex==5) { z=i+25; } else
if (ComboBox2->ItemIndex==6) { z=i+30; } else z=i+35;
Я в тихом ужасе.
Заменил на:
C++
1
z = 5*ComboBox2->ItemIndex;
1
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
24.12.2013, 16:23  [ТС]
Спасибо! Так и сделаю, думаю RAD Studio не заплачет снова..
Отдельное спасибо за замену цикла! Я просто особо не разбирался и ляпнул тут на абум...

Добавлено через 16 минут
Только вот я, наверное, не соглашусь с вашим циклом копирования из массива в массив, т.к. если, например, z=10, то и начнет во второй массив записывать как rmass=[10][j], а массив же с [0][0] новый должен организовываться.
Я прав? Или я туплю(
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
24.12.2013, 17:27
Цитата Сообщение от Ises Посмотреть сообщение
Только вот я, наверное, не соглашусь с вашим циклом копирования из массива в массив, т.к. если, например, z=10, то и начнет во второй массив записывать как rmass=[10][j], а массив же с [0][0] новый должен организовываться.
Я прав? Или я туплю(
Опишите словесно смысл этих 3х массивов. Я не понимаю что именно Вы с ними делаете, поэтому не могу сказать правильный ли код.
0
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
24.12.2013, 18:28  [ТС]
Цитата Сообщение от Kulgar Посмотреть сообщение
Опишите словесно смысл этих 3х массивов. Я не понимаю что именно Вы с ними делаете, поэтому не могу сказать правильный ли код.
Из первой матрицы 8х40 я выбираю матрицу 4х7 согласно условию, которое подходит, а из второй матрицы выбираю столбик, который подходит следующему условию. Условие 1 согласно выбора элемента из combobox2, условие 2 - согласно выбора элемента из combobox1.
Может более ясно будет из скрина:
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
25.12.2013, 10:28
Цитата Сообщение от Ises Посмотреть сообщение
Из первой матрицы 8х40 я выбираю матрицу 4х7 согласно условию, которое подходит, а из второй матрицы выбираю столбик, который подходит следующему условию. Условие 1 согласно выбора элемента из combobox2, условие 2 - согласно выбора элемента из combobox1.
Скрин не понял.
А вот циклы Ваши... заполнялись иначе, чем Вы описали. Перепутаны итераторы столбцов и строк. Не было обнуления итератора b при переходе на следующую строку. В конечном счёте получалось, что rmass заполнялся только первым элементом каждый строки nmas, а остальные нулевыми оставались.
C++
1
2
3
4
    for (i = z; i < z + 4; i++, a++)
        for (j = 0, b = 0; j < 7; j++, b++)
            rmass[a][b] = nmas[i][j];
    a = 0; b = 0;

Во втором цикле в StringGrid2 идёт полное занесение массива rmass, а не одного столбца. По скольку "условие 2" в программе вообще отсутсвует.
C++
1
2
3
    for (i = 0; i < 4; i++, a++)
        for (j = 0, b = 0; j < 7; j++, b++)
            StringGrid2->Cells[i][j] = FloatToStr(rmass[a][b]);
Единственное упоминание ComboBox1 закоментировано:
C++
1
//D=StrToFloat(ComboBox1->Text);
Личный персональный совет. Проработав логику алгоритма (хоть мысленно, хоть на бумажке) блока (к примеру, копирование части массива) напишите код и следом просто читайте его - вот прям построчно, посимвольно читайте код с одним вопросом: "Написали ли Вы то, что собирались?" И всегда есть пошаговая отладка.
1
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 33
25.12.2013, 16:36  [ТС]
Спасибо, разобрался, просто я писал еще после того как скинул сюда проект..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2013, 16:36
Помогаю со студенческими работами здесь

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

Ошибка с работой БД - "Невозможно найти устанавливаемый ISAM"
public Form1() { InitializeComponent(); string CommandText = &quot;Select , Фамилия, Имя, Отчество From...

Проблема с работой БП
Купил новый БП ибо старый сгорел, купил на 450 Вт подключил его и запуская компьютер выявил проблему: отсутствует звуковой сигнал и монитор...

Глюк с работой
Есть форма html для добавление и редактирования статей, количество переменных генерируется автоматически (с помощью js-скрипта), при...

Подскажите с проектной работой
Добрый день! Помогите с программой. Мне нужно для проектной работы по теме &quot;Компьютерная безопасность&quot; сделать подобие вируса, что бы...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru