Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
1

Функции и указатели

08.05.2013, 21:55. Показов 1306. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте Господа !!!
Вопрос банальный и честно говоря даже стыдно его тут задавать , но не могу уже минут 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2013, 21:55
Ответы с готовыми решениями:

Указатели на функции. Указатели на функции как формальные параметры у функциях высшего уровня
Найти наименьшее значение для функций используя функции и указатели на функции ...

Указатели и массивы. Указатели и функции
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию...

Указатели на массивы. Указатели и функции
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно...

Объявить массив из N указателей на функции, возвращающих указатели на функции, возвращающие указатель на char
Задание: Объявить массив из N указателей на функции, возвращающих указатели на функции,...

22
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
08.05.2013, 21:59 2
Во-первых нельзя вернуть локальный для функции массив.
Во-вторых ты его не возвращаешь, ты возвращаешь только первый элемент.
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
08.05.2013, 22:00 3
даже незнаю с чего начать - неправильно тут чуть больше, чем все.

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

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

Добавлено через 1 минуту
Господа как переделать , покажите пример
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
08.05.2013, 22:03 5
Передавай в функцию указатель на массив, а в функции его заполняй.
1
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
08.05.2013, 22:05  [ТС] 6
Цитата Сообщение от lazybiz Посмотреть сообщение
Передавай в функцию указатель на массив, а в функции его заполняй.
это понятно , а вот что бы сохранить ту первоначальную мысль , как то можно ?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
08.05.2013, 22:06 7
Цитата Сообщение от Игорь с++ Посмотреть сообщение
а вот что бы сохранить ту первоначальную мысль
А я её не понял...
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
08.05.2013, 22:08  [ТС] 8
или я заморочился о чём то не осуществимом?

Добавлено через 2 минуты
Цитата Сообщение от lazybiz Посмотреть сообщение
А я её не понял...
Так попробую на пальцах - создаём функцию которая возвращает 2-х мерный массив , далее в основной программе надо получить то , что отдала функция (2-х мерный массив)
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
08.05.2013, 22:14 9
Можно выделить динамически память под массив в функции. Заполнить его и вернуть как какой-нибудь другой тип, а потом преобразовать, так сказать в двумерный.
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
08.05.2013, 22:16  [ТС] 10
Цитата Сообщение от lazybiz Посмотреть сообщение
Можно выделить динамически память под массив в функции. Заполнить его и вернуть как какой-нибудь другой тип, а потом преобразовать, так сказать в двумерный.
не понял , кусок кода можно ?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
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, за другие компиляторы не ручаюсь (оно вообще работать не обязанно).
Чтоб объяснить как и почему оно все же работает, придется очень много писать. Поэтому ты лучше спрашивай что непонятно, тогда может писанины меньше будет.
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
08.05.2013, 22:17  [ТС] 12
короче как я понял только через заднее место можно это сделать ?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
08.05.2013, 22:18 13
Цитата Сообщение от Игорь с++ Посмотреть сообщение
возвращает 2-х мерный массив
у тебя в первом посте одномерный массив, хотя и объявлен как двумерный.
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
08.05.2013, 22:22  [ТС] 14
Kastaneda, спасибо работает на gcc , но не понятна ваша фраза -
Цитата Сообщение от Kastaneda Посмотреть сообщение
сразу говорю - это в корне неправильно!!!!
Добавлено через 48 секунд
блин , чё то я совсем уже
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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;
}
1
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
08.05.2013, 22:25  [ТС] 16
вообщем наверное будет проще сделать массив и передавать в функцию и там его заполнять !!!
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
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");
}
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
08.05.2013, 22:26 18
Цитата Сообщение от Игорь с++ Посмотреть сообщение
но не понятна ваша фраза -
потому что массив создается на стеке при входе в функцию, а после выхода из функции та часть стека, которую занимал массив, считается свободной и затирается другими значениями. Поэтому я вызываю функцию 10 раз, чтоб создалось 10 таких массивов и возвращаю указатель на последний из созданных массивов. Таким образом есть шанс, что этот массив все же не затрется при вызове того же std::cout << (), но никто этого не гарантирует.
1
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
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;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.05.2013, 22:45 20
Цитата Сообщение от Игорь с++ Посмотреть сообщение
вот так наверное более правельно и красиво будет
более правильно будет не заморачиваться с массивами на стеке, а сделать динамические. А то и вовсе std::vector использовать, дабы не отвлекаться на вопросы выделения памяти, а сконцентрироваться на конкретной задаче.
0
08.05.2013, 22:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2013, 22:45
Помогаю со студенческими работами здесь

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором...

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором...

Используя указатели на функцию вычислить значение функции в точке X в соответствии с выбором функции пользователем
Решил выложить свои лабораторные работы 1-10 за первый курс, первого семестра...

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

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Шаблонные функции и указатели на функции
Помогите доделать и исправить... Задание: 1. Создать структуру Прямоугольник, с полями Высота и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru