С новичёк

Модератор: Модераторы разделов

sbar
Сообщения: 354
ОС: Gentoo

Re: С новичёк

Сообщение sbar » 28.08.2007 15:54

можно еще странных вопросов позадовать?
0. как можно спрятать курсор в терминале?
1. как программно перейти в нужный виртуальный терминал (т.е. аналогично (Ctrl+)Alt+F{число}). если это не возможно - как отэмулировать нажатие этих клавиш?
Спасибо сказали:

sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: С новичёк

Сообщение sergio » 01.09.2007 19:00

Pr0b3L писал(а):
28.08.2007 15:54
можно еще странных вопросов позадовать?
0. как можно спрятать курсор в терминале?
1. как программно перейти в нужный виртуальный терминал (т.е. аналогично (Ctrl+)Alt+F{число}). если это не возможно - как отэмулировать нажатие этих клавиш?

Нолевое сам послушаю с интересом - что-то когда-то давно в ncurses доках не увидел... хотя для конкретных разновидностей терминалов наверняка это возможно (если работать напрямую).
Первое - если подумать - невозможно или не должно быть стандартно-возможно. Иначе вы получите вооотакенную дыру в секьюрити. (Напряглись немного и представили: запущенная вами программа "сэмулировав нажатия" перелистала терминалы, нашла тот, что под рутом, и "сэмулировала" там что-нить вроде ввода rm -R /* (Enter)... Вспомнили великую шутку виндовс с посылкой сообщения таймера любому окну... :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:

sbar
Сообщения: 354
ОС: Gentoo

Re: С новичёк

Сообщение sbar » 24.09.2007 16:40

sergio писал(а):
01.09.2007 19:00
Первое - если подумать - невозможно или не должно быть стандартно-возможно. Иначе вы получите вооотакенную дыру в секьюрити. (Напряглись немного и представили: запущенная вами программа "сэмулировав нажатия" перелистала терминалы, нашла тот, что под рутом, и "сэмулировала" там что-нить вроде ввода rm -R /* (Enter)... Вспомнили великую шутку виндовс с посылкой сообщения таймера любому окну... :happy:

Мне просто нужно сделать программку-костыль, которая:
  • либо погасила курсор на на 7-м терминале
  • либо сделала переход сначала, скажем, на 1-й а потом на 7-й
Понадобилось мне этого, потому что если после hibernate (пере)запустить иксы, то я вижу (предположительно) наложенный с 7-го терминала курсор (прямо в иксах 0_o). Не приятно выглядит эта мигающая хрень. А если временно переключиться на другой терминал и снова вернуться на 7-й -- все в порядке, никакого курсора. Если загрузиться нормально, без hibernate, то тоже все нормально, можно сколько угодно раз иксы запускать и курсора не будет вылезать.
видимо лучше просто курсор погасить, вопрос только "как"...
Спасибо сказали:

sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: С новичёк

Сообщение sergio » 24.09.2007 21:06

Pr0b3L писал(а):
24.09.2007 16:40
Мне просто нужно сделать программку-костыль
Понадобилось мне этого, потому что если после hibernate (пере)запустить иксы, то я вижу (предположительно) наложенный с 7-го терминала курсор (прямо в иксах 0_o). Не приятно выглядит эта мигающая хрень. А если временно переключиться на другой терминал и снова вернуться на 7-й -- все в порядке, никакого курсора.

Честно говоря мало что понял, и совсем не понял как терминальный курсор может оказаться на иксовом окне... Обычный консольные терминалы я думаю рутом можно от/при-соединить к экрану или переключить, но как - тут я не помощник. Но по-моему надо разбираться с ситуацией, может вы страшный баг отыскали :) , звучит как-то то ли непонятно , то ли дико. Варианты с прятаньем курсора и впрямь костыли какие-то, :happy: лучше бы понять, что там происходит.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:

Upliner
Сообщения: 67
ОС: openSUSE 11 / Debian Lenny

Re: С новичёк

Сообщение Upliner » 24.09.2007 22:55

Можно попробовать echo -e '\33[?1c' в баше
Сам к сожалению не имею возможности проверить, так как из-за глюкавых дровов nvidia я заперт в иксах под страхом зависания системы...
От Кузбаса и до Затулинки, от вершин до глубиннейших руд
Анархисты Сибирской Республики нас к предельной свободе ведут
Спасибо сказали:

sbar
Сообщения: 354
ОС: Gentoo

Re: С новичёк

Сообщение sbar » 24.09.2007 23:23

Upliner писал(а):
24.09.2007 22:55
Можно попробовать echo -e '33[?1c' в баше
точнее вот так printf "33[?1c" чертвов форум, опять режит символы. напишу через пробелы:

Код: Выделить всё

 \ 0 3 3 [ ? 1 c
:) big thx!
кстати, может и не в тему, но где можно полное руководство по всем этим терминальным последовательностям найти (или как их назвать правильно)?
Спасибо сказали:

Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: С новичёк

Сообщение Uncle_Theodore » 24.09.2007 23:26

Спасибо сказали:

Аватара пользователя
Чучок
Сообщения: 390
ОС: Debian 4.0 etch

Re: С новичёк

Сообщение Чучок » 11.11.2007 17:33

Извиняюсь за ламерский вопрос. Изучаю Си по книге Кернигана. На примерах на сайте www.cplusplus.com (да и везде) основной текст проги начинается так

Код: Выделить всё

int main ()
{
      /*текст проги*/
}
,
а в книге Кернигана int перед main нету. И у меня возник такой вопрос. Зачем ставить int перед main? Ведь main не переменная, а основная (на языке Си) функция. Это только на Паскале можно было давать тип данных функциям.
Спасибо сказали:

Аватара пользователя
Liksys
Сообщения: 2910

Re: С новичёк

Сообщение Liksys » 11.11.2007 17:39

Это возвращаемое значение функции.
Спасибо сказали:

promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С новичёк

Сообщение promov » 11.11.2007 23:29

Это тип возвращаемого значения. Положено так. По уставу.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:

Аватара пользователя
Liksys
Сообщения: 2910

Re: С новичёк

Сообщение Liksys » 11.11.2007 23:44

Вообще говоря, я где-то описывал эту фишку с возвращаемыми значениями main в C и C++, поищи по форуму.
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С новичёк

Сообщение drBatty » 17.11.2007 11:52

Чучок писал(а):
11.11.2007 17:33
Извиняюсь за ламерский вопрос. Изучаю Си по книге Кернигана. На примерах на сайте www.cplusplus.com (да и везде) основной текст проги начинается так
int main ()

это то, что функция возвращает. Причём если тип == int можно его неписать, к примеру unsigned int тоже, что и unsigned. Именно поэтому main() воспринимается компилятором как int main(). Керниган считал, что каждая программа должна выдавать код завершения, это для него было само-собой разумеющееся, вот он и не писал int.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: С новичёк

Сообщение v04bvs » 17.11.2007 19:00

Чучок писал(а):
11.11.2007 17:33
Извиняюсь за ламерский вопрос. Изучаю Си по книге Кернигана. На примерах на сайте www.cplusplus.com (да и везде) основной текст проги начинается так

Код: Выделить всё

int main ()
 {
       /*текст проги*/
 }
,
а в книге Кернигана int перед main нету. И у меня возник такой вопрос. Зачем ставить int перед main? Ведь main не переменная, а основная (на языке Си) функция. Это только на Паскале можно было давать тип данных функциям.

Если для функции не указывается возвращаемый тип, он по умолчанию считается равным int.
Спасибо сказали:

promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С новичёк

Сообщение promov » 18.11.2007 15:03

Лучше писать, а то греха потом не оберёшься. Я вот написал однажды функцию

Код: Выделить всё

a (char b []) {
 //Функция изменяла массив b
}


И она работала. До поры до времени. А потом я эту функцию вставил в программу среди перечня других функций. И всё, программа не заработала. Пока ошибку нашёл, время потерял. Оказалось, необходимо было всё-таки так писать:

Код: Выделить всё

void a (char b []) {
 //Функция изменяла массив b
}


Так что лучше не пренебрегать правилами.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:

KukMan
Сообщения: 92
ОС: Kubuntu 7.10

Re: С новичёк

Сообщение KukMan » 06.12.2007 15:31

так если перед функцией ничего нестоит. ТО по-умолчанию это void функция или же int? или если это main - то это int, а для всех остальных - void.
Интересует для C++
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С новичёк

Сообщение drBatty » 06.12.2007 15:51

KukMan писал(а):
06.12.2007 15:31
так если перед функцией ничего нестоит.
int. Всегда подразумевается тип int если явно не указано иное: например unsigned на самом деле unsigned int. А мой компилятор ругается на такие функции(warning: data definition has no type or storage class), но программу собирает ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: С новичёк

Сообщение deninok » 06.12.2007 16:24

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

Код: Выделить всё

#include <iostream>
using namespace std;

f() { cout << "f()" << endl; }

int main()
{
    f();

    return 0;
}
компилятор, соответствующий стандарту, не скомпилирует. Я пробовал на Dev-C++ ввести такой код (там стоит g++ 3.4.2) - не пропускает, выдает сообщение об ошибке:
ISO C++ forbids declaration of `f' with no type

Я решил попробовать даже так, как будто бы f() должна что-то вернуть:

Код: Выделить всё

#include <iostream>
using namespace std;

f() { return 1; }

int main()
{
    int i = f();

    return 0;
}
Та же ошибка.

Так что против стандарта не попрешь... :)

Кстати, перед main() всегда нужно ставить int. Всегда! А у Кернигана main() стоит без указания типа возвращаемого значения потому, что, когда писалась его книга, стандарта еще не было.
Спасибо сказали:

KukMan
Сообщения: 92
ОС: Kubuntu 7.10

Re: С новичёк

Сообщение KukMan » 06.12.2007 17:10

А вот функции-конструкторы класа должны быть типом? ибо в книгах пишется без типа. ПРосто Nameofclass::Nameofclass() { }, без типа. По стандарту это правильно?
Спасибо сказали:

Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: С новичёк

Сообщение Uncle_Theodore » 06.12.2007 19:32

У конструкторов Вы тип не указываете. На то они и конструкторы...
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С новичёк

Сообщение drBatty » 06.12.2007 19:57

deninok писал(а):
06.12.2007 16:24
(там стоит g++ 3.4.2) - не пропускает, выдает сообщение об ошибке:
ISO C++ forbids declaration of `f' with no type
А у меня gcc version 4.1.2 20070302 (prerelease) (4.1.2-1mdv2007.1) И такое собирает, но с warning: data definition has no type or storage class. Что конечно не говорит о том, что так можно и нужно делать.

deninok писал(а):
06.12.2007 16:24
Кстати, перед main() всегда нужно ставить int. Всегда!
Конечно!

KukMan, У конструкторов нет типа возвращаемого значения, потому-что они ничего не возвращают. И у деструкторов - тоже. Это связано с тем, что они обычно вызываются не явно:

Код: Выделить всё

class test;

{
 test x;//вызывается конструктор, непонятно кому и что возвращать.
}//вызывается деструктор, куда деть информацию возврата?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: С новичёк

Сообщение deninok » 06.12.2007 21:58

(drBatty) писал(а):А у меня gcc version 4.1.2 20070302 (prerelease) (4.1.2-1mdv2007.1) И такое собирает, но с warning: data definition has no type or storage class. Что конечно не говорит о том, что так можно и нужно делать.

Очень странно... Стандартный компилятор должен в этом случае выдавать именно ошибку, это точно! Неявный int был обусловлен совместимостью с НЕстандартным С (еще до 1989 года). А теперь тип возвращаемого значения надо указывать обязательно!
Не понимаю... Вроде gcc 2007 года должен поддерживать стандарт по умолчанию...
Спасибо сказали:

Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: С новичёк

Сообщение deninok » 06.12.2007 22:04

KukMan писал(а):
06.12.2007 17:10
А вот функции-конструкторы класа должны быть типом? ибо в книгах пишется без типа. ПРосто Nameofclass::Nameofclass() { }, без типа. По стандарту это правильно?

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

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С новичёк

Сообщение drBatty » 07.12.2007 11:06

deninok писал(а):
06.12.2007 21:58
Очень странно... Стандартный компилятор должен в этом случае выдавать именно ошибку, это точно!
Прошу прощения. Это я вас запутал. Компилятор я указал правильно, но вот запускал я его как cc, и программа была на языке c, а вовсе не на cpp. Несмотря на внешнюю похожесть эти языки совершенно разные. В Си, например, допускается такая запись. А gcc и тексты на fortran'е умеет компилировать ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: С новичёк

Сообщение deninok » 07.12.2007 20:44

Да, действительно, такая форма записи в С допустима. К сожалению... Что делать, совместимость со старой версией языка диктует свои правила.
Спасибо сказали: