Gcc 为什么';我的函数不能工作吗? #包括 #包括 #定义最大值15 字符禁止[MAXN][MAXN]; int dp[2][1
我认为问题在于你有一个你看不到的分段错误。如果你把printf和return放在freopen后面,我认为它会起作用(对我有效)Gcc 为什么';我的函数不能工作吗? #包括 #包括 #定义最大值15 字符禁止[MAXN][MAXN]; int dp[2][1,gcc,stdout,freopen,Gcc,Stdout,Freopen,我认为问题在于你有一个你看不到的分段错误。如果你把printf和return放在freopen后面,我认为它会起作用(对我有效) 我建议你使用“valgrind”在为调试而编译的结果可执行文件上,查看程序在哪一行崩溃。如果您希望有人进一步帮助您,您需要提供一个示例输入。FROPEN调用返回什么?如果失败,errno的值是多少?非常感谢您的回答!我在代码中发现了导致错误的错误被输入数据中的一个案例所破坏。但我想问,为什么在崩溃案例之前的输出数据不能写入输出文件?数据作为一个完整的流写入程序末尾的文
我建议你使用“valgrind”在为调试而编译的结果可执行文件上,查看程序在哪一行崩溃。如果您希望有人进一步帮助您,您需要提供一个示例输入。FROPEN调用返回什么?如果失败,
errno
的值是多少?非常感谢您的回答!我在代码中发现了导致错误的错误被输入数据中的一个案例所破坏。但我想问,为什么在崩溃案例之前的输出数据不能写入输出文件?数据作为一个完整的流写入程序末尾的文件?确实,流是缓冲的。但这不是唯一的原因。一旦写入未初始化的内存,您可能会通过缓冲区或用于管理文件的内部结构进行写入。您可以“消除”任何写入的可能性…因此,请记住,一旦您“随机”写入内存,就没有任何保证。
#include <stdio.h>
#include <string.h>
#define MAXN 15
char forbid[MAXN][MAXN];
int dp[2][1<<MAXN],c[1<<MAXN],*dp1,*dp2;
int cnt_one(int x)
{
int s=0;
while(x)
{
s++;
x&=x-1;
}
return s;
}
int main()
{
int t,n,s,a,b,i,j,k;
/*This is my use of freopen function*
************************************/
freopen("datain.txt","r",stdin);
freopen("dataout.txt","w",stdout);
/*This is just a dynamic program to solve a mathematical problem*
****************************************************************/
for(i=0;i<(1<<MAXN);i++) c[i]=cnt_one(i);
scanf("%d",&t);
while(t--)
{
memset(forbid,0,sizeof(forbid));
memset(dp[0],0,sizeof(int)*(1<<MAXN));
dp[0][0]=1;
scanf("%d%d",&n,&s);
while(s--)
{
scanf("%d%d",&a,&b);
forbid[a][b]=1;
}
for(i=1;i<=n;i++)
{
if(i%2)
{
dp1=dp[0];
dp2=dp[1];
}
else
{
dp1=dp[1];
dp2=dp[0];
}
memset(dp2,0,sizeof(int)*(1<<MAXN));
for(j=0;j<(1<<n);j++)
{
if(c[j]!=i-1) continue;
for(k=0;k<n;k++)
{
if(!(j>>k&1)&&!forbid[i][n-k]) dp2[j^(1<<k)]+=dp1[j];
}
}
}
printf("%d\n",dp2[(1<<n)-1]);
}
return 0;
}