C语言中如何装入资源文件? 用C++装入资源文件,可以做到。 现在我的其他程序必须在C模式下编译。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中如何装入资源文件? 用C++装入资源文件,可以做到。 现在我的其他程序必须在C模式下编译。相关的知识,希望对你有一定的参考价值。

在C++ 下,加载资源程序如下,运行正常
// 查找资源文件中、加载资源到内存、得到资源大小
HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), “EXE”);
HGLOBAL hG = LoadResource(NULL, hrsc);
DWORD dwSize = SizeofResource( NULL, hrsc);

但在纯C下应该如何加载文件呢?
经过试验,在“.cpp”下编译以上3句是正确的,但在纯C下,即在扩展名为“.c”的文件里,运行是错误的。
如何“.c”里装载资源呢?请赐教!

编译不通过提示的是什么错误? 你只简单的说运行错误,会认为你已经编译通过了,看到后面才知道你是编译不通过
取消 预编译头 呢?追问

在纯C下,提示为
error C2275: 'HRSRC' : illegal use of this type as an expression
error C2275: 'HGLOBAL' : illegal use of this type as an expression
error C2275: 'DWORD' : illegal use of this type as an expression
如果没有用纯C装过资源文件,一般来说,较难搞出来。
如果搞过,应该不难。

追答

#include "windows.h"
#include "Resource.h"

void LoadResourceEx()

HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), “EXE”);
HGLOBAL hG = LoadResource(NULL, hrsc);
DWORD dwSize = SizeofResource( NULL, hrsc);

取消预编译头,你试下可以编译通过没;
编译通过之后,如果C++代码里面调用这个函数,需要在原型那里做类似这样的声明
#ifdef __cplusplus
extern "C"
#endif

void LoadResourceEx();

#ifdef __cplusplus

#endif

参考技术A MS的C/C++函数库可不分C还是C++。你是忘记包含头文件了吧。追问

看来你不太懂C、C++ 的 区分。VC ++ 编译器 是分两种情况编译的,一种是 纯 C编译,扩展名为.c;一种是 按C++编译,扩展名为.cpp。

我说得很清楚,在.cpp的文件中编译通过,但在将扩展名改为.c时则通不过。也就是说,要在.c中也完成 资源文件转载内存的功能,需要 换一批函数,这一批函数纯C中能用的函数,我手头没有资料。

追答

编译不通过的错误消息是什么?

第五章实验报告

1.     实践题目

7-1 01背包问题

 

2.     问题描述

给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

 

3.     算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述)

(1)解空间:对于变量n其解空间为(0/1,0/1,......)共n个0/1的组合所构成。

(2)解空间树:

 

技术分享图片

(3)剪枝函数:

有两个:第一个针对左树的剪枝,即1的剪枝:其通过判断当前已经累积的重量加上当前a[i]的重量是否会超出背包容量,如果超出则剪枝。

    第二个针对右树的剪枝,即0的剪枝:其通过估算接下来背包容量所能装入的最大价值来判断是否能超出前面已算出来的价值最大值,如果不能就剪枝。

#include<iostream>
#include<algorithm>
using namespace std;
struct bag{
    int value;
    int weight;
};
int n;
int cvalue;
int cweight;
int maxvalue;
int maxweight;
bag bags[101];

bool compare(bag bag1,bag bag2)
{
    return bag1.value*bag2.weight>bag2.value*bag1.weight;
}

void dps(int i)
{

    int uppervalue(int i);
    if(i>n)
    {
        if(cvalue>maxvalue)
            maxvalue=cvalue;
        return ;
    }
    if(bags[i].weight+cweight<=maxweight)
    {
        cweight+=bags[i].weight;
        cvalue+=bags[i].value;
        dps(i+1);
        cweight-=bags[i].weight;
        cvalue-=bags[i].value;
    }
    if(uppervalue(i+1)>maxvalue)
        dps(i+1);
}

int uppervalue(int i)
{
    int leftweight=maxweight-cweight;
    int uppervalue=cvalue;
    if(i<=n)
        uppervalue+=(bags[i].value*leftweight)/bags[i].weight;
    return uppervalue;
}

int main(void)
{
    cin>>n;
    cin>>maxweight;
    cvalue=0;
    cweight=0;
    maxvalue=0;
    for(int i=1;i<=n;i++)
        cin>>bags[i].weight>>bags[i].value;
    sort(bags+1,bags+n+1,compare);
    dps(1);
    cout<<maxvalue;
    return 0;
}

4.心得体会

01背包问题是非常经典的问题,很多其他类似的问题都可以转换为特殊的01背包问题来讨论。要深刻地去理解其回溯解法的思想,并且注意是如何找出判断条件来进行剪枝的,如果剪枝的不好很可能就超时。

 

以上是关于C语言中如何装入资源文件? 用C++装入资源文件,可以做到。 现在我的其他程序必须在C模式下编译。的主要内容,如果未能解决你的问题,请参考以下文章

C语言怎么使用动态链接库,如何创建?(高手进)

动态规划中的0-1背包问题怎么去理解?要求给出具体实例和详细步骤。。。

动态规划 01背包问题

c语言中的graphics.h问题

将CDLINUX装入U盘

第五章实践