В этом коде я создаю массив структур и пытаюсь отсортировать массив структур на основе поля "arr_time". У меня возникла проблема с передачей массива структур по ссылке в функции sort_process () .

#include<iostream>
using namespace std;

struct process {
    public:
    int p_id,arr_time,burst_time,comp_time;
};

void sort_process( process x[],int len)
{
    int i,j;
    process temp;
    for(i=0;i<len;i++)
    {
        for(j=0;j<len-1;j++)
        {
            if(x[j].arr_time > x[j+1].arr_time)
            {
                temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
            }
        }
}


int main()
{
    int n,i=0,j=0,k=0,t=0,flag;
    cout<<"\n Enter number of processes : ";
    cin>>n;
    process p[n];

    for(i=0;i<n;i++)
        initialize(p[i]);   
    sort_process(p,n);  
    return 0;
}
0
Ritik Singh 16 Окт 2019 в 15:04
Нужен языковой тег
 – 
nicomp
16 Окт 2019 в 15:05
Передайте его как любой массив по ссылке: void sort_process( process (&)[len]). len должно быть cnostexpr.
 – 
Itachi Uchiwa
16 Окт 2019 в 16:09
Кстати, process p[n]; не является стандартным C ++. Вы должны либо обеспечить постоянный размер, либо лучше: используйте std::vector, если вместо этого вам нужен массив динамического размера.
 – 
Fareanor
16 Окт 2019 в 16:22

2 ответа

Вы можете просто использовать std::sort в заголовке <algorithm>:

std::sort(p, p+n, [](const process & p1, const process & p2){return p1 < p2}); // Will sort p in ascending order

Но если вы действительно хотите сделать это вручную и передать массив функции, вы можете создать функцию как:

void sort_process(process * x, std::size_t len) // copy the pointer
{
    std::sort(x, x+len, [](const process & p1, const process & p2){return p1 < p2;});
}

Но передача process x[] таким же образом эквивалентна.

Примечание. Поскольку мы ссылаемся на массив по указателю на его первый элемент, то, что вы здесь передаете, также является указателем на первый элемент (а не на массив).


Если вы действительно хотите передать его по ссылке, вы можете сделать это следующим образом:

void sort_process(process * const & x, std::size_t len)
{
    std::sort(x, x+len, [](const process & p1, const process & p2){return p1 < p2;});
}

Я добавил квалификатор const, чтобы запретить изменение указателя, поскольку это не копия, а ссылка на исходный.

Но, на мой взгляд, вы ничего не получите, передав здесь ссылку.

0
Fareanor 16 Окт 2019 в 16:04

Похоже, вы боитесь динамических массивов и указателей. Попробуй это:

#include<iostream>
using namespace std;

struct process
{
    int p_id, arr_time, burst_time, comp_time;

    void initialize()
    {
        p_id = arr_time = burst_time = comp_time = 0;
    }

    process()
    {
        p_id = arr_time = burst_time = comp_time = 0;
    }

    ~process() {}
};

void sort_process(process*& x, int len)
{
    int i, j;
    process temp;
    for (i = 0; i < len; i++)
    {
        for (j = 0; j < len - 1; j++)
        {
            if (x[j].arr_time > x[j + 1].arr_time)
            {
                temp = x[j];
                x[j] = x[j + 1];
                x[j + 1] = temp;
            }
        }
    }
}

int main()
{
    int n, i = 0, j = 0, k = 0, t = 0, flag;

    cout << "\n Enter number of processes : ";
    cin >> n;

    process* p = new process[n];

    for (i = 0; i < n; i++)
        p[i].initialize();

    sort_process(p, n);

    for (i = 0; i < n; i++)
        p[i].~process();
    delete[] p; p = 0;

    return 0;
}
0
Perotto 16 Окт 2019 в 17:15