5

これは完全なエラーメッセージです:

エラー:引数「1」の「MyTime」を「constMyTime *」に変換できません。「intDetermineElapsedTime(const MyTime *、const MyTime *)」|

そしてこれは私のコードです:

#include <iostream>
#include<cstdlib>
#include<cstring>

using namespace std;
struct MyTime { int hours, minutes, seconds; };
int DetermineElapsedTime(const MyTime *t1, const MyTime *t2);
const int hourSeconds = 3600;
const int minSeconds = 60;

int DetermineElapsedTime(const MyTime *t1, const MyTime *t2)
{
    long timeDiff = ((((t2->hours * hourSeconds) + (t2->minutes * minSeconds) + t2->seconds) -
                   ((t1->hours * hourSeconds) + (t1->minutes * minSeconds) + t1->seconds)));
    return(timeDiff);
}


int main(void)
{
    char delim1, delim2;
    MyTime tm, tm2;
    cout << "Input two formats for the time. Separate each with a space. Ex: hr:min:sec\n";
    cin >> tm.hours >> delim1 >> tm.minutes >> delim2 >> tm.seconds;
    cin >> tm2.hours >> delim1 >> tm2.minutes >> delim2 >> tm2.seconds;

    DetermineElapsedTime(tm, tm2);

    return 0;

}

修正できる方法はありますか?他に見られるエラーがあれば、遠慮なく指摘してください。私は、hr:min:sec形式を正しく出力するようにDetermineTimeElapsedを修正することについて知っています。しかし今、私はこれを乗り越える必要があります。

4

4 に答える 4

8

エラーは次の行にあるはずです:

DetermineElapsedTime(tm, tm2);

MyTimeを期待するときに、オブジェクトを上記の関数に渡しますconst MyTime*

オブジェクトアドレスを渡すことで修正します。

DetermineElapsedTime(&tm, &tm2);

またはより良いC++の方法:オブジェクト参照を受け入れるように関数プロトタイプを変更することによって:

int DetermineElapsedTime(const MyTime &t1, const MyTime &t2);

体もそれに応じて変化します。たとえば、演算子など->に置き換えられ.ます。

于 2012-11-12T06:35:14.987 に答える
2

関数は2つの変数へのポインターを期待していますが、変数自体を渡しています。これが問題です。&これを修正するには、以下に示すよう に、演算子を使用して変数のメモリアドレスを渡すだけで、変数へのポインタを渡します。

DetermineElapsedTime(&tm, &tm2);

または、@ iammilindが示唆するように、変数への参照を受け取るように関数を変更できます。つまり、上記の行をそのままにしておくことができます。これは、より安全でクリーンな「C++」の方法です。

于 2012-11-12T06:33:57.940 に答える
1

関数はへのDetermineElapsedTimeポインタを期待していますMyTime

コードを次のように変更します。

DetermineElapsedTime(&tm, &tm2);

このコンテキストでの&演算子は、「のアドレスを取得する」ことを意味します

于 2012-11-12T06:36:04.983 に答える
1

あなたの関数は2つのconstポインタを取る必要があります:

int DetermineElapsedTime(const MyTime *t1, const MyTime *t2)
                         \_____one______/  \______two_____/

さて、これがあなたがそれを呼んでいる方法です:

MyTime tm, tm2;
DetermineElapsedTime(tm, tm2);

ご覧のとおり、関数が期待するように変数をポインターで渡すのではなく、値で変数を渡します。いくつかの方法で修正できます。

  • const参照を期待するように関数を変更します。

    int DetermineElapsedTime(const MyTime &t1, const MyTime &t2)
    
  • 渡される変数のアドレスを取得します。

    MyTime tm, tm2;
    DetermineElapsedTime(&tm, &tm2);
    
  • ものを動的に割り当て、ポインタを渡します。

    MyTime *tm = new MyTime();
    MyTime *tm2 = new MyTime();
    DetermineElapsedTime(tm, tm2);
    
于 2012-11-12T06:37:28.370 に答える