2011-12-05 7 views
0

벡터에 파일을 쓰고 파일을 읽고 벡터를 다시 읽고 벡터에서 임의의 요소를 선택해야하는 ns3 응용 프로그램을 작성했습니다. 이 코드는 다음과 같습니다.문자열 할당 오류

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cassert> 
#include "ns3/core-module.h" 
#include "ns3/network-module.h" 
#include "ns3/internet-module.h" 
#include "ns3/point-to-point-module.h" 
#include "ns3/applications-module.h" 
#include "ns3/mf-helper.h" 
#include "ns3/ipv4-static-routing-helper.h" 
#include "ns3/ipv4-list-routing-helper.h" 
#include "ns3/data-rate.h" 

#include "ns3/mobility-module.h" 
#include "ns3/wifi-module.h" 
#include "ns3/ideal-wifi-manager.h" 
#include "ns3/wifi-remote-station-manager.h" 
#include "ns3/wifi-mode.h" 
using namespace ns3; 
using namespace std; 

void writeFile(string, vector<string>); 
void readFile(string, vector<string> &); 
unsigned int Random(int,int); 
bool Find(vector<string> , string); 
void selectNodes(vector<string>); 

vector<string> senders; 

int main(int argc, char **argv) 
{ 
    vector<string> vect; 
    vect.push_back("10.1.1.1"); 
    vect.push_back("10.1.1.2"); 
    vect.push_back("10.1.1.3"); 
    vect.push_back("10.1.1.4"); 
    vect.push_back("10.1.1.5"); 
    vect.push_back("10.1.1.6"); 
    vect.push_back("10.1.1.7"); 

    writeFile("data.txt", vect); 

    vector<string> ret; 
    readFile("data.txt",ret); 
    selectNodes(ret); 
} 

void writeFile(string name, vector<string> vs) 
{ 
    ofstream outfile(name.c_str(), ios::out); 
    ostream_iterator<string> oi(outfile, "\n"); 
    copy(vs.begin(), vs.end(), oi); 
} 

void readFile(string name, vector<string> &vect) 
{ 
    ifstream file(name.c_str()); 
    copy(istream_iterator<string> (file), istream_iterator<string>(), back_inserter(vect)); 
} 

void selectNodes(vector<string> ret) 
{ 
    srand(time(NULL)); 

    string src; 
    string dest; 

    unsigned int s= ret.size(); 
    src = ret[Random(1,s)]; 
    dest = ret[Random(1,s)]; 


    while(Find(senders, src)) 
    { 
     src = ret[Random(1,s)]; 
    } 

    while (src == dest) 
    { 
     src = ret[Random(1,s)]; 
     if (dest != src) 
      break; 
    } 

    cout << "##Source: " << src << std::endl; 
    cout << "##Destination: " << dest << std::endl; 

    senders.push_back(src); 
} 

unsigned int Random(int nLow, int nHigh) 
{ 
    return (rand() % (nHigh - nLow + 1)) + nLow; 
} 

bool Find(vector<string> senders, string addr) 
{ 
    for(unsigned int i=0;i<senders.size();i++) 
     if(senders[i] == addr) 
      return 1; 
    return 0; 
} 

이 코드는 무작위로 충돌합니다. gdb가 말하는 것입니다

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0xfffffffffffffff8 
0x00007fff8ad5a220 in std::string::_Rep::_M_grab() 
(gdb) bt 
#0 0x00007fff8ad5a220 in std::string::_Rep::_M_grab() 
#1 0x00007fff8ad5a29b in std::string::assign() 
#2 0x0000000100002a31 in selectNodes ([email protected]) at test_write.cc:74 
#3 0x0000000100003cf5 in main (argc=1, argv=0x7fff5fbff998) at test_write.cc:49 

왜 문자열 할당이 실패합니까? 나는 어떤 사람들은 메모리 누출로 인해 이런 멍청이가 있음을 발견했다. 그러나 여기서는 그렇지 않습니다. 내가 놓친 게 있니?

답변

3

이 라인에 문제가 있습니다. 색인 ~ ret의 최대 값은 s-1입니다.

그래서 솔루션입니다, 하나이 쓰기 :

src = ret[Random(1,s-1)]; 
dest = ret[Random(1,s-1)]; 

또는으로 Random 정의는 수학적으로하기 때문에, 위의 제안 난 당신이 Random을 redine을 제안

unsigned int Random(int nLow, int nHigh) 
{ 
    return (rand() % (nHigh - nLow + 1)) + nLow - 1; 
} 

Random[nLow, nHigh) 범위의 값을 생성합니다. Dikkstra는 이에 대한 건전한 논거를 제시했습니다. 이 읽기 : 그런데

, 당신은 참조에 의해 벡터 인수를 받아 들여야한다.

+1

edsger 링크의 경우 –

+0

그건 내 바보 같았 어! 이것과 링크를 지적 해 주셔서 감사합니다. –

2

불법 인덱스가있는 벡터에 액세스하는 것이 문제라고 저는 말할 것입니다. 벡터는 다른 C 및 C++ 배열과 마찬가지로 0에서 size-1까지의 인덱스를가집니다. Random 전화를 Random(0, s - 1)으로 변경하십시오.

src = ret[Random(1,s)]; 
dest = ret[Random(1,s)]; 

Random 반환 범위를 벗어 s에 동일한 수의 값 때문에 :