Форум программистов, компьютерный форум CyberForum.ru

Функции и указатели - C++

Восстановить пароль Регистрация
 
 
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 21:55     Функции и указатели #1
Здравствуйте Господа !!!
Вопрос банальный и честно говоря даже стыдно его тут задавать , но не могу уже минут 40 понять почему не получается . Итак допустим имеем функцию которая возвращает двух мерный массив -
C++
1
2
3
4
5
6
7
8
int Mas(){
    
 int n[5][2]={5,1,9,7,2,
                8,3,6,4,9};
                
       return **n;   
    
}
и в основной программе есть указатель на эту функцию , на сколько я предполагал по первому (нулевому) эллементу массива можно раскалупать и весь массив , НО у меня получается так , что первый элемент выводится нормально , а вот остальные какие то левые значения (первоначально была мысль сделать 2-х мерный массив и присвоить ему значения из Mas() , но это тоже не сработало), вот весь код программы -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdlib>
#include <iostream>
 
int Mas(){
    
 int n[5][2]={5,1,9,7,2,
                8,3,6,4,9};
                
       return **n;   
    
}
 
int main(int argc, char *argv[])
{
    
 
 
    int *u ;
    
    u = new int [10];
    
    *u=Mas();
    
    for(int a=0;a<10;a++){
 
           std :: cout<<u<<" = "<<*u<<"\n";
            
            *u++;
            
            }
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 21:55     Функции и указатели
Посмотрите здесь:

C++ Шаблонные функции и указатели на функции
указатели и функции в с++ C++
C++ Указатели на функции
указатели и функции C++
Указатели на Функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 21:59     Функции и указатели #2
Во-первых нельзя вернуть локальный для функции массив.
Во-вторых ты его не возвращаешь, ты возвращаешь только первый элемент.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.05.2013, 22:00     Функции и указатели #3
даже незнаю с чего начать - неправильно тут чуть больше, чем все.

Цитата Сообщение от Игорь с++ Посмотреть сообщение
функцию которая возвращает двух мерный массив -
функция возвращает int
Цитата Сообщение от Игорь с++ Посмотреть сообщение
и в основной программе есть указатель на эту функцию
где?

Цитата Сообщение от Игорь с++ Посмотреть сообщение
на сколько я предполагал по первому (нулевому) эллементу массива можно раскалупать и весь массив
как? если это всего лишь элемент (другое дело адрес первого элемента).
Цитата Сообщение от Игорь с++ Посмотреть сообщение
НО у меня получается так , что первый элемент выводится нормально
потому что по адресу u пишется значения, возвращенное из Mas(), а дальше мусор.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:01  [ТС]     Функции и указатели #4
Цитата Сообщение от lazybiz Посмотреть сообщение
ты его не возвращаешь, ты возвращаешь только первый элемент
ну а по первому нельзя его раскалупать ?

Добавлено через 1 минуту
Господа как переделать , покажите пример
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 22:03     Функции и указатели #5
Передавай в функцию указатель на массив, а в функции его заполняй.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:05  [ТС]     Функции и указатели #6
Цитата Сообщение от lazybiz Посмотреть сообщение
Передавай в функцию указатель на массив, а в функции его заполняй.
это понятно , а вот что бы сохранить ту первоначальную мысль , как то можно ?
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 22:06     Функции и указатели #7
Цитата Сообщение от Игорь с++ Посмотреть сообщение
а вот что бы сохранить ту первоначальную мысль
А я её не понял...
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:08  [ТС]     Функции и указатели #8
или я заморочился о чём то не осуществимом?

Добавлено через 2 минуты
Цитата Сообщение от lazybiz Посмотреть сообщение
А я её не понял...
Так попробую на пальцах - создаём функцию которая возвращает 2-х мерный массив , далее в основной программе надо получить то , что отдала функция (2-х мерный массив)
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 22:14     Функции и указатели #9
Можно выделить динамически память под массив в функции. Заполнить его и вернуть как какой-нибудь другой тип, а потом преобразовать, так сказать в двумерный.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:16  [ТС]     Функции и указатели #10
Цитата Сообщение от lazybiz Посмотреть сообщение
Можно выделить динамически память под массив в функции. Заполнить его и вернуть как какой-нибудь другой тип, а потом преобразовать, так сказать в двумерный.
не понял , кусок кода можно ?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.05.2013, 22:17     Функции и указатели #11
вот слегка измененный твой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <cstdlib>
#include <iostream>
 
int* Mas(int a = 0){
    
 int n[20]={5,1,9,7,2,8,3,6,4,9};
                
       return a == 10 ? n : Mas(++a);   
    
}
 
int main(int argc, char *argv[])
{
    
 
 
    int *u ;
        
    u=Mas();
    
    for(int a=0;a<10;a++){
 
           std :: cout<<u<<" = "<<*u<<"\n";
            
            ++u;
            
    }
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
сразу говорю - это в корне неправильно!!!! Работоспособность проверял в MSVS 2012, за другие компиляторы не ручаюсь (оно вообще работать не обязанно).
Чтоб объяснить как и почему оно все же работает, придется очень много писать. Поэтому ты лучше спрашивай что непонятно, тогда может писанины меньше будет.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:17  [ТС]     Функции и указатели #12
короче как я понял только через заднее место можно это сделать ?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.05.2013, 22:18     Функции и указатели #13
Цитата Сообщение от Игорь с++ Посмотреть сообщение
возвращает 2-х мерный массив
у тебя в первом посте одномерный массив, хотя и объявлен как двумерный.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:22  [ТС]     Функции и указатели #14
Kastaneda, спасибо работает на gcc , но не понятна ваша фраза -
Цитата Сообщение от Kastaneda Посмотреть сообщение
сразу говорю - это в корне неправильно!!!!
Добавлено через 48 секунд
блин , чё то я совсем уже
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 22:24     Функции и указатели #15
Примерно об этом я говорил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
int *test() {
    int *a = new int [2 * 2];
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;
    a[3] = 3;
    return a;
}
 
#define GET_VAL( i, j ) test()[2*i+j]
 
int main()
{
    cout << GET_VAL( 0, 0 ) << endl;
    cout << GET_VAL( 0, 1 ) << endl;
    cout << GET_VAL( 1, 0 ) << endl;
    cout << GET_VAL( 1, 1 ) << endl;
    return 0;
}
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:25  [ТС]     Функции и указатели #16
вообщем наверное будет проще сделать массив и передавать в функцию и там его заполнять !!!
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,695
Записей в блоге: 3
08.05.2013, 22:25     Функции и указатели #17
Цитата Сообщение от Игорь с++ Посмотреть сообщение
это понятно , а вот что бы сохранить ту первоначальную мысль , как то можно ?
Я тоже не понял. Вот фантазия на тему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define num 3
#include <iostream>
using namespace std;
int* retMass(){
static int a[]={1,2,3};
return a;
}
int main(){
int* (*ptr_toFn)()=retMass;//это вкупе с int не значило бы int*
int *b=ptr_toFn();//аналогично следующей строке
//int *b=retMass();
for(int i=0; i<num; ++i)cout<<b[i]<<" ";
cout<<endl;
system("pause");
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.05.2013, 22:26     Функции и указатели #18
Цитата Сообщение от Игорь с++ Посмотреть сообщение
но не понятна ваша фраза -
потому что массив создается на стеке при входе в функцию, а после выхода из функции та часть стека, которую занимал массив, считается свободной и затирается другими значениями. Поэтому я вызываю функцию 10 раз, чтоб создалось 10 таких массивов и возвращаю указатель на последний из созданных массивов. Таким образом есть шанс, что этот массив все же не затрется при вызове того же std::cout << (), но никто этого не гарантирует.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
08.05.2013, 22:40  [ТС]     Функции и указатели #19
Kastaneda, Спасибо огромное , теперь всё понятно .

Добавлено через 8 минут
вот так наверное более правельно и красиво будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <cstdlib>
#include <iostream>
 
 using namespace std;
 
void Mas(int s[10][10]){
 
  for (int a=0;a<10;a++){
      for(int b=0;b<10;b++){
              
              s[a][b]=b;
              
              }}
                  
    
}
 
int main(int argc, char *argv[])
{
    
    int m[10][10];
    
 Mas(m);
 
 for (int a=0;a<10;a++){
      for(int b=0;b<10;b++){
              
              cout<<m[a][b];
              
              }
              
              cout<<"\n";
              
              }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 22:45     Функции и указатели
Еще ссылки по теме:

C++ Распечатать таблицы значений функций cox (x) и на отрезке [a; b] с шагом h, развив функции в ряд Тейлора и используя указатели на функции
Указатели на функции C++
C++ Указатели Функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
08.05.2013, 22:45     Функции и указатели #20
Цитата Сообщение от Игорь с++ Посмотреть сообщение
вот так наверное более правельно и красиво будет
более правильно будет не заморачиваться с массивами на стеке, а сделать динамические. А то и вовсе std::vector использовать, дабы не отвлекаться на вопросы выделения памяти, а сконцентрироваться на конкретной задаче.
Yandex
Объявления
08.05.2013, 22:45     Функции и указатели
Ответ Создать тему
Опции темы

Текущее время: 02:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru