Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
1

Struct и всё что с этим связанно

13.06.2019, 19:28. Показов 2241. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

вот это валидная конструкция
C++
1
2
3
4
5
6
7
  struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
  } ;
MultiTarget t[1] = {{OK, strlen(OK), 0}};
int main()
а вот эта нет
C++
1
2
3
4
5
6
7
8
  struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
  } t;
t[1] = {{OK, strlen(OK), 0}};   //так не хочет
t = {OK, strlen(OK), 0};        //так тоже
int main()
только так
C++
1
2
3
4
5
6
7
  struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
  } t;
int main(){
t = {OK, strlen(OK), 0}; }
почему так происходит?

Добавлено через 5 минут
И такой вопрос
после объявления как указанно выше делаем такой вызов findMulti(t, 1);
но:
почему если я объявляю как вариант 1 то могу сделать так без ошибки компилятора
C++
1
2
3
int findMulti( struct MultiTarget *targets, int tCount) {
for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {}
}
а если как вариант 3 (что на мой не проф взгляд одно и тоже, я имею ввиду объявление/инициализация) то получаю ошибку
cannot convert ‘MultiTarget’ to ‘MultiTarget*’ for argument ‘1’ to ‘int findMulti(MultiTarget*, int)’
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2019, 19:28
Ответы с готовыми решениями:

Как можно сделать такое? (Автоматическое нажатие клавиш и все что с этим связанно)
У меня возник вопрос как можно сделать чтоб программа автоматически нажимала на определенные...

Vcredist x64 Visual C++ , и все что с этим связанно
Помогите пожалуйста! :( .Не могу установить vcredist (любой старый, новый,х64 или х82), при этом...

Создание графических интерфейсов и все что с этим связанно
Всем привет! Я недавно закончил обучаться С++ по множеству книг и научился делать различные...

Все что связанно с IP адресом
расскажите пож., как определить Ip адрес, какие данные можно получить по нему о владельце и как?

38
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
13.06.2019, 19:29 2
Цитата Сообщение от alexbmd Посмотреть сообщение
t = {OK, strlen(OK), 0}; *//так тоже
если перенести это в тело функции, то можно
или
C++
1
2
3
4
5
struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
} t = { OK, strlen(OK), 0 };
Цитата Сообщение от alexbmd Посмотреть сообщение
t[1] = {{OK, strlen(OK), 0}}; //так не хочет
C++
1
2
3
4
5
struct MultiTarget {
    const char *str;  // string you're searching for
    size_t len;       // length of string you're searching for
    size_t index;     // index used by the search routine.
} t[1] = { { OK, strlen(OK), 0 } };
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
13.06.2019, 19:35  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
если перенести это в тело функции, то можно
ну да я это написал в вариант3. но почему так нельзя ?
за остальные варианты объявления спасибо
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
13.06.2019, 19:38 4
Цитата Сообщение от zayats80888 Посмотреть сообщение
если перенести это в тело функции, то можно
почему только в теле функции можно присваивать уже объявленным переменным значение? думаю вопрос в этом.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
13.06.2019, 19:45 5
Цитата Сообщение от alexbmd Посмотреть сообщение
а если как вариант 3
В варианте 3 у тебя не массив в качестве глобальной переменной, а просто глобальная переменная. Естественно что-либо производить с переменной как с массивом нельзя, до тех пор пока не возьмёшь её адреса.
2
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
13.06.2019, 19:54 6
Цитата Сообщение от _stanislav Посмотреть сообщение
почему только в теле функции можно присваивать уже объявленным переменным значение? думаю вопрос в этом.
Может потому, что присвоение это некая операция, выполняемая процессором и следовательно ему нужны инструкции?

Добавлено через 5 минут
Я к тому, что присвоение это не инициализация(хотя инициализация глобальных объектов это тоже могут быть инструкции, выполняемые при запуске кода), т.е. должен быть определен момент времени, когда и место в коде, где это происходит.
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
14.06.2019, 12:43  [ТС] 7
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я к тому, что присвоение это не инициализация(хотя инициализация глобальных объектов это тоже могут быть инструкции, выполняемые при запуске кода)
ок с этим понял. потому что посути то была не инициализация а присвоение. НО как тогда отличить инициализацию от присвоения в не тела функции ? (на рабоче-крестьянском)

я понимаю так . как только впервые нам встречается переменная в нетела функции это и есть инициализация и в этот же момент можно ей присвоить чтото. а вариант 2 - первый раз t встречается как обжект нейм после скобки до точка-запятая и мы там ничего не присвоили а пытались это сделать отдельной строкой и компилятор считает что инициализация уже прошла и это уже присвоение. правильно я понял ?

Добавлено через 22 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
В варианте 3 у тебя не массив в качестве глобальной переменной ... до тех пор пока не возьмёшь её адреса.
я вас понял и теперь я понял что там произошло .... но
А) я воспринимал структуру так и так как маасив (как минимум чтото вроде массива) ведь мы можем заполнить объект структуры как { {},
{},
{} и тд} и объявлять как [n]
что же такое структура/как её воспринимать/понимать?

Б) в варианте 3 просто переменная а не массив не потому что я так захотел а потому что компилятор.... ага, сделал обжект нейм t[1]; и получился массив, сейчас понял. ...НО получается обжект нейм при инициализация } object name; это не только имя типа структыры а может быть абсолютной любой тип - типа структуры ? как это ? что это ? ну любой не знаю как, а как минимум получилось пока три варианта: } t; } t[1]; } *t;
хм интересно девки пляшут.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
14.06.2019, 12:52 8
Цитата Сообщение от alexbmd Посмотреть сообщение
t; } t[1]; } *t;
Выражение
C++
1
2
struct MultiTarget {
} t;
аналогично
C++
1
2
3
struct MultiTarget {
};
MultiTarget t;
Точно так же вышенаписанное аналогично
C++
1
2
MultiTarget t[1]; 
MultiTarget  *t;
и так далее.

Инициализация - процесс происходящий в переменной при обработке объявления этой переменной после выделения для неё памяти. Присваивание - процесс изменения содержимого уже инициализированной переменной. В процессе инициализации у переменной вызывается конструктор (если он не определялся, используется сгенерированный по-умолчанию), а в процессе присваивания - оператор присваивания.

C++
1
2
3
MultiTarget t; // инициализация
t = { OK, strlen(OK), 0 };  // присваивание
MultiTarget t2 = { OK, strlen(OK), 0 }; // это тоже инициализация, не присваивание!
1
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
14.06.2019, 13:05 9
компилятор тоже человек

Добавлено через 1 минуту
синтаксический и лексический анализатор конкретней
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
14.06.2019, 14:00  [ТС] 10
Цитата Сообщение от TRam_ Посмотреть сообщение
Точно так же вышенаписанное аналогично
C++Выделить код
1
2
MultiTarget t[1];
MultiTarget **t;
и так далее.
а как еще можно и так далее ?

Добавлено через 2 минуты
и такой вопрос:

Цитата Сообщение от zayats80888 Посмотреть сообщение
} t = { OK, strlen(OK), 0 };

} t[1] = { { OK, strlen(OK), 0 } };
доступ к переменным в обоих этих случаях одинаковый ?

t.len например, подходит для обоих ?

t - > len и так тоже можно ? еще както можно?
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
14.06.2019, 14:11 11
Цитата Сообщение от alexbmd Посмотреть сообщение
доступ к переменным в обоих этих случаях одинаковый ?
мне кажется эти вопросы решают писари компиляторов.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
14.06.2019, 15:09 12
Цитата Сообщение от alexbmd Посмотреть сообщение
а как еще можно и так далее ?
C++
1
MultiTarget  *t0 = &t, **t1=&t0, t2[10], t3 = MultiTarget(), t4;
Цитата Сообщение от alexbmd Посмотреть сообщение
доступ к переменным в обоих этих случаях одинаковый ?
Следует различать переменные (они же называются экземплярами класса, если речь не о простых встроенных типах) и внутренности этих переменных, называемые полями экземпляра класса.

К полям переменных обращаются с помощью "." (t.len), к полям указателей на переменные обращаются с помощью "->" (t0->len), для доступа к элементам массива нужно вначале определить, к какому элементу обращаемся и далее с этим элементом работаем аналогично переменной (t2[5].len)
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
14.06.2019, 19:38  [ТС] 13
Цитата Сообщение от alexbmd Посмотреть сообщение
for (struct MultiTarget *t = targets; t < targets+tCount; ++t)
targets+tCount
tCount у нас int 1
targets указатель
чему равно их сложение ?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
15.06.2019, 13:52 14
Равно указателю на место в памяти, следующее после места со структурой MultiTarget, на которое указывает targets .

Если targets указывает на массив MultiTarget, то указатель будет на следующий элемент. Если targets указывает на отдельно стоящий - то полученный указатель нельзя будет никак использовать (в плане работы с его полями или разыменовывания) т.к. указывает на невыделенную приложению память, операционная система может после этого приложение выкинуть.
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
18.06.2019, 14:21  [ТС] 15
объясните плиз что означает ++t->str

в выше обозначеном цикле, куда мы передаем линк на массив MultiTarget
t->str печатает OK, а
++t->str печатает К

я бы понял еще t->str++ чтобы печатало К
[кстати t->str++ почемуто ничего не изменяет , также печатает всю строку как и t->str]

++t я понимаю должен смещать указатель на следующий элемент. мы как раз так цикл for перебираем

а такая кокнструкция что делает t++->str++ ?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
18.06.2019, 14:43 16
Цитата Сообщение от alexbmd Посмотреть сообщение
что означает ++t->str
Почитай про порядок операций. Означает ++(t->str)

Добавлено через 7 минут
Ибо ++ префиксный имеет приоритет ниже, чем оператор ->

https://en.cppreference.com/w/... precedence

Добавлено через 4 минуты
Цитата Сообщение от alexbmd Посмотреть сообщение
а такая кокнструкция что делает t++->str++ ?
приоритет у них всех равный, так что будет
C++
1
2
3
4
5
MultiTarget *t2 = t;
t = t + 1;
const char *str2 = t2->str;
t2->str = t2->str + 1;
return str2;
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
24.06.2019, 13:39  [ТС] 17
спасибо.

друзья такой вопрос а нужно ли вызывать деструктор и/или удалять структуру? но созданную не через new (эту то понятно нужно)

имею структуру
C++
1
2
3
4
struct Targets {
    const char *str;
    uint8_t len;
};
внутри моей функции создаю объект, потом передаю его по ссылке, и возращяю результат в вызывающую
C++
1
2
3
4
5
bool my_fun(const char*target){
    if (strlen(target) <= 0) return true;
    Targets t[1] = {target, strlen(target)};
    return find_target(t, 1);
}
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
24.06.2019, 13:44 18
Цитата Сообщение от alexbmd Посмотреть сообщение
друзья такой вопрос а нужно ли вызывать деструктор и/или удалять структуру?
нет не нужно (ну разве что вы свой аллокатор пишите)

Цитата Сообщение от alexbmd Посмотреть сообщение
внутри моей функции создаю объект, потом передаю его по ссылке, и возращяю результат в вызывающую
Ваша функция возвращает bool
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 354
Записей в блоге: 3
24.06.2019, 15:12  [ТС] 19
спасибо

а зачем люди используют typedef применительно к структурам если
C++
1
2
3
typedef struct {
} struct_alias;
struct_alias new_struct;
и
C++
1
2
3
4
struct Struct{
};
 
Struct new_struct;
ни чем не короче , не красивее, не понятнее, не...
?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
24.06.2019, 15:18 20
alexbmd, в языке Си при определении структуры так:
C++
1
struct A { int m; };
объект этой структуры нужно было создавать так:
C++
1
struct A aObj;
Ввод псевдонима, позволял избавиться от слова struct перед типом и сократить запись.
Все заголовочные файлы, которые совместимы с Си, используют этот прием. как правило.
0
24.06.2019, 15:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2019, 15:18
Помогаю со студенческими работами здесь

Геймдев и всё, что с ним связанно
Всем привет. Учусь в 9 классе. В последнее время нравится программирование и физика. Хочется...

Object[] и все что с ним связанно
Доброго времени суток. Читаю файл по частям в Byte после чего это нужно занести в Object для...

После установки Windows 7 не заходит в mail.ru и все что связанно с ним
Недавно переустановил винду на 7 после обнавления железа, до этого стояла XP там майл прекрасно...

Рост и всё, что с этим связано
На основе своих наблюдений я заметил, что чем ниже рост человека - тем он вреднее и злее. Высокий...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru