1

Costs を要素として含む動的配列をソートしようとしています。これは私のソート機能です:

void ascending_sort(Controller* ctrl) //the function is in the controller
{
    int i,j;
    DynamicVector* CostList=getAll(ctrl->repo); //the getALL function returns the CostList that has Costs as elements
    for(i=0;i<getLen(CostList)-1;i++)
    {
        Cost* cost=(Cost*)getElementAtPosition(CostList,i); //getElementAtPosition returns the Cost at a certain position
        for(j=i+1;j<getLen(CostList);j++)
        {
            Cost* cost1=(Cost*)getElementAtPosition(CostList,j);
            if(cost->sum > cost1->sum)
            {
            Cost  aux=cost[i];
            cost[i]=cost[j];
            cost[j]=aux;
            }
        }
    }
}

問題は、コストを印刷したいときです。並べ替える前にそれらを印刷すると、すべてがうまくいき、コストが印刷されます。リストを並べ替えて並べ替えたコストを出力すると、「プログラムを閉じる」エラーが発生し、プログラムがクラッシュします。これは印刷機能です:

void PrintCosts(Console* console)
{
    DynamicVector* CostList=getAllCosts(console->ctrl);
    if (getLen(CostList))
    {
        int i;
        for(i=0;i<getLen(CostList);i++)
        {
            printf("\nCost %d\n\n",i+1);
            Cost *c=(Cost*)getElementAtPosition(CostList,i);
            PrintCost(c);
        }

    }
    else printf("No cost in the list!");
}

これは構造体です:

typedef struct{
    int id;
    char* day;
    char* type;
    int sum;
}Cost;

これは、コンソールで呼び出される並べ替え関数です。

void AscendingSort(Console* console)
{
    ascending_sort(console->ctrl);
}

これは、Cost* 型を返す関数です。

Cost* initCost(char* day, char* type, int sum)
{
    Cost* c=(Cost*)malloc(sizeof(Cost));
    if(strlen(day)>0 && strlen(day)<=10)
    {
        c->day = copyString(day);
    }
    else
    {
        c->day=0;
    }
    if(strlen(type)>0 && strlen(type)<=20)
    {
        c->type = copyString(type);
    }
    else
    {
        c->type=0;
    }
    if(sum>0)
    {
        c->sum= sum;
    }
    return c;
}

コンソール:

Console* initConsole(Controller* ctrl)
{
    Console* console=(Console*)malloc(sizeof(Console));
    console->ctrl=ctrl;
    return console;
}

getElementAtPosition

TElem getElementAtPosition(DynamicVector* v, int pos)
{
    if(v->elem[pos])
        return v->elem[pos];
    else
        return 0;
}

typedef void* TElem;
4

2 に答える 2

1

costソートコードで配列としてアクセスしようとしています

Cost  aux=cost[i];
cost[i]=cost[j];
cost[j]=aux;

これは正しくありません。getElementAtPosition()リターン ポインターが 1 つのアイテムへのポインターであり、シーケンシャルにアクセスできるアイテムの配列、つまり配列ではありません。

ポインタ通知を通じて 1 つの要素にしかアクセスできませcost->sumん。cost[i].sumi==0

于 2013-03-18T14:04:52.457 に答える
0

セグメンテーション違反が発生しているようです。Cost* を返す関数を示しておらず、逆参照する前に Cost* を検証していません。ひょっとして、その辺に何か問題があるのでしょうか?それを確認するには、もう少しソースコードが必要だと思います。

また、これに気づきました。

for(i=0;i<getLen(CostList);i++)
{
    printf("\nCost %d\n\n",i+1);
    Cost *c=(Cost*)getElementAtPosition(CostList,i); <-- typeof(C) == Cost*
    PrintCost(c);  <-- typeof(C) == Console*
}

変数を aと a のc両方として使用しています。これはタイプセーフな方法ではないため、ここにいくつかのエラーがあると思います。ただし、コードがないとわかりません:)Cost*Console*

于 2013-03-18T14:01:40.570 に答える