Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Может ли функция возвращать массив
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
GrOb GrOb вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2008
По умолчанию Может ли функция возвращать массив - 18.11.2008, 01:42

Может ли функция возвращать массив? Вот пример кода:
Код:
int FunArray(int **A, **B)
{
//выполняется операция над массивами
return **C;
}
Если да, то как можно получить доступ к элементам массива С
Ответить с цитированием
  (#2 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 18.11.2008, 02:23

А какого типа указатель C?
Если int**, то надо
Код:
int** FunArray(int** A, int** B)
{
//выполняется операция над массивами
return **C;
}
Обращение к элементу массива - C[i][j] (например).
Ответить с цитированием
  (#3 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,274
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 18.11.2008, 02:56

Во всяком случае return пишется не так, как вы оба написали.

Код:
int** FunArray(int** A, int** B)
{
  int **C;
  // распределяется память под массив С;
  //выполняется операция над массивами
  return C;
}
А вообще, конечно, такие вещи нужно делать очень аккуратно, чтобы не наступить на грабли с распределением и освобождением памяти для массива.
Ответить с цитированием
  (#4 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 18.11.2008, 11:47

А, тьфу, да )))))
Ответить с цитированием
  (#5 (permalink)) Старый
GrOb GrOb вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2008
По умолчанию 18.11.2008, 13:02

Вот, например, функция которая принимает как параметр размер массива и потом заполняет.
Как я понял код функции должен выглядеть примерно так:
Код:
float *InsertMatrix(int n);
float *InsertMatrix(int n)
(
    int i;
    float *A = new float[n];
    for(i=0; i<n; i++)
    {
        printf("A[%i]=", i);
        scanf_s("%f", &A[i]);
    }
    return A;
}
При компиляции выдает кучу ошибок. Подскажите, пожалуйста, что я здесь сделал не так и как эта функция должна выглядеть правильно.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 18.11.2008, 13:23

Ну, во первых, printf("A[%d]=", i);
Во-вторых, когда пишешь, что возникают ошибки, указывай плиз, какие-именно ошибки. В тексте ошибки часто кроется сама причина ошибки.
Ответить с цитированием
  (#7 (permalink)) Старый
GrOb GrOb вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2008
По умолчанию 18.11.2008, 14:08

Код:
#include <stdio.h>
int main(void)
{
float *InsertMatrix(int n);
float *InsertMatrix(int n)
(
    int i;
    float *A = new float[n];
    for(i=0; i<n; i++)
    {
        printf("A[%i]=", i);
        scanf_s("%f", &A[i]);
    }
    return A;
}

    getchar();
    getchar();

    return 0;
}
Вот список ошибок и строк в которых они появляются:
Error 1 error C2143: syntax error : missing ',' before ';' 7
Error 2 error C2143: syntax error : missing ')' before ';' 8
Error 3 error C2091: function returns function 8
Error 4 error C2556: 'float *(__cdecl *InsertMatrix(int))(int)' : overloaded function differs only by return type from 'float *InsertMatrix(int)' 8
Error 5 error C2373: 'InsertMatrix' : redefinition; different type modifiers 8
Error 6 error C2065: 'i' : undeclared identifier 9
Error 7 error C2065: 'i' : undeclared identifier 9
Error 8 error C2065: 'n' : undeclared identifier 9
Error 9 error C2065: 'i' : undeclared identifier 9
Error 10 error C2065: 'i' : undeclared identifier 11
Error 11 error C2065: 'A' : undeclared identifier 12
Error 12 error C2065: 'i' : undeclared identifier 12
Error 13 error C2065: 'A' : undeclared identifier 14
Error 14 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 17
Error 16 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int kramernxn_openmp\poisk\kramernxn_openmp.cpp 18
Error 17 error C2059: syntax error : 'return' 20
Error 18 error C2059: syntax error : '}' 21
Error 19 error C2143: syntax error : missing ';' before '}' 21
Error 20 error C2059: syntax error : '}' 21
Ответить с цитированием
  (#8 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 18.11.2008, 14:12

А зачем ты одну функцию внутри другой написал? Естественно, у тебя будет куча ошибок.
Надо примерно так
Код:
#include <stdio.h>

float *InsertMatrix(int n);

int main(void)
{

    getchar();
    getchar();

    return 0;
}

float *InsertMatrix(int n)
(
    int i;
    float *A = new float[n];
    for(i=0; i<n; i++)
    {
        printf("A[%i]=", i);
        scanf_s("%f", &A[i]);
    }
    return A;
}
или так

Код:
#include <stdio.h>

float *InsertMatrix(int n)
(
    int i;
    float *A = new float[n];
    for(i=0; i<n; i++)
    {
        printf("A[%i]=", i);
        scanf_s("%f", &A[i]);
    }
    return A;
}

int main(void)
{

    getchar();
    getchar();

    return 0;
}
Ответить с цитированием
  (#9 (permalink)) Старый
GrOb GrOb вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2008
По умолчанию 18.11.2008, 14:30

Что в первом, что во втором варианте компилятор выдает такие же ошибки как и в моем случаи.
Ответить с цитированием
  (#10 (permalink)) Старый
Lisenok Lisenok вне форума
Member
 
Сообщений: 443
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.01.2007
По умолчанию 18.11.2008, 14:39

Цитата:
Что в первом, что во втором варианте компилятор выдает такие же ошибки как и в моем случаи.
Внимательнее надо быть. Там вместо фигурной скобки, обычная. Ее следует заменить. Для VS 6.0 код вот так переделан:
Код:
#include <stdio.h>

float *InsertMatrix(int n)
{
    int i;
    float *A = new float[n];
    for(i=0; i<n; i++)
    {
        printf("A[%i]=", i);
        scanf("%f", &A[i]);
    }
    return A;
}

int main(void)
{

    getchar();
    getchar();

    return 0;
}
Одного не пойму, функцию в main() Вы все-равно не вызываете. А ее следует вызывать! ))
Ответить с цитированием
  (#11 (permalink)) Старый
GrOb GrOb вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2008
По умолчанию 18.11.2008, 15:03

Согласен - глупая ошибка. Уже все компилирует правильно. Спасибо.
У меня еще один вопрос: Как обратиться к элементам массива который возвращает эта функция?
Я пробовал так как написал Jonano:
Цитата:
Обращение к элементу массива - C[i][j] (например).
Вот код:
Код:
#include "stdafx.h"
#include <stdio.h>

float *InsertMatrix(int n)
{
    int i;
    float *A = new float[n];
    for(i=0; i<n; i++)
    {
        printf("A[%i]=", i);
        scanf("%f", &A[i]);
    }
    return A;
}

int main(void)
{
int i,k=5;
InsertMatrix(k);

for(i=0; i<k; i++)
    printf("A[%i]=", i,A[i]);
    getchar();
    getchar();

    return 0;
}
Но оно выдает ошибку:
error C2065: 'A' : undeclared identifier

Я согласен с этой ошибкой, поскольку массив А описан только в функции, за ее пределами он никак не описан.
Ответить с цитированием
  (#12 (permalink)) Старый
Lisenok Lisenok вне форума
Member
 
Сообщений: 443
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.01.2007
По умолчанию 18.11.2008, 15:05

Все правильно тебя ругает компилятор. Надо так:
Код:
#include <stdio.h>

float *InsertMatrix(int n)
{
    int i;
    float *A = new float[n];
    for(i=0; i<n; ++i)
    {
        printf("A[%i]=", i);
        scanf("%f", &(A[i]));
    }
    return A;
}

int main(void)
{
    float *A = InsertMatrix(5);
    for(int i=0; i<5; ++i)
        printf("A[%i]=%.2f\t", i, A[i]);
    printf("\n");
    getchar();
    getchar();

    return 0;
}
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 18.11.2008, 15:21

Если уж на то пошло, то надо не забыть память освободить.
Код:
int main(void)
{
    float *A = InsertMatrix(5);
    for(int i=0; i<5; ++i)
        printf("A[%i]=%.2f\t", i, A[i]);
    printf("\n");
    delete []A;

    getch();

    return 0;
}
Ответить с цитированием
  (#14 (permalink)) Старый
kjam kjam вне форума
Member
 
Сообщений: 111
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.04.2007
По умолчанию 12.03.2009, 01:59

1. А какой у нас язык? Чистый Си или плюсы?
Судя по второму посту автора топика (new float[n]) все же плюсы.
Тогда, вот:
Код:
#include <stdio.h>
#include <vector>

std::vector<float> InsertMatrix(int n)
{
    std::vector<float> A;
    A.resize(n);
    for(int i=0; i<n; ++i)
    {
        printf("A[%i]=", i);
        scanf("%f", &(A[i]));
    }
    return A;
}

int main(void)
{
    std::vector<float> A = InsertMatrix(5);
    for(int i=0; i<A.size(); ++i)
        printf("A[%i]=%.2f\t", i, A[i]);
    printf("\n");
    getchar();
    getchar();

    return 0;
}
PS. Дико удивлен что этого никто не написал раньше.
Ответить с цитированием
  (#15 (permalink)) Старый
kjam kjam вне форума
Member
 
Сообщений: 111
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.04.2007
По умолчанию 12.03.2009, 01:59

1. А какой у нас язык? Чистый Си или плюсы?
Судя по второму посту автора топика (new float[n]) все же плюсы.
Тогда, вот:
Код:
#include <stdio.h>
#include <vector>

std::vector<float> InsertMatrix(int n)
{
    std::vector<float> A;
    A.resize(n);
    for(int i=0; i<n; ++i)
    {
        printf("A[%i]=", i);
        scanf("%f", &(A[i]));
    }
    return A;
}

int main(void)
{
    std::vector<float> A = InsertMatrix(5);
    for(int i=0; i<A.size(); ++i)
        printf("A[%i]=%.2f\t", i, A[i]);
    printf("\n");
    getchar();
    getchar();

    return 0;
}
PS. Дико удивлен что этого никто не написал раньше.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция или процедура в делфи может вернуть НЕСКОЛЬКО значений? went Вопросы начинающих программистов 1 13.05.2011 19:52
Функция, которая выделяет память под двумерный массив snmx C++ Builder 5 28.02.2010 16:27
Функция типа Т9 как на сотовых.Есть ли прога для ПК чтоб была та же функция ? Технарь Софт и программы 11 14.03.2009 12:39
Световая полоса на дисплее нового ноута. Возвращать? Current Ноутбуки 9 16.08.2008 06:59
Процедура-функция не может возвращать record или array TPH Oberon 1 28.09.2007 13:54
Функция, возвращающая указатель, массив Vladimir the Red Sunny С/С++ 6 09.04.2007 11:45
пользовательская функция, возвращающая массив перем-й длины AlexSh Visual Basic 11 07.06.2006 19:15
Может ли функция возвращать массив? -=Rain=- Visual Basic 3 07.11.2005 21:39
Может быть в классе описан массив обьектов этого класса Ал-леша C++ Builder 7 26.05.2005 18:19
Нужно после выполнения операции возвращать фокус ввода Начинающий Delphi 2 30.01.2005 19:19
Как надо возвращать значения из DLL Vladimir the Red Sunny Visual C++ 8 13.01.2004 14:04
какая функция может преобразовать Canvas Carrot C++ Builder 1 21.08.2003 22:45



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов