LINUX.ORG.RU

Структура?


0

2
struct family {
   char *father;
   char *mother;
   int ages[2];
};

struct family f;

f.father = "john dow";

Подскажите, почему ошибка (стр. 42, это: f.father = «john dow»;?

pervy.c:42: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token


Последнее исправление: anonymus123 (всего исправлений: 1)

Ошибка где-то в другом месте. Проверь наличие точки с запятой в предыдущей строке.

Waterlaz ★★★★★
()

Весь код покажи. Или какой-то минимальный пример, на котором воспроизводится проблема

Gvidon ★★★★
()

Подскажите, почему ошибка

Чаще всего ошибка находится до той строчки, которая указана. Забыл ; после предыдущего выражения поставить, и компилятор пытается обработать 42-ю строчку как продолжение предыдущей.

i-rinat ★★★★★
()
Ответ на: комментарий от UVV

Предвижу вопрос, почему программа завершается

«Как мне узнать, завершится ли программа вообще?»

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

ошибок с точками и т.д. - нет!

Если закомментировать эту строку (42) - все нормально собирается ...

З.Ы. в данный момент, это копи-пэйст из исходника ...

anonymus123
() автор топика
Ответ на: комментарий от anonymus123

ошибок с точками и т.д. - нет!

А, ну ок, раз всё работает...

Gvidon ★★★★
()
Ответ на: комментарий от anonymus123

Лечу по фотографии, отворот/приворот по имени, помогаю похудеть по номеру квартиры.

Waterlaz ★★★★★
()
Ответ на: комментарий от anonymus123

Не понимаю, почему так не работает!?

Это ЛММ наказывает тебя за глупо заданный вопрос.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymus123

Переменные какого типа в структуре?

Какое значение присваивается полю структуры?

Дальше сам...

anonymous
()
Ответ на: комментарий от anonymus123

в данный момент, это копи-пэйст из исходника ...

int main(void)
{
struct family {
   char *father;
   char *mother;
   int ages[2];
};

struct family f;

f.father = "john dow";
return 0;
}

Всё работает, даже не ругается.

i-rinat ★★★★★
()
Ответ на: комментарий от NiceForce

Но зачем?

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

anonymous
()
Ответ на: комментарий от NiceForce

Привычка. В Си функции void foo() можно спокойно передавать аргументы (компилятор просто не проверяет их типы и количество. А вот за вызов void foo(void) с аргументами он уже даст по рукам. Потому и привычка писать (void), когда имеется в виду отсутствие аргументов.

ilammy ★★★
()
Ответ на: комментарий от ilammy

А я сначала и не понял, что он имеет в виду. Не указал argc, argv? Но зачем они мне? А тут вон оно что — сам void.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от Gvidon

По-хорошему, должен бы ругнуться на приведение из const char * в char *.

Пробовал и -Wall и -Wextra, даже попробовал не gcc, а clang'ом. Предупреждений нет.

i-rinat ★★★★★
()
Ответ на: комментарий от Gvidon

Компилировать C с помощью g++ — не спортивно.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Причину понял. Переместив весь вышеуказанный код в main - все стало норм.

Новый вопрос, почему не работает, если не в main?

anonymus123
() автор топика
Ответ на: комментарий от anonymus123

Выполнение программы начинается в main, вне её никакой код выполняться не будет (по крайней мере, в С). Это же самые основы, что ты весь семестр делал?

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Ответ на: комментарий от Miguel

)) - там нечему работать (это фактически весь код!)

УЧУСЬ!

в общем результат такой:

1)если все строки из первого поста в main - то работает!

2)если структура объявлена не в main а строка: «f.father = „john dow“;» в main - тоже собирается!

anonymus123
() автор топика
Ответ на: комментарий от anonymus123

2)если структура объявлена не в main а строка: «f.father = „john dow“;» в main - тоже собирается!

Твой конкретный случай будет работать. Но чем скорее ты осознаешь, что в С нет строкового типа, тем лучше.

UVV ★★★★★
()
Ответ на: комментарий от UVV

теперь окончательно разобрался ).

Все работает, если строка «f.father = „john dow“;» находится в теле фунции (любой, не обязательно - main)

З.Ы. По отсутствию строкового типа - уже усвоил материал ... )

anonymus123
() автор топика
Ответ на: комментарий от anonymus123

Все работает, если строка «f.father = „john dow“;» находится в теле фунции (любой, не обязательно - main)

И что, даже выполняется? Или «работает» для тебя - это то же самое, что «компилируется»?

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

лучше бы чуть раньше и по делу чего нибудь высказал, а не просто - обозначился, что бы не «забывали» ... ))

anonymus123
() автор топика

А вот и живое свидетельство разрушения системы образования, жертва ЕГЭ. Пиздец, господа.

anonymous
()
Ответ на: комментарий от Deleted

А как еще объяснить такую паталогическую неспособность мыслить, анализировать и искать информацию? Только надрочкой на говнотестики, которой заменили образование.

anonymous
()
Ответ на: комментарий от anonymus123

2)если структура объявлена не в main а строка: «f.father = „john dow“;» в main - тоже собирается!

Продолжай исследовать дальше.

anonymous
()

Вообще язык такое допускает

f.father = "john dow"
, но лучше сразу делать как надо: выделить память для поля father и туда скопировать строку «john dow».

А так как у вас может дальше случиться много неприятностей.

grondek
()
Ответ на: комментарий от anonymus123

рукалицо.

пойди книжку почитай какую-нибудь по теме, тебе это очень нужно.

Deleted
()
Ответ на: комментарий от anonymus123

почему не работает, если не в main?

Работает. Ты просто неправильно инициализируешь. Надо так:

#include <stdio.h>
struct family {
  char *father;
  char *mother;
  int ages[2];
};

struct family f = { "John Daw", NULL, {10, 0} };

int main(int a, char **c){
  printf("str_f:\nfather: %s\nmother: %s\nages[0]: %d\nages[1]: %d\n",
    f.father, f.mother, f.ages[0], f.ages[1]);
  return 0;
}

Запускаем:

gcc 1.c && ./a.out 
str_f:
father: John Daw
mother: (null)
ages[0]: 10
ages[1]: 0

Только нафига константами инициализировать структуру? Вдруг ты ее захочешь изменить?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Только нафига константами инициализировать структуру?

Рука-лицо. Ты вообще программировать умеешь, или как?

Вдруг ты ее захочешь изменить?

Ну а если не захочешь? Зачем менять константные структуры?

Вот, смотри сюда, и учись. Может поумнеешь. Может даже коммунячий бред из тебя выбьет, если IQ поднимешь на изучении хорошего кода.

Учись: https://github.com/qemu/qemu/blob/master/target-arm/machine.c

И вообще читай исходники qemu, там эта техника везде активно используется.

anonymous
()
Ответ на: комментарий от anonymous

Ты вообще программировать умеешь, или как?

Рукалицо. Почитай мой профиль. Жирными буквами выделено.

Ну а если не захочешь?

Тады ой.

Вот, смотри сюда, и учись.

А то я не знаю, как структуры частично инициализировать...

читай исходники qemu

Ога. Ты еще ведро почитать предложи.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Рукалицо. Почитай мой профиль. Жирными буквами выделено.

Ну а с хера тогда мнение-то имеешь, а? Не умеешь программировать - не умей дальше, молча.

А то я не знаю, как структуры частично инициализировать...

Какое такое «частично»? Там константные структуры вообще-то. Совсем константные.

Ога. Ты еще ведро почитать предложи.

Ну-ну, разница в масштабе на пару порядков.

anonymous
()
Ответ на: комментарий от anonymous

Ну а если не захочешь? Зачем менять константные структуры?

А если не захочешь, то объяви её константной, блджад.

anonymous
()
Ответ на: комментарий от anonymous

Ну так эдичка-то вообще не понимает, зачем нужны константные структуры.

Всё он понимает. В отличии от.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.