Войти

Показать полную графическую версию : Вопросы начинающего программиста


Страниц : 1 [2]

vadimiron
10-01-2005, 00:58
Как сделать, чтобы функция возвращала массив в С или С++

int func()
{
int B[6]={0,1,2,3,4,5};
return B;
}

int C[6]=func();


Как исправить этот код, чтобы он работал?
Там вроде надо как то с пойнтерами поигаться, я в них пока слаб....

hasherfrog
10-01-2005, 01:20
Во-о-о-от. А теперь пускай сюда придут люди, которые говорят, что "С круче Дельфи" и расскажут в двух словах, как бы это так хитро сделать, чтобы программа была ясна и понятна...

Netscaper
10-01-2005, 01:30
Вот пример.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int *wrong_func()
{
int b[6] = {0, 1, 2, 3, 4, 5};
int *ptr;
ptr = &b[0];
return ptr;
}

int *solve_func()
{
int *b;
int i;
b = (int *)malloc(sizeof(int) * 6);
for (i = 0;i < 6; i++)
b[i] = i;
return b;
}

void main()
{
int *c;
int i;
c = wrong_func();
for(i = 0;i < 6; i++)
printf("%d ",c[i]);
printf("\n");
c = solve_func();
for(i = 0;i < 6; i++)
printf("%d ",c[i]);
printf("\n");
free((void *)c);
getchar();
}

Первая функция wrong_func возвращает указатель на массив, который указывается внутри этой функции. Как видно, возвращается непонятно что. Дело в том, что этот массив создается только для этой функции (я не хочу углублятся в принципы организации памяти) и, следовательно, значения будут иметь место только в ней. Намного проще использовать динамический массив, например, как в функции solve_func, который создается и иницилизируется внутри неё. Дело в том, что динамический массив создается (функция malloc)«глобально» и будет действителен, пока не будет вызвана функция free (будет уничтожен). Надеюсь, понятно изложил. Хотя, всё-таки, присоединяюсь к мнению hasherfrog, про то, что книжки надо читать. Желательно без чьей-либо помощи. Проще говоря, разобраться самому. :yes:

mrcnn
10-01-2005, 05:17
Массив полностью вернуть из функции нельзя. Можно напрямую работать с массивом через указатели, тогда необходимость возвращать что-нибудь отпадает. Само имя массива по сути дела - всего лишь указатель.

Пример

#include<stdio.h>
void copy(int *b, int *c);
void main(){

int b[5]={0,1,2,3,4};
int c[5];
int i;

copy(b,c);

for(i=0;i<5;i++)
printf("%d\n", c[i]);
}

void copy(int *b, int *c){
int i;
for(i=0;i<5;i++)
*(c+i)=*(b+i);}

vadimiron
11-01-2005, 23:28
mrcnn
а что значит *(с+i)=*(b+i) ?
c и b - массивы, к элементу массива же вроде так обращаемся: c[i]

hasherfrog
12-01-2005, 08:18
vadimiron
Если очень примитивно объяснять, то указатель + целое == указатель[целое]

mrcnn
12-01-2005, 08:21
mrcnn
а что значит *(с+i)=*(b+i) ?
c и b - массивы, к элементу массива же вроде так обращаемся: c[i]

Я же сделал пометку, что имя массива по сути дела _указатель_ на первый элемент массива, имя массива с указанием номера элемента - _указатель_ на i элемент массива
таким образом конструкция *(c+i) указывает на i элемент массива c. По сути дела *(c+i) аналогично c[i], а *(с+i)=*(b+i) аналогитчно c[i]=b[i]




© OSzone.net 2001-2012