Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 22.07.2011, 10:07   #1
Calv
Пользователь
 
Регистрация: 22.07.2011
Сообщений: 16
По умолчанию Возвратить указатель на массив результат

Только вот начал изучать С++ и вот с толкнулся с первой проблемой.
Нужно решить такую задачку: Разместить в динамической памяти 2 массива – матрицу размерностью n на n и вектор длины n, с элементами типа long double (значения n и элементы массивов ввести с кон-соли). Написать функцию, вычисляющую сумму элементов вектора с элементами матрицы по диогонали(их передать по указателю) и возвращающую указатель на массив-результат. Выдать на консоль значения полученного вектора.

Вроде все сделал, но как-то наверное неправильно возвращаю или принимаю результат. В итоге получаю в конечном массиве только первый элемент.

Объясните где ошибка и вообще чет запутался в этих указателях.....

Вот код:
Код:
#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include "Unit2.h"
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])
{ char s[80];
long double *vec, **mat, *res,*w;
  int n,i, j;




printf("Vvedite n=");
gets(s);
n=atoi(s);
printf  ("\n");

vec = new long double [n];

for(i=0; i<n; i++)
        {
        printf("Vvedite vec[%d]=",i);
        gets(s);
        vec[i]=atoi(s);
        printf  ("\n");
        }

mat= new long double *[n];
for (i=0; i<n;i++)
        {
        mat[i]=new long double [n];
        }
for(i=0; i<n; i++)
        { for(j=0; j<n; j++)
                {
                printf("Vvedite mat[%d][%d]=",i,j);
                gets(s);
                mat[i][j]=atoi(s);
                printf  ("\n");
                }
        }
    w=new long double[n];
  res=new long double[n];
 *res=fun(n, vec, mat, w);
 for (i=0; i<n; i++)
        {
        printf("%Lf ",res[i]);
        }
   delete []w;
  delete []res;
 delete []vec;

 for(i=0;i<n;i++)
        {
         delete[] mat[i];
        }
  delete[] mat;
 getch();
        return 0;
}
//---------------------------------------------------------------------------
Код:
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
long double fun(int x, long double *y, long double **z,long double *p)
{long double s[80];
 int i,j=0;

 for (i=0; i<x; i++)
        {
         s[i]=y[i]+ z[i][j];
         j++;

        }
      p=s;

return *p;

}

Последний раз редактировалось Stilet; 22.07.2011 в 10:42.
Calv вне форума Ответить с цитированием
Старый 22.07.2011, 10:48   #2
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

ф-ция fun у вас и возвращает одно число. Можно передавать res в функцию как параметр и в ней вычислять res[i]
sashonk вне форума Ответить с цитированием
Старый 22.07.2011, 10:58   #3
Calv
Пользователь
 
Регистрация: 22.07.2011
Сообщений: 16
По умолчанию

Можно, но это не решит моего понимания как правильно вернуть указатель на массив из функции. я собственно и написал данный топик чтоб мне помогли разобраться

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

Цитата:
Сообщение от sashonk Посмотреть сообщение
ф-ция fun у вас и возвращает одно число. Можно передавать res в функцию как параметр и в ней вычислять res[i]
Переделал как вы посоветовали, так работает.
Но все же в первом примере, что не так было?
Код:
#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include "Unit2.h"
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])
{ char s[80];
long double *vec, **mat, *res,*w;
  int n,i, j;




printf("Vvedite n=");
gets(s);
n=atoi(s);
printf  ("\n");

vec = new long double [n];

for(i=0; i<n; i++)
        {
        printf("Vvedite vec[%d]=",i);
        gets(s);
        vec[i]=atoi(s);
        printf  ("\n");
        }

mat= new long double *[n];
for (i=0; i<n;i++)
        {
        mat[i]=new long double [n];
        }
for(i=0; i<n; i++)
        { for(j=0; j<n; j++)
                {
                printf("Vvedite mat[%d][%d]=",i,j);
                gets(s);
                mat[i][j]=atoi(s);
                printf  ("\n");
                }
        }
    w=new long double[n];
 // res=new long double[n];
 fun(n, vec, mat, w);  //
 for (i=0; i<n; i++)
        {
        printf("%Lf ",w[i]);
        }
   delete []w;
//  delete []res;
 delete []vec;

 for(i=0;i<n;i++)
        {
         delete[] mat[i];
        }
  delete[] mat;
 getch();
        return 0;
}
//-----------------------------------------------------------
Код:
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
long double fun(int x, long double *y, long double **z,long double *p)
{long double s[80];
 int i,j=0;

 for (i=0; i<x; i++)
        {
         p[i]=y[i]+ z[i][j];
         j++;

        }
return 0;

}

Последний раз редактировалось Stilet; 22.07.2011 в 13:54.
Calv вне форума Ответить с цитированием
Старый 22.07.2011, 11:57   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Calv Посмотреть сообщение
как правильно вернуть указатель на массив из функции.
Код:
int* func()
{
     int* arr = new int[10];

     return arr;
}

int main()
{
     int* arr = func();
     ...
     delete[] arr;

     return 0;
}
З.Ы. В вашем коде разбираться не хочу. Привел простейший пример - адаптируйте его под вашу задачу
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 22.07.2011, 13:29   #5
Calv
Пользователь
 
Регистрация: 22.07.2011
Сообщений: 16
По умолчанию

ругается на ваш пример(
Calv вне форума Ответить с цитированием
Старый 22.07.2011, 13:45   #6
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

как я вам сказал, вы возвращаете единственное число типа long double. Вы уже передаете в ф-цию указатель p и в него заносите результаты вычислений. Если хотите, можете его еще и возвращать
Код:
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
long double* fun(int x, long double *y, long double **z,long double *p)
{
 int i,j=0;

 for (i=0; i<x; i++)
        {
         p[i]=y[i]+ z[i][j];
         j++;

        }
return p;

}

Последний раз редактировалось sashonk; 22.07.2011 в 13:49.
sashonk вне форума Ответить с цитированием
Старый 22.07.2011, 13:55   #7
Calv
Пользователь
 
Регистрация: 22.07.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от sashonk Посмотреть сообщение
как я вам сказал, вы возвращаете единственное число типа long double. Вы передаете в ф-цию указатель p. Чем вам не результат? Если хотите, можете его еще и возвращать
Да в том что в этом случаи он не возвращает, а просто указатель р передается в функцию, где и изменяется. А так как массив переданный в функцию по указателю изменяется и в не функции, в таком случае его необязательно возвращать все и так будет работать. у меня по заданию нужно его возвратить. я не пойму как. А вашу идею я понял, попробовал и она прекрасно работает. Но это не то что мне нужно.
Calv вне форума Ответить с цитированием
Старый 22.07.2011, 13:56   #8
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Blade правда уже привел пример, но вот тебе по нагляднее.

Код:
#include <iostream>

void GetArr(int *pArr, int Size) {
 for (int i = 0; i < Size; ++i) {
  std::cout << "[" << pArr << "]"'
 }
}

int *MyFoo(int *pArr, int Size) {
 int Sum = 0;
 for (int i = 0; i < Size; ++i) {
  Sum+= pArr[i];
 } 
 return pArr;
}

const int Size = 5;

int main(void) {
 int Arr[5] = { 1, 2, 3, 4, 5 };
 int pArr = new int[Size];
 pArr = MyFoo(Arr, Size);
 GetArr(pArr, Size);
 delete pArr;
 std::cin.get();
 return 0;
}
Помог? Жми на весы.

Последний раз редактировалось coNsept; 22.07.2011 в 14:00.
coNsept вне форума Ответить с цитированием
Старый 22.07.2011, 15:28   #9
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Calv Посмотреть сообщение
ругается на ваш пример(
Какие ошибки? В каком месте?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 22.07.2011, 16:25   #10
Calv
Пользователь
 
Регистрация: 22.07.2011
Сообщений: 16
По умолчанию

Код:
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
long double fun(int x, long double *y, long double **z)
{long double *s;
 int i,j=0;
  s=new long double [x];
 for (i=0; i<x; i++)
        {
         s[i]=y[i]+ z[i][j];
         j++;

        }
return s;//вот здесь вот ругается

}
пишет Cannot convert 'long double*' to 'long double'
Calv вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
может ли функция возвратить массив? BoozZzilla Помощь студентам 13 25.03.2011 16:08
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
Указатель на массив указателей, и т.д. Bernarditto Общие вопросы C/C++ 1 09.07.2010 11:26
указатель на двумерный массив Aндрей Общие вопросы C/C++ 9 20.05.2010 08:40
указатель на массив Cpluser Общие вопросы C/C++ 6 23.09.2009 20:46


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840