Один из основных вопросов начинающего программиста, это - "Почему не запускается ?", вот пример программы, которая компилируется одним компилятором, а другим нет (даже двумя) Обсуждалась прога Code #include <iostream.h> void main(void) { int k,i; int power (int,int); for (i=0; i<10; i++) { k=power (2,i); cout << "i= " << i << ", k=" << k << endl; } }
int power (int x, int n) { int p=1; for (int i =0; i<=n; i++) p *=x; return p; } Данный пример я попытался скомпилировать в Visual Studio 2008 pro и в Dev-C++ Работать код отказался, как в VS, так и в Dev-C++, плюёт следующее 1>.\main.cpp(1) : fatal error C1083: Cannot open include file: 'iostream.h': No such file or directory Убираем .h из инклюда. (Посмотрел файлы iostream в Visual Studio, Dev-C++ и в Borland Builder. У Борланда (возможно и у в других версиях языка C++), этот файл имеет расширение h, поэтому убирать .h не надо.) Далее получаем 1>.\main.cpp(17) : error C2065: 'cout' : undeclared identifier 1>.\main.cpp(17) : error C2065: 'endl' : undeclared identifier Что за ... Google forever ! Решение кроется в добавлении после инклюда строчки using namespace std; (Предположу, что у Борланда использование пространства имён std, без явного указания этого факта, производит сам компилятор) Объявление всех имён из данного пространства глобальными является признаком плохого стиля, как пишет Страуструп. В Dev-C++ добавляется сообщение о том, что main должен возвращать значение типа int, даже если не используем return. В VS сообщение появляется если в конце программы, мы, решим использовать return. Ещё один путь, хороший стиль. При использовании cout и других подобных ей функций добавляем перед ними std::, строку с using убираем std::cout << "i=" << i << "k=" << k << std::endl; Можно и с using, но по другому: using std::cout;, вставляем в код, перед использованием. Кстати исполняемый файл скомпилированый и слинкованый продуктами от Microsoft занял на диске - 9728 байт, а файл полученный с помощью GCC или G++ занял 497751 байт, всего-то в 50 раз больше ! (Могу предположить, что необходимые статические библиотеки прикрепляются к файлу) Причина мне не известна, но я выясню с помощью отладчика. И возможно напишу об этом. Рабочая версия под Visual Studio 2008: Code #include <iostream>
int power (int x, int n) { int i, p=1; for (i=1; i<n; i++) p*=x; return p; }
void main(void) { int i, k; for (i=0; i<10; i++) { k=power(2,i); std::cout<<"i = " << i << ", k = " << k << std::endl; } system ("pause"); } Если объявить функцию power до main, то её не надо прописывать в коде, перед выполнением (как в первоначальном варианте) system ("pause"); - выполняем консольную команду ОС - pause. (Можно вызвать любую консольную команду, например вывод содержимого директории на экран - system ("dir");) Результат: Модификация программы: Code #include <iostream> #include <locale.h>
int power (int x, int n) { int i, p=1; for (i=1; i<n; i++) p*=x; return p; }
void main(void) { setlocale(LC_ALL,"Rus"); int i, k, in; std::cout << "Введите основание: "; std::cin >> in; for (i=0; i<10; i++) { k=power(in,i); std::cout<<"i = " << i << ", k = " << k << std::endl; } system ("pause"); } Добавлено: приглашение на ввод, ввод непосредственно основания целочисленного типа, и в первом параметре функции power изменена двойка на переменную in. Пример результата:
|