с пробитой головой калека
Доброго всем времени суток)
такой вопрос у меня: можно ли перевести двумерный массив строк в одномерный, чтобы там дальше с ним всякие преобразования делать?
я как-то попыталась это реализовать, но билдер ругается(
посмотрите пожалуйста, в чем ошибка?

код

@темы: Вопрос, C++

Комментарии
22.02.2011 в 22:18

Может ругается потому, как массив t объявляется на 2500 символов, а на деле вы в него 3000 записываете? (30*10=3000) Хотя я могу ошибаться, С++ не изучала
22.02.2011 в 22:37

Пау-чок


У вас массив a определён как двумерный массив >символов<, а не указателей. Так же, как и массив t - массив символов. Поэтому, в строке

вы передаёте не указатель на символ а символ.
22.02.2011 в 22:53

с пробитой головой калека
katastroficheski
да нет) если бы не это ругался, то я бы разобралась)

O
так. это значит, что мне t надо задать как массив указателей?
а то у меня как на зло с указателями плохо(
22.02.2011 в 23:54

ну, и???
.tenderness_
нет, вам не нужны массивы указателей
чтобы поправить ваш код, то вместо strcpy(t[l], a[i][j]) можно написать t[l]=a[i][j]. У вас же все равно идет посимвольное копирование
//и да, в таком случае он будет падать при выполнении из-за того, что одномерный массив коротковат

но вообще рекомендую почитать про функцию strcat()
23.02.2011 в 01:17

Пау-чок
.tenderness_
Я не совсем понял поставленную задачу. В данный момент

может считаться объявлением a как массива из ста строк, каждая не длиннее 29 значащих символов (30'й - ноль, как указатель конца строки), а - как одну строку в 2499 символов (опять же с нулём на 2300'й позиции). Если вам нужно просто слить 100 строк в одну - то это одно, если же нужно перераспределить массив из 100x30 строк в один массив из 2500 строк - это другое.
23.02.2011 в 10:10

с пробитой головой калека
Alala
блииин. точно) написала так, как вы сказали и все путем)
спасибо)

O
по идее его надо перераспределить.
но сейчас пока что все работает. надеюсь, что дальше сложностей не возникнет)
28.02.2011 в 09:53

Хочешь чуда? Будь чудом!
ну вообще, если объявлен массив не динамический, то можно не добавлять работы по созданию нового одномерного массива
потому что в памяти такой массив nxm ничем не отличается от одномерного массива длиной n*m
то есть двумерный массив:
int array[2][3];
for(int i = 0; i < 2; i++)
for(int j = 0; j < 3; j++)
array[i][j] = 1;

в памяти будет выглядеть как массив одномерный: 1 1 1 1 1 1

для того, чтобы с двумерным массивом работать как с одномерным нужно только нормально работать с указателями:

int array[n][m];

for(int* i = array[0]; i < array[n-1]+m; i++)
cout << *i;

этот кусочек выведет все содержимое массива.
как видно - это один цикл

i - это указатель.
array[0] - адрес начала первой строки
array[1] - соответсвенно адрес начала второй строки

аналогично
array[i]+j - это адрес житого элемента в итой строке

если перед адресом поставить *
то это будет сам элемент.

потому и пишется
cout << *i;

потому что выводим содержимое ячейки, а не сам адрес.

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