'How do you pass a struct pointer through a function?

#define WIDTH_DATA 20

typedef struct
{
    float inhalt;
    unsigned int nr;
    int status;
} Paket;

typedef struct
{
    Paket Eingang[WIDTH_DATA];
    int laenge;
    float Ablage_A[WIDTH_DATA];
    float Ablage_B[WIDTH_DATA];
} Data_t;

#include <stdio.h>

int pruefe_status(int i1)
{

    if (i1==0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

int vergleiche(unsigned int i1, unsigned int i2)
{

    if (i1<i2)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int verteile_Pakete(Data_t *dv){

    int counterA=0,counterB=0;
    for (int i=0; i<WIDTH_DATA; i++)
    {
        if (pruefe_status(dv->Eingang[i].status)==0)
        {
            if(vergleiche(dv->Eingang[i].nr,5000))
            {
                dv->Ablage_A[counterA] = dv->Eingang[i].inhalt;
                counterA++;
            }
            else{
                dv->Ablage_B[counterB] = dv->Eingang[i].inhalt;
                counterB++;
            }
        }
    }
    return counterB + counterA;
}

int main(void)
{

    // Beispiel für testdv1:
    Data_t testdv1 = {{{12.5, 6067, 1}, {45.7, 3002, 0}, {56.0, 3456, 1}}, 3, {0}, {0}};
    Data_t testdv2 = {{{12.5, 6067, 0}, {45.7, 3002, 1}, {56.0, 3456, 1}}, 3, {0}, {0}};
    Data_t testdv3 = {{{12.5, 6067, 0}, {45.7, 7002, 0}, {56.0, 6456, 0}, {13.5, 6067, 0}, {1.7, 7772, 0}, {156.0, 5656, 0}}, 6, {0}, {0}};

    int Anzahl_pakete1=0;
    int Anzahl_pakete2=0;
    int Anzahl_pakete3=0;

    Anzahl_pakete1 = verteile_Pakete(&testdv1);
    Anzahl_pakete2 = verteile_Pakete(&testdv2);
    Anzahl_pakete3 = verteile_Pakete(&testdv3);

    printf("test 1:\nAnzahl bearbeitenden Pakete:%f\n",Anzahl_pakete1);



    for (int i=0;i<10;i++)
    {
        printf("AblageA %d: %f\nAblageB %d: %f\n",i,testdv1.Ablage_A[i],i,testdv1.Ablage_B[i]);
    }
    printf("test 2:\nAnzahl bearbeitenden Pakete:%f\n",Anzahl_pakete2);
    for (int i=0;i<10;i++)
    {
        printf("AblageA %d: %f\nAblageB %d: %f\n",i,testdv2.Ablage_A[i],i,testdv2.Ablage_B[i]);
    }
    printf("test 3:\nAnzahl bearbeitenden Pakete:%f\n",Anzahl_pakete3);
    for (int i=0;i<10;i++)
    {
        printf("AblageA %d: %f\nAblageB %d: %f\n",i,testdv3.Ablage_A[i],i,testdv3.Ablage_B[i]);
    }
    return(0);
}

Why is the data in testdv1 or 2 or 3 not going in the function verteile_Pakete?.

I tried to pass the address of these test variables to the function as a pointer but the values get lost and don't get through when I try to debug. So everything comes out as 0.

How can I solve this?



Solution 1:[1]

When you look at the compiler output (https://godbolt.org/z/jM43PY916) it warns you that you try to output the integer count as float.

Replace %f with %d in your format strings for integers and it works.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Zaiborg