簡體   English   中英

無法將單指針轉換為雙指針

[英]Can't Convert Single Pointer to Double Pointer

這是我的代碼。

#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中調用函數的地方。

好吧,例如轉到line 17 您嘗試將一個指針(由new運算符返回)分配給一個雙指針(測驗)。

因此,您可能想執行*quizz = new ... 但是您知道,在不先檢查指針值的情況下取消對指針的引用會在以后出現問題。

但是無論如何,您首先要了解什么是指針,如何使用指針等,而不要解決此問題。 您可能會對此進行編譯,但是您編寫的內容有很多錯誤(您通常不想通過副作用修改函數的參數,因為它很難維護,等等)。

最終的目的不是要使其編譯,而是要安全地到達目標位置。 逐步學習概念,不要嘗試太快,考慮到您的代碼/問題,這將是我的建議。

僅供參考,當您習慣了指針的工作方式時,應該轉到shared_ptr ,這將給您帶來更大的安全性。 在這里查看其工作方式。

您的問題是您試圖將int *分配給int **。 new [n]運算符不返回指向指針的指針,而是指向包含n個動態創建的對象的內存塊的開頭的指針。

解決方案是正確傳遞指針,將函數標頭更改為

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

請注意,您也永遠不會對動態創建的數據調用delete [],因此會遇到內存泄漏。 雖然我個人不喜歡智能指針,但我建議您閱讀有關此問題的內容,並閱讀正確的newinging和deleteinging指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM