starfish:-)

super_online 2001-06-04 10:51:00
你好:
我对一些程序的细节问题不太了解:-)
比如这个程序
一个C
#include <stdio.h>
long n, i, ID[150000];
int j;
char mark[150000];

main()
{
scanf("%ld\n", &n);
for (i = 0; i < n; i++)
scanf("%ld %d\n", &ID[i], &mark[i]);

for (j = 100; j >= 0; j--)
for (i = 0; i < n; i++)
if (mark[i] == j) printf("%ld %d\n", ID[i], j);
return(0);
}
这好象是在向URAL题库提交的时候出现的错误
我想是数组太大了(c规定在一个程序里只可以用64k的内存空间)
可是有人跟我说URAL可以用很大的内存。。也就是,不是内存的问题
我平时只是用tc3.0或者2.0对这个方面不太了解一般没有用到多余64k
的内存(win2000)
ural是用什么编译器的可以用很大的数组?
我对这个方面很不了解?
希望指教
另外我是个程序爱好者希望和你。。:-))

...全文
84 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
starfish 2001-06-06
  • 打赏
  • 举报
回复
不好意思,我刚刚在TC2下面试了一下上面的程序,虽然没有错误但是数组中的存储的数据是错的,看来还是编译器的寻址方式的问题。在TC3下面没有问题,不过在TC3下面也用不到这样来开数组。
super_online 2001-06-05
  • 打赏
  • 举报
回复
starfish你在吗?
starfish 2001-06-05
  • 打赏
  • 举报
回复
ural的题目我做过,但是没有提交过题目答案。一般来说国外的这些竞赛用的是gcc和free pascal,而且是用linux系统,可用内存规定是16MB。
一般来说,如果竞赛中使用到大数组而编译器不能编译通过,可以自己用malloc()来分配内存,这样动态分配的内存可以突破编译器的限制,可用内存大小就只和操作系统有关了。
比如,在Tc2下,下面的代码是可以正常运行的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <alloc.h>
#define MAX_N 10000

void main()
{
char *A;
int i,j;
A = malloc(MAX_N*MAX_N*sizeof(int));
if (A) printf("OK!\n"); else printf("Fail!");
for (i=0; i<MAX_N; i++)
for (j=0; j<MAX_N; j++) {
A[i*sizeof(int)*MAX_N+j*sizeof(int)] = i+j;
}
printf("OK!");
free(A);
}

这样就定义了一个10000*10000的大数组,在TC2下面运行了没问题呀。
唯一的麻烦地方在于要将二维的数组下标转化成一维的,你做一个函数pos()来进行这种转化就可以了:

int pos(int i, int j)
{
return ( i*sizeof(int)*MAX_N+j*sizeof(int) );
}

然后使用A[i][j] 用 A[pos(i,j)] 就可以了。

很高兴认识你,我的email: starfish.h@china.com , QQ: 16968814
严黎斌 2001-06-05
  • 打赏
  • 举报
回复
支持多大内存,不是语言规范的问题,而是操作系统和编译器的问题。
16位的c比如tc,只能支持到64K内存,2^^16,加上dos的段寄存器,最多可访问640K内存。
32位的c比如vc,bcb等理论上支持4G的内存2^32,但实际上好像是2G,另外2G是windows用的。Unix下的c类似。
ural是啥东东?c编译器?
long是2字节的,因此long id[150000]就要占用将近300KB内存,mark又要占用150k内存。这内存是危险了。
因为有跨段指针,编译时应该用huge or large模式。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧