2012-02-29 2 views
2

내 프로그램에서 노래를 뒤섞고 있지만 컴파일러를 시도 할 때 내 구조체를 int로 비교할 수 없기 때문에 조금 혼란 스럽다. 임씨가 생각하는 걸 궁금해하는 Im? C++ : 포인터의 동적 배열을 뒤섞는 방법?

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

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

그래서 나는 문제가 발생 U에게 구조체 및 PTR 잘을 heres 기능 메신저 말했다 ..

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 
}  
} 
+2

이것은 포인터 배열이 아닌 * 배열입니다. 또한 함수에서 사용하지 않은 인수가 많이 있습니다. 의도적으로? –

+0

아, 사용하지 않은 args에 대해 사과드립니다. – gamergirl22

답변

3

위반 코드는 int temp = ptr[i]; ... ptr[r] = temp;이며, Songint은 할당 할 수 없습니다.

또한 저장하기 위해 std::vector<Song>을 사용하는 것이 좋습니다. 코드가 강력하고 충돌 가능성이 적습니다. 벡터는 항상 포함 된 노래 수를 알고 있습니다. 예

#include <vector> 
... 
struct Song { ... }; 
... 
void shuffle(std::vector<Song>& mySongs, ...) 
{ 
    /* shuffle mySongs somehow. */ 
    ... 
} 

mySongs.size() 노래의 번호를 포함, 당신은 예상대로 mySongs[index] (또는 더 나은 mySongs.at(index))와 함께 각 노래에 액세스 할 수 있습니다. 새 노래 추가는 mySongs.push_back(someSong) 님이 수행합니다.

질문 하시길 : 내 노래 벡터를 어떻게 셔플합니까? 음 ...

/* 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 할 수 있습니다.

+0

thnx 이 도움을 위해 .. 지금은 잘 어울리지 만 벡터는 새로운 것입니다. 나는 그들이 규칙적인 배열 일 것이라고 그들에게 말하니? for (int i = 0; i gamergirl22

+0

예상대로 작동해야합니다. 더 좋게, 당신은 Song 객체에 그것을 스트림에 쓰는 함수를 줄 수있다. 나는 내 대답에 몇 가지를 추가 할 것이다. – hochl

+0

thnx. idk 왜 우리가 벡터를 가르쳐 arent하지만 그들은 훨씬 더 간단 보입니다. 나는 이것들을 매우 유용하게 보이기 때문에 지금 스스로 공부할 것이다. – gamergirl22

1

당신은 int (int temp = ptr[i];)에 Songs 객체를 할당하려고하고 당신이 시도 intSongs (ptr[r] = temp;)에 할당하십시오. 그것은 작동하지 않습니다. Songs temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp;

1

변경 :

int temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp; 

원래 코드는 정수로 Songs를 할당하려고

Songs temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp; 

로 작동하려면, 난 당신이 라인을 변경하는 것이 좋습니다. 할당하려는 객체와 동일한 유형의 임시 객체를 만들어야합니다.

+1

더 나은 점은'std :: swap (ptr [i], ptr [r])'을 사용하는 것입니다. –

+3

'std :: vector'와'std :: random_shuffle (v.begin(), v.end())'를 사용하여 더 좋은 결과를 얻는 것이 더 나을 것입니다. 그러나 그 질문은 실제로 무엇이 아닙니다 :) – Dervall

1

글쎄, 왜 구조체 값을 저장하기 위해 int을 사용하고 있습니까? 그냥합니다

Songs temp; 

는 또한, 당신의 유형 이름은 완전히 혼란, Songs하나의 노래를 나타낼 것으로 보인다.

+0

아 아폴 기 구조는 1 곡이 각 데이터 thnx에 다시있는 동안 모든 노래를 개최하는 것처럼 보입니다 – gamergirl22

2

표준 라이브러리에서 더 많이 사용하려고합니다. std :: vector와 std :: random_shuffle을 사용하면 이렇게 훨씬 더 깨끗합니다. 편집 : 이제 코드 출력.

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

struct song 
{ 
    std::string title;  
    std::string artist; 
    std::string mem; 
}; 

std::ostream& operator << (std::ostream& stream, const song& s) 
{ 
    return stream << "Song: { Title: " << s.title 
     << ", Artist: " << s.artist << ", Mem: " << s.mem; 
} 

template <typename T> 
std::ostream& operator << (std::ostream& stream, const std::vector<T>& v) 
{ 
    stream << '['; 
    for (auto i = v.begin(); i != v.end(); ++i) 
     stream << *i << ", \n"; 
    return stream << ']'; 
} 
int main() 
{ 
    std::vector<song> songs; 
    // .push_back your songs 
    std::random_shuffle(songs.begin(), songs.end()); 
    std::cout << songs; 
} 
+0

와우 흥미로운 ... 우리는 벡터에 익숙하지 않았지만 이것은 매우 단순 해 보입니다. 함수에 벡터 도 전달합니까? thnx again – gamergirl22

+0

음, 벡터는 기본적으로 동적 배열이지만 수동 크기 조정/해제 등으로 신경 쓰지 않아도됩니다. - random_shuffle은 템플릿 함수이고, 반복자를 전달하고, 첫 번째 점을 시작하고 마지막 점 다음에 끝납니다. 요소. – cooky451

+0

u 쿠키에 감사드립니다. u는 내가 제안 할까 << 벡터 셔플을 작성하려면? – gamergirl22

관련 문제