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

Поиск:

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


Шустрый
*


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

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



Начал изучать С. пользуюсь DevC++. Не понял, как там работает отладчик, поэтому решил задать вопрос. 

Код

#include <stdio.h>

int main(){
    long nc = 0;
    while(getchar() != 'q')
                    ++nc;
    printf("%ld\n", nc);
    getchar();
}


Подскажите пож. почему программа вылетает после нажатия на 'q'. Т.е. почему ф-ия getchar() не срабатывает, а срабатывает только, если ее написать дважды. Ведь по идеи после printf() должна работать getchar() и ждать символ. или я не понял
PM MAIL   Вверх
Alca
Дата 8.6.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

почему программа вылетает после нажатия на 'q

что значит вылетает?


Это сообщение отредактировал(а) Alca - 8.6.2010, 22:33


--------------------
PM WWW ICQ Skype Jabber   Вверх
sidiakin
Дата 8.6.2010, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



в смысле завершается. не могу понять, почему она не ждет пока getchar() получит символ
PM MAIL   Вверх
djamshud
Дата 8.6.2010, 22:51 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Alca
Дата 8.6.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Код

int main(int argc, char* argv[]) {


        long nc = 0;
        char c;
        while(c = getchar()) {
            if (c == 'q') break;
            ++nc;
        }    
            
        
        printf("%ld\n", nc);
        fflush(stdin);    //<<<<<<<<<<<<<<<<<
                
        c = getchar();


    return 0;
}


Добавлено через 57 секунд
http://stackoverflow.com/questions/1432989...ing-two-getchar

Это сообщение отредактировал(а) Alca - 8.6.2010, 22:53


--------------------
PM WWW ICQ Skype Jabber   Вверх
sidiakin
Дата 8.6.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, я знаю, как пользоваться printf, scanf. Просто мне стал интересен именно этот момент. Как это загуглить я не знаю, а здесь поиск выдает 0 результ. по getchar. Буду признателен, если позже опишите проблему в кратце. Просто интересно. Заранее спасибо
PM MAIL   Вверх
djamshud
Дата 8.6.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



http://forum.vingrad.ru/forum/topic-302367.html
Первый комментарий. Там про cin.get(), но разницы никакой.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Ozerich
Дата 8.6.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



ну ты ввёл букву и нажал энтер. Вот getchar и обработал твой энтер как нажатую клавишу на клавиатуре. Или пиши два раза getchar() или очищай этот энтер так  fflush(stdin);
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
sidiakin
Дата 9.6.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну конечно же! как я про '\n' не подумал!? А поясните пожалуйста еще один момент:

Код

if (c >='0' && с <= '9')
            ++ndigit [c – '0'];


Цитата

if (c >= '0' && c <= '9') ...
определяет, является ли находящийся в c символ цифрой. Если это так, то

c –'0'

есть числовое значение цифры. Сказанное справедливо только в том случае, если для ряда значений '0','1', ..., '9' каждое следующее значение на 1 больше предыдущего. К счастью, это правило соблюдается во всех наборах символов.


Никак не могу понять зачем с-'0'

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Цитата

Никак не могу понять зачем с-'0'

Есть таблица символов которая называется ASCII. Согласно её каждый символ имеет свой код от 1 до 255. Цифра 0 там имеет 48ой код. Цифра 1 - 49ый, 2 - 50ый и т.д. В переменной с записан код символа. Так вот, чтобы узнать какая там цифра находится, надо от с отнять 48 или '0';
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
sidiakin
Дата 9.6.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подскажите почему ругается компилятор при объявлении ф-ии getline():

Код

#include <stdio.h>
#define MAXLINE 1000

int getline(char line[], MAXLINE);
void copy(char to[], char from[]);

int main(){


4 \main.cpp expected identifier before numeric constant 
4 \main.cpp expected `,' or `...' before numeric constant 
4 \main.cpp ISO C++ forbids declaration of `parameter' with no type 
PM MAIL   Вверх
toxx
Дата 9.6.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#define MAXLINE 1000

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


Шустрый
*


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

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



А так нельзя? Это пример из книги по С
PM MAIL   Вверх
Ozerich
Дата 9.6.2010, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Возможно имелось ввиду это
Код

int getline(char line[], int len);

--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Dem_max
Дата 10.6.2010, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



потому что  int getline(char line[], 1000); не правильно.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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