Передача структура-в-указатель-массив-в-структуре по адресу в C - PullRequest
0 голосов
/ 08 марта 2011

У меня есть функция, которая принимает указатель, полиномиальный для экземпляра структуры, называемой POLYNOMIAL.Он содержит массив указателей на другую структуру, называемую TERM.TERM содержит два значения.

Эта функция предназначена для изменения одного из значений в TERM.Я пытаюсь сделать это с помощью строки:

polynomial->terms[i]->Coefficient *= scalar;

Но это не работает;в то время как функция видит то, что я ожидаю, когда я вызываю

polynomial->terms[i]->Coefficient,

, изменения, по-видимому, ограничены областью действия функции.Я наметил мое лучшее понимание памяти, чтобы попытаться найти проблему, но безрезультатно.

РЕДАКТИРОВАТЬ: Определение полинома:

typedef struct Polynomial {
  TERM *terms[MAXPOLYTERMS];
  int numTerms;
  char Polynomialstring[MAXPOLYCHARS];
} POLYNOMIAL;

Определение термина:

typedef struct Term {
  int Coefficient;
  int Exponent;
  char Termstring[MAXTERMCHARS];
} TERM;`

Функция:

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;
}

1 Ответ

2 голосов
/ 08 марта 2011

Нет ничего явно неправильного в коде, который вы нам показываете, поэтому есть вероятность, что проблема в коде, который вы нам не показали.Это довольно сложная структура данных для управления;Интересно, если у вас есть ошибка в коде, который загружает ее.Возможно, вам следует показать нам код, который инициализирует и распределяет данные, а также код, который вы используете для печати данных, плюс тестовая программа.Это может быть просто квадратичный (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...