2016-09-12 4 views
-2

Я хочу сортировать текстовый файл, используя сортировку слияния. Я использую вектор для обработки текстового файла. Эта программа компилируется правильно, но когда я ее запускаю, она показывает ошибку сегментации (сбрасывание ядра). Я много пробовал, но все напрасно. Может ли кто-нибудь помочь мне в этом. Заранее спасибо.Я передаю вектор функции. Программа компилируется, но когда я ее запускаю, она показывает ошибку сегментации (основной дамп).

vector<string> sV; 
void merge(vector<string> & sV, int l, int m, int r) 
{ 
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 = r - m; 

    vector<string> sV1; 
    vector<string> sV2; 

    for (i = 0; i < n1; i++) 
    sV1[i] = sV[l+1]; 
    for (j = 0; j < n2; j++) 
    sV2[j] = sV[m + 1 + j]; 

    i = 0; 
    j = 0; 
    k = l; 
    while (i < n1 && j < n2) 
    { 
     if (sV1[i] <= sV2[j]) 
     { 
     sV[k] = sV1[i]; 
     i++; 
     } 
     else 
     { 
     sV[k] = sV2[j]; 
     j++; 
     } 
    k++; 
    } 

    while (i < n1) 
    { 
    sV[k] = sV1[i];  
    i++; 
    k++; 
    } 
    while (j < n2) 
    { 
    sV[k] = sV2[j]; 
    j++; 
    k++; 
    } 
} 

void mergeSort(vector<string> & sV, int l, int r) 
    { 
    if (l < r) 
    { 
     int m = l+(r-l)/2; 
     mergeSort(sV, l, m); 
     mergeSort(sV, m+1, r); 
     merge(sV, l, m, r); 
    } 
    } 

int main() 
    { 
    string word; 
    char ch, ch1; 

    ifstream tin("a1.txt"); 
    ofstream outp("out.txt"); 
    if(!tin.is_open()) 
    cout << "Unable to open file :) \n"; 

    while(tin >> word) 
    sV.push_back(word); 

    mergeSort(sV, 0, sV.size() - 1); 
    for (size_t i = 0; i < sV.size(); i++) { 
    outp<< sV[i] << " "; 
    } 
return 0; 
} 
+5

активизировали вас через вашу программу в отладчике? Где именно происходит segfault? – Angew

+0

Локальные векторы 'sV1' и' sV2' пусты. Вы не можете индексировать их до тех пор, пока не добавите некоторые элементы. –

+0

Если переход через программу занимает слишком много времени, получите дамп ядра (вам может потребоваться установить «ulimit -c unlimited» и перезапустить программу), подать его в отладчик (в gdb, это «путь gdb/to/the/binary path/to/the/dump ") и проверьте стек вызовов (в gdb, это« bt »). –

ответ

1

Вы не можете просто создать вектор и присвоить значение точно так же, как массив. Вам нужно сначала вызвать вектор :: push_back(), который увеличит размер.

как только это сделано, вы можете получить доступ к элементу, используя индекс []

+1

если и только если [index] где index Ceros

+0

спасибо @Dkg .. :) –

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

  • Нет связанных вопросов^_^