Вопрос по C

Курсы, колледжи, университеты.
Andrey FAN
Новичок
Posts: 53
Joined: 05 Jan 1999 10:01
Location: Moldova

Вопрос по C

Post by Andrey FAN »

Впервые копаюсь в С++
Как сделсть так, что бы окошко после выполнения прграммы не закрывалось?
Спасибо.
RomaFAN
meerkat
Уже с Приветом
Posts: 405
Joined: 16 Apr 2000 09:01

Вопрос по C

Post by meerkat »

Думаю у тебя еще появиться много вопросов, зайди на http://lib.ru/, там есть "УЧЕБНИКИ ПО ПРОГРАММИРОВАНИЮ, C, C++ ( 20 )".
Удачи.
psx
Уже с Приветом
Posts: 414
Joined: 16 Mar 2000 10:01
Location: Salt Lake City, UT, US

Вопрос по C

Post by psx »

Зависит от того, чем вы пользуетесь в С. Можно использовать что-то типа *get*, то есть например _getch(). Будет ждать нажатия клавиши на клавиатуре.
dimate
Новичок
Posts: 55
Joined: 24 Apr 2000 09:01
Location: Moscow->Haifa->Chicago

Вопрос по C

Post by dimate »

<BLOCKQUOTE><font size="1" face="Arial">quote:</font><HR>Originally posted by Andrey FAN:
[i:02c49c19f1]Впервые копаюсь в С++
Как сделсть так, что бы окошко после выполнения прграммы не закрывалось?
Спасибо.
RomaFAN [/i:02c49c19f1]<HR></BLOCKQUOTE>

It doesn't have to do with C or C++. It is a Win95/98 setting for DOS windows. I work on NT and am not sure where you can switch it centrally, but look in Control Panel. Also, if You might be able to change it by rightclick the batch file which is responsible for compilation and select Properties. On the Program tab, uncheck "Close on exit".
jawabean@home
Уже с Приветом
Posts: 588
Joined: 24 Sep 1999 09:01

Вопрос по C

Post by jawabean@home »

naverno, proshe vsego zapuskat' programmu iz dos sessii (v command prompt). togda ono uzhe v okne budet, i nechemu budet zakryvat'sya.

a vopros horoshij: ni tebe kompilyator kakoj, ni OS

mozhet on na kakom-nibud' BeOS vse delaet, kotorogo nikto tut ne znaet
Andrey FAN
Новичок
Posts: 53
Joined: 05 Jan 1999 10:01
Location: Moldova

Вопрос по C

Post by Andrey FAN »

Учебники для начинающих у меня есть, но во всех пишут: введите такой-то код, скомпилируйте, и выполните программу, увидите такой-то результат.
Так вот результат увидеть не успеваю, очень быстро закрывается окошко.
Нигде об этом не нашёл.
В Perl подобную проблему решаю оператором SLEEP :-) Наверное, не правильно, но ничего другого не вычитал.
Подскажите, что, трудно? :-)
RomaFAN
FANRA
Posts: 5
Joined: 20 Jul 2000 09:01
Location: Moldova

Вопрос по C

Post by FANRA »

Нет, из доса запускать не удобно. А в опции то же не то, программа должна сама работать. Вот psx предложил то, что мне надо команду, которая заставляет программу ждать нажатия клавиши, но почему-то компилятор не берет эту команду, может я, что-то не то делаю?

#include <stdio.h>
main()
{
printf ("Hello, Fan!\n");
_getch();
}

Спасибо.
meerkat
Уже с Приветом
Posts: 405
Joined: 16 Apr 2000 09:01

Вопрос по C

Post by meerkat »

Файл заголовка для _getch() - conio.h .
Попробуй еще _kbdhit(). А файл заголовка stdio.h - это для getchar().
tevch
Уже с Приветом
Posts: 325
Joined: 12 Apr 1999 09:01
Location: NYC

Вопрос по C

Post by tevch »

Да что Вы право. В NT свойства shortcut. Закрывать или нет после завершения программы.
FANRA
Posts: 5
Joined: 20 Jul 2000 09:01
Location: Moldova

Вопрос по C

Post by FANRA »

Meerkat, большое спасибо. Все работает, хотя пришлось немного подумать, так как вы сделали ошибку, команда kbdhit(); принимается компилятором в виде kbhit();, это наверно от того, что вы спешили мне помочь, и опечатались или вы имели ввиду другую команду?
Еще раз спасибо.
meerkat
Уже с Приветом
Posts: 405
Joined: 16 Apr 2000 09:01

Вопрос по C

Post by meerkat »

FANRA:
Да вы правы, это была опечатка, правильно _kbhit. Если у Вас VC++, то можно запускать программу из под отладчика Ctrl+F5, а не F5, тогда можно и без _getch и пр. обойтись.

tevch:
А если Вы работаете не под NT?
FANRA
Posts: 5
Joined: 20 Jul 2000 09:01
Location: Moldova

Вопрос по C

Post by FANRA »

Meerkat:
Нет, к сожалению я не в VC++ мне до этого долече, как то я сел за него. Голова аж закружилась от этих проектов, конструкторов и прочего, для начало разберусь в просто в С и С++, а уж потом и за V можно. Мне пока что 16. [img:5f58126e6f]http://www.privet.com/ubb/smile.gif[/img:5f58126e6f]
Tevch:
Вы подумайте: вам нужно сделать Кому-то какую-то программу, которая должна выводить результат на экран. Вы ее сделаете, хорошо сделаете, поставите эту галочку. Но вдруг у этого Кого-то эта галочка исчезла или сам он ее убрал, ну мало ли чего может сделать эта винда, и что тогда? А не проще написать kbhit(); и все, и не морочить себе голову?
С уважением FANRA.
tevch
Уже с Приветом
Posts: 325
Joined: 12 Apr 1999 09:01
Location: NYC

Вопрос по C

Post by tevch »

OK. Я думал, что это так, тестовое окошко за полчаса. А ежели проект серьезный то да.
FANRA
Posts: 5
Joined: 20 Jul 2000 09:01
Location: Moldova

Вопрос по C

Post by FANRA »

Tevch:
Даже и если это тестовое окошко за полчаса, неужели удобнее искать этот свеженаписанный файл, создавать ярлык, ставить галочку, потом его запускать? Тестовое окошко- это, на мой взгляд, маленькая программа, которую и не стоит сохранять, так посмотрел, работает, и все.
Roman S.B.
Posts: 11
Joined: 07 Oct 1999 09:01
Location: Kharkov,Ukraine

Вопрос по C

Post by Roman S.B. »

Не подскажете?
Фрагмент:
__________________________________
class A
{
public:
A();
~A();
private:
ULONG* m_2Darray;
};

A::A()
{
m_2Darray = new ULONG[5][5];
}

A::~A()
{
delete [][] m_2Darray;
}
___________________________________

То ли в объявлении m_2Darray, то ли в конструкторе/деструкторе есть ошибки.
Как ни извращался - все равно Compiler Error C2440:
'conversion' : cannot convert from 'type1' to 'type2'

Может, есть вариант правильного кода?

Спасибо,
Роман
User avatar
BOBAH
Уже с Приветом
Posts: 9885
Joined: 18 Apr 2000 09:01
Location: Moscow -> VA -> Boston, MA

Вопрос по C

Post by BOBAH »

Вот так работает:
A::A()
{
m_2Darray = new ULONG[5, 5];
}

A::~A()
{
delete m_2Darray;
}
User avatar
BOBAH
Уже с Приветом
Posts: 9885
Joined: 18 Apr 2000 09:01
Location: Moscow -> VA -> Boston, MA

Вопрос по C

Post by BOBAH »

А как подразумевалось в вопросе?

Вот что там было написано: [i:8328fe5f9d]"То ли в объявлении m_2Darray, то ли в конструкторе/деструкторе есть ошибки. Как ни извращался - все равно Compiler Error C2440: 'conversion' : cannot convert from 'type1' to 'type2'"[/i:8328fe5f9d]
Речь шла об ошибках компиляции а не об ошибках выполнения. Причем сюдя по ошибкам можно однозначно идентифицировать VC++. Так в чем проблема? ЧТо я сказал неправильно?
alext
Новичок
Posts: 21
Joined: 05 Jun 1999 09:01
Location: Minsk, Belarus --> A'dam, The Netherlands

Вопрос по C

Post by alext »

<BLOCKQUOTE><font size="1" face="Arial">quote:</font><HR>Originally posted by BOBAH:
[i:2ffb15e442]Вот так работает:
A::A()
{
m_2Darray = new ULONG[5, 5];
}

A::~A()
{
delete m_2Darray;
}
[/i:2ffb15e442]<HR></BLOCKQUOTE>

Где?!!!!

Точнее, то, что компилятор это съел и не подавился - это понятно. А вот чтобы это еще и работало именно так, как подразумевалось в вопросе ...

[This message has been edited by alext (edited 06-09-2000).]
bemby
Уже с Приветом
Posts: 2107
Joined: 02 Aug 2000 09:01
Location: Covina, CA, USA (from SPb, RU)

Вопрос по C

Post by bemby »

ВОВАН прав. В современных реализациях C++ не нужно писать "delete a[]", а уж тем более "delete a[][]". Достаточно просто "delete a". Когда динамически выделяется блок памяти, в его заголовке и так его размер написан. Память под многомерные массивы все равно выделяется линейно.

P.S. А "delete []a" - совсем плохо. [img:31e38192d2]http://www.privet.com/ubb/smile.gif[/img:31e38192d2]

[This message has been edited by bemby (edited 06-09-2000).]
alext
Новичок
Posts: 21
Joined: 05 Jun 1999 09:01
Location: Minsk, Belarus --> A'dam, The Netherlands

Вопрос по C

Post by alext »

Ндаааа........... Тьфу, я хотел сказать "мама моя, убереги меня от программ, написанных BOBAHом или bemby" :-)

<BLOCKQUOTE><font size="1" face="Arial">quote:</font><HR>Originally posted by BOBAH:
[i:619d2e1343]А как подразумевалось в вопросе?
[/i:619d2e1343]<HR></BLOCKQUOTE>

Смотрим всего-то одним (!) сообщением выше твоего ответа и видим:

<BLOCKQUOTE><font size="1" face="Arial">quote:</font><HR>Originally posted by Roman S.B.:
[i:619d2e1343]Не подскажете?

m_2Darray = new ULONG[5][5];

[/i:619d2e1343]<HR></BLOCKQUOTE>

Человеку нужен двумерный массив 5 на 5. Т.е. (кто не понял) на 25 элеменов. Вот твой ответ:

<BLOCKQUOTE><font size="1" face="Arial">quote:</font><HR>Originally posted by BOBAH:
[i:619d2e1343]Вот так работает:
A::A()
{
m_2Darray = new ULONG[5, 5];
}
A::~A()
{
delete m_2Darray;
}
[/i:619d2e1343]<HR></BLOCKQUOTE>

"Вот так работает". Блин, нет слов. "Вот так" ты выделил память под 5 (пять), а не 25 (двадцать пять), элементов. Не веришь - скомпилируй и проверь.

<BLOCKQUOTE><font size="1" face="Arial">quote:</font><HR>Originally posted by bemby:
[i:619d2e1343]ВОВАН прав. В современных реализациях C++ не нужно писать "delete a[]", а уж тем более "delete a[][]". Достаточно просто "delete a". Когда динамически выделяется блок памяти, в его заголовке и так его размер написан. Память под многомерные массивы все равно выделяется линейно.

P.S. А "delete []a" - совсем плохо. [img:619d2e1343]http://www.privet.com/ubb/smile.gif[/img:619d2e1343]

[/i:619d2e1343]<HR></BLOCKQUOTE>

Этот смайлик относится ко всему сообщению, или только к P.S.?

Мое предположение, что только к P.S. А поэтому:

ВОВАН [b:619d2e1343]не[/b:619d2e1343] прав. Ты, соответственно, тоже.

<OL TYPE=1>
<LI> "delete a[][]" - просто синтаксическая ошибка. "delete[][] a", кстати, тоже.
<LI> Не вижу ничего смешного в конструкции "delete []a". Абсолютно нормальный С++.
<LI> Про "Достаточно просто delete a" расскажи стандартизаторам от C++. Может, они "осознают всю глубину своей неправоты" и изменят стандарт.
<LI> "Course mode on"

Освобождение памяти - это только часть того, что выполняют "operator delete" и "operator delete[]". Они еще и деструкторы вызывают (деструктор - это такая... ну да ладно). Так вот, "operator delete" вызывает деструктор только для одного элемента. А "operator delete[]" вызывает деструктор для всех элементов массива.

Для особо неверящих советую скомпилять и [b:619d2e1343]запустить[/b:619d2e1343] вот такую программку:

<BLOCKQUOTE><font size="1" face="Arial">code:</font><HR><pre>#include <stdio.h>

class A {
public:
A();
~A();
};

A::A() {}
A::~A() { printf("~A()\n"); }

int main() {

A* a1 = new A[2];
A* a2 = new A[2];

printf("Deleting via delete[]\n");
delete[] a2;

printf("Deleting via delete\n");
delete a1;

return 0;
}</pre><HR></BLOCKQUOTE>
"Course mode off"
</OL>


[This message has been edited by alext (edited 07-09-2000).]
User avatar
BOBAH
Уже с Приветом
Posts: 9885
Joined: 18 Apr 2000 09:01
Location: Moscow -> VA -> Boston, MA

Вопрос по C

Post by BOBAH »

ОК. Уел. Действительно с многомерными массивами я давно не работал вот и облажался. Странно только, что компилятор записть типа ULONG[5, 5] съел. Ну да ладно. Моя ошибка, признаю.
На счет деструкторов и оператора delete я все знаю. Но в то же время мне интересно с каких это пор у типа ULONG появился деструктор? А для элементарных типов удаление по delete без скобок работает корректно.

А теперь, мил человек alext, расскажи, а как бы ты ответил на заданный вопрос? А то критиковать все умеют...
bemby
Уже с Приветом
Posts: 2107
Joined: 02 Aug 2000 09:01
Location: Covina, CA, USA (from SPb, RU)

Вопрос по C

Post by bemby »

Виноват, виноват...
Не прав.
Забавно, пишу на C++ с 91-го, но ни разу не использовал массив объектов (сначала были TCollection, потом CArray и STL vector).
Помню конструкцию delete [] c книги Страуструпа, но счел ее устаревшей (не книгу).

А конструкция ulong a[5,5] вполне правильна с точки зрения языка, только смысла в ней нет. Оператор "," используется для "evaluate two or more expressions in contexts where only one expression is allowed", т.е. результатом выражения 5,5 будет 5, как последнее выражение в списке.
bemby
Уже с Приветом
Posts: 2107
Joined: 02 Aug 2000 09:01
Location: Covina, CA, USA (from SPb, RU)

Вопрос по C

Post by bemby »

Да, а правильный код в том примере будет таким:

<BLOCKQUOTE><font size="1" face="Arial">code:</font><HR><pre>

class A
{
public:
A();
~A();
private:
long(*m_2Darray)[5];
};

A::A()
{
m_2Darray = new long[5][5];
}

A::~A()
{
delete [] m_2Darray;
}

</pre><HR></BLOCKQUOTE>
User avatar
BOBAH
Уже с Приветом
Posts: 9885
Joined: 18 Apr 2000 09:01
Location: Moscow -> VA -> Boston, MA

Вопрос по C

Post by BOBAH »

А как быть со случаем, когда обе размерности неизвестны? А то какой смысл в двумерном массиве у которого одна размерность фиксируется при объявлении... [img:0de4b2547c]http://www.privet.com/ubb/smile.gif[/img:0de4b2547c]
Есть ли какия-то возможность задать такой массив и выделить его по new без применения приведения типов?
bemby
Уже с Приветом
Posts: 2107
Joined: 02 Aug 2000 09:01
Location: Covina, CA, USA (from SPb, RU)

Вопрос по C

Post by bemby »

Встречный вопрос: а зачем вообще многомерные массивы нужны?
Массив любой размерности замечательно получается из одномерного:

1. a = new long[Na*Nb*Nc...*Nz] - allocation
2. a[a + b*Na + c*(Nb*Na) + .. + z*(Na*Nb*...*Ny)] - адресация

где Na..Nz - размерности массива
а а..z - индексы по ним.

Return to “Образование”