c - Arduino 不以高值运行
问题描述
我有下面的代码(cod01),我需要将其转换为 Arduino 的代码(cod02)。它处理 Eratosthenes Sieve 算法(从上限查找素数)。cod01 完美运行,并且已经用超过 1000000 的值进行了测试,并且始终运行。我将它转换为 Arduino,但它只能工作到 1768 年。我需要它工作到 2000 年,有人可以帮助我吗?
//cod01
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX 7
int main(){
int i,j;
int limite;
char ehprimo[MAX];
int cont=0;
for(i=2;i<MAX;i++) ehprimo[i]=1;
limite = (int)sqrt(MAX);
for(i=2;i<=limite;i++){
if(ehprimo[i]){
for(j=i*i;j<MAX;j=j+i)
ehprimo[j] = 0;
}
}
for(i=2;i<MAX;i++){
if(ehprimo[i]){
printf("%d\t",i);
}
}
return 0;
}
.
//cod02
#define MAX 2000
int i,j;
int limite;
char ehprimo[MAX];
int cont=0;
void setup() {
Serial.begin(9600);
for(i=2;i<MAX;i++) ehprimo[i]=1;
limite = (int)sqrt(MAX);
for(i=2;i<=limite;i++){
if(ehprimo[i]){
for(j=i*i;j<MAX;j=j+i)
ehprimo[j] = 0;
}
}
for(i=2;i<MAX;i++){
if(ehprimo[i]){
Serial.print("\t");
Serial.print(i);
}
}
}
void loop() {
}
解决方案
您的代码只需要大量 RAM。
Arduino Uno(带有 ATmega328P µC)只有 2048 字节 SRAM。
如果您保留 2000 字节的行
#define MAX 2000
char ehprimo[MAX];
没有足够的堆栈和 Arduino 框架。
您必须要么减少内存消耗,要么选择具有更多 SRAM 的 µC。
推荐阅读
- javascript - 在Angular的子组件中单击按钮时如何为父组件属性设置值
- java - 如何以 AB123 --> AB 123 格式拆分字符串?爪哇
- javascript - 如何删除谷歌图表中的工具提示
- ag-grid - 农业网格的最佳自动化测试套件是什么?
- oracle - 如何在不显示密码的情况下从 unix 连接 oracle 数据库
- gcc - GCC 的 ffast-math 是否具有跨平台或编译器版本的一致性保证?
- jquery - 为什么 JQuery 需要时间来加载?
- javascript - 移动设备上输入值更改的正确事件是什么?
- angular - 如果没有 JSON 数据,在组件中隐藏 div
- android - 未调用 Android MotionLayout 过渡侦听器