1

これが私のコードです。

#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

今、私はポインターについていくつか調べましたが、配列から変数に値を割り当てることができない理由がわかりません!関数の先頭から余分なポインターを削除しようとしましたが、何も修正されません。シングルポインタからダブルポインタに変換できないというエラーが表示され、メインの関数を呼び出す場所にエラーがあると表示されます。

4

2 に答える 2

1

line 17さて、例えばに行きます。newポインター (オペレーターが返す) をダブルポインター (クイズ)に割り当てようとします。

したがって、おそらくやりたいでしょう*quizz = new ...。しかし、最初に値を確認せずにポインターを逆参照すると、後で問題が発生します。

しかし、いずれにせよ、これを修正する代わりに、まずポインタとは何か、どのように使用するかなどについて学ぶ必要があります。あなたはこれをコンパイルするかもしれませんが、あなたが書いたものには非常に多くの間違いがあります (通常、保守が難しいなどの理由で、副作用によって関数の引数を変更したくありません)。

目的は、コンパイルすることではなく、目的の場所に安全に到達することです。概念を段階的に学び、速すぎないようにしてください。これは、コード/質問を考慮した私のアドバイスです。

参考までに、ポインターの動作に慣れたら、shared_ptrより安全なポインターに移動する必要があります。ここでどのように機能するかを参照してください。

于 2013-03-06T03:51:12.113 に答える
0

あなたの問題は、int* を int** に代入しようとしていることです。new[n] 演算子は、ポインターへのポインターを返すのではなく、動的に作成された n 個のオブジェクトを含むメモリ ブロックの先頭へのポインターを返します。

解決策は、ポインターを適切に渡し、関数ヘッダーを次のように変更することです。

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

動的に作成されたデータに対しても delete[] を呼び出すことはないため、メモリ リークが発生することに注意してください。私は個人的にはスマート ポインターが好きではありませんが、この問題についてよく読んで、ポインターを適切に新規作成および削除する方法を読むことをお勧めします。

于 2013-03-08T15:16:39.227 に答える