Большой Воронежский Форум
» Программирование>Массив в C++ Builder6
Alecksey991 23:23 13.05.2004
Проблемка такая. Надо обрабатывать матрицу (N*N), где N задается, а потом вводятся элементы. Как объявить массив?
Мне нужно использовать динамический массив? [Ответ]
zss_vrn 07:28 14.05.2004
Alecksey991

Сообщение от :
Мне нужно использовать динамический массив?

А Бог его знает, что нужно в конкретном случае Зависит от задачи. Я динамические массивы не очень люблю - в смысле памяти они экономичнее, а в смысле геммороя - наоборот.

Можно использовать Variant - он до 5-мерных массивов поддерживает. Посмотри HELP, я уж давно этим не пользовался.
[Ответ]
Grossmeister 09:19 14.05.2004
Alecksey991 Vector<элемент>. [Ответ]
Kent 13:17 14.05.2004
float *massiv,element;
int strok=10,stolbcov=10;

//Выделим память
massiv=new float[strok*stolbcov];

//считаем элемент X,Y (надо учесть что первый столбец и строка нулевые)

element=*(massiv+strok*X+stolbcov*y);

//Подчистим память за собой
delete massiv; [Ответ]
Alecksey991 13:47 14.05.2004
zss_vrn Variant - это не то.

Задача примерно такого типа. Надо обрабатывать элементы матрицы вида
A11 A12 A13 ... A1n
A21 A22 A23 ... A2n
...............................
An1 An2 An3 ... Ann

Т.е. не известны размеры массива, а статический массив требует чтобы при его объявлении в скобках были константы:
float Massiv[20][20]; - массив 20х20 элементов. [Ответ]
zss_vrn 15:25 14.05.2004
Alecksey991
Ага... Это напоминает обработку таблиц Excel. Нет?

Во всяком случае для Excel Variant вполне подходил - массив-то двухмерный, чем плохо? И динамический.

Но если я чего-то не понял и Variant не совсем подходит, то можно так, как Kent нарисовал, на чистом С++.

Kent

Сообщение от :
delete massiv;

delete []massiv; //

zss_vrn добавил [date]1084537576[/date]:
И лучше double.
[Ответ]
Alecksey991 20:07 14.05.2004
Да походу с удалением был косяк.

zss_vrn Variant тоже должен подходить, но я не пойму как его использовать. [Ответ]
zss_vrn 08:11 17.05.2004
Alecksey991

Вот, кусок проги, может пригодится
------------------------------
iNameCol = 2;
iStatusCol = 6;

Variant vExcel,vBook,vSheet;
Function Open("Open");
PropertyGet Workbooks("Workbooks");
PropertyGet Sheets("Worksheets");
PropertyGet Range("Range");
PropertyGet Count("Count");
PropertyGet Rows("Rows");
PropertyGet Value("Value");
PropertyGet Item("Item");

PropertySet Visible("Visible");

Procedure Quit("Quit");
Procedure Close("Close");
Procedure Activate("Activate");

try {
vExcel = Variant::CreateObject("Excel.Application");
vExcel.Exec(Visible << false);
vBook = vExcel.Exec(Workbooks).Exec(Open <<WideString(sFileName));
vSheet = vBook.Exec(Sheets << 1);//Îòêðîåì ïåðâóþ ñòðàíèöó
vSheet.Exec(Activate);

grdStrings->Cells[0][0] = "ÊÎÄ";
grdStrings->Cells[1][0] = "ÓÏÁÑ";
grdStrings->Cells[2][0] = "Íàèìåíîâàíèå";
grdStrings->Cells[3][0] = "Êîä ÃÝÑÍ";
grdStrings->Cells[4][0] = "Êîä åä.";
grdStrings->Cells[5][0] = "Åä.èçì";
grdStrings->Cells[6][0] = "Ñòàòóñ";

Variant vValueA, vValueB, vValueC, vValueE, vValueF, vValueG;
Range.ClearArgs();
vValueA = vSheet.Exec(Range << "A5" << "A65530").Exec(Value);//Êîä ÌÏ

int Cnt = 0;//Ñ÷åò÷èê ñòðîê
int iEmptyCnt = 0;//Ñ÷åò÷èê ïóñòûõ ñòðîê

AnsiString asStr;
while ( iEmptyCnt<3 ){//Ïîëó÷àåì ñ÷åò÷èê
asStr = AnsiString( vValueA.GetElement(Cnt+1,1));
if (asStr.Length() ){//Òî, ÷òî íàäî
iEmptyCnt = 0;
Cnt++;
} else iEmptyCnt++;
}

AnsiString asEnd = Cnt + 5;//Ñêîëüêî íàñ÷èòàëè ñòðîê
asStr = Cnt;

Range.ClearArgs();//Êîä ÓÏÁÑ
vValueB = vSheet.Exec(Range << "B5" << "B" + asEnd).Exec(Value);

Range.ClearArgs();//Êîä ÃÝÑÍ
vValueC = vSheet.Exec(Range << "C5" << "C" + asEnd).Exec(Value); [Ответ]
Павел-Kikoz 13:39 17.05.2004
Я просто фигею... Простейшая задача, а здесь какие-то Vector'а, Variant, Exell... [Ответ]
Kent 14:02 17.05.2004

Сообщение от :
Первоначальное сообщение от Kent
float *massiv,element;
int strok=10,stolbcov=10;

//Выделим память
massiv=new float[strok*stolbcov];

//считаем элемент X,Y (надо учесть что первый столбец и строка нулевые)

element=*(massiv+strok*X+stolbcov*y);

//Подчистим память за собой
delete massiv;

По поводу delete []massiv; - согласен. Но прошу прощения за другую ошибку (спешил очень).

Чтобы обратится к элементу massiv(x,y) необходимо записать:
element=*(massiv+stolbcov*y+x);

Камнями не кидать, ведь никто и не поправил. [Ответ]
zss_vrn 14:41 17.05.2004
Павел-Kikoz
Ну, и че фигеть? Человеку помочь надо, а не фигеть [Ответ]
Alecksey991 00:26 18.05.2004
Павел-Kikoz Если есть более простое решение - предложения в студию. [Ответ]
Павел-Kikoz 15:32 18.05.2004
zss_vrn Alecksey991
Дык, Kent кажется и так уже все расписал, что еще предлагать?
Просто если есть проблемы с объявлением массива, то использовать Vector, Variant или Excel будет еще затруднительней... [Ответ]
Alecksey991 01:59 19.05.2004
Может кому пригодится нашел о динамическом выделении памяти в справочном пособии по C++ Builder 6 А.Я. Архангельского "Книга1 Язык С++" [Ответ]
zss_vrn 08:23 19.05.2004
Павел-Kikoz
Не, я не имел в виду использовать Excel Я имел в виду то, что я Variant с динамическими массивами использовал для обработки Excel. Так удобнее просто было.

А вообще то, что Kent написал - самое простое решение и в общем случае подходящее решение. Универсальное для С++. Но вопрос-то был о CBuilder, вот я и понял его слишком буквально.
[Ответ]
MHC 14:00 19.05.2004

Сообщение от :
Первоначальное сообщение от Alecksey991

float Massiv[20][20]; - массив 21х21 элемент.

Ты уверен? [Ответ]
Alecksey991 01:47 20.05.2004
MHC Ошибочка вышла. Как раз хотел исправить
zss_vrn Вопрос был о С++Builder потому что в Delfi я вообще не секу, а то что работает в С++ будет работать и в Builder.
[Ответ]
zss_vrn 10:55 20.05.2004
Alecksey991
Конечно, будет! Я думал, тебе нужно нечто, присущее именно билдеру, а не С++.

ЗЫ: Variant, кстати, пришел в билдер из дельфей на С++ он по большей части не нужен. [Ответ]
Вверх