С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 206

Параметры функции

21.03.2019, 08:43. Показов 3749. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня задание создать функцию по такому прототипу.
C++
1
int set_arr ( char* arr[], int size, int pos, char* str )
Так вот вопрос, что значит char* arr[] вот этот параметр? arr – внешний массив размерностью size элементов (все элементы массива arr должны быть инициализированы в значение NULL вне функции). Он двумерный?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2019, 08:43
Ответы с готовыми решениями:

Параметры функции: параметры по умолчанию
помогите пожалуйста понять. void foo(int a, int b, int c=1){std::cout << a << "\t" << b << "\t" << c << '\t';} int main(){ ...

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

Какими способами можно использовать функции класса B, как параметры функции Sub класса А?
class A {... void Sub(...); ...} class B : ... { public: float f1(float); float f2(float); ...

33
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 206
21.03.2019, 19:22  [ТС]
Студворк — интернет-сервис помощи студентам
nd2, вы правы. С cin.getline(str,N); заработало

Добавлено через 1 минуту
nd2, а мне для arr[i] выделить столько же, сколько и для str?

Добавлено через 5 минут
Цитата Сообщение от remag7 Посмотреть сообщение
Функция print_arr должна иметь в качестве аргумента
(единственного) структуру с необходимой информацией
Вот этот момент не ясен. Мне нужно присвоить массив arr в массив, который находится в структуре?
0
 Аватар для dreamer_108
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
21.03.2019, 19:24
Цитата Сообщение от remag7 Посмотреть сообщение
присвоить массив arr в массив, который находится в структуре
Указатель на этот массив, да

Добавлено через 38 секунд
Цитата Сообщение от remag7 Посмотреть сообщение
для arr[i] выделить столько же, сколько и для str?
Для него выдели размер size - он ведь у тебя определен статически
0
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 206
21.03.2019, 19:28  [ТС]
dreamer_108, arr[i]= (char*)malloc(N * sizeof(char)); вот так ? Мне получается нужно будет удалить для str и для arr[i] потом?
0
 Аватар для dreamer_108
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
21.03.2019, 19:31
да, все верно.
Для arr выделить так:
C++
1
arr = (char**) malloc(sizeof(char*) * size);
А для каждого элемента arr так:
C++
1
arr[pos] = (char*) malloc(sizeof(char) * N);
А в конце вызвать free сначала для каждого элемента arr, а потом для самого arr
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.03.2019, 19:34
Цитата Сообщение от remag7 Посмотреть сообщение
nd2, а мне для arr[i] выделить столько же, сколько и для str?
Выделено там всё уже, в main(). Под str выделяется, чтобы можно было туда читать, потом это значение str, заносится в arr[i].
1
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 206
21.03.2019, 19:39  [ТС]
nd2, то есть Это лишнее?
C++ (Qt)
1
2
3
for (int i = 0;i < size;i++) {
        arr[i]= (char*)malloc(N * sizeof(char));
    }
C++ (Qt)
1
2
3
struct arr1{
    char*arr[5];
}arr2;
arr2.arr=arr; Вот тут ошибку выдаёт.
0
 Аватар для dreamer_108
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
21.03.2019, 19:43
Цитата Сообщение от remag7 Посмотреть сообщение
rr[i]= (char*)malloc(N * sizeof(char));
Для чего? Ты ведь выделяешь эту память при чтении в str в функции set_arr
0
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 206
21.03.2019, 19:49  [ТС]
dreamer_108, там написано, что статически задаётся, то есть arr = (char**) malloc(sizeof(char*) * size); не подходит. Мне препод в прошлый раз сказал, что нужно char *arr[size];

Добавлено через 4 минуты
Как всё сложно -_-
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.03.2019, 19:51
remag7, задание так написано, что трудно понять, что нужно. Например, вот это:
Размер под каждую строку str выделяется внутри функции set_arr.
Про память под строкой речь, или о количестве символов? Зачем, вообще, передавать в функцию указатель на строку, если потом он сохраняется в массиве указателей?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
21.03.2019, 19:51
Лучший ответ Сообщение было отмечено remag7 как решение

Решение

Цитата Сообщение от dreamer_108 Посмотреть сообщение
. Выделяешь память для char** размером sizeof(char*) * size
нахрена козе баян
тут требуется массив указателей
вот так например
C
1
2
3
4
5
6
char * arr[2]={NULL,NULL);
char str1[]="строка один";
char str2[]="строка два";
arr[0]=srt1;
arr[1]=str2;
printf("%s %s",arr[0],arr[1]);
где в каком месте двумерный массив?
2
 Аватар для dreamer_108
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
21.03.2019, 19:51
Лучший ответ Сообщение было отмечено remag7 как решение

Решение

Цитата Сообщение от remag7 Посмотреть сообщение
там написано, что статически задаётся, то есть arr = (char**) malloc(sizeof(char*) * size); не подходит. Мне препод в прошлый раз сказал, что нужно char *arr[size];
написано, что статически задается сам size) Ну тогда под arr память специально выделять вообще не нужно.
Задай только size с помощью #define:
C++
1
#define SIZE 100
Цитата Сообщение от remag7 Посмотреть сообщение
arr2.arr=arr; Вот тут ошибку выдаёт.
Ну заделай вот такую структуру:
C++
1
2
3
4
5
struct ArrayInfo
{
    char** arr;
    int size;
};
И потом в мейне:
C++
1
2
3
ArrayInfo arrInfo;
    arrInfo.arr = arr;
    arrInfo.size = size;
А эту структуру уже отправишь в функцию, которая удаляет твой массив

UPD: Ну и освобождать arr тогда не нужно будет в конце
0
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 206
21.03.2019, 21:11  [ТС]
dreamer_108, реально работает

Добавлено через 12 минут
ValeryS, я вот не понимаю, вроде одно и тоже делают,но называются по-разному. Что то массив со строками, что это char **arr и char*arr[N] . Так в чём разница?

Добавлено через 56 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
#include<conio.h>
#include<Windows.h>
#include<cstring>
using namespace std;
const int N = 101;
struct ArrayInfo
{
    char** arr;
    int size;
};
int set_arr(char* arr[], int size, int pos, char* str) {
    str = (char*)malloc(N * sizeof(char));
    cin.getline(str,N);
    arr[pos] = str;
    return 0;
}
void print_arr(ArrayInfo arr2) {
    for (int i = 0;i < arr2.size;i++) {
        cout << "Строка " << i + 1 <<" "<< arr2.arr[i] << endl;
    }
}
    void delete_arr(ArrayInfo arr2) {
        for (int i = 0;i < arr2.size;i++) {
            free(arr2.arr[i]);
        }
 
}
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int x;
    const int size = 5;
    char *arr[size];
    char *str=NULL;
    int pos;
    for (int i = 0;i < size;i++) {
        arr[i] = NULL;
    }
    for (pos  = 0;pos < size;pos++) {
        cout << "Введите " << pos + 1 << " строку ";
        x= set_arr(arr, size, pos, str);
        if (x == 1) {
            cout << "Ошибка!";
            pos  = 0;
        }
    }
    cout << endl;
    ArrayInfo arrInfo;
    arrInfo.arr = arr;
    arrInfo.size = size;
    print_arr(arrInfo);
    delete_arr(arrInfo);
    _getche();
    return 0;
}
Вот. Вроде всё готово. Правда не знаю, правильно или нет, но работает и без ошибок компиляции
0
 Аватар для dreamer_108
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
21.03.2019, 21:12
Цитата Сообщение от remag7 Посмотреть сообщение
я вот не понимаю, вроде одно и тоже делают,но называются по-разному
Когда ты объявляешь массив с помощью char arr[N], помять под него выделяется автоматически.
Когда ты объявляешь char* arr, ты получаешь только указатель, а выделить и освободить память тебе нужно вручную (с помощью malloc и free или new и delete)
На деле, arr[N] тоже является указателем на этот массив, так что с точки зрения типа это абсолютно одно и то же

Добавлено через 38 секунд
Цитата Сообщение от remag7 Посмотреть сообщение
Правда не знаю, правильно или нет, но работает и без ошибок компиляции
Ну запусти и протестируй
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
21.03.2019, 21:37
Лучший ответ Сообщение было отмечено remag7 как решение

Решение

Цитата Сообщение от remag7 Посмотреть сообщение
Что то массив со строками, что это char **arr и char*arr[N] . Так в чём разница?
это далеко не одно и тоже, хотя результат может быть и идентичным
почитай что такое указатели
например телефонная книга
есть номер и есть адрес
адрес это и есть указатель, указатель указывает на конкретный адрес, но если дом снесли(оператор delete или free)
то дома нет а адрес, сиречь указатель, остался

Добавлено через 5 минут

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
это далеко не одно и тоже, хотя результат может быть и идентичным
вспомнилось "Хоть пнем о сову, хоть сову о пень, сове все одно конец"

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2019, 21:37
Помогаю со студенческими работами здесь

Параметры функции
Нужна помощь со строкой, где вызывается функция Min(38). А точнее с параметрами. Никогда не сталкивался с &quot;? :&quot;. Какие параметры...

Параметры функции
Как передать в функцию в качестве параметра масив ???

Параметры функции
Читаю книгу увидел не понятные для меня параметры. int function(int ,int ,char s&amp;); Объясните что это за параметры, и как с ними...

Параметры функции
load(n,a);как называются эти параметры void load (int n,doble* a) а как называются эти?

Функции и их параметры
Здравствуйте, в C++ я абсолютный новичок, но с некоторыми другими языками знаком (на любительском уровне). По теме: например в AHK при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru