我需要将一个结构数组传递给一个函数[大代码]

时间:2014-12-11 17:11:54

标签: c arrays function vector structure

我已经在这方面工作了好几天但似乎无法解决这个问题。

提前抱歉这个不合时宜的长度,所以如果有人花时间通过它并试图理解这个烂摊子,我会欠你的。

以下是代码:

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

typedef struct cart {
    int id;
    char *nume;
} cart;

typedef struct pach {
    int id, idCartier, strada, numar, prioritate, codificare;
    float greutate;
    char* mesaj;
    int adresa[18];
} pach;

typedef struct post {
    int id, nrPachete;
    int vector[50];
} post;

int citeste(int *nrP, cart *cartier, pach *pachet, int *nrC) {
    printf("Punctul 1\n");
    int i, j;     
    scanf("%d", nrC);
    for (i = 0; i < *nrC; i++) {
        cartier[i].id = i;
        char aux[500]; 
        scanf("%s", aux);
        cartier[i].nume = malloc(strlen(aux) + 1);  
        cartier[i].nume = aux;
        printf("%d %s\n", cartier[i].id, cartier[i].nume);
    }
    scanf("%d", nrP);
    for (i = 0; i < *nrP; i++) {
        pachet[i].id = i;
        char aux[500];
        for (j = 0; j < 18; j++)
            scanf("%d", &pachet[i].adresa[j]);
        scanf("%d %f", &pachet[i].prioritate, &pachet[i].greutate);
        getchar();
        fgets(aux, 256, stdin);
        pachet[i].mesaj = malloc(strlen(aux) + 1);
        pachet[i].mesaj = aux;
        printf("%d\n", pachet[i].id);
        for (j = 0; j < 18; j++)
            printf("%d ", pachet[i].adresa[j]);
        printf("\n%d %.6f ", pachet[i].prioritate, pachet[i].greutate); 
        printf("%s", pachet[i].mesaj);
    }
    return *nrP;
}

void extrage(int *nrP, pach *pachet) {
    printf("\nPunctul 2\n");
    int i, j;
    for (i = 0; i < *nrP; i++) {
        pachet[i].idCartier = 0;
        pachet[i].strada = 0;
        pachet[i].numar = 0;
        for (j = 0; j < 5; j++)
            pachet[i].idCartier += pachet[i].adresa[j] * pow(2, (4 - j));
        for (j = 5; j < 10; j++)
            pachet[i].strada += pachet[i].adresa[j] * pow(2, (9 - j));
        for (j = 10; j < 18; j++)
            pachet[i].numar += pachet[i].adresa[j] * pow(2, (17 - j));
        printf("%d %d ", pachet[i].id, pachet[i].idCartier);
        printf("%d %d\n", pachet[i].strada, pachet[i].numar);
    }
}

void distribuie(int *nrP, pach *pachet, post *postas, int *nrC, cart *cartier) {    
    printf("Punctul 3\n");
    int i, j;
    for (i = 0; i < *nrC; i++) {        // FOR-1A
        postas[i].nrPachete = 0;
        postas[i].id = i;
        for (j = 0; j < 50; j++)
            postas[i].vector[j] = 0;
    }
    for (i = 0; i < *nrC; i++) {        // FOR-1B
        for (j = 0; j < *nrP; j++) {        
            if (cartier[i].id == pachet[j].idCartier) {
                postas[i].vector[postas[i].nrPachete] = pachet[j].id;
                postas[i].nrPachete++;
            }
        }
        printf("%d %d ", postas[i].id, postas[i].nrPachete);
        for (j = 0; j < postas[i].nrPachete; j++)
            printf("%d ", postas[i].vector[j]);
        printf("\n");
    }


}


void ordoneaza(pach *pachet, int *nrC, post *postas) {
    printf("Punctul 4\n");
    pach aux;
    int i, j, k = 0, schimbat = 1;
    for (i = 0; i < *nrC; i++) {
        while (schimbat) {
            schimbat = 0;
            for (j = 0; j < postas[i].nrPachete - k; j++)
                if (pachet[postas[i].vector[j]].prioritate < pachet[postas[i].vector[j+1]].prioritate) {
                    aux = pachet[postas[i].vector[j]];
                    pachet[postas[i].vector[j]] = pachet[postas[i].vector[j+1]];
                    pachet[postas[i].vector[j+1]] = aux;
                    schimbat = 1;
                }
            k++;
        }
        k = 0;
        schimbat = 1;
        for (j = 0; j < postas[i].nrPachete; j++) {
            for (k = j; k < postas[i].nrPachete; k++) {
                if (pachet[postas[i].vector[j]].prioritate == pachet[postas[i].vector[k]].prioritate) 
                    if (pachet[postas[i].vector[j]].greutate < pachet[postas[i].vector[k]].greutate) {
                        aux = pachet[postas[i].vector[j]];
                        pachet[postas[i].vector[j]] = pachet[postas[i].vector[k]];
                        pachet[postas[i].vector[k]] = aux;
                    }
            }   
        }
    }
    for (i = 0; i < *nrC; i++)
        for (j = 0; j < postas[i].nrPachete; j++) {
            postas[i].vector[j] = pachet[postas[i].vector[j]].id;
            }
    for (i = 0; i < *nrC; i++) {
        printf("%d %d ", postas[i].id, postas[i].nrPachete);
        for (j = 0; j < postas[i].nrPachete; j++)
            printf("%d ", postas[i].vector[j]);
        printf("\n");
    }
}


int main() {
    int nrP, nrC;
    pach pachet[1600];
    post postas[32];
    cart cartier[32];
    citeste(&nrP, &cartier[32], &pachet[1600], &nrC);
    extrage(&nrP, &pachet[1600]);
    distribuie(&nrP, &pachet[1600], &postas[32], &nrC, &cartier[32]);
    ordoneaza(&pachet[1600], &nrC, &postas[32]);
    return (0);
}

该计划的简短信息:

citeste函数应该读取cartier和pachet结构。他们都是。然后以不同的格式打印它们。

extrage函数应该采用每个pachet,并使用adresa(用BINARY编写)转换它的3个部分并获得strada,numar和idCartier。然后还打印那些。

Distribuie检查pachet是否分发到postas(分布式意味着pachet.idCartier == postas.id),如果不分发它。

Ordoneaza接受每个postas的向量并在优先级之后对其进行排序(或者如果prioritate-s相等则为greutate)。

但它不能按预期工作,也会产生奇怪的分段错误。

例如,如果我注释掉了distribuie函数,它会在extrage之后立即给出segfault。如果我把它放回去,它会在完成后立即给出段错误。如果我取消注释所有内容,它会再次给出段错误。

如果有人真正阅读了所有这些并且愿意回复,我会非常感激。任何建议都有帮助!

1 个答案:

答案 0 :(得分:0)

我没有阅读你的代码,但你的标题说你在传递结构数组时遇到了麻烦。我附上一个工作片段希望它可以帮助你解决问题。

#include<stdio.h>
typedef struct employee{
int empId;
char name[10];
}EMP;

void arrayOfStruct(EMP *a, int size)
{
    printf("%d\t%d",a[0].empId,a[3].empId);    
}
int main()
{
   EMP NC[4];
   NC[0].empId = 9;
   NC[3].empId = 2;
   arrayOfStruct(&NC[0],sizeof(NC)/sizeof(NC[0]));
}

size的帮助下,你永远无法超越为结构分配的内存。

如果您想要传递更高维度的数组,您必须硬编码除最外层数据之外的所有数组大小。

void arrayOfStruct(EMP a[][4], int size)
{
    // to do
}

int main()
{
    EMP NC[2][4];
    ...
    arrayOfStruct(NC,sizeof(NC)/sizeof(NC[0]));
}

如你所见,我没有指定最高大小的数组,我正在通过其他争论。

为什么我需要指定内部尺寸的大小?

让我们举一个例子,假设您有int[4][4],并且您试图通过int[3][]将数组传递给函数,编译器如何知道要创建多少内部块,在其他情况下通过int[][3],编译器可以很容易地理解它必须为每个外部数组制作大小为3的内部块。