Здравствуйте, potap, Вы писали:
P>Не чувствую, что в этом более здорового .
P>Требовалось: P>1. иметь некоторую переменную p- начальный адрес ЕДИНОГО куска памяти с данными. P>2. обращаться к элементам массива — p[i][j]. P>3. на этапе компиляции неизвестны пределы, в которых будут меняться i и j.
ну может тогда так:
class xxx
{
char data;
public:
char& operator [](int i) {return data;}
};
//...
xxx * p = new xxx [M * N];
p[i][j] = 0;
//...
И все-таки почитай топик, ссылку на который я дал ниже.
Любите книгу — источник знаний (с) М.Горький
Re[6]: двумерный динамический массив
От:
Аноним
Дата:
28.11.02 09:49
Оценка:
Он (потап) говорит о представлении массива в памяти. Если есть int a[5][5];
Можно написать int * pD1 = *a; и далее писать p[i_num*5+j_num] = 10; или a[i_num][j_num] = 10;
Здравствуйте, potap, Вы писали:
P>Люди, просветите плиз.
P>Одномерный статический (с заранее известным размером)массив (char a[5]) легко переводится в одномерный динамический (с заранее НЕизвестным размером) массив (char* a=malloc(n)).
P>А как быть с двумерным (и более) массивом. Как перевести char a[5][7] в nxm динамический массив.
P>Спасибо за возможные ответы.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, potap, Вы писали:
P>>Не чувствую, что в этом более здорового :???: .
P>>Требовалось: P>>1. иметь некоторую переменную p- начальный адрес ЕДИНОГО куска памяти с данными. P>>2. обращаться к элементам массива — p[i][j]. P>>3. на этапе компиляции неизвестны пределы, в которых будут меняться i и j.
B>
Здравствуйте, potap, Вы писали:
P>Люди, просветите плиз.
P>Одномерный статический (с заранее известным размером)массив (char a[5]) легко переводится в одномерный динамический (с заранее НЕизвестным размером) массив (char* a=malloc(n)).
P>А как быть с двумерным (и более) массивом. Как перевести char a[5][7] в nxm динамический массив.
Нет, с точки зрения машинного представления, разницы между 1-мерным и n-мерным массивом (если не рассматривать масивы а-ля Java). Это в том и в другом случае некоторая область памяти. Есть разница, с точки зрения компилятора и программера в способе адресации этой памяти. Так для получения элемента одномерного массива TYPE A[n], мы пишем A[i], что буквально означает
*((char*)A + (char)sizeof(TYPE)*i)). Для двумерного массива TYPE A[m][n], выражение A[i][j], будет означать
*((char*)A + (char)sizeof(TYPE)*i) + (char)sizeof(TYPE)*j) и т.д.
Т.е. можно прописать некий класс с соответствующими конструкторами и набором операторов ( типа (int i, int j) ), в котором сам массив
будет представлен в виде непрерывной области памяти, а задача распределения и адресации этой памяти реализуется при помощи функций-членов.
Не дай своим глазам увидеть, а ушам услышать то, что ты не сможешь объяснить.
Абрахам ван Хелсинг
Здравствуйте, potap, Вы писали:
P>Люди, просветите плиз.
P>Одномерный статический (с заранее известным размером)массив (char a[5]) легко переводится в одномерный динамический (с заранее НЕизвестным размером) массив (char* a=malloc(n)).
P>А как быть с двумерным (и более) массивом. Как перевести char a[5][7] в nxm динамический массив.
P>Спасибо за возможные ответы.
Привет, вот небольшой пример создания двумерного массива:
#include <stdio.h>
#include <stdlib.h>
typedef int T;
T **Allocate(size_t m, size_t n)
{
int **a;
int *p;
size_t Row;
a = malloc(m * n * sizeof **a + m * sizeof *a);
if(a != NULL)
{
for(Row = 0, p = (T *)a + m; Row < m; Row++, p += n)
{
a[Row] = p;
}
}
return a;
}
вместо T можешь подставить любой другой тип.
Пока.
Трудно ничего не делать, но мы не боимся трудностей.