![](/img/trans.png)
[英]Fast convert double pointer array into single pointer, probably can be continuous
[英]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.