Не удается преобразовать один указатель в двойной указатель

Так вот мой код.

#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.

1

Решение

Ну, иди в line 17 например. Вы пытаетесь назначить указатель (возврат по new оператор) на двойной указатель (викторина).

Так что вы, вероятно, хотите сделать *quizz = new ..., Но вы знаете, что разыменование указателя без проверки его значения сначала вызывает проблемы позже.

Но в любом случае, вместо того, чтобы это исправить, вы должны сначала узнать, что такое указатель, как вы его используете и так далее. Вы можете получить это для компиляции, но с тем, что вы написали, очень много неправильных вещей (обычно вы не хотите изменять аргументы функции побочным эффектом, потому что это трудно поддерживать и т. Д.)

Конец не в том, чтобы заставить его скомпилироваться, а в том, чтобы туда, куда вы хотите, безопасно перейти. Изучайте концепции шаг за шагом и не пытайтесь идти слишком быстро, это был бы мой совет, учитывая ваш код / ​​вопрос.

К вашему сведению, когда вы привыкнете к тому, как работают указатели, вам следует перейти к shared_ptr которые дают вам гораздо больше безопасности. Посмотри, как это работает Вот.

1

Другие решения

Ваша проблема в том, что вы пытаетесь присвоить int * для int **. Оператор new [n] возвращает не указатель на указатель, а указатель на начало блока памяти, содержащего n динамически создаваемых объектов.

Решением было бы правильно передать указатели, изменив заголовки функций на

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

Обратите внимание, что вы никогда не вызываете delete [] для ваших динамически создаваемых данных, поэтому вы столкнетесь с утечками памяти. Хотя мне лично не нравятся умные указатели, я предлагаю вам ознакомиться с ними для этой проблемы и почитать о правильно новых и удаляющих указателях.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector