Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
jake09
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 20
#1

Работа с двухмерным динамеческим массивом через указатель - C++

20.11.2014, 23:07. Просмотров 910. Ответов 22
Метки нет (Все метки)

Натупил здесь наверное сильно, подскажите ребят, а то долго уже сиджу над этим... Где ошибки? Программу компилирует, но потом выбивает.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
 int main()
 {
    srand(time(NULL));
    const int size_x = 4, size_y = 5, m = 20;
    int **matrix, i, j, d, n[4] = {1,2,3,4}, s;
    matrix = malloc(m*sizeof(int**));
    for (i = 0; i < size_x; i++)
    {
        for (j = 0; j < size_y; j++)
        {
            matrix[i][j] = (rand() % 20)-10;
            d = fabs(matrix[i][j]);
            if((j+1)==d)
            {
                   s++;
            }
        }
        printf("For line %d number of elements that matched is = %d\n", n[i],s);
        free(matrix);
    }
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 23:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с двухмерным динамеческим массивом через указатель (C++):

Работа с массивом структур в функции через указатель на этот массив - C++
Добрый вечер. Имеется следующая задача: &quot;Разработайте программу, сохраняющую записи (порядковый номер ввода, число с плавающей точкой и...

Развлечения с массивом через указатель - C++
Инициализация указателей. Объявите массив, состоящий из 8 элементов типа short int. Объявите указатель на этот массив и присвойте ему...

Управление двухмерным массивом из функции - C++
Доброго времени суток, пожалуйста, подскажите, как правильно передать в функцию указатель на двухмерный массив, а затем из функции изменять...

В С++ может ли argv быть двухмерным массивом? - C++
int main(int argc, char *argv) { argv = tolower(argv); argv = tolower(argv); Вот что это означает? Когда у argv с двумя...

Работа с массивом с через strcpy_s() - C++
Функция addBrackets принимает массив и преобразует его заключая в скобки . т.е. на на вход массив: text после преобразования: ...

Работа с массивом через геттер и сеттер - C++
#include &lt;iostream&gt; using namespace std; class My_Class { private: int *p; public: My_Class() { p = new int ;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
21.11.2014, 02:40 #16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Память "многомерного массива" в С и С++ состоит из одного непрерывного блока. Никакого "цикла" при выделении и/или освобождении памяти для такого массива нет и быть не может.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Почему не может? Может конечно.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Сущность, которую можно использовать как многомерный массив" - это и есть многомерный массив Все остальное - детали реализации.
Противоречим самому себе потихоньку? Ну-ну.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ключевой момент здесь в том, что никакие указатели физически нигде не хранятся. Никакого массива указателей нет и никогда не было. Указатель возникает только воображаемый, концептуальный, временный, как промежуточный результат выполнения array-to-pointer conversion.
Ладно. Тогда яви чудо и создай, а затем освободи динамический многомерный массив без всякого цикла и без инициализации и затем освобождения в розницу всех этих несуществующих указателей.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3826 / 2084 / 532
Регистрация: 18.10.2014
Сообщений: 3,699
21.11.2014, 03:12 #17
Цитата Сообщение от true_bugmaker Посмотреть сообщение
Противоречим самому себе потихоньку? Ну-ну.
Смешались в кучу кони, люди!!!...

Зрителям: я по-моему везде ясно указывал, когда речь идет о встроенных массивах, а когда о рукописных "jagged arrays". Специально тщательно вставлял слова "встроенный" и "языковый". Но все оказалось тщетно. Пациент все свалил в одну кучу и увидел там "противоречия" Случай тяжелый, боюсь мы его теряем....

Цитата Сообщение от true_bugmaker Посмотреть сообщение
Тогда яви чудо и создай, а затем освободи динамический многомерный массив без всякого цикла и без инициализации и затем освобождения в розницу всех этих несуществующих указателей
Да пожалуйста. Вот вам аж пятимерный!!!

C++
1
2
int n = 10;
int (*a)[20][30][40][50] = new int[n][20][30][40][50];
доступ

C++
1
a[3][5][6][7][8] = 42;
а вот освобождение

C++
1
delete[] a;
О, чудо!!! Как же так - ни одного цикла?!!

(Но пациент скорее мертв, чем жив и надежды на излечение малы...)

=================

Но самое интересное произойдет, если мы перейдем в язык С с его поддержкой variable-length arrays и сделаем все размеры величинами времени выполнения

C
1
2
3
4
5
6
7
8
9
10
11
int n1 = rand() % 10 + 1;
int n2 = rand() % 20 + 1;
int n3 = rand() % 30 + 1;
int n4 = rand() % 40 + 1;
int n5 = rand() % 50 + 1;
 
int (*a)[n2][n3][n4][n5] = malloc(n1 * n2 * n3 * n4 * n5 * sizeof(int));
 
a[1][2][3][4][5] = 42;
 
free(a);
О, чудо!!!

Где же "циклы"TM? Неужели волшебный 'malloc' как-то магически узнал, что нам нужен не просто плоский кусок памяти, а многомерный массив (небось выглянул из глубин своей реализации через перископ), и услужливо выполнил дополнительное выделение памяти для "массивов указателей"TM да еще и "циклов"TM втихаря накрутил для их инициализации!!! Воистину велики дела твои 'malloc'!
0
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
21.11.2014, 03:51 #18
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Да пожалуйста. Вот вам аж пятимерный!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
victor@scorpion:~/devel/tmp$ cat dynar.cpp 
#include <iostream>
 
int main (int argc, char * argv []) {
        int n1 = 10, n2 = 20, n3 = 30, n4 = 40, n5 = 50;
        int (*a)[n2][n3][n4][n5] = new int[n1][n2][n3][n4][n5];
 
 
        return 0;
}
 
victor@scorpion:~/devel/tmp$ gcc dynar.cpp 
dynar.cpp: В функции «int main(int, char**)»:
dynar.cpp:5:41: ошибка: «n2» cannot appear in a constant-expression
dynar.cpp:5:45: ошибка: «n3» cannot appear in a constant-expression
dynar.cpp:5:49: ошибка: «n4» cannot appear in a constant-expression
dynar.cpp:5:53: ошибка: «n5» cannot appear in a constant-expression
victor@scorpion:~/devel/tmp$
чёто по-моему он как-то не так должен работать.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Специально тщательно вставлял слова "встроенный" и "языковый".
То есть динамические массивы не являются встроенными или языковыми? И динамические массивы нельзя использовать как многомерные массивы? Потому что если было бы можно, они были бы
Цитата Сообщение от true_bugmaker Посмотреть сообщение
"Сущность, которую можно использовать как многомерный массив" - это и есть многомерный массив Все остальное - детали реализации.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3826 / 2084 / 532
Регистрация: 18.10.2014
Сообщений: 3,699
21.11.2014, 04:15 #19
Цитата Сообщение от true_bugmaker Посмотреть сообщение
чёто по-моему он как-то не так должен работать.
В смысле? Смотрим в спецификацию языка С++ и видим, что там ясно сказано, что все размеры кроме первого, в операторе 'new' для массива должны быть константами времени компиляции. Вам что-то в этом не ясно?

Цитата Сообщение от true_bugmaker Посмотреть сообщение
То есть динамические массивы не являются встроенными или языковыми? И динамические массивы нельзя использовать как динамические массивы?
Что такое "динамические массивы" в данном случае? Массивы, у которых все размеры являются неконстантыми? Встроенные языковые массивы в языке С++ такого не позволяют, как ясно написано в спецификации языка С++. (А вот в языке С - пожалуйста.) Но при чем здесь такие массивы? Дискуссия шла о природе языковых многомерных массивов языка С++. Вы мне даже цитаты из стандарта про них приводили. Помните?

Встроенные языковые массивы бывают "динамическими" только по первому размеру.

Поэтому давайте-ка не будем отвлекаться и вернемся к моим примерам. Расскажите-ка нам, где ж там "циклы"TM и "массивы указателей"TM, которые, как вы утверждали, существуют во встроенных языковых массивах. Особенно меня интересует вариант с 'malloc' и variable-length arrays. Покажете-ка мне, где прячутся эти загадочные "циклы"TM и "массивы указателей"TM в обоих моих примерах. Я просто горю нетерпением их увидеть.
0
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
21.11.2014, 05:04 #20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В смысле? Смотрим в спецификацию языка С++ и видим, что там ясно сказано, что все размеры кроме первого, в операторе 'new' для массива должны быть константами времени компиляции. Вам что-то в этом не ясно?
До сих пор неясно когда же ты явишь нам чудо, выделив и удалив динамический массив без циклов.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
(А вот в языке С - пожалуйста.)
VLA уже перестали быть необязательным расширением?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Особенно меня интересует вариант с 'malloc' и variable-length arrays. Покажете-ка мне, где прячутся эти загадочные "циклы"TM и "массивы указателей"TM в обоих моих примерах. Я просто горю нетерпением их увидеть.
Первый так и не заработал. А во втором, использовать расширение, не толстовато ли? Почему сразу не либу какую-нибудь?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3826 / 2084 / 532
Регистрация: 18.10.2014
Сообщений: 3,699
21.11.2014, 05:47 #21
Цитата Сообщение от true_bugmaker Посмотреть сообщение
До сих пор неясно когда же ты явишь нам чудо, выделив и удалив динамический массив без циклов.
Я смотрю, пошло верчение хвостом... Ну-ка и я попробую "Динамический" в терминологии С++ означает - выделенный в динамической памяти. Примеры я уже привел

А теперь серьезнее: ни о каких "динамических массивах" речь не шла. С чего это вдруг? Тема массивов динамического размера была закрыта моей ссылочкой в сообщении #4. Там по ссылочке вы найдете и циклы, и массивы указателей...

А разговор здесь шел о многомерных языковых массивах. Ничего "динамического". Вы же мне сами цитату из стандарта в нос тыкали. Вы ведь понимаете, надеюсь, что в стандарте пишут именно о языковых массивах, а не о ваших доморощенных массивах указателей? Сообщение #8 посмотрите. Где там слово "динамический"?

Цитата Сообщение от true_bugmaker Посмотреть сообщение
А во втором, использовать расширение, не толстовато ли? Почему сразу не либу какую-нибудь?
Ну, ну, ну, опять верчение хвостом пошло... Да, могу и либу! В чем проблема-то? Какое это имеет значение, расширение это или нет, либа это или нет?

Вопрос не в том "либа" ли это, "расширение" ли это, а в том, используют ли они "циклы"TM и "массивы указателей"TM. Вы нам тут распинались, что невозможно создать массив динамического размера без "циклов" и "массивов указателей". Так а как же это удается нашему "расширению"? Это что какое-то волшебное расширение, искажающее саму ткань реальности и делающее невозможное возможным? Или вы считаете, что там в этом "расширении" где-то спрятаны эти "циклы" и "массивы указателей"? Если так, то покажите же нам, где они спрятаны.

P.S. В языке С VLA являются не "расширением", а опциональной фичей, и то опциональной только в компиляторах языка С11. В языке С99 VLA обязательны. В любом случае, это к делу не относится и заниматься дешевым переводом стрелок на посторонние темы я запрещаю.
0
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
21.11.2014, 06:26 #22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А теперь серьезнее: ни о каких "динамических массивах" речь не шла. С чего это вдруг?
С того что обсуждение началось с этого комментария, почему бы и нет?

двумерный динамический массив размерностью (size_x, size_y) следует выделять так, потому что по факту в сях нету двумерных массивов, создаётся одномерный массив из int*, указателей на одномерные массивы int:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы же мне сами цитату из стандарта в нос тыкали. Вы ведь понимаете, надеюсь, что в стандарте пишут именно о языковых массивах, а не о ваших доморощенных массивах указателей? Сообщение #8 посмотрите. Где там слово "динамический"?
Речь шла о том, что массивы в с++ ведут себя иначе, чем просто многомерные массивы, и что динамическое их выделение - одна из особенностей, по которой это заметно. Ты же стал утверждать, в какой-то конкретной или нескольких реализациях для некоторых частных случаев, например для статических многомерных массивов, указатели в явном виде в памяти не располагаются потому что массивы в с++ многомерны, а не потому что в этом частном случае нет никакой надобности располагать в памяти эти указатели, раз уж все адреса извесны на этапе компиляции, неизменяемы и все обращения к ним в этом частнном случае можно заменить на прямые адреса, верно? Или цитат с перовй страницы понадёргать?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какое это имеет значение, расширение это или нет, либа это или нет?
Такое, что оно умышленно скрывает обсуждаемые нами понятия при помощи "синтаксического сахара".

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а как же это удается нашему "расширению"?
Точно так же как удаётся создавать статические на этапе компиляции, тоже без циклов.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В любом случае, это к делу не относится и заниматься дешевым переводом стрелок на посторонние темы я запрещаю.
Есть ли у тебя власть запрещать мне что-либо?
0
jake09
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 20
22.11.2014, 15:47  [ТС] #23
Спасибо ребят, все получилось
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2014, 15:47
Привет! Вот еще темы с ответами:

Работа с массивом через указатели(Определить, строго ли чередуются элементы в массиве) - C++
Задан массив из N элементов, состоящий только из нулей и единиц. Определить, строго ли чередуются элементы в массиве. Программа должна...

лаба по динамеческим структурам данных - C++
Кто знает как сделать????

Не могу разобраться как сделать указатель функции с динамич. массивом - C++
int* mass(int p, int n) { cout &lt;&lt; &quot;Введите размер массива: &quot;; cin&gt;&gt;n; int *p = new int ; for (int i(0); i &lt; n; i ++) { cout &lt;&lt;...

Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) - C++
Подскажите как передать указатель на файл в функцию, как вернуть указатель на файл из функции. void Open() // из этой функции вернуть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.11.2014, 15:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru