Помогите с scanf и выделением памяти - PullRequest
0 голосов
/ 02 марта 2011

Вот мой код:

#include <stdio.h>
#include <stdlib.h>

#define MAX 50

float** getdata(void);
void calculations(float* fPtr);
//void printoriginal(float* values, int inputnum, float* fPtr);

int main(void)
{
    float** fPtr; 
    float* values; 

    fPtr = getdata();
    calculations(*fPtr);
    int element;
//  printoriginal(*values, inputnum, *fPtr);



    system("PAUSE");
    return 0;
}

float getvalues(void)
{
     float* values = (float*)calloc(*inputnum, sizeof(float));

float** getdata(void)
{
    int i;
    int n;
    float** fPtr;
    int* inputnum;

    printf("How many values do you want to input into the array?");
    scanf("%d", inputnum);

    float* values = (float*)calloc(*inputnum, sizeof(float));

    if (values == NULL)
    {   printf("Memory overflow\n");
        exit(101);
    }


    for(i = 0; i < *inputnum; i++)
    {
        n = i + 1;
        printf("Please enter your %d number: ", n);
        scanf("%f",(values+i));
    }


    fPtr = (float**)calloc(*inputnum+1, sizeof(float*));
    if (fPtr == NULL)
    {   printf("Memory overflow\n");
        exit(101);
    }

    for(int c=0; c < *inputnum; c++)
    {
        *(fPtr+i) = (values+i);
    }
printf("%f", values+2);

return fPtr;
}

Я сканирую значения в getdata, но сканирую в мусоре. Я почти уверен, что мой скан выключен. Кроме того, как я смогу передать обратно мой массив значений через ссылку? Мне тоже очень тяжело с этим. Спасибо всем.

Ответы [ 4 ]

0 голосов
/ 02 марта 2011

Существует так много ошибок, я не знал, с чего начать:)

Код полностью переписан ниже. Пожалуйста, изучите это.

#include <stdio.h>
#include <stdlib.h>

#define MAX 50

int  get_data        (float** array);           /* must be pointer-to-pointer to return through parameter */
void print_data      (const float* array, int size); /* print data */
void do_weird_things (float* array, int size);  /* do weird things with the data */
void clear_data      (float*  array);           /* clean up */

int main(void)
{
    float* array;
    int size;

    size = get_data (&array);

    printf("Before weird things:\n");
    print_data (array, size);

    do_weird_things (array, size);

    printf("After weird things:\n");
    print_data (array, size);

    clear_data (array);


    system("PAUSE");
    return 0;
}

int get_data (float** array)
{
    int i;
    int items;

    printf("How many values do you want to input into the array? ");
    scanf("%d", &items);
    getchar(); /* remove \n from stdin */

    *array = calloc(items, sizeof(float));

    if (*array == NULL)
    {
        printf("Memory overflow\n");
        exit(EXIT_FAILURE);
    }


    for(i = 0; i < items; i++)
    {
        printf("Please enter your %d number: ", i+1);
        scanf("%f", (*array) + i);
        getchar(); /* remove \n from stdin */
    }

    return items;
}

void do_weird_things (float* array, int size) /* do whatever data manipulation you wish here */
{
  int i;

  for(i=0; i<size; i++)
  {
    array[i] += i;
  }
}

void print_data (const float* array, int size)
{
  int i;

  for(i=0; i<size; i++)
  {
    printf("%f\t", array[i]);
  }
  printf("\n");
}

void clear_data      (float*  array)
{
  free(array);
}
0 голосов
/ 02 марта 2011

Мне нравится, когда объекты "назначаются" одной функции.В вашей программе ваши значения создаются в функции getdata(), используются в calculations() и никогда не выпускаются.

Если бы за них отвечала функция main(), это, на мой взгляд, упростило бы кодирование,Что-то вроде

int main(void) {
    int inputnum, innum;
    double *fPtr;

    printf("How many values do you want to input into the array?");
    fflush(stdout);
    if (scanf("%d", &inputnum) != 1) {
        fprintf(stderr, "Error in input. Program aborted.\n");
        exit(EXIT_FAILURE);
    }
    if (inputnum > MAX) { /* ... nothing yet ... */ }

    fPtr = calloc(inputnum, sizeof *fPtr);
    if (fPtr == NULL) {
        fprintf(stderr, "Not enough memory. Program aborted.\n");
        exit(EXIT_FAILURE);
    }

    /* use fPtr in other functions */
    innum = data_get(fPtr, inputnum);
    data_print(fPtr, innum);

    free(fPtr);
    return 0;
}

В приведенном выше фрагменте я использовал функции data_get() и data_print() с несколько другим прототипом, чем у вас.Эти функции принимают указатель и несколько элементов.

int data_get(double *data, int num);
void data_print(double *data, int num);

Первая читает до num, удваивается в памяти, на которую указывает data, и возвращает количество двойных, которые были эффективно введены.
Для печати второго числа требуется двойное число.

О!Если у вас нет веских причин использовать float s, не используйте их.Всегда предпочитаю double с.

0 голосов
/ 02 марта 2011

Также вместо

printf ("% f", значения + 2);

использование

printf ("% f", * (значения + 2));

0 голосов
/ 02 марта 2011

вместо

int * inputnum;
scanf( ..., inputnum );

Вы хотите:

int inputnum;
scanf( ..., &inputnum );

Либо так, либо вам нужно вставить выделение inputnum:

/* Very non-C-worthy code sample */
int * inputnum;
inputnum = malloc( sizeof *inputnum );
if( inputnum == NULL ) {
    perror( "malloc" );
    exit( EXIT_FAILURE );
}
scanf( ..., inputnum );

но это будет выглядеть очень странно для всех, кто знаком с C (Если нет другой причины для этого, и в этом В этом случае нет никаких причин.)

Проблема, с которой вы столкнулись, состоит в том, что сохранение полученного значения в указанном месте по inputnum, который является фиктивным местоположением, так как inputnum неинициализирован.

...