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

标签 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);
}

有关该程序功能的简短信息:

citete 函数应该读取 cartier 和 pache 结构。他们全部。然后以稍微不同的格式打印它们。

extrage函数应该获取每个包,并使用adresa(以BINARY编写)将其3部分转换并获得strada、numar和idCartier。然后也打印这些。

Distribuie 检查小包是否已分发到 postas(已分发意味着 pachet.idCartier == postas.id),如果没有,则分发它。

Ordoneaza 获取每个 postas 的 vector ,并在优先级之后对其进行排序(如果优先级相等,则对其进行排序)。

但它无法按预期工作,并且还会出现奇怪的段错误。

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

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

最佳答案

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

#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][] 将数组传递给函数,编译器如何知道要创建多少个内部 block ,在其他情况下通过 int[][3] ,编译器可以很容易地理解它必须为每个外部数组创建大小为 3 的内部 block 。

关于c - 我需要将结构数组传递给函数[大代码],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27428565/

相关文章:

c - C 中函数的两个或多个值

使用 strcat 连续连接多个 char*

c - 如何从解密和加密的数据中找到 RC4 key ?

python - 在 numpy 对象数组中搜索

function - 多匹配查询功能得分

带有未知参数的 Python 包装函数

c = a + b 和隐式转换

javascript - 将元素附加到数组 : Differences between direct assignment and `push` ?

java - 模式错误纠正

C 全局函数(非 C++)