【问题标题】:Can't Convert Single Pointer to Double Pointer无法将单指针转换为双指针
【发布时间】:2013-02-20 17:25:25
【问题描述】:

这是我的代码。

#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;
}

所以我已经消除了除以下之外的所有其他错误:

grade.cpp: In function âvoid process_quiz(int&, int**, int, char**)â:
grade.cpp:17: error: cannot convert âint*â to âint**â in assignment
grade.cpp: In function âvoid process_lab(int&, int**, int, char**)â:
grade.cpp:29: error: cannot convert âint*â to âint**â in assignment
grade.cpp: In function âvoid process_assignment(int&, int**, int, char**)â:
grade.cpp:41: error: cannot convert âint*â to âint**â in assignment
grade.cpp: In function âvoid process_exam(int&, int**, int, char**)â:
grade.cpp:53: error: cannot convert âint*â to âint**â in assignment
grade.cpp: In function âvoid process_final(int&, int**, int, char**)â:
grade.cpp:65: error: cannot convert âint*â to âint**â in assignment

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

【问题讨论】:

  • 指针是一个非常复杂的话题。这是此作业的要求,还是您只是想使用它们?您可以在不使用指针的情况下仅传递和返回值来完成所有这些计算。

标签: c++ arrays pointers command-line command-line-arguments


【解决方案1】:

例如,去line 17。您尝试将指针(由 new 运算符返回)分配给双指针(测验)。

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

但无论如何,您应该首先了解指针是什么、如何使用它们等等,而不是解决这个问题。您可能会编译它,但是您编写的内容有很多错误(您通常不希望通过副作用修改函数的参数,因为它很难维护等)

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

仅供参考,当您习惯了指针的工作方式后,您应该转到shared_ptr,这样会更安全。看看它是如何工作的here

【讨论】:

    【解决方案2】:

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

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

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

    注意,您也永远不会对动态创建的数据调用 delete[],因此您会遇到内存泄漏。虽然我个人不喜欢智能指针,但我建议您针对这个问题阅读它们,并阅读正确的新指针和删除指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2021-07-22
      • 2020-12-10
      • 2020-10-21
      • 2021-04-12
      • 2012-10-24
      • 2016-08-07
      相关资源
      最近更新 更多