Нет ничего явно неправильного в коде, который вы нам показываете, поэтому есть вероятность, что проблема в коде, который вы нам не показали.Это довольно сложная структура данных для управления;Интересно, если у вас есть ошибка в коде, который загружает ее.Возможно, вам следует показать нам код, который инициализирует и распределяет данные, а также код, который вы используете для печати данных, плюс тестовая программа.Это может быть просто квадратичный (3-членный) полином;этого достаточно, чтобы продолжить.
Я бы не удивился, обнаружив, что проблема в том, что вы выделяете terms
в полиноме.Вы, вероятно, действительно хотите:
typedef struct Polynomial
{
TERM *terms;
int numTerms;
char Polynomialstring[MAXPOLYCHARS];
} POLYNOMIAL;
Затем вы можете назначить правильное количество терминов с помощью:
poly->terms = malloc(nterms * sizeof(*poly->terms));
poly->nterms = nterms;
Вы можете использовать почти те же выражения, что и раньше, для доступа к терминам:
poly->terms[i].Coefficient *= scalar;
Обратите внимание на изменение с ->
на .
в последней части.
Проверка ошибок для краткости и ясности опущена.
Вероятно, вы не выполняете MAXPOLYTERMSотдельные назначенные назначения, как требуется для существующей структуры данных.
Версия с использованием упрощенной полиномиальной структуры
Я удалил неиспользуемые части кода (например, строки), чтобы добраться до этоговерсия, которая компилируется в соответствии с GCC 4.2.1 (с использованием -std=c99 -Wall -Wextra
) на MacOS X 10.6.6 и запускается в чистом режиме под Valgrind 3.6.1.
#include <stdlib.h>
#include <stdio.h>
typedef struct Term
{
int Coefficient;
int Exponent;
} TERM;
typedef struct Polynomial
{
TERM *terms;
int numTerms;
} POLYNOMIAL;
static void FreePolynomial(POLYNOMIAL *poly)
{
free(poly->terms);
free(poly);
}
static void MultiplyPolynomial(POLYNOMIAL *polynomial, int scalar)
{
int numberofterms = polynomial->numTerms;
for (int i = 0; i < numberofterms; i++)
polynomial->terms[i].Coefficient *= scalar;
}
static POLYNOMIAL *allocPoly(int *array, int num)
{
POLYNOMIAL *poly = malloc(sizeof(*poly));
poly->terms = malloc(num * sizeof(*poly->terms));
for (int i = 0; i < num; i++)
{
poly->terms[i].Coefficient = array[2*i+0];
poly->terms[i].Exponent = array[2*i+1];
}
poly->numTerms = num;
return poly;
}
static void dumpPolynomial(FILE *fp, POLYNOMIAL *poly, const char *tag)
{
fprintf(fp, "Polynomial dump (%s): 0x%p\n", tag, poly);
if (poly != 0)
{
fprintf(fp, "Terms %d\n", poly->numTerms);
for (int i = 0; i < poly->numTerms; i++)
fprintf(fp, "%d: Coefficient %d, Exponent %d\n", i,
poly->terms[i].Coefficient, poly->terms[i].Exponent);
}
fflush(fp);
}
int main(void)
{
int coeffs[] = { 1, 0, 2, 1, 3, 2 };
POLYNOMIAL *poly = allocPoly(coeffs, 3);
dumpPolynomial(stdout, poly, "Before");
MultiplyPolynomial(poly, 4);
dumpPolynomial(stdout, poly, "After");
FreePolynomial(poly);
return 0;
}
Версия с использованием сложной полиномиальной структуры
Это использует ваши оригинальные структуры данных.Он компилируется чисто и работает чисто.
#include <stdlib.h>
#include <stdio.h>
enum { MAXPOLYTERMS = 5, MAXPOLYCHARS = 5, MAXTERMCHARS = 5 };
typedef struct Term {
int Coefficient;
int Exponent;
char Termstring[MAXTERMCHARS];
} TERM;
typedef struct Polynomial {
TERM *terms[MAXPOLYTERMS];
int numTerms;
char Polynomialstring[MAXPOLYCHARS];
} POLYNOMIAL;
static void FreePolynomial(POLYNOMIAL *poly)
{
for (int i = 0; i < poly->numTerms; i++)
free(poly->terms[i]);
free(poly);
}
static void MultiplyPolynomial(POLYNOMIAL *polynomial, int scalar)
{
int numberofterms = polynomial->numTerms, i=0;
if(scalar == 0)
{FreePolynomial(polynomial);}
else
{
for(i=0;i<numberofterms;i++)
{polynomial->terms[i]->Coefficient *= scalar;}
}
return;
}
static POLYNOMIAL *allocPoly(int *array, int num)
{
POLYNOMIAL *poly = malloc(sizeof(*poly));
for (int i = 0; i < num; i++)
{
poly->terms[i] = malloc(sizeof(TERM)); // backsliding
poly->terms[i]->Coefficient = array[2*i+0];
poly->terms[i]->Exponent = array[2*i+1];
poly->terms[i]->Termstring[0] = '\0';
}
poly->numTerms = num;
poly->Polynomialstring[0] = '\0';
return poly;
}
static void dumpPolynomial(FILE *fp, POLYNOMIAL *poly, const char *tag)
{
fprintf(fp, "Polynomial dump (%s): 0x%p\n", tag, poly);
if (poly != 0)
{
fprintf(fp, "Terms %d\n", poly->numTerms);
for (int i = 0; i < poly->numTerms; i++)
fprintf(fp, "%d: Coefficient %d, Exponent %d\n", i,
poly->terms[i]->Coefficient, poly->terms[i]->Exponent);
}
fflush(fp);
}
int main(void)
{
int coeffs[] = { 1, 0, 2, 1, 3, 2 };
POLYNOMIAL *poly = allocPoly(coeffs, 3);
dumpPolynomial(stdout, poly, "Before");
MultiplyPolynomial(poly, 4);
dumpPolynomial(stdout, poly, "After");
return 0;
}