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

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

02.04.2019, 11:12. Показов 1320. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Выделил суть проблемы.
Создаю структуру, в ней массив, передаю структурную переменную в ф-цию по ссылке и забиваю чаровский массив посимвольно.
Но при индексации происходит то, чего я объяснить не могу, а именно, вместо перехода к следующей i-той строке, происходит переход, но и дозапись предыдущей строки.
То есть.
в первую строку запишет 40 символов, во вторую 30, в третью 20, в четвертую 10. Как так-то?)

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
#include "pch.h"
#include <iostream>
 
struct list {
    char mass[4][10];
};
 
void a(list &param);
 
int main()
{
    struct list var;
    a(var);
    for(int i =0;i<4;i++)
    {
        std::cout << var.mass[i] << '\n';
    }
}
 
 
void a(list &param) 
{
    for (int i = 0; i < 4; i++) 
    {
        for (int j = 0; j < 10; j++)
        {
            param.mass[i][j] = 'a';
        }
    }
}
Вот как выглядят контрольные переменные при отладке, видно. что заполняется больше, чем нужно.
А при выводе еще и шум откуда-то попадает.

Миниатюры
Передача массива как члена структуры по ссылке в функцию   Передача массива как члена структуры по ссылке в функцию  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.04.2019, 11:12
Ответы с готовыми решениями:

Передача члена структуры в функцию
Здравствуйте. Столкнулся с проблемой и не могу найти ее решение. есть структура: #ifndef STRUCTSCAN_H #define STRUCTSCAN_H ...

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

Передача массива в функцию по ссылке
Здравствуйте. Есть функция: void f(int &amp;a) { int *p=&amp;a; p=1; } Но почему-то при попытке передать ей массив ругается...

10
Злостный нарушитель
 Аватар для Verevkin
10339 / 5757 / 1269
Регистрация: 12.03.2015
Сообщений: 26,588
02.04.2019, 11:21
ИМХО, cout интерпретирует var.mass[i] как указатель на строку (char*), поэтому и выводит на консоль все символы из памяти, начиная с этого адреса и до первого нуля. Поскольку массив у тебя статический, то все данные размещены в одном непрерывном куске памяти. А за ним ещё и мусор рандомный болтается, который ты тоже на консоли видишь.
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
02.04.2019, 11:46
Цитата Сообщение от Verevkin Посмотреть сообщение
А за ним ещё и мусор рандомный болтается, который ты тоже на консоли видишь.
Потому что нулей в самом массиве не оказалось.

Нужно примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
void a(list &param) 
{
    for (int i = 0; i < 4; i++) 
    {
        for (int j = 0; j < 9; j++)
        {
            param.mass[i][j] = 'a';
        }
        param.mass[i][9] = '\0';
    }
}
Добавлено через 2 минуты
И размеры лучше выставлять с помощью define, т.е.

C++
1
2
#define MAX_MY_STRING_LEN  10
#define MY_STRING_COUNT   4
1
0 / 0 / 0
Регистрация: 16.06.2018
Сообщений: 14
02.04.2019, 12:04  [ТС]
Verevkin

Спасибо за ответ!
Помогло.

Переделал ф-цию, которая добавляет на место десятого элемента каждой строки нуль-символ.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void a(list &param) 
{
    int i;
    int j;
    for (i = 0; i < 4; i++) 
    {
        for ( j= 0; j < 10; j++)
        {
            param.mass[i][j] = 'a';
        }
        param.mass[i][j-1] = '\0';
    }
}
Тогда выводит гладко.

Но тогда другой вопрос. В массиве 40 чаров, почему он выводит еще 9 мусорных символов? Откуда он их взял?
Была мысль, что я перезаписал нуль символ окончания четвертой строки, и он продолжил выводить, но почему тогда он остановился?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
02.04.2019, 12:49
unrealprorok, потому что std::cout для указателя на строку символов не может узнать, какова длина строки. Он может только последовательно читая байты остановиться, когда в байте окажется 0. Но ведь память компьютера занимает не только твоя программа, соответственно там остаются байты с данными других программ, операционной системы, и просто мусор, оставшийся в ячейках памяти после запуска компьютера. Вот его то твоя программа и вывела.
1
Злостный нарушитель
 Аватар для Verevkin
10339 / 5757 / 1269
Регистрация: 12.03.2015
Сообщений: 26,588
02.04.2019, 13:17
Цитата Сообщение от unrealprorok Посмотреть сообщение
Но тогда другой вопрос. В массиве 40 чаров, почему он выводит еще 9 мусорных символов? Откуда он их взял?
Они там были до тебя ещё. До меня ответили.
У меня встречный вопрос: а зачем тебе такая конструкция вообще? Как ты её собрался использовать на практике и почему?
0
0 / 0 / 0
Регистрация: 16.06.2018
Сообщений: 14
02.04.2019, 13:39  [ТС]
TRam_

Спасибо, я так и думал, что он просто будет выводить до первого нуль символа, просто показалось странным) А так, количество мусорных символов меняется, так что, спасибо).

Verevkin

Да я хотел собрать консольную игрушку, типо, поле чудес, где в этот массив копируются введенные символы, если они совпадают с кодовым словом. Но не хотел, чтобы на пустых местах были какие-то закорючки.

Остался последний вопрос.
Когда я объявляю структурную переменную в функции main, то при отладке я вижу какие-то MMMMM вместо мусора или нулей.
Если я объявляю глобально структурную переменную и передаю в функцию по ссылке, то я вижу нуль символы.

Почему так?
Миниатюры
Передача массива как члена структуры по ссылке в функцию   Передача массива как члена структуры по ссылке в функцию  
0
Злостный нарушитель
 Аватар для Verevkin
10339 / 5757 / 1269
Регистрация: 12.03.2015
Сообщений: 26,588
02.04.2019, 13:44
Цитата Сообщение от unrealprorok Посмотреть сообщение
Когда я объявляю структурную переменную в функции main, то при отладке я вижу какие-то MMMMM вместо мусора или нулей.
Если я объявляю глобально структурную переменную и передаю в функцию по ссылке, то я вижу нуль символы.
ИМХО, большинство компиляторов инициализируют глобальные переменные нулями. Это возможно, т.к. память под них - в куче, а не на стеке.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.04.2019, 13:51
Цитата Сообщение от unrealprorok Посмотреть сообщение
Когда я объявляю структурную переменную в функции main, то при отладке я вижу какие-то MMMMM вместо мусора или нулей.
MMMMM - и есть мусор.
отладочная сборка любит всякие барьеры, хвостики вставлять.
что бы выявлять факт пробитой памяти.

Цитата Сообщение от unrealprorok Посмотреть сообщение
Если я объявляю глобально структурную переменную
не инициализированные глобальные переменные обязаны всегда содержать нули.
1
0 / 0 / 0
Регистрация: 16.06.2018
Сообщений: 14
02.04.2019, 15:56  [ТС]
Всем спасибо за помощь!

Разобрался
0
Злостный нарушитель
 Аватар для Verevkin
10339 / 5757 / 1269
Регистрация: 12.03.2015
Сообщений: 26,588
02.04.2019, 16:14
Цитата Сообщение от unrealprorok Посмотреть сообщение
Всем спасибо за помощь!
Разобрался
С тебя пиво.
Кликните здесь для просмотра всего текста
шутка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2019, 16:14
Помогаю со студенческими работами здесь

Передача двумерного массива в функцию по ссылке
Требуется написать функцию, которая выделяет память для одномерного и двумерного динамического массива. Для первого варианта вопросов вроде...

Передача массива List в функцию по ссылке
В общем есть самописный класс mList&lt;T&gt;, позволяющий реализовать массивы, как ассоциативные, так и обычные.... в общем проблема в следующем....

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

Передача массива структуры в функцию
Добрый вечер! У меня такая проблема. Необходимо создать функцию, которая &quot;обнуляет&quot; все значения в полях структуры. Структура такая: ...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru