【问题标题】:C++, return array from function [closed]C ++,从函数返回数组[关闭]
【发布时间】:2017-06-09 21:08:24
【问题描述】:

我正在构建这个子网计算器,但现在我被数组卡住了。我想创建将返回数组的新 int 函数,但我不知道我是如何尝试很多东西但仍然不知道,认为它必须用指针做一些事情。我想创建从“while(octet4>0)”开始的新函数。所以 octet4 被传递给函数,函数应该返回功能齐全的数组,然后我可以在 main 中使用它。希望有人会知道我在寻找什么的答案,希望解决方案不会太复杂,因为我只是学习编程并认为这将是一个有趣的项目。

int main() {
int i=0,j,q,s,size=8,temp;
int binary_ip[8];
int netmask;
int mask;
int octet1, octet2, octet3, octet4; 
string ip;
cout<<"Vnesite IP naslov, npr. 192.168.32.55:"<<endl;
cin>>ip;
cout<<"Vnesite netmasko, npr. /27:"<<endl;
cin>>netmask;   

stringstream stream(ip);
char ch; 
stream >> octet1 >> ch >> octet2 >> ch >> octet3 >> ch >> octet4;


while(octet4>0){
    binary_ip[i]=octet4%2;
    i++;
    octet4=octet4/2;
}

switch(i){
    case 7:binary_ip[7]=0;
    break;
    case 6:for(s=6;s<=7;s++)binary_ip[s]=0; 
    break;
    case 5:for(s=5;s<=7;s++)binary_ip[s]=0;
    break;
    case 4:for(s=4;s<=7;s++)binary_ip[s]=0;
    break;
    case 3:for(s=3;s<=7;s++)binary_ip[s]=0;
    break;
    case 2:for(s=2;s<=7;s++)binary_ip[s]=0;
    break;
    case 1:for(s=1;s<=7;s++)binary_ip[s]=0;
    break;
}

for(q=0;q<size/2;q++){
    temp=binary_ip[size-1-q];
    binary_ip[size-1-q]=binary_ip[q];
    binary_ip[q]=temp;}

return 0;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
  • @renekton 那个开关盒是干什么用的??
  • 所以你想把你的while循环放在一个函数中并返回一个数组?
  • 一个“int函数”根据定义返回一个int,而不是一个数组。
  • 你为什么不考虑让你的函数填充数组,而不是返回它。这样你就不用为内存分配和释放而烦恼了。

标签: c++ arrays function


【解决方案1】:

一些选项:

  • 使用 std::array 代替常规的 C 数组。这些更容易使用,并且您已经在使用标准库。 http://www.learncpp.com/cpp-tutorial/6-15-an-introduction-to-stdarray/
  • 让你的函数填充数组,而不是创建并返回它:

    void MakeArray(int octet4, int binary_ip[8]) ;

  • 使用指针,用“new”分配数组,用“delete”释放它。但是,您需要一种方法来了解数组的大小。

【讨论】:

  • 我认为您的第二个选项不会编译,除非您将其设为引用(或 int 指针),除非数组到指针衰减的工作方式与我认为的不同。
  • 它编译。虽然数组中的大小基本被忽略了。
  • C 数组从不按值传递
  • 是的,我知道如果它编译它会忽略大小,但我认为它不会让你指定大小,因为我从未尝试过。我希望大多数编译器至少会为此发出警告。
  • 今天肯定不那么常见了。仅用于为调用它的人指定函数的期望,而不是为编译器指定函数的期望。不过,这使得移植 C->Java 变得更加困难。
【解决方案2】:
#include <iostream>


int array(int octet4, int binary_ip[]);

int main()
{
  int binary_ip[6];
  int octet4 = 55;
  int i = 0;
  i = array(octet4, binary_ip);//binary_ip passes in the address of the first element in the array
}
int array(int octet4, int binary_ip[])
{
    int i = 0;
    while(octet4>0)
    {
        binary_ip[i]=octet4%2;
        i++;
        octet4=octet4/2;
    }
    return i;
}

或者您可以使用 Daniel H 建议的矢量

void array(int octet4, std::vector<int> &binary_ip)
{

    while(octet4>0)
    {
    binary_ip.push_back(octet4%2);
    octet4=octet4/2;
    }

}
int main()
{
  std::vector<int> binary_ip;
  int octet4 = 55;
  array(octet4, binary_ip); 
}

【讨论】:

  • 为什么要传入i而不是在函数中声明呢?
  • 因为 OP 在 switch 语句中使用了i
  • @DanielH 我本可以创建一个 int 函数并返回 i 并使 main 中的 i 等于这样的 int 函数 i = array(octet4, binary_ip)
  • 是的,这看起来更整洁。然后它会返回它生成了多少元素的计数,而不仅仅是增加一个数字。
  • @DanielH 那里我用了一个向量是你的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多