Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамический массив. Это как?

9.0K
15 декабря 2004 года
Toxin
4 / / 15.12.2004
Большинство программ ориентированы на возможность работы с любым возможным объёмом данных.:D
Хотелось бы и самому сделать подобное.
Необходим динамический массив. Как изменять число записей в нём?
Если в Дэлфаре используется что-то вроде SetLength, то здесь данная функция определена только для класса AnsiString.:x
259
15 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Toxin
Большинство программ ориентированы на возможность работы с любым возможным объёмом данных.:D
Хотелось бы и самому сделать подобное.
Необходим динамический массив. Как изменять число записей в нём?
Если в Дэлфаре используется что-то вроде SetLength, то здесь данная функция определена только для класса AnsiString.:x



Вот способ № 1:
The declaration

type declarator [<constant-expression>]

declares an array composed of elements of type. An array consists of a contiguous region of storage exactly large enough to hold all of its elements.

If an expression is given in an array declarator, it must evaluate to a positive constant integer. The value is the number of elements in the array. Each of the elements of an array is numbered from 0 through the number of elements minus one.

Multidimensional arrays are constructed by declaring arrays of array type. The following example shows one way to declare a two-dimensional array. The implementation is for three rows and five columns but it can be very easily modified to accept run-time user input.

/* DYNAMIC MEMORY ALLOCATION FOR A MULTIDIMENSIONAL OBJECT. */

#include <stdio.h>

#include <stdlib.h>

typedef long double TYPE;

typedef TYPE *OBJECT;

unsigned int rows = 3, columns = 5;

void de_allocate(OBJECT);
int main(void) {

OBJECT matrix;

unsigned int i, j;

/* STEP 1: SET UP THE ROWS. */

matrix = (OBJECT) calloc( rows, sizeof(TYPE *));

/* STEP 2: SET UP THE COLUMNS. */

for (i = 0; i < rows; ++i)

matrix = (TYPE *) calloc( columns, sizeof(TYPE));

for (i = 0; i < rows; i++)

for (j = 0; j < columns; j++)

matrix[j] = i + j; /* INITIALIZE */

for (i = 0; i < rows; ++i) {

printf("\n\n");
for (j = 0; j < columns; ++j)
printf("%5.2Lf", matrix[j]);
de_allocate(matrix);
return 0;

}

void de_allocate(OBJECT x) {

int i;

for (i = 0; i < rows; i++) /* STEP 1: DELETE THE COLUMNS */

free(x);

free(x); /* STEP 2: DELETE THE ROWS. */

}

This code produces the following output:

0.00 1.00 2.00 3.00 4.00

1.00 2.00 3.00 4.00 5.00

2.00 3.00 4.00 5.00 6.00

In certain contexts, the first array declarator of a series might have no expression inside the brackets. Such an array is of indeterminate size. This is legitimate in contexts where the size of the array is not needed to reserve space.

For example, an extern declaration of an array object does not need the exact dimension of the array; neither does an array function parameter. As a special extension to ANSI C, C++Builder also allows an array of indeterminate size as the final member of a structure. Such an array does not increase the size of the structure, except that padding can be added to ensure that the array is properly aligned. These structures are normally used in dynamic allocation, and the size of the actual array needed must be explicitly added to the size of the structure in order to properly reserve space.

Except when it is the operand of a sizeof or & operator, an array type expression is converted to a pointer to the first element of the array.

Вот способ № 2:
Differences from Object Pascal Variants

The C++Builder syntax for creating Variant type arrays is different from the Object Pascal usage. For example, consider the following Object Pascal code:

V: Variant;

V := VarArrayCreate([0,HighVal,0,HighVal],varInteger);

In C++Builder, you can use Variant and the OPENARRAY macro like this.

Variant V(OPENARRAY(int,(0,HighVal,0,HighVal)),varInteger);

6.3K
15 декабря 2004 года
xTrim
38 / / 11.06.2004
а может всетаки проще использовать стандартную библиотеку и писать

#include <vector>
std::vector<int> iv;
iv.push_back(1);

и т.д.
259
15 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by xTrim
а может всетаки проще использовать стандартную библиотеку и писать

#include <vector>
std::vector<int> iv;
iv.push_back(1);

и т.д.



Проще, но у Variant есть большое преимущество: вообще о типе данных можно не думать.

6.3K
15 декабря 2004 года
xTrim
38 / / 11.06.2004
Цитата:
Originally posted by AlexandrVSmirno


Проще, но у Variant есть большое преимущество: вообще о типе данных можно не думать.



ого, хорошенькое преимущество. это лишний повод использовать стандартные контейнеры а не преимущество.

259
15 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by xTrim


ого, хорошенькое преимущество. это лишний повод использовать стандартные контейнеры а не преимущество.



Согласен. Код растет. Быстродействие падает. Но бывает, что выбирать не приходится.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог