powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Двумерные массивы и С++
70 сообщений из 70, показаны все 3 страниц
Двумерные массивы и С++
    #39286832
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}



1.Так мы найдем минимум в каждой строке:
Код: plaintext
1.
2.
3.
for (int i = 0; i < n; ++i){
		counters_min_in_rows[i] = *std::min_element(a[i], a[i] + m);
	}


2. Написать свои функции поиска минимума и максимума не составляет труда, однако мне хотелось бы использовать существующие возможности С++. Подскажите пожалуйста по следующим вопросам:

q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы? Будут ли при этом какие-то потери по времени в отличие от классической реализации? Как бы вы поступили на практике?
q2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ?
q3 Каким образом вы бы оформили код из пункта 1, в стиле С++ ?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39286854
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}


/


начнем с того, что это - не двумерный массив, а массив массивов.


2. Написать свои функции поиска минимума и максимума не составляет труда, однако мне хотелось бы использовать существующие возможности С++. Подскажите пожалуйста по следующим вопросам:

q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы?

ну, по хитрому вычислять индексы в матрице, и в цикле на range обрабатывать. или в for each.


Будут ли при этом какие-то потери по времени в отличие от классической реализации?

ой, Там при обработке в памяти какие потоки по времени то?

Как бы вы поступили на практике?

не знаю, какую-то библиотеку на этот счет бы нашел.

q2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ?


нет. даже лучше new не использовать явно.

q3 Каким образом вы бы оформили код из пункта 1, в стиле С++ ?


не знаю, надо подумать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39286856
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
многомерный массив отличается от вложенных массивов именно тем, что доступ ко всей памяти массива происходит регулярным образом.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39286869
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в c++ забыли/не захотели сделать полноценные многомерные массивы
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39286870
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}


Выделяй память одним большим куском
Код: plaintext
1.
2.
void p* = malloc(sizeof(int*)*n + sizeof(int)*m*n);
...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39286885
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, я бы применял это :

http://www.boost.org/doc/libs/1_61_0/libs/multi_array/doc/user.html
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287094
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилв c++ забыли/не захотели сделать полноценные многомерные массивы
А скольки -мерность нам нужна в языке? Выше 2-й степени идёт полиномиальный расход памяти.
Возможно хештаблички решат это задачу более экономно. Разумеется я исхожу из предположения
что пользователь не всегда использует весь диапазон ключей и большая часть ячеек остаются
нулями.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287099
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА скольки -мерность нам нужна в языке?
>1
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287108
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonА скольки -мерность нам нужна в языке?
>1
Ну назови задачу где тебе нужен был массив выше двух измерений.
И что там хранилось и как использовалось?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287125
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилв c++ забыли/не захотели сделать полноценные многомерные массивы
Потому что кому надо может тривиально реализовать класс с таким функционалом.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287193
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИзопропилпропущено...

>1
Ну назови задачу где тебе нужен был массив выше двух измерений.

В Fortran-90, если ничего не путаю, их 7. Мне больше 6-ти как-то не требовалось...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287195
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
я тут не так давно карты Кохонена юзал, Там в моделях 7-10 изменений - легко..


вообще, любые матмодели ....
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287217
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, крутяк.

И как они хранились в memory?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287268
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у нас есть некий язык X++ в котором можно сделать следующее:

Код: plaintext
1.
2.
// 5-th dimension Cube
double hyperCube[][][][][] = new double[][][][][]();


Как его аллоцировать? В какую структуру? Как его экстендить. Как он будет
деградировать (освобождать память)?

В хешмапу? А в какую? А если мне надо будет сделать срез (итаратор по 3-му параметру)
то как взять значения которые у меня уже в кубе?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287283
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКак его аллоцировать? В какую структуру? Как его экстендить. Как он будет
деградировать (освобождать память)?
ИМХУ в одномерный массив. Какая разница сколько измерений? Расчет смещения относительно начала прост:
например в arr[M][N][K][L] , надо получить элемент a[1][2][3][4] смещение будет
Код: plaintext
1.
((1*N + 2) * K + 3) * L + 4
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287285
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима это банально. Ты подумай сколько у тебя памяти и какие диапазоны
индексов отсюда всплывают.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287300
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима это банально. Ты подумай сколько у тебя памяти и какие диапазоны
индексов отсюда всплывают.
Если это обычный (не ассоциативный) массив, то элементов будет M*N*K*L и от эвристики меньше не станет. Другой вопрос как оно в память ляжет, а тут не столько память важна (докупить можно если очень надо), сколько кэш проца, поэтому самое часто перебираемое измерение должно быть последнее, т.е. L.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287302
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ну припустим я эти значения M,N,K.... еще не знаю. Я буду грузить
данные из внешнего файла. Из СSV.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287312
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы?

ну, по хитрому вычислять индексы в матрице, и в цикле на range обрабатывать. или в for each.


Не может кто-нибудь привести конкретный пример, пожалуйста
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287317
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИзопропилпропущено...

>1
Ну назови задачу где тебе нужен был массив выше двух измерений.
И что там хранилось и как использовалось?

У меня в программах на Maple есть 4х мерные матрицы. Для реализации приближенных методов, коэффициенты в вычислительной схеме имеют 4 индекса
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287326
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, если в качестве набора базисных функций использовать , строим невязку и уже имеем коэффициенты адресуемые 4мя индексами
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287330
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T, ну припустим я эти значения M,N,K.... еще не знаю. Я буду грузить
данные из внешнего файла. Из СSV.
А какая разница M,N,K это константы или переменные? Другое дело если ты не знаешь как будут использоваться эти M,N,K.
Кстати "грузить" это уже отдельная ресурсоемкая задача.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287355
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonКак его аллоцировать? В какую структуру? Как его экстендить. Как он будет
деградировать (освобождать память)?
ИМХУ в одномерный массив. Какая разница сколько измерений? Расчет смещения относительно начала прост:
например в arr[M][N][K][L] , надо получить элемент a[1][2][3][4] смещение будет
Код: plaintext
1.
((1*N + 2) * K + 3) * L + 4


в общем случае адрес p+(i 1 -l 1 ) * s 1 + (i 1 -l 2 ) * s 2 +...
где s n - шаг по измерению(stride)

это позволяет строить вырезки(slice) в том числе и с уменьшением числа измерений

p,l i ,s i - хратятся в паспорте(дескрипторе) массива
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287375
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что решили? 5-мерным массивам дать жизнь?
Или обойдемся проекциями на одномерный?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287389
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТак что решили? 5-мерным массивам дать жизнь?
Или обойдемся проекциями на одномерный?
ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287412
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercuryMasterZiv q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы?

ну, по хитрому вычислять индексы в матрице, и в цикле на range обрабатывать. или в for each.


Не может кто-нибудь привести конкретный пример, пожалуйста


http://ideone.com/wama4t
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
#include <iostream>
#include <vector>
#include <algorithm>

template<class T>
struct array_2d : public std::vector<std::vector<T>> {
	array_2d(size_t rows, size_t cols) : std::vector<std::vector<T>>(rows, std::vector<T>(cols)) {}
};


int main() {
	size_t rows = 5, cols = 10;

	array_2d<int> a2d(rows, cols);
	
	// fill 2d-matrix
	int counter = 0;
	for(auto &c: a2d) {
		for(auto &r: c) {
			r = ++counter;
			std::cout << r << ", ";
		}
		std::cout << std::endl;
	}
	std::cout << std::endl;

	std::vector<int> min_row;
	std::vector<int> min_col = a2d[0];
	
	// min for each - row
	for(auto &c: a2d) 
		min_row.push_back( *std::min_element(c.begin(), c.end()) );

	// min for each - col
	for(auto &c: a2d) 
		std::transform(c.begin(), c.end(), min_col.begin(), min_col.begin(), 
			 [](auto v1, auto v2) { return std::min(v1, v2); } );

	for(auto &mr: min_row) std::cout << mr << ", ";
	std::cout << std::endl;

	for(auto &mc: min_col) std::cout << mc << ", ";
	std::cout << std::endl;

	return 0;
}



Пара плюсов:
1. Работает для любых типов, для которых определен <

2. Чем хороши стандартные алгоритмы, что при необходимости легко можно использовать их параллельные версии:
thrust::transform для распараллеливания на CPU или GPU - в зависимости от типа переданного вектора.
Можно ставить на CPU-only машины.

Или в будущем когда разродятся в стандарте std::experimental::parallel::transform для распараллеливания на CPU.

А алгоритмов распаралеленных там много: https://thrust.github.io/doc/namespacethrust.html
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287541
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonТак что решили? 5-мерным массивам дать жизнь?
Или обойдемся проекциями на одномерный?
ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать.
Мне послышался тезис об изменениях в language.

А как можно language - под задачу? Нонсенс.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287553
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima Tпропущено...

ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать.
Мне послышался тезис об изменениях в language.

А как можно language - под задачу? Нонсенс.
Все можно, но с дуру можно и ...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287700
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

то, что вы привели, является так называемой "хорошей практикой" ?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287701
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercury0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}


Выделяй память одним большим куском
Код: plaintext
1.
2.
void p* = malloc(sizeof(int*)*n + sizeof(int)*m*n);
...



Какие в таком случае будут преимущества?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288701
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилв c++ забыли/не захотели сделать полноценные многомерные массивы
Правда, почему их нет? Сейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++? Мне кажется, что я что-то просто не знаю о его возможностях
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288718
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКакие в таком случае будут преимущества?
Возможно Дима ратовал за экономию памяти. Дешевле 1 кусок в 100 байт чем 100 кусков по 1 байту.
Плюс если ты используешь "зубчатые" массивы массивов то там теоретически
тоже может быть экономия. Но это все в теории невозможно подсчитать.
Лучше создать два макета и посмотреть как оно будет практически.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288731
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryоперирую несколькими массивами массивов

сравни массив массивов с массивами в Algol-68
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288796
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++?
SashaMercury, твой код не имеет ничего общего с С++ .
SashaMercuryЗдравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}



malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении).
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288818
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++?
SashaMercury, твой код не имеет ничего общего с С++ .
SashaMercuryЗдравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}



malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении).

По существу вы не правы. Но даже если бы вы были правы, это не принципиально, замените malloc на new и получите те-же 4 строчки. Если у вас есть другое решение, то я буду очень рад его увидеть. Мне кажется что оно есть.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288843
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПравда, почему их нет?
Потому что
1) у всех разные требования
2) их не проблема самому реализовать
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288884
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288890
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BagaBagaSashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

С++ http://ideone.com/zbo3D9
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288899
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaВсё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Поработает до чего-то подобного
Код: plaintext
1.
2.
x = 200000;
f(x);
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288906
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaНу и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...
Appendix C.2 п.7
Ну и по всему стандарту конечно есть куча упоминаний, про то что большинство конструкций и библиотек С являются частью С++.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288920
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

В последнем стандарте языка С это разрешено (объявление массива auto с размером, задаваемым переменной, т.е. в runtime), также добавлена alloca().
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288923
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
вообще-то Appendix С посвящён обеспечению совместимости. С тем же успехом можно любую фичу, хоть из того же фортрана или явы, которая "доступна для обеспечния совместимости" объявлять частью С++. Вот только нужно ли? Ведь тогда и printf, и весь С-style ввод-вывод придётся признать как "часть С++"...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288932
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПоработает до чего-то подобного
Код: plaintext
1.
2.
x = 200000;
f(x);


Не беспокойтесь за переполнение стека раньше времени.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288938
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivBagaBagaпропущено...

Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

В последнем стандарте языка С это разрешено (объявление массива auto с размером, задаваемым переменной, т.е. в runtime), также добавлена alloca().
Variable Length Array разрешен, начиная с С99. Но вы правы - и в последнем тоже.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288965
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaвообще-то Appendix С посвящён обеспечению совместимости.
Там написано что этот раздел описывает разницу между С и С++.
И в частности C.2 п.7 говорит
The C ++ standard library provides 209 standard functions from the C library (включая malloc).
Мотивация (совместимость) тут не имеет значения.
Главное "C ++ standard library provides", т.е. это часть С++.
BagaBagaВедь тогда и printf, и весь С-style ввод-вывод придётся признать как "часть С++"...
Естественно и printf - часть С++ - п.27.8.2.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288989
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
тогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288995
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaтогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся.
Не весь. Приложение С стандарта описывает какое подмножество С входит в С++.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289014
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял почему мне не нравятся двумерные массивы.

Они отчасти решают задачу sparse matrices, но если разработчик
хочет полного решения то ему неизбежно нужна библиотека или фреймворк
для поддержки этой сложной и интересной возможности.

А так.. на уровне ЯП оно или не нужно или легко заменить на массив std::string
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289025
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++?
SashaMercury, твой код не имеет ничего общего с С++ .
SashaMercuryЗдравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}



malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении).

BagaBagaSashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си.
2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new
3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли.


Выделение памяти на стеке меня совершенно не интересует
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289105
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си.
2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new
3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли.
Выделение памяти на стеке меня совершенно не интересует
1. Вы можете продолжать думать, что пишете на С++. И использовать malloc и new, printf и cout. Если так принято в вашей команде (если она есть). А приписывать мне чужой бред - не надо.
2. Современный С++ практически не использует оператор new. И это современный тренд развития С++. Если вам нужен контейнер с управлением памятью - используйте из библиотек (stl, boost, любая на ваш вкус, можете написать свою). Хоть vector, хоть dynarray эффективно прячут от программиста управление выделением памятью. Любое "ручное" выделение ресурса обязательно сопровождается стражем (освобождения) ресурса (RAII-идиома).
3. В чём __конкретно__ я не прав, и что же это за существо, по которому я не прав, вы так и не ответили.


Выделение памяти на стеке или в куче - детали реализации. Если для решения задачи достаточно памяти стека, я возьму стек. Иначе - буду смотреть в кучу. Или специализированные аллокаторы. Если вы не можете предсказать режим и потребляемый объем памяти, то и с выделением в куче ... мало хорошего получите (что лучше - свалиться по стеку, или засвописть систему и свалиться уже тогда?) Вы всегда знаете, где именно будет выделена память тем или иным классом? Тем же string? А в случае small-string-optimization? )
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289277
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaDima TПоработает до чего-то подобного
Код: plaintext
1.
2.
x = 200000;
f(x);


Не беспокойтесь за переполнение стека раньше времени.
Соглашусь, кто-то уже побеспокоился за меня. Проблему переполнения стэка наблюдал недавно в MSVC2015 с массивами фиксированного размера, затестил double arr[n]; так оно просто не компилируется, похоже MS просто еще не решил как реализовать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289347
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercury1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си.
2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new
3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли.
Выделение памяти на стеке меня совершенно не интересует
1. Вы можете продолжать думать, что пишете на С++. И использовать malloc и new, printf и cout. Если так принято в вашей команде (если она есть). А приписывать мне чужой бред - не надо.
2. Современный С++ практически не использует оператор new. И это современный тренд развития С++. Если вам нужен контейнер с управлением памятью - используйте из библиотек (stl, boost, любая на ваш вкус, можете написать свою). Хоть vector, хоть dynarray эффективно прячут от программиста управление выделением памятью. Любое "ручное" выделение ресурса обязательно сопровождается стражем (освобождения) ресурса (RAII-идиома).
3. В чём __конкретно__ я не прав, и что же это за существо, по которому я не прав, вы так и не ответили.


Выделение памяти на стеке или в куче - детали реализации. Если для решения задачи достаточно памяти стека, я возьму стек. Иначе - буду смотреть в кучу. Или специализированные аллокаторы. Если вы не можете предсказать режим и потребляемый объем памяти, то и с выделением в куче ... мало хорошего получите (что лучше - свалиться по стеку, или засвописть систему и свалиться уже тогда?) Вы всегда знаете, где именно будет выделена память тем или иным классом? Тем же string? А в случае small-string-optimization? )

Конкретно вы не правы в том:
1. Что утверждали что С++ не имеет никакого отношения к функции malloc. Выше вам привели ссылку на стандарта языка С++ и даже цитату опровергающее ваше суждение
2. Пусть у вас сохранится ваше личное мнение, на которое вы безусловно имеете все права, и пусть malloc - в принципе нелегальная функция в контексте С++. Я уже не раз вам подсказал, в том случае, если вы используете оператор new, аналогичный код сохранится, как и 4 строчки. И конечно, ваши придирки не по существу (и в принципе необоснованные, см. п. 1) не должны были иметь место.
3. Откуда у вас информация о том, как часто в языке С++ используется new ?

Я недостаточно хорошо разбираюсь в специфике организации работы кучи и стека, потому не могу как-то обстоятельно прокомментировать ваш последний абзац. Но у меня не раз возникала ситуация, что выделение памяти на стеке приводило к краху программы. Приведите пожалуйста конкретный пример, как по вашему правильным было бы динамически выделить память на массив массивов или двумерный массив используя только С++
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289348
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку.
Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete().
Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать.

P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289349
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку.
Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete().
Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать.

P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать.

Возможно вы и правы, однако первоначальное утверждение было не том, нужно или не нужно (или насколько это хороший тон), а легально или нелегально в принципе относительно языка С++. А это кардинально разные понятия
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289350
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКогда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete().
Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать.
А можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289351
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах.
Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new.
Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289365
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovAnatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах.
Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new.
Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete.

Послушайте, я вообще по этому поводу ничего не говорю. Да и что значит ваше 'неправильно'? Незаконно? Думаю вы имеете ввиду другое. Под 'неправильно' вы понимаете 'было бы лучше/следует/хороший тон'. Я в этом далеко не уверен, но про это речь выше и не шла. Выше было утверждение, согласно которому, malloc и С++ никаким образом не связаны, что в программах на языке С++ malloc использовать не то чтобы нежелательно или это есть плохой тон, а вообще нельзя. Вот и всё.

Вообще пустой спор, что мы тут развели ни о чем - это настолько очевидные вещи. Как будто я вас пытаюсь убедить что malloc хорошо, а new плохо. Или что при вызове malloc тоже вызывается конструктор. Таких глупостей я вам не говорю.


Да и вообще, я что, написал что мой код в самом первом посте является примером хорошего кода на С++? По-моему я написал что так я делаю, и как лучше сделать это грамотно с использованием всех возможных средств С++. Более того, я задал уточняющий вопрос:
SSq2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ?
Но дело не в этом даже, просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289980
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неопрятный код допустим в "стартовых скриптах". Просто потому, что такой скрипт работает в известном окружении и на многие "принятые здесь умолчания" можно спокойно заложиться. Даже если окружение (внезапно) изменилось, то в самом пиковом раскладе такой скрипт можно "перебить лапками" за пару-тройку минут через "цопи цон филе".
С программами такой подход не работает просто потому, что компилируемую программу нельзя просто так взять и "поредактировать по месту".
Мне, например, больше года пришлось воевать с разработчиками из-за того, что, грубо говоря, кому-то было лень написать два блока try/catch вместо одного - часть реальной системы гарантированно ложилась на пару-тройку дней при каждом обновлении. И это - java, где всё должно быть защищено и безопасно, но цена неряшливости - нервы и потерянное время сотен живых людей.

P.S. А так, да - подумаешь написал в статической функции не то, что полагается, а то, что привык.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39290037
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Узбагойся, тут тебе не Ява. Люди понимают отличие new от malloc
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39290383
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, стоило пропустить пару дней, а тут такие открытия делаются...
SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си?
Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39290695
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaЭх, стоило пропустить пару дней, а тут такие открытия делаются...
SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си?
Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится.

И каким образом из этого следует, что данная функция не имеет никакого отношения к С++? Из того что x принадлежит X не следует, что x не может принадлежать Y. Возможно для вас это не так, потому что вы считаете:
BagaBagaAnatoly Moskovsky,
тогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся.

Возможно лучшей аргументацией для вас будет BS и его книга The C++ Programming Language:

BSC++ was developed from the C programming language and, with few exceptions, retains C as a
subset. The base language, the C subset of C++, is designed so that there is a very close correspondence
between its types, operators, and statements and the objects that computers deal with
directly: numbers, characters, and addresses.

BSClearly, C++ owes much to C [Kernighan,1978]. C is retained as a subset.

0. Вы делаете вывод о том, что функция malloc принадлежит языку С.
1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++.
2. Из п. 0 и п. 1 следует, что функция malloc также является частью С++

Не могли бы вы аргументировано, не ссылаясь на ваши личные суждения опровергнуть эти три пункта, в том случае, если вы с ними не согласны. Вы скажете свою точку зрения, я в ответ ни скажу ни слова по этому вопросу и мы прекратим дискуссию. Просто я хочу понять вас, почему вы рассуждаете так, как вы рассуждаете
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39291316
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury0. Вы делаете вывод о том, что функция malloc принадлежит языку С.

Надеюсь, вы не собираетесь это отрицать?

SashaMercury1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++.

Я и не утверждаю, что С и С++ не пересекаются вовсе. Но я бы и не стал приписывать старине Бьярне утверждение, что malloc является частью С++. На CppCon он призывает не пользоваться "raw new", а не то что malloc... При этом ссылки на конкретный пункт стандарта, где бы malloc представлялась как часть С++, я от вас так и не дождался. Но есть простые факты:
1. средства управления динамическим выделением памяти описываются пунктом 18.6 Dynamic memory management стандарта. Там есть new и delete в различных вариантах. Там нет malloc и free.
2. malloc и free явным образом (а не "в комментариях по ходу изложения") присутствуют в пункте 20.7.13. C library

Наконец, если считать, что malloc есть "натуральная" часть языка С++ для динамического выделения памяти, то каким образом при помощи malloc (и без использования new или inplace new) выделить память в куче для столь же "натурального" объекта С++, как vector, для определенность пусть будет vector <string>? Если покажете "в коде" - мне придётся с вами согласиться. В противном случае получается нонсенс: стандартный механизм С++ для выделения динамической памяти не может быть использован для динамического выделения памяти для любого стандартного объекта С++ (или строже - для любого не-POD-объекта)...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39291332
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga,

все эти потуги вокруг malloc станут ненужными, если приложению требуется работать с несколькими пулами памяти, причём без разницы - C или C++
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39291359
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
malloc это механизм нижнего уровня по отношению к С++.

То что им тоже можно пользоваться, ничего не меняет.

Непонятно, что вообще вы хотите доказать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296739
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. У меня возник ещё один вопрос по двумерным массивам.
В стандарте Си сказано следующее:
ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static or thread storage duration is not initialized
explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules,
and any padding is initialized to zero bits;
— if it is a union, the first named member is initialized (recursively) according to these
rules, and any padding is initialized to zero bits;

Насколько мне понятно, в том случае если мы выделяем память на массив на стеке
Код: plaintext
1.
2.
	const int size = 400;
	int a[size][size];


то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил)

Аналогичных рассуждений в стандарте С++ я не нашел. Однако нашёл следующее:
N4594 8.5.1.12When initializing a multi-dimensional array, the initializer-clauses initialize the elements with the last
(rightmost) index of the array varying the fastest (8.3.4). [ Example:
Код: plaintext
1.
int x[2][2] = { 3, 1, 4, 2 };


initializes x[0][0] to 3, x[0][1] to 1, x[1][0] to 4, and x[1][1] to 2. On the other hand,
Код: plaintext
1.
2.
3.
float y[4][3] = {
{ 1 }, { 2 }, { 3 }, { 4 }
};


initializes the first column of y (regarded as a two-dimensional array) and leaves the rest zero. —end
example ]

Исходя из этого, предположил, что такой код:
Код: plaintext
1.
2.
	const int size = 400;
	int a[size][size] = {};



установит каждый бит данного массива к 0. Однако не нашёл где об этом явно сказано в стандарте языка, и вообще, насколько законны такие действия. Подскажите пожалуйста, насколько это законно
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296741
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВ стандарте Си сказано следующее:
ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static or thread storage duration is not initialized
explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules,
and any padding is initialized to zero bits;
— if it is a union, the first named member is initialized (recursively) according to these
rules, and any padding is initialized to zero bits;

Насколько мне понятно, в том случае если мы выделяем память на массив на стеке
Код: plaintext
1.
2.
	const int size = 400;
	int a[size][size];



то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил)
Нет. Вы неверно прочли. Инициализация нулями происходит только для объектов у которых "static or thread storage duration". А стековые (automatic) не инициализируются.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296742
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С++ - то же самое
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296746
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВ С++ - то же самое

Очень жаль что нет такой возможности. И странно, что её нет. Думаю это было бы востребовано. А такой код для С++
Код: plaintext
1.
2.
        const int size = 400;
	int a[size][size] = {};



тоже нелегален? (на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296748
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнелегален
А где там говорится про нелегальность?
Просто переменная содержит неопределенное значение. А сам код вполне легален.


SashaMercury(на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно
Наличие инициализатора {} как бы подразумевает явную инициализацию (для чисел - нулями). Так что непонятно что смущает.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296749
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, спасибо!
...
Рейтинг: 0 / 0
70 сообщений из 70, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Двумерные массивы и С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]