Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10689
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3991
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2051
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1794
Дата выхода:14.09.2013, 23:30
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:70 / 56
Вопросов / ответов:3 / 11

Консультация # 75887: Здравствуйте дорогие эксперты. Я хотел бы спросить как в языке С одномерный массив преобразовать в многомерный? Заранее спасибо за ответы....


Консультация # 71777: Здравствуйте эксперты! Подскажите, почему получается бесконечный цикл если писать вот так: for(int a=0;a=5;a++){cout<<"*";}; и вот так: for(int a=0;a<5;a+2){cout<<"*";};...
Консультация # 124476: Помогите, пожалуйста, выполнить задание. Корона должна выводиться на консоли, знаком "*"...

Консультация # 75887:

Здравствуйте дорогие эксперты. Я хотел бы спросить как в языке С одномерный массив преобразовать в многомерный? Заранее спасибо за ответы.

Дата отправки: 15.02.2007, 17:08
Вопрос задал: GOrilla
Всего ответов: 5
Страница онлайн-консультации »


Консультирует estiGi:

Здравствуйте, GOrilla!
Изменить сам тип? Никак.
Одномерный массив выглядит, например как
int * pArray;
или
int arr [size];
Двумерный:
int ** ppArray;
или
int arr [size][size];

Вы не сможете изменить тип int* на int**.
Если же имеется в виду просто преобразование, то как обычно:

void func (int * pArr)
{
int ** ppArr;
ppArr = (int **)pArr;
или
ppArr = (int **)&pArr;
}

вы должны сами выбирать, в зависимости от того, что на самом деле находится в pArr. Но если он создавался как одномерный массив, то в результате
ppArr = (int **)pArr;
вы получите фиг знает что, а в результате
ppArr = (int **)&pArr;
вы получите адрес массива
переделать же его в двумерный просто так вот не получится

Консультировал: estiGi
Дата отправки: 15.02.2007, 17:31
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует PROD:

Здравствуйте, GOrilla!
Не буду утверждать, но помоему никак.
создаете новый многомерный массив и переносите туда нужным образом данные.
Если массив изначально задан как одномерный под него и память будет выделена соответствующе.
в определенных случаях от переписывания массива вас могут спасти указатели. То есть ваш массив останется одномерным, но данные из него вы будете по другому.
например был int a[10]; а вы хотите чтоб стал int b[2][5]; (одну строку разрезать пополам)то наш псевдо массив b это указатель на a смещенный на j*5+i элементов.
Во всех других случаях переписывайте массив в другой

Консультировал: PROD
Дата отправки: 15.02.2007, 19:23
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует ramok (Практикант):

Здравствуйте, GOrilla!

данные в одномерном массиве и многомерном хранятся одинаково, тоесть последовательно в памяти.
все зависит от интерпритации одномерного массива.

самый простой и очевидный способ это просто скопировать содержимое одномерного массива в многомерный. в приложении пример 1
но в данном случае вы дублируете массив.

можно просто вспомнить что синтаксис доступа к многомерному массиву это всего лишь удобная запись, но никто не мешает воспользоватся и указателями.
тоесть A[i][j] в вашем случае аналог *(M + 5*i + j)
смотрите пример 2 в приложении.
недостаток метода - некрасивый синтаксис
преимущество - не происходит никакого копирования

Приложение:

Консультировал: ramok (Практикант)
Дата отправки: 15.02.2007, 19:44
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Ross:

Здравствуйте, GOrilla!

Для удобства и наглядности извлечения данных из одномерного массива можно использовать макрос(если массив часто используется и заранее известно его имя).
Допустим имеется массив matrix[16], который нужно интерпретировать как матрицу 4*4:

#define m(i,j) *(matrix + j*4+i) //либо matrix[i+j*4]

float matrix[16];

int main()
{
m(0,0) = 1;
m(0,1) = 2;
m(0,3) = m(0,0) + m(0,1);
}

Консультировал: Ross
Дата отправки: 16.02.2007, 00:04
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует kool:

Здравствуйте, GOrilla!
Мона примерно так (см. приложение):

Приложение:

Консультировал: kool
Дата отправки: 16.02.2007, 00:35
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 71777:

Здравствуйте эксперты!
Подскажите, почему получается бесконечный цикл если писать вот так:
for(int a=0;a=5;a++){cout<<"*";};
и вот так:
for(int a=0;a<5;a+2){cout<<"*";};

Дата отправки: 20.01.2007, 10:01
Вопрос задал: Вячеслав Шинкаренко
Всего ответов: 4
Страница онлайн-консультации »


Консультирует kool:

Здравствуйте, Вячеслав Шинкаренко!
В первом случае
for(int a=0;a=5;a++){cout<<"*";};
в условии цикла значение выражения a=(призвоить)5 всегда истино,
а значит цикл не закончится. Нуно так, например,
for(int a=0;a<=5;a++){cout<<"*";};
Во-втором случае
for(int a=0;a<5;a+2){cout<<"*";};
значение a ваще не меняется. Нуно так, например,
for(int a=0;a<5;a+=2){cout<<"*";};
Удачи!

Консультировал: kool
Дата отправки: 20.01.2007, 12:12
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Mitya86:

Здравствуйте, Вячеслав Шинкаренко!

бесконечный цикл в первом случае получается потому что вместо условия вторым параметром цикла стоит присваивание(а=5). "=" - это оператор присваивания, а "==" - оператор сравнения. Поэтому Вам необходимо писать а==5 в первом случае.
во втором случае третьим параметром цикла стоит арифметический оператор сложения, который не изменяет значения операндов(а+2), чтобы присвоить а новое значение необходимо использовать оператор присваивания "=". Т.е во втором случае вместо а+2 нужно писать а=а+2 либо а+=2

Консультировал: Mitya86
Дата отправки: 20.01.2007, 12:40
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Volodymyr:

Здравствуйте, Вячеслав Шинкаренко!
1) for(int a=0;a=5;a++){cout<<"*";}; // нужно условие (int a=0;a!=5;a++) так как цикл выполняется пока условие истинно (т.е. "а" неравно 5).

2) правильно будет: for(int a=0;a<5;a+=2){cout<<"*";}; // иначе результат увеличения "а" на 2 не сохранится.

Консультировал: Volodymyr
Дата отправки: 20.01.2007, 16:04
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Thread:

Здравствуйте, Вячеслав Шинкаренко!
Цикл в Си++ представляет собой следущее:
for (инициализация; условие; итерация)

здесь инициализация - это то, что выполняется первый раз
условие - буловское значение, пока оно равно true - цикл выполняется, поэтому цикл

while (условие)
{
}

эквивалентен

for (;условие;)
{
}

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

Теперь нужно отметить такой момент, что в с++ bool - это такое числовое значение, что если оно равно 0, то это false, при других значения это true

т.е.

цикл
while (true) - бесконечный

то и циклы
while (1)
while (5)
while (8)

тоже бесконечные

Еще один момент: в си оператор = возвращает результат присваивания. Т.е. (x = 5) имеет значение 5 . Поэтому можно записать так: y = (x = 5), ну или без скобок, y = x = 5

Вернемся к вашей задаче.
В первом случае в качестве условия всегда будет значение присваивания a = 5, т.е. 5,а пять в виде bool означает true, получаем всегда выполняющееся условие, т.е. бесконечный цикл

Во втором случае единственное, что делает выражение a+2, это создает некоторую ячейку в памяти со значением 2, при этом само a не изменяется и всегда остается меньше чем 5. Т.е. a < 5 выполняется всегда и цикл бесконечный.

Консультировал: Thread
Дата отправки: 20.01.2007, 20:08
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 124476:

Помогите, пожалуйста, выполнить задание. Корона должна выводиться на консоли, знаком "*"

Дата отправки: 23.02.2008, 13:21
Вопрос задал: VIP VIP
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Ross:

Здравствуйте, VIP VIP!

Вот решение задачи. Для порядку конечно стоит еще добавить проверку вводимого числа (оставляю на ваше усмотрение)

Приложение:

Консультировал: Ross
Дата отправки: 24.02.2008, 13:07
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует shayen (Студент):

Здравствуйте, VIP VIP!
Код в приложении, компилировался в VS 2003

Приложение:

Консультировал: shayen (Студент)
Дата отправки: 24.02.2008, 19:32
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное