Adrikk
@Adrikk
Студент

Массив не передается полностью в функцию потока. Объясните в чем проблема?

Добрый вечер, подскажите пожалуйста в чем моя ошибка?
У меня задача создать дополнительный поток, который сортирует массив заполненный случайными числами(от 1 до m) в основном потоке(пример на малом кол-ве элементов = 5)
Если запустить код, сперва будет выведен заполненный массив из основного потока, потом выведен переданный массив в поток, потом отсортированный массив.
Проблема в том, что переданный в поток массив передается порой не полностью т.е. то только 2 элемента то бывает передадутся все 5. Не понимаю в чем проблема..5c6ead6178acd732415309.png
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
 
using namespace std;
//структура содержащая 2 массива и переменную, которая по сути отвечает за кол-во элементов в массивах
typedef struct structArray
{
        int firstSortedArray[4];
        int secondSortedArray[4];
        int m;
}structArray;
 
//функция сравнения для qsort
int compare (const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}
 
//функция потока
DWORD WINAPI firstSort(LPVOID Param){
    structArray *s=(structArray*)Param;
    for(int i=0;i<s->m;i++)
    cout<< i <<" элемент до сортировки массива:" << s->firstSortedArray[i] << endl;
    
    cout<<"----------После сортировки---------" << endl;
    qsort(s->firstSortedArray,s->m,sizeof(int),compare);
    
    for(int i=0;i<s->m;i++)
    cout<< i <<" элемент после сортировки массива:" << s->firstSortedArray[i] << endl;
return 0;
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    int num;
    
    structArray* s=new structArray;
    s->m=5;
    srand (time(NULL));
    //Заполнение случайными значениям от 1 до м массивов
    for(int i=0;i<s->m;i++){
        num=rand() % s->m +1;
        s->firstSortedArray[i]=num;
        cout<<i<<"элемент массива заполненный в основном потоке:"<<s->firstSortedArray[i] << endl;
        s->secondSortedArray[i]=num;
    }
    cout<<"----------Работа второго потока-------------" << endl;
    DWORD dwThreadId;
    HANDLE hThread = CreateThread(0,0,firstSort,s,0,&dwThreadId);
    WaitForSingleObject(hThread,5000);
    TerminateThread(hThread,dwThreadId);
    
return 1;
}
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
@res2001
Developer, ex-admin
Выход за границу массива тут:
for(int i=0;i<s->m;i++){
...
   s->secondSortedArray[i]=num;
}

У вас количество элементов в обоих массивах 4, а m вы инициализируете 5. При последнем присваивании secondSortedArray происходит выход за границу массива, а т.к. после secondSortedArray в структуре идет m, то m у вас заменяется последним рандомным значением.
В firstSortedArray то же есть выход за границу массива, но это не носит деструктивных последствий.
Подобные вещи часто приводят к краху программы. Вы могли бы это отловить в отладчике. Пользуйтесь им. Отладчик - друг программиста! :-)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы