我正在为程序重新播放歌曲,但我有点困惑,因为当我尝试编译器时,我无法将结构与int进行比较。我想知道你们会怎么想?

struct Songs                 //my struct
{
string title;
string artist;
string mem;
};

Songs *ptr;
ptr = new Songs[25];    //dynamic array

所以我告诉你struct和ptr很好,这里的函数遇到了麻烦。
void shuffle (Songs song[], Songs *ptr, string title, string mem, string  artist, int num)
{

 for (int i=0; i<(num); i++)
 {
     int r = i + (rand() % (num-i)); // Random remaining position.
     int temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp;  //this isnt working
 }                                                     //but its logically sound?

 for (int c=0; c<n; c++)
 {
     cout << ptr[c] << " ";  // Just print
 }
}

最佳答案

令人反感的代码位于int temp = ptr[i]; ... ptr[r] = temp;,您正在分配Songint,这是不可能的。

另外,我强烈建议使用std::vector< Song >进行存储。您的代码更加健壮,崩溃的可能性也较小,此外 vector 始终知道其包含的Songs数量。例

#include <vector>
...
struct Song { ... };
...
void shuffle(std::vector< Song >& mySongs, ...)
{
   /* shuffle mySongs somehow. */
   ...
}
mySongs.size()包含歌曲数,您可以按预期使用mySongs[index](或更好的mySongs.at(index))访问每首歌曲。添加新歌曲是通过mySongs.push_back(someSong)完成的。

现在回答您的问题:如何随机播放我的歌曲 vector 。好 ...
/* at start of program. */
srand(unsigned(time(NULL)));
...
void shuffle(std::vector< Song >& mySongs)
{
    std::random_shuffle(mySongs.begin(), mySongs.end());
}

绝招。参见here

可以通过定义如下函数来将歌曲写入流:
std::ostream& operator << (std::ostream& osr, const Song& mySong)
{
    osr << mySong.title << ' ' << mySong.artitst << ' ' << mySong.mem;
    return osr;
}

现在您可以愉快地执行std::cout << mySong << std::endl

关于c++ - C++:如何改组动态指针数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9496600/

10-12 14:49