2013-06-10 5 views
1

Я пытаюсь передать этот массив функции, но я продолжаю получать, ошибка C2664: «correctans»: невозможно преобразовать параметр 2 из «std» :: string [3] [3] 'to' std :: string ** ', не обращайте внимания на глупые вопросы в коде, которые он просто случайно тестирует.Передача двумерного массива функции с помощью указателя в C++

код:

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

int correctans(string *arr1, string **arr2, int *arr3, int questions, int choices) 
{ 
int count=0; 
int ans; 

    for(int i=0; i<questions; i++) 
    { 
     cout << "Question #" << i+1; 
     cout << arr1[i] << endl; 
     for(int j=0; j<choices; j++) 
      cout << j+1 << arr2[i][j] << " "; 
     cout << "your answer:"; 
     cin >> ans; 
     if(ans==arr3[i]) 
      count++; 
    } 

    return count; 
} 

int main() 
{ 
    int correct; 
    string Questions[3]={"HowAreYou", "HowManyHandsDoYouHave", "AreYouCrazyOrCrazy"}; 
    string Choices[3][3]={{"Banana", "Peanut", "Fine"},{"Five", "Two", "One"},{"I'mCrazy", "I'mCrazyBanana", "I'mDoubleCrazy"}}; 
    int Answers[3]={3, 2, 3}; 

    correct=correctans(Questions, Choices, Answers, 3, 3); 
    cout << "You have " << correct << " correct answers" <<endl; 

    return 0; 
} 

ответ

1

Здесь вы идете

Int correctans (строка * arr1, строка (& arr2) [3] [3], Int * arr3, внутр вопросов, внутр выбора) `

+0

Спасибо, много это сработало: D !! – WildBeginner

+0

, но у меня есть вопрос, что если я не знаю, что такое размер 2d-массива, что я могу использовать вместо [3] [3], потому что я попытался изменить число только от функции, но он не работал i хотите быть в состоянии установить его до любого размера, что это возможно? – WildBeginner

+0

@WildBegginner: вы можете создать функцию '' correctans''. '' template correctans (..., string (& arr) [SIZE] [SIZE], ...) ''. Но если вы не знаете размер во время компиляции, это не сработает. – fogbit

0

Если я правильно помню, вы можете использовать что-то вроде 'строку [] [] & RArray'
(или точно: строка [3] [3] & RArray), конечно вы также должны передавать фактические размеры в качестве параметров.

Компилятор принял это:
строка arr2 [3] [3]
в качестве параметра. Но я попытаюсь улучшить передачу указателя вместо копирования массива по значению. Так как вы используете stl :: string, вы также можете попробовать вектор < vector < string>>.

0

Ну, как компилятор сказал std::string [3][3] не может быть преобразован в std::string **.

Вы можете попробовать это

int correctans(string *arr1, string (* arr2)[ 3 ], int *arr3, int questions, int choices) 

или это

int correctans(string *arr1, string arr2[][ 3 ], int *arr3, int questions, int choices) 

Но лучшим решением является использование std::vector.

+0

не работает, я все равно получаю ту же ошибку – WildBeginner

+0

@WildBegginner Я исправил ошибку. Попробуйте еще раз – kotlomoy

+0

второй, но он не передан с помощью указателя. спасибо, хотя @kotlomoy – WildBeginner

1

Передачей многомерных массивов можно получить очень смущает. Я рекомендую создать singlepointer в начале вашего массива, и передавая этот указатель:

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

int correctans(string *arr1, string *arr2, int *arr3, int questions, int choices) 
{ 
int count=0; 
int ans; 

    for(int i=0; i<questions; i++) 
    { 
     cout << "Question #" << i+1; 
     cout << arr1[i] << endl; 
     for(int j=0; j<choices; j++) 
      cout << j+1 << arr2[i][j] << " "; 
     cout << "your answer:"; 
     cin >> ans; 
     if(ans==arr3[i]) 
      count++; 
    } 

    return count; 
} 

int main() 
{ 
    int correct; 
    string Questions[3]={"HowAreYou", "HowManyHandsDoYouHave", "AreYouCrazyOrCrazy"}; 
    string Choices[3][3]={{"Banana", "Peanut", "Fine"},{"Five", "Two", "One"},{"I'mCrazy", "I'mCrazyBanana", "I'mDoubleCrazy"}}; 
    int Answers[3]={3, 2, 3}; 

    string* choicesPtr=&Choices[0][0]; 
    correct=correctans(Questions, choicesPtr, Answers, 3, 3); 
    cout << "You have " << correct << " correct answers" <<endl; 

    return 0; 
} 

Этот код компилируется и выполняется.

+1

Но 'arr2 [i] [j]' не будет работать – kotlomoy

+0

О, я понимаю, что вы имеете в виду. – IanPudney

+0

Да, arr2 [i] [j] не работает. – WildBeginner

Смежные вопросы