Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу понять, как работает программа 
:(
    Опции темы
sidiakin
Дата 27.6.2010, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Товарищи! Что не так в примере змейки?

Код

struct vec2i
{
  int x;
  int y;
};
 
struct vec2i snake[50];
struct vec2i apple;
int key = 'd';
int len = 5;
int speed = 200;
bool end = true;


Код

void paramSnake(void)
{
  snake[0].x = 10;
  snake[0].y = 10;
  
  for(int i = 0; i < len; i++)
  {
        snake.x = snake[0].x;
        snake.y = snake[0].y - i;
  }
}



При компиляции выдает ошибку:

\main.cpp In function `void paramSnake()': 
\main.cpp request for member `x' in `snake', which is of non-class type `vec2i[50]' 
\main.cpp request for member `y' in `snake', which is of non-class type `vec2i[50]' 
PM MAIL   Вверх
sidiakin
Дата 27.6.2010, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Объясните, откуда в программе snake.x, если объявл. только snake[].x ?

Это сообщение отредактировал(а) sidiakin - 27.6.2010, 14:20
PM MAIL   Вверх
sidiakin
Дата 27.6.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Изменил snake.x на snake[i].x вроде заработало
PM MAIL   Вверх
sidiakin
Дата 30.6.2010, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Код

#include <conio.h>
#include <stdio.h>

struct test
{
       int x;
       int y;
};

int main()
{
    test t[20];
        
    t[0].x = 10;
    t[0].y = 20;
    
    t[0].x - 2;
    
    printf("%d", t[0].x);
    printf("%d", t[0].y);
            
    getch();
}



Подскажите, почему не работает инструкция t[0].x - 2 ? Почему значение t[0].x не изменяется? Спасибо.
PM MAIL   Вверх
cutwater
Дата 30.6.2010, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



sidiakin, может учебник по С почитать?

Код

t[0].x = t[0].x - 2;


или

Код

t[0].x -= 2;





--------------------
user posted image
PM MAIL   Вверх
sidiakin
Дата 30.6.2010, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Извиняюсь, туплю. Вот посмотрите фрагмент:

Код

void proba(void)
{
     t[0].x = 10;
     t[0].y = 10;
     
     for(int i=0; i < 5; i++)
     {
             t[i].x = t[i].x;
             t[i].y = t[i].y - i;
     }
}


То, что автор хочет в цикле проинициализировать все эл-ты массива, я понял. Но мне кажется, что какая т то ерунда получается???

Это сообщение отредактировал(а) sidiakin - 30.6.2010, 09:13
PM MAIL   Вверх
sidiakin
Дата 30.6.2010, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Кажется я понял. Наверно автор хотел написать так:

Код

t[0].y = 10;
for(int i=0; i < 5; i++)
     {
             t[i].x = t[0].x;
             t[i].y = t[0].y - i;
     }

PM MAIL   Вверх
sidiakin
Дата 6.7.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Возникли проблемы в понимании синтаксиса. Поясните пожалуйста

По структурам:

Код

struct Book{
   int a;
};
Book b;
b.a = 2;


Все понятно: описыв. новый тип данных под назв. Book, потом создаю перем. b типа Book.

А как понимать записи типа:

Код

struct{
   int a;
} array[] = {...};


Тут как? Создается массив структур, но имени у структуры нет? Получается, что я могу давать имя структурам, а могу и не давать???

И еще вопросик:

Код

typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT;


Тут как? Я создаю структуру с именем tagPOINT типа POINT ? Объясните пожалуйста! Вообще не понятно.  

PM MAIL   Вверх
xvr
Дата 6.7.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(sidiakin @  6.7.2010,  12:08 Найти цитируемый пост)
Получается, что я могу давать имя структурам, а могу и не давать???
Да

Цитата(sidiakin @  6.7.2010,  12:08 Найти цитируемый пост)
Тут как? Я создаю структуру с именем tagPOINT типа POINT ?
Структуру с типом tagPOINT и typedef с типом POINT (это в чистом С). После этого описания можно писать:
Код

struct tagPOINT var;
или
POINT var;
для описания переменной var (обе строки описывают одно и то же)


PM MAIL   Вверх
sidiakin
Дата 7.8.2010, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Подскажите пож., как работает sizeof со структурами. Вот фрагмент описания: 

Цитата

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

struct { char h; int b; double f; } str; int a1; a1 = sizeof(str);
Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.


Вот то, что получилось 7 - это понятно, а откуда еще 5 байт?
Что за участки памяти для выравнивания элементов?

Это сообщение отредактировал(а) sidiakin - 8.8.2010, 00:37
PM MAIL   Вверх
xvr
Дата 11.8.2010, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(sidiakin @  7.8.2010,  23:48 Найти цитируемый пост)
Что за участки памяти для выравнивания элементов?
Это фича многих компьютерный архитектур. А для некоторых - это вообще суровая необходимость.
Переменные в памяти должны начинаться с адреса, кратного их размеру. Т.е. 4х байтовая переменная (int к премеру) должна начинаться с адреса, кратного 4м (т.е. первые 2 бита в адресе должны быть нулями). В противном случае будет серьезное замедление при обращении к такой переменной (на x86 архитектуре), или вообще исполнение прекратится с ошибкой (на RISC архитектурах). Полей в структуре это тоже касается, поэтому компилятор и добавляет дырки между полями структуры, что бы все эти поля были правильно выровнены (предполагается, что адрес самой структуры выровнен по максимуму, это обеспечивает или сам компилятор - для локальных переменных структур, или run-time поддержка для структур на куче)


PM MAIL   Вверх
Леопольд
Дата 11.8.2010, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(sidiakin @  7.8.2010,  23:48 Найти цитируемый пост)
Переменная а1 получит значение, равное 12
Здесь int 16 битный. На 32 битной архитектуре будет 16 байт. Выкинь это старьё и найди нормальную книгу. В IT всё очень быстро меняется. Старайся читать наиболее свежую литературу.

Цитата(sidiakin @  7.8.2010,  23:48 Найти цитируемый пост)
Вот то, что получилось 7 - это понятно, а откуда еще 5 байт?
double - 8 байт
int - 2 байта
char - 1 байт
8+2+1 = 11

Это сообщение отредактировал(а) Леопольд - 11.8.2010, 09:02


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.