2016-05-21 62 views
-1

Uni用にこのプログラムを実行する必要があります。この「変数はこのスコープで宣言されていません」エラーが発生し続けます。変数がこのスコープで宣言されていませんでした。C++

は、文字列パラメータとして整数配列を受け取り、整数配列内の対応する値に従って文字列パラメータ内の各文字が乗算された文字列を返す関数を書く:これは割り当てです。あなたは、(文字列の終わりのヌル/ 0文字を除いて)両方の配列が同じ数の要素を持っていると仮定することができます。さらに、関数は参照パラメータで結果から余分な文字数を返します。 Exempleパラメータ1 "ABCD" {1,2,3,4} 結果:これは私がこれまでに書くことができたコードである6

を "abbcccdddd":

#include <iostream> 
#include <string> 
using namespace std; 
string Function (string c, int numbers[n]) 
{ 
    string result; 
    for (int i=0; i< n;i++) 
    { 
     int index= numbers[i]; 
     for (int j=0; j< index;j++) 
     { 
      result.append(c.at(i)); 
     } 
    } 
    return result; 
} 

int main() 
{ 
    int n; 
    string r; 
    cout << "Nr in array"; 
    cin >> n; 
    int numbers [n]; 
    for (int i=0; i<n;i++) 
    { 
     cout << "Nr"; 
     cin >> numbers[i]; 
    } 
    string c; 
    cout << " Write some letters"; 
    cin >> c; 
    r=Function(c,numbers[n]); 
    cout << r; 
    return 0; 
} 

そして、これらは、私は私のコードをコンパイルしようとしたときにポップアップエラーです:

4:40: error: 'n' was not declared in this scope 
In function 'std::string Function(...)': 
7:20: error: 'n' was not declared in this scope 
9:14: error: 'numbers' was not declared in this scope 
12:18: error: 'c' was not declared in this scope 
In function 'int main()': 
33:25: error: cannot pass objects of non-trivially-copyable type 'std::string {aka class std::basic_string<char>}' through '...' 

は、私は、これは些細な溶液であってもよい知っている、と私はこれを投稿する前にstackoverflowの上で同様の問題を探しましたが、何も本当に近い来ませんでした〜へ私の問題だと思います。つまり、私はmain関数の後に関数を定義したり、ループ内に変数を定義してから、それらを外部に呼び出すことはできません。ありがとうございます!:)

+3

'string関数(文字列c、int numbers [n])' 'それは何ですか? –

+1

これは、 'std :: vector'を使うことで混乱がなくなります。 – tadman

答えて

0

文字列と配列の長さが同じであることがわかっているため、配列の長さを関数に渡す必要はありません。 また、C++でこれを行うことはできません:cin >> n; int numbers [n];はnがconst式ではないためです。代わりにint *numbers=new int[n];を使用できます。

#include <iostream> 
#include <string> 
using namespace std; 

string Function (const string &c, int* numbers) 
{ 
    string result; 
    for (size_t i=0; i<c.size(); i++) 
     result.append(numbers[i],c.at(i)); 
    return result; 
} 

int main() 
{ 
    int n; 
    cout << "Nr in array: "; 
    cin >> n; 
    int *numbers=new int[n]; 
    for (int i=0; i<n; i++) 
    { 
     cout << "Nr: "; 
     cin >> numbers[i]; 
    } 
    string c; 
    cout << "Write some letters: "; 
    cin >> c; 
    cout << Function(c,numbers) << endl; 
    delete[] numbers; 
    return 0; 
} 
4

この配列を渡すために使用している構文は無効です。ポインター(配列の実際の位置)と長さを別のパラメーターとして渡す必要があります。

また、あなたがやったように配列を割り当てるときは、実行時にこれを決めることができないので、配列のサイズを事前に知る必要があります。これは、newでの動的メモリ割り当てが以下のようになるものです。割り当てられたメモリを解放して、メモリリークがないことを確認してください。

#include <iostream> 
#include <string> 

using namespace std; 

// numbers is a pointer and n is the length of it 
string Function (string c, int* numbers, int n) 
{ 
    string result; 
    for (int i=0; i< n;i++) 
    { 
     int index= numbers[i]; 
     for (int j=0; j< index;j++) 
     { 
      result += c.at(i); 
     } 
    } 
    return result; 
} 

int main() 
{ 
    int n; 
    string r; 
    cout << "Nr in array"; 
    cin >> n; 

    // allocate dynamic memory in desired size 
    int* numbers = new int[n]; 

    for (int i=0; i<n;i++) 
    { 
     cout << "Nr"; 
     cin >> numbers[i]; 
    } 
    string c; 
    cout << " Write some letters"; 
    cin >> c; 
    r=Function(c,numbers, n); 
    cout << r; 

    // free previously allocated memory 
    delete[] numbers; 

    return 0; 
} 
+1

また、可変長配列はC++でサポートされているとは思いません。 –

+0

@bkVnet Cは常にそれらをサポートしていますが、C++でも同様です。ポインタは配列のように動作します。 – tadman

+0

@tadmanあなたは本当ですか?これは標準的な動作かコンパイラ拡張ですか?私はpre-C++ 11コンパイラを使用していますが、このコードは私には当てはまりません。私は 'cin >> n;を参照しています。 int numbers [n]; 'コード。 –

関連する問題