我想用 C 撰寫一個方法,它創建一個單調遞增值的陣列。它有 int begin、int end、int interval 的輸入。
在這個例子中;方法應該回傳 [0,1,2,3,4,5,6,7,8,9,10] 的陣列。當我列印結果時,它應該列印出前兩個索引并得到 0 和 1。但是,當我列印它時,第一個為 0,第二個為 9829656。
當我只列印一個索引時它總是正確的,但是當我列印多個索引時,除了第一個列印的值之外的每個值都會給出不同的結果。我認為其他結果與記憶體地址有關,因為我使用了指標。
#include <iostream>
using namespace std;
int* getIntervalArray(int begin, int end, int interval){
int len = (end - begin) / interval 1;
int result[11] = {};
for (int i = 0; i <= len - 1; i ) {
result[i] = begin interval * i;
}
return result;
}
int main(){
int begin = 0;
int end = 10;
int interval = 1;
int* newResult = getIntervalArray(begin, end, interval);
cout << newResult[0] << endl;
cout << newResult[1] << endl;
return 0;
}
uj5u.com熱心網友回復:
您正在回傳一個指向區域變數的指標。您可以改為回傳一個std::vectorby 值,如下所示:
#include <iostream>
#include <vector>
//return a vector by value
std::vector<int> getIntervalArray(int begin, int end, int interval){
int len = (end - begin) / interval 1;
std::vector<int> result(len); //create a vector of size len
for (int i = 0; i <= len - 1; i ) {
result.at(i) = begin interval * i;
}
return result;
}
int main(){
int begin = 0;
int end = 10;
int interval = 1;
std::vector<int> newResult = getIntervalArray(begin, end, interval);
//print out elements of returned vector
for(int i = 0; i < newResult.size(); i)
{
std::cout << newResult.at(i) << std::endl;
}
return 0;
}
上面程式的輸出可以在這里看到。
uj5u.com熱心網友回復:
一個可能的解決方案是動態分配本地陣列,并通過智能指標回傳它:
#include <array>
#include <iostream>
#include <memory> // make_unique
auto getIntervalArray(int begin, int end, int interval)
{
int len = (end - begin) / interval 1;
auto result{ std::make_unique<std::array<int, 11>>() };
for (int i = 0; i <= len - 1; i ) {
(*result)[i] = begin interval * i;
}
return result;
}
int main()
{
int begin = 0;
int end = 10;
int interval = 1;
auto newResult{ getIntervalArray(begin, end, interval) };
std::cout << (*newResult)[0] << std::endl;
std::cout << (*newResult)[1] << std::endl;
std::cout << (*newResult)[2] << std::endl;
return 0;
}
演示
uj5u.com熱心網友回復:
將函式中的陣列變數設定為static. 這是因為 C 不支持回傳區域變數的地址。
static int result[11];
uj5u.com熱心網友回復:
嘗試這個。還添加洗掉 newResult
#include <iostream>
using namespace std;
int* getIntervalArray(int begin, int end, int interval){
int len = (end - begin) / interval 1;
int* result = new int[len];
int lastValue = begin;
for (int i = 0; i <= len - 1; i ) {
result[i] = lastValue;
lastValue = interval;
}
return result;
}
int main(){
int begin = 0;
int end = 10;
int interval = 1;
int* newResult = getIntervalArray(begin, end, interval);
cout << newResult[0] << endl;
cout << newResult[1] << endl;
// add delete here.
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/351773.html
上一篇:如何過濾兩個numpy陣列?
下一篇:沒有包裝節點的XML結構陣列?
