我有一项任务,我需要输入一个7位数的输入(电话号码)并检查它是否在pi的数字中找到.pi的数字存储在提供的空格分隔文本文件中.这似乎相当简单:将输入分解为数组,将pi的数字读入数组,并检查是否找到匹配项.长话短说,我让这个程序让我满意.我们提供了文本文档,其中pi的数字为10,100的倍数,依此类推,最多可达100万个数字.我的程序最多可达100,000个数字.但无论出于何种原因,在100万个数字文件中,它会因通用的Windows错误而崩溃.我没有关于它为什么崩溃并且没有给出错误消息的信息(除了通用的"导致该程序停止工作的问题"消息).
注意到赋值状态的限制我不能使用任何面向对象的代码,除了cin,cout和文件流对象(这个限制是因为我们还没有进入类,他们不希望我们使用函数而不知道他们是如何工作的).
无论如何,我正在寻找有关程序崩溃原因的见解.我对需要它们的每个变量(包括计数器和函数返回)都使用了很长时间,这应该足够了,因为它们可以达到大约20亿,而且这里不应该有任何超过一百万的数字.
谢谢你的帮助.过去几个小时我一直在这里没有成功.
const long int numberOfDigits = 1000000;
int digitsOfPi[numberOfDigits];
Run Code Online (Sandbox Code Playgroud) 有问题的语言是C/C++.
我的教授说当你完成使用它时释放堆上的内存,因为否则你最终会得到无法访问的内存.这样做的问题是你可能最终耗尽了所有内存,而且你无法访问它们.
为什么相同的概念不适用于堆栈?我知道你总是可以访问你在堆栈中使用的内存,但如果你不断创建新的变量,你最终会用完空间吗?那么为什么你不能在堆栈上释放变量来为堆上的新变量腾出空间呢?
我得到编译器释放堆栈上的变量,但那是在变量范围的末尾.它是否也在其范围的末尾释放堆上的变量?如果没有,为什么不呢?
虽然学习c编程只memory提到了.但实际上似乎还有更多; 这些buffer和stack文字几乎就在那里.
这些条款有什么区别?为什么他们很有趣?
拜托,我需要一个详细的答案.简短的答案无法提供服务.一些资源也可能有所帮助.
提前坦克.
对于一个特定的问题,我必须从用户那里获取大小介于其间的字符串输入1 and 10^5.我使用了以下代码
char *a;
a = malloc(100000*sizeof(char));
Run Code Online (Sandbox Code Playgroud)
并且在循环内(t指的是测试用例的数量)
while( t-- )
{
scanf( "%d", &n );
scanf( "%s", a );
.....
}
Run Code Online (Sandbox Code Playgroud)
n是用户在运行时输入的字符串的长度.问题是这给了我"超出时间限制"
我对上面的代码做了一些修改,
while( t-- )
{
scanf( "%d", &n );
char a[n];
scanf( "%s", a );
....
}
Run Code Online (Sandbox Code Playgroud)
没有"TLE",这完全没问题.但我不明白为什么.使用第一个代码的原因是由于内存分配只进行一次,因此节省了时间.我错了吗?请解释.
为什么拳击和拆箱操作之间的速度变化如此之大?有10倍的差异.我们什么时候应该关心这个?上周Azure支持告诉我们,我们的应用程序的堆内存中存在问题.我很想知道它是否与装箱拆箱问题有关.
using System;
using System.Diagnostics;
namespace ConsoleBoxing
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Program started");
var elapsed = Boxing();
Unboxing(elapsed);
Console.WriteLine("Program ended");
Console.Read();
}
private static void Unboxing(double boxingtime)
{
Stopwatch s = new Stopwatch();
s.Start();
for (int i = 0; i < 1000000; i++)
{
int a = 33;//DATA GOES TO STACK
object b = a;//HEAP IS REFERENCED
int c = (int)b;//unboxing only hEre ....HEAP GOES TO STACK
}
s.Stop();
var UnBoxing = s.Elapsed.TotalMilliseconds- boxingtime;
Console.WriteLine("UnBoxing …Run Code Online (Sandbox Code Playgroud) 我正在尝试在数组X中搜索所需的模式(变量模板).模板的长度为9.
我做的事情如下:
function check_alloc{T <: ZeroOne}(x :: AbstractArray{T}, temp :: AbstractArray{T})
s = 0
for i in 1 : 1000
myView = view(x, i : i + 9)
if myView == temp
s += 1
end
end
return s
end
Run Code Online (Sandbox Code Playgroud)
并在此短循环中获得意外的内存分配(46 KB).为什么会发生这种情况?如何防止内存分配和性能下降?
阅读 C++17 草案 §6.9.1/5:
类型
char16_t和char32_t分别表示不同类型的具有相同的大小,符号性,和对准如uint_least16_t和uint_least32_t,分别在<cstdint>被称为底层类型。
现在参考 C11 草案 §7.20.1.2/2,这是 C 库继承的参考:
typedef 名称
uint_leastN_t指定宽度至少为N 的无符号整数类型,这样具有较小大小的无符号整数类型至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 位的无符号整数类型。
注意“至少”部分。这意味着char16_t实际上可能有例如 32 位,从而形成char16_t一个 UTF-16 原始数据的错误表示的数组。在这种情况下,将此类数组写入二进制文件将导致有效代码单元与 U+0000 字符交替。
是否有充分的理由char16_t根据uint_least16_t而不是来定义uint16_t?或者它只是标准中的一个缺陷?
给定n个金条,找到适合容量W的金的最大重量
第一行包含背包的容量W和金条的数量n.下一行包含n个整数
适合容量为W的背包的最大黄金重量.
1 <= W <= 10000; 1 <= n <= 300; 0 <= w0,w1,w2,...,w(n-1)<= 100000
#include <iostream>
#include <vector>
using std::vector;
int optimal_weight(int W, vector<int> w) {
int n = w.size() + 1;
int wt = W + 1;
int array [n][wt];
int val = 0;
for(int i = 0; i < wt; i++) array [0][i] = 0;
for(int i = 0; i < n; i++) array …Run Code Online (Sandbox Code Playgroud) c++ arrays algorithm dynamic-programming multidimensional-array
int a = 0;
int *b = malloc (sizeof(int));
b = malloc (sizeof(int));
Run Code Online (Sandbox Code Playgroud)
上面的代码很糟糕,因为它在堆上分配内存然后不释放它,这意味着您将无法访问它.但是你也创建了'a'并且从未使用它,所以你也在堆栈上分配了内存,在范围结束之前不会释放内存.
那么为什么不在堆上释放内存,但是没有释放堆栈上的内存(直到作用域结束)是不好的做法?
注意:我知道堆栈上的内存无法释放,我想知道为什么它不被认为是坏的.