Массив символов в структуре - несовместимое присвоение? [дубликат]

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

С огромной точки зрения компании/продукта - мудро иметь Руководство по стилю HMI/UI, которое обстоятельно объясняет основных разработчиков предписаний, должен использовать их дизайны интерфейса для определенных целей их программного обеспечения. Во многих случаях столь же важно быть последовательным, как это должно быть корректно, также - единственное руководство для большого продукта, или комплект продуктов становится действительно важным. Это также сохраняет экспертов по программному обеспечению от также необходимости быть пользовательскими экспертами. Если бы существует всего один источник, я сказал бы, что внутреннее руководство по стилю было бы им. Идеально, они должны быть записаны (и обновлены) сделать точно, что Вы спрашиваете - контрольная точка всех вещей рассмотреть при создании дизайна.

я не уверен, что Вы будете когда-либо находить единственное руководство для весь аспекты дизайна пользовательского интерфейса, который является единым источником. Различные типы технологии требуют различных методов - например, эти две дизайнерских идеи выше полезны для двух совсем других типов приложений (передачи речи и видеоигры). И никакой не особенно полезен для веб-приложений. Хуже все же, пользовательское изменение потребностей, поскольку данная технология становится более широко принятой - например, графический интерфейсы пользователя Web 2.0 используют некоторые разметки и концепции проекта, которые нарушают более старые ранние веб-методы дизайна UI.

Общие принципы, которые я нахожу полезными для моей работы в мире веб-приложения:

  • Всегда рассматривают то, что пользователь пытается сделать, поскольку первоочередная задача
  • Рассматривает другие системы, пользователь уже знаком с, и скопируйте их, когда возможный*
  • Сосредотачивают внимание на самом важном решении/информации (см. первый маркер) - внимание может быть сосредоточено во многих отношениях, в зависимости от технологии - размер, перемещение, положение, цвет, звук или любой другой сенсорный вход.
  • Рассматривают пользователя - возраст, disablity/ability, предшествующий опыт с этой технологией и почти чем-либо еще, о чем можно думать. Затем дизайн с ключевыми аспектами пользователя в памяти.
  • Рассматривают среду пользователя - аппаратные средства, сеть, физическая среда
  • Заставляет пользователя сделать как можно меньше действия для выполнения их целей - т.е., щелчки мышью, нажатия клавиш, голосовые команды

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

* (Редактирование - Добавленный) - когда возможный и , когда это имеет смысл. Не бойтесь изобрести велосипед, когда у Вас есть лучшая идея, пока у Вас есть хороший случай для нее действительно быть лучше.

33
задан Patrick 18 August 2009 в 08:45
поделиться

5 ответов

Это не имеет ничего общего со структурами - массивы в C не назначаются:

char a[20];
a = "foo";   // error

вам необходимо используйте strcpy:

strcpy( a, "foo" );

или в своем коде:

strcpy( sara.first, "Sara" );
63
ответ дан 27 November 2019 в 17:48
поделиться

используйте strncpy , чтобы убедиться, что у вас нет переполнения буфера.

char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;
4
ответ дан 27 November 2019 в 17:48
поделиться

Вы также можете инициализировать его следующим образом:

struct name sara = { "Sara", "Black" };

Поскольку (как особый случай) вам разрешено инициализировать массивы символов из строковых констант.

Теперь , что касается того, что на самом деле представляет собой структура - это составной тип, состоящий из других значений. То, что sara на самом деле выглядит в памяти, представляет собой блок из 20 последовательных значений char (на которые можно ссылаться, используя sara.first , за которым следует 0 или более байтов заполнения, за которыми следует другой блок из 20 последовательных значений char (на которые можно ссылаться с помощью sara.last ). Все другие экземпляры типа имя структуры расположены таким же образом.

В этом случае очень маловероятно, что есть какое-либо заполнение, поэтому имя структуры представляет собой всего лишь блок из 40 символов,

4
ответ дан 27 November 2019 в 17:48
поделиться

sara - это сама структура, а не указатель (т.е. переменная, представляющая местоположение в стеке, где хранятся фактические данные структуры ). Следовательно, * sara не имеет смысла и не компилируется.

2
ответ дан 27 November 2019 в 17:48
поделиться

Структура Sara - это блок памяти, содержащий переменные внутри. Практически нет разницы между классическими объявлениями:

char first[20];
int age;

и структурой:

struct Person{
char first[20];
int age;
};

В обоих случаях вы просто выделяете некоторую память для хранения переменных, и в обоих случаях будет зарезервировано 20 + 4 байта. В вашем случае Сара - это просто блок памяти размером 2x20 байт.

Единственное отличие состоит в том, что в структуре память выделяется как единый блок, поэтому, если вы возьмете начальный адрес Sara и перескочите на 20 байтов, вы найдете «последнюю» переменную. Иногда это может быть полезно.

Подробнее см. http://publications.gbdirect.co.uk/c_book/chapter6/structures.html :).

0
ответ дан 27 November 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: