Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140

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

07.08.2014, 12:23. Показов 1659. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Файл с реализацией:
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
int Init_can::Send(int* msgdata[])
{
        //Send
        canmsg_t tx;
        ULONG   ulWritten;
        ZeroMemory(tx.data,  8);
        
        
        memcpy(tx.data, g_byData, 8);
        
        tx.flags    = 0;
        tx.id       = 1;
        tx.length   = 8;
        OVERLAPPED ov;
        memset(&ov, 0, sizeof(OVERLAPPED));
        ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
 
        memcpy(tx.data, msgdata, 8);
        tx.data[0] = 1;
        tx.data[1] = 2;
        tx.data[2] = 3;
        tx.data[3] = 4;
        tx.data[4] = 5;
        tx.data[5] = 16;
        tx.data[6] = 0xf;
        tx.data[7] = 1;
        acCanWrite(port0, &tx, 1, &ulWritten, &ov);
        return 0;
}
файл с использованием функции:
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
void CTestCanDlg::OnBnClickedButton6()
{
    // TODO: Add your control notification handler code here
    TCHAR str1[5];
    int tempdatamsg[8];
    
    GetDlgItemText(IDC_EDIT4, str1, 4);
    int msg1;
    msg1 = _wtoi(str1);
    tempdatamsg[0] = msg1;
 
    GetDlgItemText(IDC_EDIT5, str1, 4);
    int msg2;
    msg2 = _wtoi(str1);
    tempdatamsg[1] = msg2;
 
    GetDlgItemText(IDC_EDIT6, str1, 4);
    int msg3;
    msg3 = _wtoi(str1);
    tempdatamsg[2] = msg3;
 
    GetDlgItemText(IDC_EDIT7, str1, 4);
    int msg4;
    msg4 = _wtoi(str1);
    tempdatamsg[3] = msg4;
 
    GetDlgItemText(IDC_EDIT8, str1, 4);
    int msg5;
    msg5 = _wtoi(str1);
    tempdatamsg[4] = msg5;
 
    GetDlgItemText(IDC_EDIT9, str1, 4);
    int msg6;
    msg6 = _wtoi(str1);
    tempdatamsg[5] = msg6;
 
    GetDlgItemText(IDC_EDIT10, str1, 4);
    int msg7;
    msg7 = _wtoi(str1);
    tempdatamsg[6] = msg7;
 
    GetDlgItemText(IDC_EDIT11, str1, 4);
    int msg8;
    msg8 = _wtoi(str1);
    tempdatamsg[7] = msg8;
    
    can.Send(&tempdatamsg); //error C2664: 'Init_can::Send' : cannot convert parameter 1 from 'int (*__w64 )[8]' to 'int *[]'
}
В строке 47 второго файла возникает ошибка. Чего от меня хочет компилятор?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.08.2014, 12:23
Ответы с готовыми решениями:

Передача массива в функцию в качестве параметра
Приветствую. Начал познавать замечательный С++ и сразу столкнулся с проблемой - передачей массивов в функцию "по значению". То...

Передача двумерного динамического массива в функцию в качестве параметра
Вообщем надо сложить и умножить две матрицы, но сделать это в отдельных функциях. Матрицы заданы динамическими массивами размерами n*m и...

Передача файла в функцию в качестве параметра
Здравствуйте! Подскажите, как передать файловый поток в функцию? int main() { ifstream fin("my file.txt"); ... ...

12
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
07.08.2014, 12:38  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
[0]
а вот этот ноль что значит? Нулевой элемент массива передавать?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.08.2014, 12:41
Убери указатель, т.е.:
... Send( int msgdata[] ) { … }
...
... can.Send( tempdatamsg );
1
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
07.08.2014, 12:51  [ТС]
castaway,
Так, программа скомилиласть, сейчас потестю, отпишусь

Добавлено через 7 минут
В принципе работает, но криво. Думаю косяк в моей функции. Спасибо за помощь!
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
07.08.2014, 17:04
C++ - Передача массива в функцию в качестве параметра
Параметр функции не может быть массивом.
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
07.08.2014, 17:08  [ТС]
Цитата Сообщение от gru74ik Посмотреть сообщение
Параметр функции не может быть массивом.
Да? А почему у меня получилось?) Или Вы не знаете что такое параметры функции?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.08.2014, 19:32
Цитата Сообщение от takhvatulin Посмотреть сообщение
Да? А почему у меня получилось?) Или Вы не знаете что такое параметры функции?
Массив в С и С++ - это не объект первого класса. Его нельзя копировать по значению (только поэлементно), поэтому в языках С и С++ тип массива в параметрах функции приводится к указателю на тот же тип. Легко проверить таким кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cstdio>
 
void f(int a[256]) // подразумевается f(int * a)
{
    printf("sizeof: %d\n", sizeof(a)); // как правило здесь будет 4, размер указателя на х86
}
 
int main()
{
    int a[256] = {};
    f(a);
}
Ссылка на онлайн компилятор.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
07.08.2014, 19:48
Цитата Сообщение от takhvatulin Посмотреть сообщение
Да? А почему у меня получилось?) Или Вы не знаете что такое параметры функции?
У Вас получилось в качестве параметра функии передавать указатель, а не массив.

Пруф:
Кликните здесь для просмотра всего текста

Цитата Сообщение от Стивен Прата
Функции и двумерные массивы

При написании функции, которая принимает в качестве аргумента двумерный
массив, необходимо помнить, что имя массива трактуется как его адрес, поэтому
соответствующий формальный параметр является указателем
— так же, как и в случае
одномерного массива. Сложность заключается в том, чтобы правильно объявить
указатель. Предположим, например, что вы начинаете с такого кода:
int data[3][4] = {{1,2,3,4}, {9,8,7,6}, {2,4,6,8}};
int total = sum(data, 3);
Как должен выглядеть прототип sum () ? И почему функция передает количество
строк (3), но не передает количество столбцов (4)?
Итак, data — имя массива из трех элементов. Первый элемент сам по себе является
массивом их четырех значений типа int. To есть тип data — это указатель на массив
из четырех int, поэтому соответствующий прототип должен быть таким:
int sum(int (*ar2)[4], int size);
Скобки необходимы, потому что показанное ниже объявление определило бы
массив их четырех указателей на int вместо одного указателя на массив из четырех int,
а параметр функции не может быть массивом:
int *ar2[4]
Существует альтернативный формат, который означает в точности то же самое,
что и первый прототип, но, возможно, является более простым для чтения:
int sum(int ar2[][4], int size);
И тот, и другой прототип устанавливает, что аr2 — указатель, а не массив. Также
обратите внимание, что тип указателя явно говорит о том, что он указывает на массив
из четырех int. Таким образом, тип указателя задает количество столбцов — вот
почему количество столбцов не передается в отдельном аргументе функции.
Поскольку тип указателя задает количество столбцов, функция sum () работает
только с массивами из четырех столбцов. Однако количество строк задается
переменной size, поэтому sum() может работать с произвольным количеством строк:
int а[100][4];
int b[6][4];
...
int total1 = sum(a, 100); // сумма всех элементов а
int total2 = sum(b, 6); // сумма всех элементов b
int total3 = sum(a, 10); // сумма первых 10 строк а
int total4 = sum(a+10, 20); // сумма следующих 20 строк а
Зная, что аr2 — указатель на массив, как его можно использовать в определении
функции? Простейший способ — работать с аr2 как с именем двумерного массива.
Вот возможный вариант определения функции:
C++
1
2
3
4
5
6
7
8
int sum(int ar2[][4], int size) 
{ 
int total = 0; 
for (int r = 0; r < size; r++) 
for (int с = 0; с < 4; C++) 
total += ar2[r][c] ; 
return total; 
}
Еще раз обратите внимание, что количество строк передается в параметре size,
но количество столбцов является фиксированным и равно 4, как в объявлении аr2,
так и во вложенном цикле.
Вот почему можно использовать нотацию массивов. Поскольку аr2 указывает на
первый элемент (элемент 0) массива, элементы которого являются массивами из четырех
int, то выражение аr2+r указывает на элемент номер r. Таким образом, аr2[r] — это
элемент номер r. Этот элемент сам по себе является массивом из четырех int, поэтому
аr2[r] — имя этого массива из четырех int. Применение индекса к имени массива дает
нам его элемент, поэтому аr2[r][с] — элемент массива из четырех int, т.е. отдельное
значение типа int. Для получения данных указатель аr2 должен быть разыменован
дважды. Простейший способ сделать это — дважды использовать квадратные скобки,
как в аr2[r][с]. Если это неудобно, можно два раза применить операцию *:
C++
1
аr2[r][с] == *(*(аr2 + r) + с)  // одно и то же
Чтобы понять это, понадобится разобрать выражение по частям, начав изнутри:
C++
1
2
3
4
5
6
7
ar2                 // указатель на первую строку — массив из 4 int 
ar2 + r             // указатель на строку r (массив из 4 int) 
*(ar2 + r)          // строка r (массив из 4 int, следовательно, имя массива, 
                    // таким образом, указатель на первый int в строке, т.е. ar2[2])
*(ar2 + r) + c      // указатель на элемент int под номером с в строке r, 
                    // т.е. аr2[r] + с 
*(*(аr2 + r) + с    // значение int под номером с в строке r, т.е. аr2[r][с]
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.08.2014, 21:00
На всякий случай
Ошибка Lvalue required
1
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
08.08.2014, 12:08  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Убери указатель, т.е.:
... Send( int msgdata[] ) { … }
...
... can.Send( tempdatamsg );
Я сделал так. Где здесь указатель?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.08.2014, 12:29
takhvatulin, они рассказывают как это выглядит изнутри. Просто по своей сути [] и есть в данном случае указатель.
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
08.08.2014, 12:30  [ТС]
Ясно. Меня, во всяком случае, интересовал лишь верхний уровень
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.08.2014, 13:38
Цитата Сообщение от takhvatulin Посмотреть сообщение
Я сделал так. Где здесь указатель?
C++
1
Send(int msgdata[]) // подразумевается Send(int * msgdata)
Здесь msgdata на самом деле указатель. Это подразумевается, хоть и синтаксически выглядит, что это массив. Да, это костыль, но это есть и никуда от этого не деться (ну кроме смены языка).

Цитата Сообщение от takhvatulin Посмотреть сообщение
Ясно. Меня, во всяком случае, интересовал лишь верхний уровень
Это и есть верхний уровень т.к. объясняется в любой вменяемой книжке для начинающих. В любом случае без знания этих базовых вещей в С\С++ не обойтись, совсем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.08.2014, 13:38
Помогаю со студенческими работами здесь

Передача файла в функцию в качестве параметра
Имеется такой код, который, по идее, должен создавать файл с записями и кое-как их потом преобразовывать. Проблема в том, что файл не...

Передача функции в качестве параметра в другую функцию
Задание стоит следующее: Написать программу, содержащую две функции. Первая функция, вычисляющая определитель второго порядка располагается...

Функции, передача массива в качестве параметра
Приветствую) Собственно, есть простенькое задание с двумерными массивами, оно выполнено: #include &lt;iostream.h&gt; #include...

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

Передача двумерного массива указателей на char в качестве параметра функции
Есть массив char *result2; Нужно передать его в функцию void defDouble(???) в качестве одного из параметров . Как будет выглядеть...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru