2016-02-14 2 views
-3

Я всего лишь начальный кодер и все .. Я пытался создать печатную таблицу, используя статическую массив из 10 лучших фильмов от гнилых помидоров вместе со своим критиком и рейтингом аудитории.Аргумент типа "std :: string (*) [10]" несовместим с параметром типа "Movie *"

Мне дали структуру Movie and void PrintMovies. Однако, когда я пытаюсь вызвать PrintMovies, массив заголовков не работает. Ошибка продолжает говорить, что аргумент несовместим. Я не понимаю, что это значит и не понимает, как это исправить.

Также, если вы знаете, как закончить отображение таблицы, вы можете мне помочь? Я сделал цикл for для 2-D массива, но я не знаю, как продолжить после него.

//--------------------------------Movie.h------------------------------- 
     #ifndef _Movie_ 
     #define _Movie_ 
     #include <iostream> 

     struct Movie 
     { 
      std::string title; 
      int criticRating; // from 0 to 100 
      int audienceRating; // from 0 to 100 
     }; 

     #endif /*defined _Movie_*/ 
    //-----------------------------------Movie.cpp----------------------------- 
     #include <iostream> 
     #include <string> 
     #include <algorithm> 
     #include "Movie.h" 
     #include <iomanip> 
     using namespace std; 

     void PrintMovies(Movie* movies, int numMovies); 

     int main() 
     { 
      std::string titles[3][10] = { "Kung Fu Panda", "Hail, Caesar!", "Star Wars: Episode VII - The Force Awakens", 
          "The Revenant", "The Choice","Pride and Prejudice and Zombies","The Finest Hours", 
          "Ride Along 2", "The Boy","Dirty Grandpa" }; 
      PrintMovies(titles, 10); 
      return 0; 
     } 

     void PrintMovies(Movie* movies, int numMovies) 
     { 
      cout << "Movies\n"; 
      cout << "Critic\t" << "Audience\t" << "Title\n"; 
      for (int row = 0; row < 3; ++row) 
      { 

      } 
     } 
+1

Функция ожидает массив значений «Movie». Вы передали массив значений 'std :: string'. Это фундаментальный недостаток в вашей программе, но я не могу предоставить это как ответ, потому что неясно, как вы действительно хотите, чтобы программа вела себя. – paddy

+0

am, ok.. где начать: 1.- Почему бы не сделать класс дыр. 2.- из прототипов PrintMovies вы не можете отбрасывать из std :: string в Movie *. – Joel

+0

@paddy На самом деле, они передали указатель на массив 'std :: string'. – juanchopanza

ответ

0
std::string titles[3][10] = {...} 

генерирует двумерный массив строк, в то время как ваша функция ожидает получить указатель на объект Movie. Это разные типы, и компилятор не может понять, как преобразовать один в другой.

Одним из вариантов является использование вектора, как это:

std::vector<std::string> titles = {...}; 
std::vector<Movie> movies; 
for(std::string title : titles) 
    movies.push_back({title,0,0}); //here the conversion happens: 
           // we use a string (title) and two ints to generate a movie 

, а затем изменить Signatur вашей функции

void PrintMovies(std::vector<Movie>& movies); 
+0

что происходит с PrintMovies (...) в основном? Что я заключу в круглые скобки? Я никогда не использовал векторы раньше ..:/ –

+0

Oh ... Является ли «заголовки» в круглых скобках, а затем изменено на «фильмы»? –

+0

В скобках вы добавляете разделенный запятыми список строк так же, как и в своем массиве строк. Затем вы получаете вектор строк вместо массива строк, который по-прежнему называется «заголовки». For-loop преобразует один заголовок за другим в фильм и добавляет его в вектор фильмов под названием «фильмы». Вы вызываете функцию затем как «PrintMovies (movies);» и получаете количество фильмов как 'movies.size()'. [Эта ссылка] (http://www.cplusplus.com/reference/vector/vector/) может быть полезна. – Anedar

0

строка кода

std::string titles[3][10] = { "Kung Fu Panda", "Hail, Caesar!", "Star Wars: Episode VII - The Force Awakens", 
        "The Revenant", "The Choice","Pride and Prejudice and Zombies","The Finest Hours", 
        "Ride Along 2", "The Boy","Dirty Grandpa" }; 

ошибочно пытается для создания 3 x 10 массивов названий фильмов, но вы передаете только 10 названий фильмов. Совершенно непонятно, что вы пытались сделать здесь. Но я подозреваю, что ты хотел:

std::string titles[10] = { "Kung Fu Panda", "Hail, Caesar!", "Star Wars: Episode VII - The Force Awakens", 
        "The Revenant", "The Choice","Pride and Prejudice and Zombies","The Finest Hours", 
        "Ride Along 2", "The Boy","Dirty Grandpa" }; 

Теперь у вас есть имена фильмов, но они не Movie s пока они std::string s. Поэтому вы не можете просто передать их функции PrintMovies. Вам нужно будет создать и заполнить массив из Movie s

Вот вычищенный «SSCCE» вашего кода, который поможет вам начать работу.

#include <algorithm> 
#include <iomanip> 
#include <iostream> 
#include <string> 
#include <vector> 

struct Movie 
{ 
    std::string title; 
    int criticRating; // from 0 to 100 
    int audienceRating; // from 0 to 100 
}; 

void PrintMovies(Movie* movies, int numMovies) 
{ 
    std::cout << "Movies\n"; 
    std::cout << "Critic\t" << "Audience\t" << "Title\n"; 
    for (int row = 0; row < 3; ++row) 
    { 
     ///TODO: Rethink this, you have to print numMovies movies. 
    } 
} 

int main() 
{ 
    constexpr auto NumMovies = 10; 
    // or static const size_t NumMovies = 10; 

    std::string titles[NumMovies] = { "Kung Fu Panda", "Hail, Caesar!", "Star Wars: Episode VII - The Force Awakens", 
        "The Revenant", "The Choice","Pride and Prejudice and Zombies","The Finest Hours", 
        "Ride Along 2", "The Boy","Dirty Grandpa" };   
    ///TODO: array of critic ratings 
    ///TODO: array of audience ratings. 

    ///TODO: Create and populate array of Movies called "movies". 
    Movie movies[NumMovies]; // Something like this 
    for (auto i = 0; i < NumMovies; ++i) 
    { 
     movies[i].title = titles[i]; 
     // ... 
    } 

    PrintMovies(movies, NumMovies); 
} 

Живая демонстрация: http://ideone.com/31z0u4

Примечания:

. Вместо того, чтобы писать «10» везде, я создал для него постоянный псевдоним - NumItems. В пределах области, о которой объявлено, т. Е. Основной, вы можете использовать «NumItems» вместо текущего количества фильмов. Это помогает поддерживать целостность.

. В цикле for я использовал ключевое слово C++ 11 «auto», чтобы заботиться о том, какой тип значения имеет мой инвариант,

. Я не решил ряд других проблем с вашей реализацией, так как это, похоже, ранний этап обучения на курсе/курсе C++.

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