看看这段代码:
的StdAfx.h:
import random
def randnums():
total=0
for count in range(6):
number = random.randint(1,9)
total+=number
print(total)
randnums()
Main.cpp的:
#pragma once
#include <stdarg.h>
template<class T>
class DArray {
private:
T* elements;
int dimensions, length;
int* lengths;
public:
DArray() {
dimensions = 0;
length = 0;
}
DArray(int dims, ...) {
va_list args;
va_start(args, dims);
dimensions = dims;
lengths = new int[dims];
length = 1;
for (int i = 0; i < dims; i++) {
lengths[i] = va_arg(args, int);
length *= lengths[i];
}
va_end(args);
elements = new T[length];
}
T get(...) {
va_list args;
va_start(args, dimensions);
int weight = 1;
int index = va_arg(args, int);
for (int i = 1; i < dimensions; i++) {
weight *= lengths[i - 1];
index += va_arg(args, int) * weight;
}
va_end(args);
return elements[index];
}
void set(T value, ...) {
va_list args;
va_start(args, dimensions);
int weight = 1;
int index = va_arg(args, int);
for (int i = 1; i < dimensions; i++) {
weight *= lengths[i - 1];
index += va_arg(args, int) * weight;
}
va_end(args);
elements[index] = value;
}
~DArray() {
if (lengths != nullptr)
delete[] lengths;
//thanks to an answer pointing out I forgot to add this part:
if (elements != nullptr)
delete[] elements;
}
};
出于某种原因,对于我的生活中我无法弄清楚,当从generateRandomMatrix()内部调用matrix.set()时,索引变量的负值为-462266869,导致索引超出范围异常。
如果只将正参数传递给函数,索引如何为负?
(以下是本地变量观看窗口的屏幕截图,了解它的价值:http://i.imgur.com/LfGQ8OF.png)
答案 0 :(得分:2)
在成员函数set()
中,
va_start(args, dimensions);
应该是
va_start(args, value);
答案 1 :(得分:1)
generateRandomMatrix
返回DArray<int>
,但您没有operator =
也没有复制构造函数。
在这种情况下,返回只是复制本地类,但随后调用了析构函数(本地DArray矩阵)并删除了分配。
要解决它,您应该实现复制构造函数和operator =。如果您使用的是c ++ 11,请考虑移动运算符。
BTW:由于elements
数组未删除,因此存在内存泄漏。
答案 2 :(得分:0)
问题已经解决,我要感谢我得到的2个答案。必须修复两件事:
新方法是:
T get(int index, ...) {
va_list args;
va_start(args, index);
int weight = 1;
for (int i = 1; i < dimensions; i++) {
weight *= lengths[i - 1];
index += va_arg(args, int) * weight;
}
va_end(args);
return elements[index];
}
void set(T value, ...) {
va_list args;
va_start(args, value);
int weight = 1;
int index = va_arg(args, int);
for (int i = 1; i < dimensions; i++) {
weight *= lengths[i - 1];
index += va_arg(args, int) * weight;
}
va_end(args);
elements[index] = value;
}
非常感谢所有花时间在这个问题上的人。