Страница 1 из 2
Возврат массива функцией
Добавлено: 30 авг 2007, 22:26
Тыква
есть ф-ция. которая создает символьный двумерный массив.как заставить её возвращать его в исходную программу?я так понимаю с помощью указателя?но как это реализовать?
(в Си)
Спасибо заранее!
Re: Возврат массива функцией
Добавлено: 30 авг 2007, 22:36
FLOODkOFF
хотябы часть кода функции приведи
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 03:09
ichups
Ttype ** tmp = new Ttype* [n]; // наш массив
for (int i=0;i<n;++i){tmp=new Ttype ;}; /* заполнение массива (n и m соответственно размерность )*/
//остальной код ...
return tmp ;// возврат массива функция соответствующего типа
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 05:58
shurkaox
Функция должна возвращать не только указатель но и размерности массива
например так
char** fun(int* x, int *y) //x,y -размерности
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 06:02
shurkaox
Функция должна возвращать не только указатель но и размерности массива
например так
char** fun(int* x, int *y) //x,y -размерности
{
char** mas;
*x=10; *y=14//вычислили необходимые размеры
malloc(mas, *x)//давно на С не писал, может malloc по другому маленько
for (int i=0; i<*x; i++)
malloc(mas, *y);
//теперь можно работать с mas[j]
return mas;
}
}
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 09:31
FLOODkOFF
shurkaox писал(а):Функция должна возвращать не только указатель но и размерности массива
например так
char** fun(int* x, int *y) //x,y -размерности
{
char** mas;
*x=10; *y=14//вычислили необходимые размеры
malloc(mas, *x)//давно на С не писал, может malloc по другому маленько
for (int i=0; i<*x; i++)
malloc(mas, *y);
//теперь можно работать с mas[j]
return mas;
}
}
немного не так с маллоками.
Код: Выделить всё
char** fun(int* x, int *y)
{
int i;
char** mas;
*x=10; //вычислили необходимые размеры
*y=14;
mas = (char **) malloc(*x);
for (int i=0; i<*x; i++)
mas[i] = (char *) malloc(*y); //теперь можно работать с mas[i][j]
return mas;
}
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 09:35
FLOODkOFF
но как это реализовать? (в Си)
...
Ttype ** tmp = new Ttype* [n]; // наш массив...
если вы пишете на Си, то причем тут new?
P.S.
Тем не менее, ответ уже написан выше.
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 09:56
Тыква
т е выходит вернуть можно только указатель на массив динамической памяти т к обычный массив будет работать только в пределах ф-ции?
Спасибо всем за ответы, немного разобрался!
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 10:29
Absurd
Тыква писал(а):т е выходит вернуть можно только указатель на массив динамической памяти т к обычный массив будет работать только в пределах ф-ции?
Спасибо всем за ответы, немного разобрался!
Тебе нужен двухмерный массив строк или же одномерный массив строк, при этом ты имел в виду что каждая строка это одномерный массив char'ов?
По поводу памяти - да, локальные массивы хранятся в стеке выше адреса возврата из функции которую туда поместила инструкция call. При выходе из функции по инструкции ret массив оказывается ниже верхушки стека, в той памяти которую использовать никак нельзя.
Re: Возврат массива функцией
Добавлено: 31 авг 2007, 10:39
BBB
FLOODkOFF писал(а):немного не так с маллоками.
Код: Выделить всё
*x=10; //вычислили необходимые размеры
*y=14;
mas = (char **) malloc(*x); // <- [b]здесь ОШИБКА[/b]
for (int i=0; i<*x; i++)
mas[i] = (char *) malloc(*y); // <- [b]здесь ОШИБКА[/b]
return mas;
}
Неточность. При выделении памяти надо учитывать размер элемента массива. Учитывая, что в данном случае - сперва массив указателей, затем массив int-ов, то этот момент существенен:
Код: Выделить всё
*x=10; //вычислили необходимые размеры
*y=14;
mas = (char **) malloc( (*x) * [b]sizeof (char *)[/b]); // <- [b]вот так верно[/b]
for (int i=0; i<*x; i++)
mas[i] = (char *) malloc ( (*y) * [b]sizeof (int)[/b]); //<- [b]вот так верно[/b] return mas;
}
Можно, кстати, вообще выделить одним куском памяти. Правда, в этом случае формально массив будет одномерный, и для обращения к элементам мссива придется "на лету" далать "преобразование" из двух "логических" координат в одну "физическую". Но зато здесь можно будет воспользоваться оператором new:
Код: Выделить всё
int* fun(int* xSize, int *ySize) //xSize, ySize -размерности
{
int* mas;
*xSize=10; *ySize=14//вычислили необходимые размеры
mas = new int [(*xSize) * (*ySize)]
return mas;
};
// Обращение к элементу (i, j) в этом случае будет:
mas [(i * xSize) + j]