1

Тема: Сalloc,malloc,new.

Підкажіть де я можу детально почитати про ці 3 функції в С++.

2

Re: Сalloc,malloc,new.

Ось тут є:

Подякували: "mamkin haker"1

3

Re: Сalloc,malloc,new.

https://uk.wikipedia.org/wiki/New_(C%2B%2B) new ( вікіпедія )

4

Re: Сalloc,malloc,new.

А для двохмірних масивів не знаєте де може бути інформація?

5 Востаннє редагувалося "mamkin haker" (11.05.2021 16:03:36)

Re: Сalloc,malloc,new.

Taras_2000 написав:

А для двохмірних масивів не знаєте де може бути інформація?

вікіпедія =_= https://uk.wikipedia.org/wiki/%D0%94%D0 … 0%B8%D0%B2 - масиви

2х вимірні масиви https://www.bestprog.net/uk/2017/03/04/ … %BC%D0%B0/

6

Re: Сalloc,malloc,new.

все є у відкритому доступі, вам лишень потрібно надрукувати в пошуковій строці свій запит -_-

тримай rofl відео на ютюбі як гуглити ( відео російською )

Прихований текст

7 Востаннє редагувалося Droid 77 (11.05.2021 16:10:03)

Re: Сalloc,malloc,new.

Taras_2000 написав:

А для двохмірних масивів не знаєте де може бути інформація?

Гадаю для початку треба пошукати десь там:

  • Вища математика

  • Чисельні методи в інформатиці

А вже потім шукати методи реалізації тією чи іншою обраною мовою програмування.

8 Востаннє редагувалося koala (11.05.2021 16:34:26)

Re: Сalloc,malloc,new.

Taras_2000 написав:

А для двохмірних масивів не знаєте де може бути інформація?

В C++ немає вбудованого типу для двовимірних масивів. Що є - я писав колись.

І так, new - оператор, а не функція.

Подякували: Taras_2000, leofun012

9

Re: Сalloc,malloc,new.

Накидав такий код

#include <iostream>
#include <ctime>
using namespace std;

int** create_arr(const int SIZE)
{
    int part, rows, columns;
    int** arr;
    cout << "1 - malloc\n2 - calloc\n3 - New\n\n Choose 1  2  3  to create arr\n:";
    cin >> part;
    

    switch (part)
    {
    case 1:
        arr = malloc(rows , columns);//Помилка:"Фун-я не приймає 2 аргументів"
        transpose(arr, rows, columns);// Індефікатор незнайдений 
        for (int i = 0; i < rows; i++)
        {
            free(arr[i]);
        }
        free(arr);
        break;
    case 2:
        arr = calloc(rows , columns );//Помилка:"Не можна перетворити void* в int**",При чому я не пам'ятаю що десь використовував void
        transpose(arr, rows, columns);
        for (int i = 0; i < rows; i++)
        {
            free(arr[i]);
        }
        free(arr);
        break;
    case 3:
        arr = New(rows, columns);
        transpose(arr, rows, columns);
        for (int i = 0; i < rows; i++)
        {
            delete[](arr[i]);
        }
        delete[](arr);
        break;
    default:
        cout << "Error";
    }
    return 0;
}
int** malloc(int rows, int columns)
{
    srand(time(NULL));
    int i, j;
    int** arr = (int**)malloc(columns * sizeof(int*));
    for (int i = 0; i < rows; i++)
    {
        arr[i] = (int*)malloc(columns * sizeof(int));
    }
    int A;
    cout << "Choose\n 1 - random\n 2 - manually\n\n";
    cin >> A;
    switch (A)
    {
    case 1:
        for (size_t i = 0; i < rows; i++)
        {
            for (j = 0; i < columns; j++)
            {
                arr[i][j] = 1 + rand() % 9;
                arr[0][0] = 9;
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    case 2:
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cin >> arr[i][j];
            }
        }
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    default:
        cout << "Error";
    }
    return arr;
}
int** calloc(int rows, int columns)
{
    srand(time(NULL));
    int i, j;
    int** arr = (int**)calloc(rows * sizeof(int*),columns * sizeof(int*));
    for (int i = 0; i < rows; i++)
    {
        arr[i] = (int*)calloc(rows * sizeof(int*),columns * sizeof(int));
    }
    int A;
    cout << "Choose\n  1 - random\n 2 - manually";
    cin >> A;
    switch (A)
    {
    case 1:
        for (size_t i = 0; i < rows; i++)
        {
            for (j = 0; i < columns; j++)
            {
                arr[i][j] = 1 + rand() % 9;
                arr[0][0] = 9;
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    case 2:
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cin >> arr[i][j];
            }
        }
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    default:
        cout << "Error";
    }
    return arr;
}
int** New(int rows, int columns)
{
    srand(time(NULL));
    int i, j;
    int** arr = (int**)malloc(columns * sizeof(int*));
    for (int i = 0; i < rows; i++)
    {
        arr[i] = (int*)malloc(columns * sizeof(int));
    }
    int A;
    cout << "Choose\n  1 - random\n 2 - manually";
    cin >> A;
    switch (A)
    {
    case 1:
        for (size_t i = 0; i < rows; i++)
        {
            for (j = 0; i < columns; j++)
            {
                arr[i][j] = 1 + rand() % 9;
                arr[0][0] = 9;
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    case 2:
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cin >> arr[i][j];
            }
        }
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    default:
        cout << "Error";
    }
    return arr;
}

int** transpose(int** arr, int Rows, int Columns)
{
    int i, j;
    int** tmp = new int* [Columns];
    for (i = 0; i < Columns; ++i)
        tmp[i] = new int[Rows];
    for (i = 0; i < Columns; ++i)
        for (j = 0; j < Rows; ++j)
            tmp[i][j] = arr[j][i];
    return tmp;
}
void delete_arr(int** arr, const int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        delete[] arr[i];
    }
    delete arr;
}
int main()
{
    srand(time(NULL));

    const int SIZE = 2;

    int** arr = create_arr(SIZE);         
    system("pause");
    return 0;
}

10

Re: Сalloc,malloc,new.

Taras_2000 написав:
arr = malloc(rows , columns);//Помилка:"Фун-я не приймає 2 аргументів"

Ем... я навіть не знаю, що додати. Все описано максимально точно. Перечитайте опис функції malloc

Taras_2000 написав:
transpose(arr, rows, columns);// Індефікатор незнайдений

Ну так, немає проголошення transpose до цього місця.

Taras_2000 написав:
arr = calloc(rows , columns );//Помилка:"Не можна перетворити void* в int**",При чому я не пам'ятаю що десь використовував void 

Коли виправите помилку з malloc, там буде те саме. Перечитайте опис функцій calloc і malloc, і особливо зверніть увагу на тип, що вони повертають.

Подякували: Taras_20001

11

Re: Сalloc,malloc,new.

Показує 0 помилок але коли заходити в список висвітлює 2:
1)LNK2019    посилання на недозволений зовнішній символ_main в функции "int __cdecl invoke_main(void)"
2)LNK1120    недозволених зовнішніх елементів: 1   
Неможу знайти цих 2 помилок, а все решту вроді як працює.

#include <iostream>
#include <ctime>
using namespace std;

int** malloc(int rows, int columns);
int** calloc(int rows, int columns);
int** New(int rows, int columns);
int** transpose(int** arr, int rows, int columns);

int maim()
{
    int part, rows, columns;
    int** arr;
    cout << "1 - malloc\n2 - calloc\n3 - New\n\n Choose 1  2  3  to create arr\n:";
    cin >> part;
    cout << "Rows=\n\nColumns=\n\n" << endl;
    cin >> rows >> columns;
    
    switch (part)
    {
    case 1:
        arr = malloc(rows , columns);
        transpose(arr, rows, columns);
        for (int i = 0; i < rows; i++)
        {
            free(arr[i]);
        }
        free(arr);
        break;
    case 2:
        arr = calloc(rows , columns);
        transpose(arr, rows, columns);
        for (int i = 0; i < rows; i++)
        {
            free(arr[i]);
        }
        free(arr);
        break;
    case 3:
        arr = New(rows, columns);
        transpose(arr, rows, columns);
        for (int i = 0; i < rows; i++)
        {
            delete[] arr[i];
        }
        delete[] arr;
        break;
    default:
        cout << "Error";
    }
    return 0;
}
int** malloc(int rows, int columns)
{
    srand(time(NULL));
    int i, j;
    int** arr = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++)
    {
        arr[i] = (int*)malloc(columns * sizeof(int));
    }
    int M;
    cout << "Choose\n 1 - random\n 2 - handmade\n\n";
    cin >> M;
    switch (M)
    {
    case 1:
        for (size_t i = 0; i < rows; i++)
        {
            for (j = 0; j < columns; j++)
            {
                arr[i][j] = 1 + rand() % 9;
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    case 2:
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cin >> arr[i][j];
            }
        }
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    default:
        cout << "Error";
    }
    return arr;
}
int** calloc(int rows, int columns)
{
    srand(time(NULL));
    int i, j;
    int** arr = (int**)calloc(rows * sizeof(int*),columns * sizeof(int*));
    for (int i = 0; i < rows; i++)
    {
        arr[i] = (int*)calloc(rows * sizeof(int*),columns * sizeof(int));
    }
    int A;
    cout << "Choose\n  1 - random\n 2 - handmade";
    cin >> A;
    switch (A)
    {
    case 1:
        for (size_t i = 0; i < rows; i++)
        {
            for (j = 0; j < columns; j++)
            {
                arr[i][j] = 1 + rand() % 9;
            
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    case 2:
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cin >> arr[i][j];
            }
        }
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    default:
        cout << "Error";
    }
    return arr;
}
int** New(int rows, int columns)
{
    srand(time(NULL));
    int i, j;
    int** arr = (int**)malloc(columns * sizeof(int*));
    for (int i = 0; i < rows; i++)
    {
        arr[i] = (int*)malloc(columns * sizeof(int));
    }
    int A;
    cout << "Choose\n  1 - random\n 2 - handmade";
    cin >> A;
    switch (A)
    {
    case 1:
        for (size_t i = 0; i < rows; i++)
        {
            for (j = 0; j < columns; j++)
            {
                arr[i][j] = 1 + rand() % 9;
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    case 2:
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cin >> arr[i][j];
            }
        }
        for (size_t i = 0; i < rows; i++)
        {
            for (size_t j = 0; j < columns; j++)
            {
                cout << arr[i][j] << " ";
            }
            cout << endl;
        }
        break;
    default:
        cout << "Error";
    }
    return arr;
}

int** transpose(int** arr, int rows, int columns)
{
    int i, j;
    int** tmp = new int* [columns];
    for (i = 0; i < columns; ++i)
    {
        tmp[i] = new int[rows];
    }
    for (i = 0; i < columns; ++i)
    {

        for (j = 0; j < rows; ++j)
        {
            tmp[i][j] = arr[j][i];
        }
        cout << endl;
    }
    return tmp;
    system("pause");
}

12

Re: Сalloc,malloc,new.

І кого це ви калічити зібралися? Функцію main?

Подякували: Taras_20001

13

Re: Сalloc,malloc,new.

Хех

koala написав:

І кого це ви калічити зібралися? Функцію main?

14

Re: Сalloc,malloc,new.

Ахаха

    return tmp;
    system("pause");
}
Подякували: Taras_20001

15 Востаннє редагувалося "mamkin haker" (11.05.2021 21:30:31)

Re: Сalloc,malloc,new.

чи то я сліпий , чи то в коді нема функції

int main(){}

???
таки її немає -_-

upd.

Прихований текст

/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

відкрий мене

заміни функцію

//10 стрічка
int maim()
//на
int main()
Подякували: Taras_20001

16

Re: Сalloc,malloc,new.

А, так ось кого ви покалічили!

Taras_2000 написав:
int** malloc(int rows, int columns);
int** calloc(int rows, int columns);

Будь ласка, видаліть ці два рядки з коду, а потім скопіюйте на форум визначення цих функцій зі стандарту (або будь-якого сайту, присвяченого мові C) та спробуйте просто поставити питання.

17

Re: Сalloc,malloc,new.

Гей була в мене рушниця
Та й дивчина-чарівниця
Та й коняка-розбишака
Залишилась гола срака

Або казочка про те як не треба плутати хрон з патісоном і чому С та С++ це різні мови.

був собі програміст, що плутав С та С++, та помер, бо не знав, яким чином собі прострелити ногу, тому прострелив собі
голову. кінець

Подякували: wander1

18

Re: Сalloc,malloc,new.

ХАХАХАХА

ur_naz написав:

Гей була в мене рушниця
Та й дивчина-чарівниця
Та й коняка-розбишака
Залишилась гола срака

Або казочка про те як не треба плутати хрон з патісоном і чому С та С++ це різні мови.

був собі програміст, що плутав С та С++, та помер, бо не знав, яким чином собі прострелити ногу, тому прострелив собі
голову. кінець

19

Re: Сalloc,malloc,new.

Перепрошую за попередній коментар, я неуважно прочитав код. Не звертайте на нього уваги.
Дуже не бажано називати власні функції так само як системні. Зокрема, в

int** calloc(int rows, int columns)
{
    srand(time(NULL));
    int i, j;
    int** arr = (int**)calloc(rows * sizeof(int*),columns * sizeof(int*));

у вас виникає небажана рекурсія.
Далі: у вас функції malloc, calloc (хоч би Malloc і Calloc назвали) і New на 80% складаються зі спільного коду, який заповнює масиви. Винесіть його з цих функцій в окрему функцію fill_array чи якось так.
Ну і у вас замість послідовних викликів, умовно,

create_arr();
fill_arr();
transpose();
release();

структура викликів, де кожна функція викликає наступну (а transpose - ще й виключно new).
Це погано. Переробіть на хоча б таке:

int kind /*1-calloc, 2-malloc, 3-new*/,
     rows=3, cols=5; //взагалі треба вводити
int **arr = create_arr(kind, rows, cols);
fill_array(arr, rows, cols);
print(arr, rows, cols);
int **transposed = create_array(kind, cols, rows);
transpose(arr, transposed, rows, cols);
print(transposed, cols, rows);
release(a, kind, rows, cols);
release(transposed, kind, cols, rows);
Подякували: ch0r_t, Arete, Taras_20003

20

Re: Сalloc,malloc,new.

Зараз би в 2021 році в процедурній мові робити функціональщину...
Зараз би в 2021 році не розуміти різницю між С та С++...
Зараз би в 2021 році писати юзеру ототопвзфіваждьопарафєіва.
Це ж глупство. За таке треба бити по пиці.
Я вже не кажу про назви і нульовий рівень абстракції.
Задача викладача, я вважаю, навчити писати код максимально не так, як ото тут понаписано.
Бо як і де працюють малок, чи калок, чи нью можна прочитати в довідниках. А як писати чистий код, мало де знайдеш.