Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2010, 14:32   #1
agronomchek
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 19
По умолчанию Язык Си. Не возвращается значение указателя из функции.

Подробное описание задания:
В программе описать 3 функции.
Функция f1 осуществляет ввод m-размера одномерного массива, а[i]-значений элементов массива (предварительно под массив в теле функции динамически выделяется память), передает в главную m и a[i], i=1,...m.
Функция f2, получая через параметры одномерный массив, динамически выделяет память под новый массив (инвертируемый исходный) и передает в точку вызова новый массив. Тип возвращаемого функцией значения - void.
Главная функция получает размер массива и значения его элементов через f1, вызывает f2 и выводит на экран элементы нового массива, полученные как разности элементов исходного массива и инвертированного.

Проблема: Из главной функции указатель inv передается в функцию f2, там он становится массивом. Этот массив должен "вернуться" в главную функцию. Но при попытке обращения к этому указателю после f2 вылетает ошибка сегментации.

Собственно,
Код:
#include <stdio.h>
#include <stdlib.h>

float *f1(int* m)
{
	int size = 0,i; float *a;
	printf("\nPlease enter m - size of array: ");
	scanf("%d", &size);
		a = (float*)(malloc(size*sizeof(float)));
	if (a)
    {
		 for (i = 0; i < size; ++i)
         {
             printf("\n Enter a[%d]= ",i);
             scanf("%f", &a[i]);
		 }
		 *m = size;
	}
    else {*m = 0;}
	return a;
}


void f2 (float *mas,float *inv, int k)
{
     int i;
     inv=(float*)malloc(k*sizeof(float));
     if (!inv) 
     {
               printf("\nRequire more memory!\n"); 
               system("pause");
               exit(1);
     }
     for (i=0; i<k; i++) inv[i]=mas[k-i-1];
}

int main(void)
{
     int m, i; float *inv=NULL; float *mas=NULL; float x;
     mas=f1(&m);
     f2(mas, inv, m); 
     printf("\n Difference between elements of direct and reverse arrays: ");
     for (i=0; i<m; i++) 
     {
         if (i%3==0) printf("\n");
         x=mas[i]-inv[i];
         printf("mas[%d]= %f\t", i, x);
     }
     free(inv);
     free(mas);
     system("pause");
     return 0;
}

Последний раз редактировалось agronomchek; 29.08.2010 в 14:49. Причина: рабочий мусор в коде
agronomchek вне форума Ответить с цитированием
Старый 29.08.2010, 22:47   #2
agronomchek
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 19
По умолчанию

уже не надо. вот рабочий вариант кода:
Код:
#include <stdio.h>
#include <stdlib.h>
 
float *f1(int* m)
{
        int size = 0,i; float *a;
        printf("\nPlease enter m - size of array: ");
        scanf("%d", &size);
        a = (float*)(malloc(size*sizeof(float)));
        if (a)
        {
                for (i = 0; i < size; ++i)
                {
                        printf("\n Enter a[%d]= ",i);
                        scanf("%f", &a[i]);
                }
                *m = size;
        }
        else {*m = 0;}
        return a;
}
 
 
void f2 (float *mas,float **inv, int k)
{
        int i;
        *inv=(float*)malloc(k*sizeof(float));
        if (!(*inv)) 
        {
                printf("\nRequire more memory!\n"); 
                system("pause");
                exit(1);
        }
        for (i=0; i<k; i++)
                (*inv)[i]=mas[k-i-1];
}
 
int main(void)
{
        int m, i; float *inv=NULL; float *mas=NULL; float x;
        mas=f1(&m);
        f2(mas, &inv, m); 
        printf("\n Difference between elements of direct and reverse arrays: ");
        for (i=0; i<m; i++) 
        {
                if (i%3==0) printf("\n");
                x=mas[i]-inv[i];
                printf("mas[%d]= %f\t", i, x);
        }
        free(inv);
        free(mas);
        system("pause");
        return 0;
}
agronomchek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не возвращается результат функции при использовании типа параметра ptResult superpyct БД в Delphi 2 09.06.2010 14:31
Значение функции IceBreaker Помощь студентам 10 09.02.2010 09:52
Как узнать возвращается ли чему либо результат из функции? Stilet Общие вопросы Delphi 7 07.10.2009 16:45
Протабулировать значение функции gessi Паскаль, Turbo Pascal, PascalABC.NET 2 13.09.2009 18:39
Найти значение функции Y ahtung Microsoft Office Excel 6 24.12.2008 15:59