LINUX.ORG.RU

вернуть указатель на двумерный массив

 


0

3

Здравствуйте уважаемые сишники. Имеется несколько статических двумерных массивов, все M x N. Как записать тип функции, которая вернет указатель на один из этих массивов? Очень не хочется переделывать на char**.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

которая вернет указатель на один из этих массивов?

Может всё-таки на первый элемент?

ziemin ★★
()
static int v[M][N], u[M][N];

int (*f(void))[M][N]
{
        return &v;
}

Функция f возвращает указатель на двумерный массив.

anonymous
()

Как записать тип функции

в Сях(«обычных») не гарантируется проверка выхода за границу массива и даже ожидается , что таковой нет во строенных синтаксических конструкциях.

то, что нарисовал анонимус лиш «коментарий» чека на проверку что это именно прямоугольный MxN , а не вектор M*Nx1 , а не вектор 1*M*N, а ли ещё какой вариант прямоуголизации числа MxN «обычный С-компилятор» делать не обязан и как правило таковы реализации.

вообщем хоть и стёб но Брайан Керниганом:

«Почему Паскаль не является моим любимым языком программирования"

ща (да и в большинстве и тогда) эта статья не о Паскалях , а о некоторых чертах С которые должны быть в языках - и там особо подчёркивается , что не должа компилятором функция работающая с однородными наборами (ака вектора ака массивы) ограничиватся константными размерами(формами) ибо наличие таковой черты в языке убыточно для программиста-пользователя этого языка.

qulinxao ★★☆
()

Имеется несколько статических двумерных массивов, все M x N.

в PureC не бывает многомерных массивов. Бывают массивы массивов. Ты про них?

если да, то у меня для тебя плохие новости: невозможно вернуть массив изх функции. Можно только указатель.

только так можно:

#include <stdio.h>

void print_matrix(int matrix[][3])
{
	int j, k;
	for(j = 0; j < 3; j++, printf("\n"))
		for(k = 0; k < 3; k++)
			printf("%d ", matrix[j][k]);
}

void gen_matrix1(int matrix[][3])
{
	int j, k;
	for(j = 0; j < 3; j++)
		for(k = 0; k < 3; k++)
			matrix[j][k] = (j==k ? 1 : 0);
}

int main()
{
	int matrix[3][3];
	gen_matrix1(matrix);
	print_matrix(matrix);
	return 0;
}

emulek
()
Ответ на: комментарий от emulek

в PureC не бывает многомерных массивов

Бывают.

#include <stdio.h>
#include <assert.h>

typedef int MATRIX[10][10];

MATRIX* foo()
{
    static MATRIX m;
    int i, j;
    for (i = 0; i < 10; ++i)
        for (j = 0; j < 10; ++j)
            m[i][j] = i * j;
    return &m;
}

int main()
{
    MATRIX* m = foo();
    int i, j;
    for (i = 0; i < 10; ++i)
        for (j = 0; j < 10; ++j)
            assert((*m)[i][j] == i * j);
    return 0;
}
anonymous
()
Ответ на: комментарий от anonymous

в PureC не бывает многомерных массивов

Бывают.

не бывают. У тебя одномерный массив, каждый элемент которого — одномерный массив из 10и int. Если ты не понимаешь разницу, то это твоя проблема.

emulek
()
Ответ на: комментарий от emulek

Упоротый? Массив массивов в С - это массив указателей на первые элементы массивов.

А это - двумерный массив, занимающий 100 байт.

char m[10][10];

Что даже ты в состоянии проверить через sizeof. В памяти оно лежит как 100 char подряд.

anonymous
()
Ответ на: комментарий от anonymous

А это - двумерный массив, занимающий 100 байт.

это 10 массивов по 10 байт. Впрочем, тебе этого всё равно не понять...

emulek
()
Ответ на: комментарий от Solace

Зануда

дело не только в терминологии, но и в том, что все размерности(кроме одной) «многомерного» массива в C прибиты гвоздями к самому массиву. Попробуй переписать пример анонимуса так, что-бы функция могла возвращать не только 10×10, но и 20×20 массивы.

emulek
()
Ответ на: комментарий от emulek

дело не только в терминологии

Дело только и исключительно в терминологии, которую ты по безграмотности не знаешь. И в стандарте языка, и в K&R есть понятие многомерного массива.

anonymous
()
Ответ на: комментарий от emulek

вот именно, лучше продолжай жевать

anonymous
()
Ответ на: комментарий от anonymous

Кстати нет. В СТАТИЧЕСКОМ массиве char m[10][10] элемент [1][0] идет сразу за [0][9] это по сути единый массив char[100]. А вот если делать ДИНАМИЧЕСКИЙ массив MxN, то да, будет массив указателей.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

А вот если делать ДИНАМИЧЕСКИЙ массив MxN

ну вот... На кой хрен их вообще вводили в новый стандарт? Только тонны нового быдлокода получилось...

emulek
()
Ответ на: комментарий от anonymous

Для ущербана поясню - твой дефайн говно и ничего не дает. Ты ретурнишь что-то в районе void*, максимум int*.

Теперь замени MATRIX * на int * и обосрись. Ретурнить в сишке никакие массивы нельзя, да и их не существует. Хоть емулек и обоссанная макака, но это ущербанище право - в сишке никаких массивов нет и отродясь небыло, а особенно каких-то нмерных. Это чистосинтаксический алиасы, которые ни в аргументы, ни в возврат сувать нельзя.

() - ущербанище плюсое, ты тут ещё и кукарекаешь.

anonymous
()
Ответ на: комментарий от anonymous

Ещё один говноед придумывает собственную терминологию. Слова «array», «multidimensional» есть в стандарте языке.

То что массив в С не first-class - отдельная история никого с точки зрения стандартной терминологии не е..т.

anonymous
()
Ответ на: комментарий от anonymous

От чего ж тебе так припекает-то?

Aswed ★★★★★
() автор топика
Ответ на: комментарий от anonymous

И где тут одно и то же?

ты не понял, твоя формула *(m+3*10 + 2) отлично работает для массивов m[2][50] и m[25][4], и даёт тот же самый char, как и для массива m[10][10]. Т.е. компилятор это отлично сглатывает и молча выдаёт какую-то хрень, как будто всё нормально. Т.е. по твоему выходит, что десятая строка в матрице из двух строк — правильный ответ. А мне ээтот ответ чем-то не нравится...

emulek
()
Ответ на: комментарий от anonymous

Хоть емулек и обоссанная макака, но это ущербанище право - в сишке никаких массивов нет и отродясь небыло

детка, одномерные массивы в сишечке таки есть, хотя они часто сами катуются в указатель. И тем не менее, если ты посчитаешь sizeof(m), где m — массив, то увидишь, что это m весит не столько, сколько указатель, а столько, сколько все N элементов.

emulek
()
Ответ на: комментарий от anonymous

Ещё один говноед придумывает собственную терминологию. Слова «array», «multidimensional» есть в стандарте языке.

это что-бы таким как ты было понятнее.

emulek
()
Ответ на: комментарий от anonymous

Ретурнить в сишке никакие массивы нельзя, да и их не существует

Засунь в struct свой «не существует»

unC0Rr ★★★★★
()
Ответ на: комментарий от emulek

В С нет функций, потому что нельзя объявить функцию внутри функцию, не говоря уже о замыканиях.

Термин «функция» в стандарте языка использован лишь из политкорректности к обладателям IQ < 50. Чтобы им было понятней.

anonymous
()
Ответ на: комментарий от anonymous

В С нет функций, потому что нельзя объявить функцию внутри функцию, не говоря уже о замыканиях.

ты либо передёргиваешь, либо путаешь меня с другим аноном. В сишечке нет многомерных массивов, в том смысле, в котором это принято понимать в других ЯП. Есть в другом смысле, но это не совсем то.

Если ты этого не понимаешь, то извини.

emulek
()
Ответ на: комментарий от emulek

В сишечке нет многомерных массивов, в том смысле, в котором это хотелось бы понимать emulek-у.

fixed

anonymous
()
Ответ на: комментарий от anonymous

как скажешь. Факт в том, что функция не может принять(и отдать) в качестве аргумента сущность «многомерный массив». Может только «матрицу с тремя столбцами». И единственная возможность это исправить — препроцессорные костыли. А одномерный массив можно передать вернуть, только вот информация о числе элементов теряется. Внутри функции sizeof(array) вернёт размер указателя, увы.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.