Converting C++ implementation of vector in C

2019-02-28 09:20发布

问题:

I have written the following code in C++, however found out that I have to convert it in C. I am not C or even C++ programmer, please help.

Can someone help me change this method to C directives, specifically vector implementation, following will not compile I have removed complexity to keep it simple. Thanks in anticipation.

__declspec(dllexport) std::vector<MY_STRUCT> WINAPI ABC(char *strVal)
{
MY_STRUCT f;
std::vector<MY_STRUCT> list = std::vector<MY_STRUCT>();


while (*dddd)
{   /*do the following for every feature in license file*/

        f.attrib_num = fi.attrib_num;           
        f.attrib_lic = fi.attrib_lic;

        list.push_back(f);      


    } /* end while(conf) */

    dddd++;
    printf("\n");

} /* end while (*dddd) */

return flist;

}

回答1:

Here is implementation (also usage) of dynamic array of structs in C. You can adapt it to your structure; I used to post it on code review before

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

typedef struct
{
    int ID;
    char * name;
} Student;

// array of structs
typedef struct
{
    Student *array;
    size_t used;
    size_t size;
} Array;

void initArray(Array *a, size_t initialSize)
{
    int i = 0;
    // Allocate initial space
    a->array = malloc(initialSize * sizeof(Student));

    a->used = 0;           // no elements used
    a->size = initialSize; // available nr of elements

    // Initialize all values of the array to 0
    for(i = 0; i<initialSize; i++)
    {
        memset(&a->array[i],0,sizeof(Student));
    }
}

// Add element to array
void addElement(Array *a, Student element)
{
    int i = 0;
    if (a->used == a->size)
    {
        a->size *= 2;
        a->array = realloc(a->array, a->size * sizeof(Student));

        // Initialize the last/new elements of the reallocated array
        for(i = a->used; i<a->size; i++)
        {
            memset(&a->array[i],0,sizeof(Student));
        }
    }

    // Copy name
    a->array[a->used].name = (char*)malloc(strlen(element.name) + 1);
    strcpy(a->array[a->used].name, element.name);

    // Copy ID
    a->array[a->used].ID=element.ID;

    a->used++;
}

void freeArray(Array *a)
{
    int i = 0;
    // Free all name variables of each array element first
    for(i=0; i<a->used; i++)
    {
        free(a->array[i].name);
        a->array[i].name=NULL;
    }

    // Now free the array
    free(a->array);
    a->array = NULL;

    a->used = 0;
    a->size = 0;
}

int main(int argc, const char * argv[])
{

    Array a;
    Student x,y,z;

    x.ID = 20;
    x.name=malloc(strlen("stud1") + 1);
    strcpy(x.name,"stud1");

    y.ID = 30;
    y.name=malloc(strlen("student2") + 1);
    strcpy(y.name,"student2");

    z.ID = 40;
    z.name=malloc(strlen("student3") + 1);
    strcpy(z.name,"student3");

    // Init array, don't forget
    initArray(&a, 5);

    // Add elements
    addElement(&a, x);
    addElement(&a, y);
    addElement(&a, z);

    // Print elements
    printf("%d\n", a.array[0].ID);
    printf("%s\n", a.array[0].name);
    printf("%d\n", a.array[1].ID);
    printf("%s\n", a.array[1].name);
    printf("%d\n", a.array[2].ID);
    printf("%s\n", a.array[2].name);


    // Free array
    // don't forget
    freeArray(&a);

    free(x.name);
    free(y.name);
    free(z.name);

    return 0;
}