Возврат массива функцией

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Тыква
Сообщения: 4
Зарегистрирован: 18 авг 2007, 00:00

30 авг 2007, 22:26

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

Спасибо заранее! :)
Не бейте сильно я только учусь!:)
Аватара пользователя
FLOODkOFF
Сообщения: 4
Зарегистрирован: 30 авг 2007, 21:32
Откуда: Санкт-Петербург
Контактная информация:

30 авг 2007, 22:36

хотябы часть кода функции приведи
ichups
Сообщения: 14
Зарегистрирован: 06 июн 2007, 21:57

31 авг 2007, 03:09

Ttype ** tmp = new Ttype* [n]; // наш массив
for (int i=0;i<n;++i){tmp=new Ttype ;}; /* заполнение массива (n и m соответственно размерность )*/
//остальной код ...
return tmp ;// возврат массива функция соответствующего типа
shurkaox
Сообщения: 3
Зарегистрирован: 30 мар 2007, 16:43

31 авг 2007, 05:58

Функция должна возвращать не только указатель но и размерности массива
например так
char** fun(int* x, int *y) //x,y -размерности
shurkaox
Сообщения: 3
Зарегистрирован: 30 мар 2007, 16:43

31 авг 2007, 06:02

Функция должна возвращать не только указатель но и размерности массива
например так
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;
}
}
Аватара пользователя
FLOODkOFF
Сообщения: 4
Зарегистрирован: 30 авг 2007, 21:32
Откуда: Санкт-Петербург
Контактная информация:

31 авг 2007, 09:31

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;
}
Аватара пользователя
FLOODkOFF
Сообщения: 4
Зарегистрирован: 30 авг 2007, 21:32
Откуда: Санкт-Петербург
Контактная информация:

31 авг 2007, 09:35

но как это реализовать? (в Си)
...
Ttype ** tmp = new Ttype* [n]; // наш массив...
если вы пишете на Си, то причем тут new?
P.S.
Тем не менее, ответ уже написан выше.
Аватара пользователя
Тыква
Сообщения: 4
Зарегистрирован: 18 авг 2007, 00:00

31 авг 2007, 09:56

т е выходит вернуть можно только указатель на массив динамической памяти т к обычный массив будет работать только в пределах ф-ции?
Спасибо всем за ответы, немного разобрался! :)
Не бейте сильно я только учусь!:)
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

31 авг 2007, 10:29

Тыква писал(а):т е выходит вернуть можно только указатель на массив динамической памяти т к обычный массив будет работать только в пределах ф-ции?
Спасибо всем за ответы, немного разобрался! :)
Тебе нужен двухмерный массив строк или же одномерный массив строк, при этом ты имел в виду что каждая строка это одномерный массив char'ов?

По поводу памяти - да, локальные массивы хранятся в стеке выше адреса возврата из функции которую туда поместила инструкция call. При выходе из функции по инструкции ret массив оказывается ниже верхушки стека, в той памяти которую использовать никак нельзя.
2B OR NOT(2B) = FF
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

31 авг 2007, 10:39

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]
Ответить