Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

error: cannot convert ‘int (*)[4]’ to ‘int**’ | SWAPPING ARRAYS

I am trying to write a function that swap two arrays in O(1) time complexity. However, when i try to write the function parameters, I get the error:

error: cannot convert ‘int (*)[4]’ to ‘int**’

Here is my code:

#include <iostream>
using namespace std;


void swap_array_by_ptr(int* a[], int* b[]) {
    int* temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int fr[] = {1,2,3,4};
    int rv[] = {4,3,2,1};
    
    swap_array_by_ptr(&fr, &rv);
    
    for (int i = 0; i < 4 ; i++) {
        cout << fr[i] << " ";
    }
    
    cout << endl;
    
    for (int i = 0; i < 4 ; i++) {
        cout << rv[i] << " ";
    }
}

However, when i tried to define the arrays with ‘new’ command, this works as expected as below:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

#include <iostream>
using namespace std;


void swap_array_by_ptr(int** a, int** b) {
    int* temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int fr = new int[4]{1,2,3,4};
    int rv = new int[4]{4,3,2,1};
    
    swap_array_by_ptr(&fr, &rv);
    
    for (int i = 0; i < 4 ; i++) {
        cout << fr[i] << " ";
    }
    
    cout << endl;
    
    for (int i = 0; i < 4 ; i++) {
        cout << rv[i] << " ";
    }
}

Is there any way that i can define the arrays with [] method and swap the arrays by sending these arrays with ‘&array’ method ?

As I believe, there must be a way to do that, I only achieve this when I’m trying to do with ‘new’ method. However, is there any way to swap two arrays in O(1) complexity with sending parameters as
swap_array_by_ptr(&fr, &rv);
?

Thanks for help.

>Solution :

You can not swap two arrays with O( 1 ). You need to swap each pairs of corresponding elements of two arrays.

In the first program

int fr[] = {1,2,3,4};
int rv[] = {4,3,2,1};

swap_array_by_ptr(&fr, &rv);

the expressions &fr and &rv have type int( * )[4] while the corresponding function parameters in fact has the type int **

void swap_array_by_ptr(int* a[], int* b[]) {

after adjusting the parameters having array types to pointers to the array element types by the compiler.

So the compiler issues an error.

You could use standard function std::swap declared in the header <utility> the following way

std::swap( fr, rv );

But in any case its complexity is O( n ).

In the second program there are at least typos. Instead of

int fr = new int[4]{1,2,3,4};
int rv = new int[4]{4,3,2,1};

you have to write

int *fr = new int[4]{1,2,3,4};
int *rv = new int[4]{4,3,2,1};

In this case you are not swapping arrays themselves. That is the arrays will still store their initial values. You are swapping pointers that point to the dynamically allocated arrays.

To be sure that arrays are not swapped consider the following demonstration program.

#include <iostream>
using namespace std;


void swap_array_by_ptr(int** a, int** b) {
    int* temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int fr[] = { 1,2,3,4};
    int rv[] = {4,3,2,1};

    int *p1 = fr;
    int *p2 = rv;
    
    swap_array_by_ptr( &p1, &p2 );
    
    for (int i = 0; i < 4 ; i++) {
        cout << p1[i] << " ";
    }
    
    cout << endl;
    
    for (int i = 0; i < 4 ; i++) {
        cout << p2[i] << " ";
    }

    cout << endl;

    for (int i = 0; i < 4 ; i++) {
        cout << fr[i] << " ";
    }
    
    cout << endl;
    
    for (int i = 0; i < 4 ; i++) {
        cout << rv[i] << " ";
    }

    cout << endl;
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading