簡體   English   中英

將struct數組傳遞給函數

[英]Pass struct array to function

我只想在storeDataHere函數內部將ana1分配給ana [0]和ana 1

在saveData函數內部,只需將每個data_array [0]傳遞給storeDataHere函數。

#include <stdio.h>
#include <string.h>
struct Analysis{
    int a;
    int b[10];
};

struct Analysis ana[2];

void storeDataHere(void* res)
{
    // initialize a1;
    struct Analysis a1;
    a1.a = 1;
    memset(a1.b, 0, 10*sizeof(int));

    for(int i=0; i<10; i++)
        a1.b[i] = 1;


    // store a1 into ana[0], ana[1];
    struct Analysis temp = res;
    temp = a1;

}

void saveData(void* data, size_t size)
{

    struct Analysis *data_array = data;
    // pass two struct elements to storeDataHere;
    storeDataHere((void*)data_array[0]);
    storeDataHere((void*)data_array[1]);
}



int main()
{
    // pass struct array ana to saveData
    saveData( (void*)ana, sizeof(ana[0]));

    for(int i=0; i<2; i++)
    {
        printf("\n%d\n", ana[i].a);
        for(int j=0; j<10; j++)
            printf("%d", ana[i].b[j]);
    }

    return 0;
}

這是有錯誤的輸出:

在此處輸入圖片說明

如果保留此功能結構,該如何解決? (不更改功能參數)

在這里查看答案:

https://repl.it/D2Cd

// use struct Analysis* instead of void*
//
void storeDataHere(struct Analysis* res)
{
    int i;
    // initialize a1;
    struct Analysis a1;

    a1.a = 1;
    // memset(a1.b, 0, 10*sizeof(int)); no need to memset cause you set later

    for (i = 0; i < 10; i++) 
    {
        a1.b[i] = 1;
    }

    // store a1 into ana[0], ana[1];
    *res = a1; // assign value of pointer res to a1 
}

// pass array struct to function
void saveData(struct Analysis data[])
{
    struct Analysis *data_array = data;
    // pass two struct elements to storeDataHere;
    storeDataHere(&data_array[0]);
    storeDataHere(&data_array[1]); // pass pointer of each element to StoreDataHere
}

請參閱鏈接查看更多細節。 編碼愉快!!

您正在嘗試分配一個指向對象的指針,這是不可能的,您應該擁有一個副本:

// Copy values
struct Analysis temp = *((struct Analysis*)res);

// or
// Copy pointer
struct Analysis *temp = res;

下一個問題是,將data_array元素(例如data_array[0]傳遞給函數(根據您的代碼),您必須傳遞整個結構:

storeDataHere((void*)data_array);

更改(您需要先鑄造void指針,然后取消引用):

struct Analysis temp = res;

struct Analysis temp = *((struct Analysis *)res);

另一個更正(廣播並傳遞正確的類型):

storeDataHere((void*)data_array);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM