求教,dll中回调函数问题。

时间:2022-09-06 13:55:25
用C语言实现一个2维矩阵(float类型),实现以下几个函数
用户可以动态的设定矩阵的行数和列数。
int SetMatrixRowAndCol(Martrix *matrix, int row, int col);
用户可以设定矩阵的每个单元(nRow, nCol)的数值。
int  SetMatrixValue(Martrix *matrix,int x, int y, float* value);

考虑如何将上述函数编译成一个DLL, DLL中提供回调函数让用户在读文件的时候,有机会把回调函数用于把文件内容显示到窗体上面。

前边做好了,就是下边,怎么写回调函数把文件内容显示到窗体上面呢?求好人解答。

自己写的一部分代码
typedef juzhendll_API struct maxtrix

    unsigned int row;
    unsigned int col;
    float **value;
}Martrix;

int SetMatrixRowAndCol(Martrix *matrix, unsigned int row, unsigned int col)
{
    int i;   
    (matrix->value) = (float **)malloc(sizeof(float *) *row); 
    memset((matrix->value), 0, sizeof(float *) *row);
    for(i=0;i<(int)row;i++)
    {
        *(matrix->value+i) = (float *)malloc(sizeof(float) * col);
        memset(*(matrix->value+i), 0, sizeof(float) * col);
    }
    return 0;
}

int SetMatrixValue(Martrix *matrix,int x, int y, float** value)
{
    int i,j;
    printf("请按行的顺序依次输入矩阵各项的值(共%d项):\n",x*y);
    for(i=0;i<=x-1;i++)
    {
        printf("\n"); 
        for(j=0;j<=y-1;j++)
        {
            scanf("%f", &value[i][j]);
        }
    }
    return 0;
}

7 个解决方案

#1


这是我在dll中的代码,
#ifndef JUZHENDLL_H_
#define JUZHENDLL_H_

#ifdef juzhendll_API
#else
#define juzhendll_API extern "C" _declspec(dllimport)
#endif

typedef  struct maxtrix

    unsigned int row;
    unsigned int col;
    float **value;
}Martrix;

juzhendll_API int SetMatrixRowAndCol(Martrix *matrix, unsigned int row, unsigned int col);
juzhendll_API int SetMatrixValue(Martrix *matrix,int x, int y, float** value);
juzhendll_API int Initialize(Martrix *matrix,int x, int y, float** value);

#include <stdio.h>   
#include <malloc.h>  
#include <stdlib.h>
#include <string.h>
#include "juzhendll.h"
#define juzhendll_API extern "C" _declspec(dllimport)

int SetMatrixRowAndCol(Martrix *matrix, unsigned int row, unsigned int col)
{
    int i;   
    (matrix->value) = (float **)malloc(sizeof(float *) *row); 
    memset((matrix->value), 0, sizeof(float *) *row);
    for(i=0;i<(int)row;i++)
    {
        *(matrix->value+i) = (float *)malloc(sizeof(float) * col);
        memset(*(matrix->value+i), 0, sizeof(float) * col);
    }
    return 0;
}

int SetMatrixValue(Martrix *matrix,int x, int y, float** value)
{
    int i,j;
    printf("请按行的顺序依次输入矩阵各项的值(共%d项):\n",x*y);
    for(i=0;i<=x-1;i++)
    {
        printf("\n"); 
        for(j=0;j<=y-1;j++)
        {
            scanf("%f", &value[j]);
        }
    }
    return 0;
}
int Initialize(Martrix *matrix,int x, int y, float** value)
{
        FILE *fp; 
        int i,j;
        if((fp=fopen("e:\\fr1.txt","r"))==NULL) 
        { 
                printf( "can not open file\n "); 
                return 0; 
        } 
    for(i=0;i<=x-1;i++)
    {
        for(j=0;j<=y-1;j++)
                { 
                        fscanf(fp,"%f# ",&value[j]); 
                        printf( "%f",value[j]); 
                } 
                printf("\n"); 
        } 
        fclose(fp); 
        fp=NULL;
        return 0;


如果要实现DLL中提供回调函数让用户在读文件的时候,有机会把回调函数用于把文件内容显示到窗体上面。
这个该怎么做呢,谢谢,对回调函数不是太理解

#2


void SetCBFunc(pfCbFunc pfFunc)
void AModuleFunc(const char *pchBuf, unsigned short wBufLen, void *pvContext)
这两个函数是外部调用函数是吗,那在dll里边写一个g_pfCbFunc函数吗?这三个参数都是用来接收什么的呢const char *pchBuf, unsigned short wBufLen, void *pvContext,

#3


DLL修改:

typedef void (*FILEVALUEPROC) (float value); //回调函数声明
int Initialize(Martrix *matrix,int x, int y, float** value, FILEVALUEPROC lpFileValueProc)
{
FILE *fp;  
int i,j;
if((fp=fopen("e:\\fr1.txt","r"))==NULL)  
{  
printf( "can not open file\n ");  
return 0;  
}  
for(i=0;i<=x-1;i++)
{
for(j=0;j<=y-1;j++)
{  
fscanf(fp,"%f# ",&value[j]);  
printf("%f",value[j]);
lpFileValueProc(value[j]); }  
printf("\n");  
}  
fclose(fp);  
fp=NULL;
return 0;
}



//主程序使用

typedef void (*FILEVALUEPROC) (float value);

//回调函数实体
void MyFileValueProc(float value)
{
//想怎么显示就怎么显示
}

//调用
typedef int(*lpInitialize)(Martrix *matrix,int x, int y, float** value, FILEVALUEPROC lpFileValueProc);
float *value[20];
Initialize(NULL, 1, 2, value, MyFileValueProc);

#4


代码中本来想加红的 

看的时候 去掉   和 

#5



看的时候去掉: [color=#FF0000]

#6


你现在的问题是什么?

void MyFileValueProc(float value)
中的实现不知道怎么写?

#7


不好意思,最近几天外出,刚看到回复,万分感谢。

#1


这是我在dll中的代码,
#ifndef JUZHENDLL_H_
#define JUZHENDLL_H_

#ifdef juzhendll_API
#else
#define juzhendll_API extern "C" _declspec(dllimport)
#endif

typedef  struct maxtrix

    unsigned int row;
    unsigned int col;
    float **value;
}Martrix;

juzhendll_API int SetMatrixRowAndCol(Martrix *matrix, unsigned int row, unsigned int col);
juzhendll_API int SetMatrixValue(Martrix *matrix,int x, int y, float** value);
juzhendll_API int Initialize(Martrix *matrix,int x, int y, float** value);

#include <stdio.h>   
#include <malloc.h>  
#include <stdlib.h>
#include <string.h>
#include "juzhendll.h"
#define juzhendll_API extern "C" _declspec(dllimport)

int SetMatrixRowAndCol(Martrix *matrix, unsigned int row, unsigned int col)
{
    int i;   
    (matrix->value) = (float **)malloc(sizeof(float *) *row); 
    memset((matrix->value), 0, sizeof(float *) *row);
    for(i=0;i<(int)row;i++)
    {
        *(matrix->value+i) = (float *)malloc(sizeof(float) * col);
        memset(*(matrix->value+i), 0, sizeof(float) * col);
    }
    return 0;
}

int SetMatrixValue(Martrix *matrix,int x, int y, float** value)
{
    int i,j;
    printf("请按行的顺序依次输入矩阵各项的值(共%d项):\n",x*y);
    for(i=0;i<=x-1;i++)
    {
        printf("\n"); 
        for(j=0;j<=y-1;j++)
        {
            scanf("%f", &value[j]);
        }
    }
    return 0;
}
int Initialize(Martrix *matrix,int x, int y, float** value)
{
        FILE *fp; 
        int i,j;
        if((fp=fopen("e:\\fr1.txt","r"))==NULL) 
        { 
                printf( "can not open file\n "); 
                return 0; 
        } 
    for(i=0;i<=x-1;i++)
    {
        for(j=0;j<=y-1;j++)
                { 
                        fscanf(fp,"%f# ",&value[j]); 
                        printf( "%f",value[j]); 
                } 
                printf("\n"); 
        } 
        fclose(fp); 
        fp=NULL;
        return 0;


如果要实现DLL中提供回调函数让用户在读文件的时候,有机会把回调函数用于把文件内容显示到窗体上面。
这个该怎么做呢,谢谢,对回调函数不是太理解

#2


void SetCBFunc(pfCbFunc pfFunc)
void AModuleFunc(const char *pchBuf, unsigned short wBufLen, void *pvContext)
这两个函数是外部调用函数是吗,那在dll里边写一个g_pfCbFunc函数吗?这三个参数都是用来接收什么的呢const char *pchBuf, unsigned short wBufLen, void *pvContext,

#3


DLL修改:

typedef void (*FILEVALUEPROC) (float value); //回调函数声明
int Initialize(Martrix *matrix,int x, int y, float** value, FILEVALUEPROC lpFileValueProc)
{
FILE *fp;  
int i,j;
if((fp=fopen("e:\\fr1.txt","r"))==NULL)  
{  
printf( "can not open file\n ");  
return 0;  
}  
for(i=0;i<=x-1;i++)
{
for(j=0;j<=y-1;j++)
{  
fscanf(fp,"%f# ",&value[j]);  
printf("%f",value[j]);
lpFileValueProc(value[j]); }  
printf("\n");  
}  
fclose(fp);  
fp=NULL;
return 0;
}



//主程序使用

typedef void (*FILEVALUEPROC) (float value);

//回调函数实体
void MyFileValueProc(float value)
{
//想怎么显示就怎么显示
}

//调用
typedef int(*lpInitialize)(Martrix *matrix,int x, int y, float** value, FILEVALUEPROC lpFileValueProc);
float *value[20];
Initialize(NULL, 1, 2, value, MyFileValueProc);

#4


代码中本来想加红的 

看的时候 去掉   和 

#5



看的时候去掉: [color=#FF0000]

#6


你现在的问题是什么?

void MyFileValueProc(float value)
中的实现不知道怎么写?

#7


不好意思,最近几天外出,刚看到回复,万分感谢。