Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t将单指针转换为双指针_C++_Arrays_Pointers_Command Line_Command Line Arguments - Fatal编程技术网

C++ Can';t将单指针转换为双指针

C++ Can';t将单指针转换为双指针,c++,arrays,pointers,command-line,command-line-arguments,C++,Arrays,Pointers,Command Line,Command Line Arguments,这是我的代码 #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; float labweight = .1; float quizweight = .1; float assignmentweight = .4; float examweight = .25; float finalweight = .15; void process_quiz(

这是我的代码

#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

float labweight = .1;
float quizweight = .1;
float assignmentweight = .4;
float examweight = .25;
float finalweight = .15;

void process_quiz(int &numquiz, int **quiz, int argc, char *argv[]) {
   for(int i=1; i < argc; i+=2) {
      if(argv[i][0]=='-' && argv[i][1]=='q') {
         numquiz = atoi(argv[i+1]);
         quiz = new int[numquiz];
      }
      else
     std::cout << quiz << " quizzes";
   }
   return;
}

void process_lab(int &numlab, int **lab, int argc, char *argv[]) {
   for(int i=1; i < argc; i+=2) {
      if(argv[i][0]=='-' && argv[i][1]=='q') {
         numlab = atoi(argv[i+1]);
         lab = new int[numlab];
      }
      else
     std::cout << lab << " quizzes";
   }
   return;
}

void process_assignment(int &numassignment, int **assignment, int argc, char *argv[]) {
   for(int i=1; i < argc; i+=2) {
      if(argv[i][0]=='-' && argv[i][1]=='q') {
         numassignment = atoi(argv[i+1]);
         assignment = new int[numassignment];
      }
      else
     std::cout << assignment << " assignmentzes";
   }
   return;
}

void process_exam(int &numexam, int **exam, int argc, char *argv[]) {
   for(int i=1; i < argc; i+=2) {
      if(argv[i][0]=='-' && argv[i][1]=='q') {
         numexam = atoi(argv[i+1]);
         exam = new int[numexam];
      }
      else
     std::cout << exam << " examzes";
   }
   return;
}

void process_final(int &numfinal, int **final, int argc, char *argv[]) {
   for(int i=1; i < argc; i+=2) {
      if(argv[i][0]=='-' && argv[i][1]=='q') {
         numfinal = atoi(argv[i+1]);
         final = new int[numfinal];
      }
      else
     std::cout << final << " finalzes";
   }
   return;
}

int main(int argc, char* argv[]){

    int numquiz, *quiz, numlab, *lab, numassignment, *assignment, numexam, *exam, numfinal, *final;
    if (argc == 9){
        process_quiz(numquiz, &quiz, argc, argv);
        process_lab(numlab, &lab, argc, argv);
        process_assignment(numassignment, &assignment, argc, argv);
        process_exam(numexam, &exam, argc, argv);
    }
    if (argc == 10){
        process_quiz(numquiz, &quiz, argc, argv);
        process_lab(numlab, &lab, argc, argv);
        process_assignment(numassignment, &assignment, argc, argv);
        process_exam(numexam, &exam, argc, argv);
        process_final(numfinal, &final, argc, argv);
    }
    else{
    cout << "Please input things correctly!" << endl;
    }

    cout << numlab << endl;
    cout << numquiz << endl;
    cout << numassignment << endl;
    cout << numexam << endl;
    cout << numfinal << endl;
}

现在我已经研究了一些指针,但我不明白为什么我不能将数组中的值赋给变量!我试图从函数的开头删除额外的指针,但这并不能解决任何问题。我只是收到一些错误,说我不能从一个指针转换成一个双精度指针,它说这个错误就是我在main中调用函数的地方。

好吧,例如,转到
第17行。您尝试将指针(通过
new
操作符返回)分配给双指针(测验)

所以你可能想做
*quizz=new…
。但是你知道,不先检查指针的值就取消对指针的引用会在以后引发问题

但在任何情况下,您都应该首先了解什么是指针,如何使用指针等等,而不是解决这个问题。您可能需要编译它,但是您编写的东西有很多错误之处(您通常不希望通过副作用修改函数的参数,因为它很难维护,等等)

最终的目的不是让它编译,而是让它安全地到达您想要去的地方。一步一步地学习概念,不要试图走得太快,考虑到您的代码/问题,这将是我的建议


仅供参考,当您习惯了指针的工作方式后,您应该转到
shared\ptr
,这会给您带来更大的安全性。看看它是如何工作的。

好吧,例如,转到
第17行。您尝试将指针(通过
new
操作符返回)分配给双指针(测验)

所以你可能想做
*quizz=new…
。但是你知道,不先检查指针的值就取消对指针的引用会在以后引发问题

但在任何情况下,您都应该首先了解什么是指针,如何使用指针等等,而不是解决这个问题。您可能需要编译它,但是您编写的东西有很多错误之处(您通常不希望通过副作用修改函数的参数,因为它很难维护,等等)

最终的目的不是让它编译,而是让它安全地到达您想要去的地方。一步一步地学习概念,不要试图走得太快,考虑到您的代码/问题,这将是我的建议


仅供参考,当您习惯了指针的工作方式后,您应该转到
shared\ptr
,这会给您带来更大的安全性。看看它是如何工作的。

您的问题是您试图将int*分配给int**。新的[n]运算符不返回指向指针的指针,而是返回指向包含n个动态创建对象的内存块开头的指针

解决方案是正确地传递指针,将函数头更改为

void process_quiz(int &numquiz, int *quiz, int argc, char *argv[]) 

注意,您也从未对动态创建的数据调用delete[],因此您将遇到内存泄漏。虽然我个人不喜欢智能指针,但我建议您仔细阅读本期的智能指针,并仔细阅读正确的新建和删除指针。

您的问题是您试图将int*分配给int**。新的[n]运算符不返回指向指针的指针,而是返回指向包含n个动态创建对象的内存块开头的指针

解决方案是正确地传递指针,将函数头更改为

void process_quiz(int &numquiz, int *quiz, int argc, char *argv[]) 

注意,您也从未对动态创建的数据调用delete[],因此您将遇到内存泄漏。虽然我个人不喜欢智能指针,但我建议您仔细阅读本期的智能指针,并仔细阅读正确的新建和删除指针。

指针是一个非常复杂的话题。这是本作业的要求,还是你只是想使用它们?所有这些计算都可以在不使用指针的情况下传递和返回值。指针是一个非常复杂的主题。这是本作业的要求,还是你只是想使用它们?您可以执行所有这些计算,只传递和返回值,而无需使用指针。