2015-04-05 3 views
0

Таким образом, цель этого фрагмента кода заключается в чтении в числах из файла, представляющего коэффициенты многочлена. Количество цифр не известно заранее. В каждой строке есть один «полином». Пример файла, который я читаю ниже.C int не сохраняется

Polynomails.txt 
1 2 0 0 5 
7.0 0 0 0 -2.25 1.13 

В настоящее время основным проверяет только то, что имя файла было дано, и что она может быть открыта, а затем вызывает ReadPoly, как показано ниже. BUFFSIZE определяется как 256 с инструкцией define в этом файле.

void ReadPoly(FILE* InputFile){ 
    polynomial poly; 
    double complex *coef; 
    char *p, *buffer; 
    unsigned int terms; 

    buffer = (char*) malloc(BUFFSIZE); 

    while(fgets(buffer,BUFFSIZE,InputFile)){  
     coef = (double complex*) malloc(BUFFSIZE*sizeof(double complex)); 
     terms = 0; 
     p = strtok(buffer, " "); 
     while(NULL != p){ 
      coef[terms] = atof(p); 
      terms++; 
      p = strtok(NULL, " "); 
     } 
     coef = (double complex*) realloc(coef,(terms*sizeof(double complex))); 
     printf("terms provided to init: %d\n",terms); 
     createPoly(&poly,terms); 
     poly.polyCoef = coef;  
     printf("terms in struct: %d\n",poly.nterms); 
    } 
    free(buffer); 
} 

И вот функция createPoly и объявление полиструктуры.

typedef struct 
{ 
unsigned int nterms;  /* number of terms */ 
double complex *polyCoef; /* coefficients */ 
} polynomial; 


void createPoly(polynomial *p, unsigned int nterms){  
    double complex terms[nterms]; 

    p = (polynomial*) malloc(sizeof(polynomial)); 

    p->nterms = nterms; 
    p->polyCoef = terms; 
    printf("In createPoly, nterms: %d\n",p->nterms);  
} 

Теперь от того, что я могу сказать, все номера считываются в правильно, но значение nterms в структуре не работает, как ожидалось. Вот результат, когда я запускаю это. Стоит отметить, что даже при том же вводе данных значение «terms in struct» не всегда одинаково.

terms provided to init: 6 
In createPoly, nterms: 6 
terms in struct: 1075624960 
terms provided to init: 5 
In createPoly, nterms: 5 
terms in struct: 1075624960 

Моя единственная, хотя в том, что поле polyCoef из структуры как-то писать над полем nterms но без фиксированных размеров (которые не вариант) Я не уверен, как поступить.

+0

Не выставлять результат malloc/calloc/realloc в C] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –

+0

'buffer = (char *) malloc (BUFFSIZE);' если BUFFSIZE является постоянным, было бы лучше использовать 'char buffer [BUFFSIZE];' –

ответ

0

В вашей подпрограмме createPoly вы динамически выделяете polynomial и устанавливаете его член nterms, но никогда не возвращаете указатель на динамически распределенную структуру. poly.nterms, который вы печатаете в ReadPoly, полностью не связан с тем, что находится в пределах createPoly. Вы просто печатаете неинициализированную память, поэтому вы получаете такое большое, случайное значение.

Один из способов обойти это передать указатель на указатель в createPoly, как это:

void createPoly(polynomial **p, unsigned int nterms) {  
    double complex terms[nterms]; 
    *p = malloc(sizeof(polynomial)); 
    /* ... */ 
} 

Тогда в ReadPoly:

polynomial *poly; 
/* ... */ 
createPoly(&poly, terms); 

Другой вариант:

polynomial *createPoly(unsigned int nterms) { 
    polynomial *poly = malloc(sizeof(polynomial)); 
    /* ... */ 
    return poly; 
} 
+0

Ну его передал указатель p, где и назначается новый многочлен. Я могу получить все поля polyCoef просто отлично, его единственные nterms, которые дают мне печаль. – Dave851

+0

Да, он вручает указатель 'p', который вы перезаписываете другим указателем. Затем вы никогда не передадите динамически назначенный указатель. –

0

В функции ReadPoly вы объявляете poly как переменная стека, то есть компилятор уже выделил пространство для структуры в стеке.

Тогда в creatPoly вы переназначить указатель на какую-либо другую память вручную выделить, теряя первоначальный указатель, передаваемый createPoly, и поэтому данные, которые вы установите в структуре устанавливаются только для этого вновь выделенной структуры, а не в исходная структура передана функции. Это также означает, что у вас есть утечка памяти, поскольку указатель, которому вы назначили в createPoly, теряется после возвращения функции.

Есть два решения: либо не выделять память в createPoly, или иметь poly быть указателем в ReadPoly, а затем передать указатель к указателю в качестве аргумента createPoly (с enumate прохода по ссылке) , Я предлагаю первое решение.

0

Проблема была в том, что я переписал указатель в функции createPoly, malloc'ing памяти вне функции createPoly было простым исправлением.

В конце концов я использовал первое предложение Йоахима Пилеборга, главным образом потому, что я до сих пор несколько новичок в C и еще не играл с указателями на указатели.

Смежные вопросы