1

大学では、「コンピュータ サイエンス入門」のコースに合格する必要があります。このコースでは、アセンブリ、c、c++ を使用して解決する必要があるさまざまなトピックに関するさまざまな演習を提供します。

私の問題は、さまざまなコンパイラ (g++ と Visual Studio C++) を使用しているが、それらは私が提供するコードを異なる方法で解釈するか、異なるコードを必要とするため、プログラムを少なくとも 2 回実装する必要があることです。

gcc および Visual Studio C++ で動作するコードを作成する方法についての情報を探しています。

私がすでに対処しなければならなかったことのいくつかの例:

VSC++ での作業:

template<typename T, template<typename X, typename Y> class container, class Allocator>
int in(int p_number, va_list params){
std::ifstream &data = *(va_arg(params, std::ifstream*));
if(!data.good()){
    return -1;
}

char delimiter = (char)va_arg(params, int), temp;
std::stringstream ss;
while((temp = data.get())!=delimiter){
    if(data.eof()){
        return 0;
    }
    ss.put(temp);
}
T value;
ss >> value;

if(data.eof()){
    return 0;
}

typedef container<T, Allocator>* con_p;

container<T, Allocator> &con = *(va_arg(params, con_p));
con.push_back(value);

return 1;
}

template<typename T>
struct MAP{
template<typename itr>
static int map(itr begin, itr end, int (*fp)(int, va_list), int p_number, ...){
    int p_number2 = p_number+1;

    va_list list;
    va_start(list, fp);

    int r=0, temp;
    for(; begin!=end; ++begin){
        p_number = reinterpret_cast<int>(&(*begin));
        temp = (*fp)(p_number2, list);
        if(temp==-1){
            return -1;
        }
        r += temp;
    }

    va_end(list);

    return r;
}
};

template<typename T,
        template<typename X, typename Y> class container,
        class Allocator>
int write(const container<T, Allocator> &con, std::string filepath, char delimiter = '\n'){
std::ofstream data;
data.open(filepath, std::ios::out | std::ios::binary | std::ios::trunc);
int r = MAP<T>::map(con.begin(), con.end(), out<T>, 2, &data, delimiter);
data.close();
return r;
}

g++ での作業:

template<typename T, class A, template<typename X, typename Y> class container>
int write(const container<T, A> &con, std::string filepath, char delimiter = '\n'){
long temp; int r = 0;
std::ofstream data;
data.open(filepath.c_str(), std::ios::out | std::ios::binary | std::ios::trunc);

for(typename container<T, A>::const_iterator i=con.begin(); i!=con.end(); ++i){
    if(!data.good()){
        data.close();
        return -1;
    }

    temp = (long)data.tellp();
    data << *i << delimiter;

    r += ((long)data.tellp() - temp);
}

data.close();
return r;
}

同じ機能ですが、VSC++ で受け入れられるテンプレート定義が g++ では受け入れられないため、実装が大きく異なります。

PS念のため、私の大学がインターネットを検索して調べている場合、学生がインターネットから宿題をコピーしている場合. 私の名前は TU-Darmstadt の Christian W. 学生です。

4

2 に答える 2

1

この状況に遭遇したときはいつでも、それはあなたのコードがおそらく間違っていることを意味します。コンパイラは正しいコードを適切に処理する必要があります。したがって、移植性のない仮定を行っているかどうか、またはより寛容なコンパイラが受け入れるバグがあるかどうかを常に確認してください。

そうは言っても、一般に、さまざまなプラットフォームでコンパイルを実行する場合は、条件付きコンパイルブロックを使用します。つまり、コードをで囲みます

#ifdef PLATFORM_MACRO
    // conditional code here
#endif

ここで、PLATFORM_MACROは、問題のプラットフォームに設定されている#defineです。そのブロック内のコードは、目的のプラットフォーム(つまり、PLATFORM_MACROが定義されている場所)でのみ表示されます。

于 2012-11-28T21:53:59.403 に答える
1

コンパイラメッセージを確認しましたか?エラーメッセージは理由で生成されます。私gccの場合、適切なヘッダーが含まれ(など)、タイプが修正されたら(たとえば、などの代わりに) <cstdio>、最初の例をコンパイルします。<iostream>data.open(filepath.c_str(), ...data.open(filepath, ...

于 2012-11-28T22:18:06.163 に答える