Меню

Visual studio синтаксическая ошибка

pupsus

2 / 2 / 0

Регистрация: 30.10.2014

Сообщений: 62

1

12.11.2014, 18:38. Показов 25558. Ответов 7

Метки нет (Все метки)


Вот текст класса, где собственно говоря вылезает ошибка. Где я мог пропустить «;» никак не пойму. Причем предыдущая строка «Field* field;» ничем не отличается от строки с ошибкой «CSprite* balls;»

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma once
#include "stdafx.h"
#include "Sprite.h"
#include "Field.h"
 
 
class Balls
{
public:
    Balls(SDL_Renderer* passed_renderer, int x, int y, int w, int h, std::string FilePath);
    ~Balls(void);
 
    void Update();
 
    void SetColor();
    void Draw();
    void Generate();
    
private:
    Field* field;
    CSprite* balls;
    SDL_Renderer* renderer;
    int X;
    int Y;
    int img_width;
    int img_height;
};

текст ошибки:
1>—— Построение начато: проект: My_Game, Конфигурация: Debug Win32 ——
1> Sprite.cpp
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C2143: синтаксическая ошибка: отсутствие «;» перед «*»
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
1> My_Game.cpp
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C2143: синтаксическая ошибка: отсутствие «;» перед «*»
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
1> Main.cpp
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C2143: синтаксическая ошибка: отсутствие «;» перед «*»
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:usersсаняdocumentsvisual studio 2010projectsmy_gamemy_gameballs.h(21): error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
1> Создание кода…
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



16466 / 8966 / 2198

Регистрация: 30.01.2014

Сообщений: 15,567

12.11.2014, 18:48

2

Лучший ответ Сообщение было отмечено pupsus как решение

Решение

pupsus, эти ошибки говорят о том, что почему-то в этом месте трансляции не видно объявления типа CSprite.
Случайно файлы заголовочные друг от друга не зависят? Нет ли включения в Sprite.h файла Balls.h?



1



2 / 2 / 0

Регистрация: 30.10.2014

Сообщений: 62

12.11.2014, 18:50

 [ТС]

3

есть, а так нельзя делать?



0



16 / 16 / 6

Регистрация: 03.11.2014

Сообщений: 72

12.11.2014, 18:50

4

У деструктора воид убирать надо?



0



2 / 2 / 0

Регистрация: 30.10.2014

Сообщений: 62

12.11.2014, 18:54

 [ТС]

5

все, ошибка исправлена, спасибо)
если не сложно объясните в чем тут дело, почему не могут заголовочные друг на друга ссылаться?

Добавлено через 49 секунд
а зачем у деструктора воид убирать?



0



DrOffset

16466 / 8966 / 2198

Регистрация: 30.01.2014

Сообщений: 15,567

12.11.2014, 18:56

6

Цитата
Сообщение от pupsus
Посмотреть сообщение

есть, а так нельзя делать?

Нельзя. Т.к. будет рекурсивное включение.
Используй предварительное объявление (например в Balls.h), а include «Sprite.h» из Balls.h убери

C++
1
2
3
class CSprite;
 
// код из шапки темы.

заголовочный файл Sprite.h подключай вместо этого в Balls.cpp

Добавлено через 25 секунд

Цитата
Сообщение от pupsus
Посмотреть сообщение

а зачем у деструктора воид убирать?

Можно не убирать. Но вообще в С++ он не обязателен.



1



2 / 2 / 0

Регистрация: 30.10.2014

Сообщений: 62

12.11.2014, 19:02

 [ТС]

7

ясно, спасибо большое очень помогли



0



DrOffset

16466 / 8966 / 2198

Регистрация: 30.01.2014

Сообщений: 15,567

12.11.2014, 19:14

8

Лучший ответ Сообщение было отмечено pupsus как решение

Решение

Цитата
Сообщение от pupsus
Посмотреть сообщение

если не сложно объясните в чем тут дело, почему не могут заголовочные друг на друга ссылаться?

А включает Б, а Б включает А. Это бесконечная рекурсия. Разрывает ее в данном случае pragma once, но в что-то в любом случае страдает, либо в Balls.h не видно содержимого Sprite, либо наоборот (в зависимости от того что вперед успело включиться).

Добавлено через 10 минут
pupsus,
Вот небольшая иллюстрация на примере include-guards defines (с ними нагляднее, чем с once), но смысл тот же.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef A_TEST
#define A_TEST //A.h (1)
    //include "B.h"
    #ifndef B_TEST
    #define B_TEST
        //include "A.h"
        #ifndef A_TEST
        #define A_TEST //A.h(2)
            // и т.д.
 
            class A
            {
                B * f;
            };
        #endif
        // end include
 
        class B
        {
 
            A * f; // <-- здесь будет ошибка, A не объявлен,
                   // т.к. include guard выше не дал включить A.h
                   // потому что A_TEST уже есть, задефайнен выше (1)
        };
 
    #endif
    //end include
 
    class A
    {
        B * f;
    };
 
#endif //A_TEST



6



I am new to programming C.. please tell me what is wrong with this program, and why I am getting this error: error C2143: syntax error : missing ‘;’ before ‘type’….

extern void func();

int main(int argc, char ** argv){
    func();
    int i=1;
    for(;i<=5; i++) {
        register int number = 7;
        printf("number is %dn", number++);
    }
    getch();
}

asked Mar 29, 2013 at 4:10

eLg's user avatar

9

Visual Studio only supports C89. That means that all of your variables must be declared before anything else at the top of a function.

EDIT: @KeithThompson prodded me to add a more technically accurate description (and really just correct where mine is not in one regard). All declarations (of variables or of anything else) must precede all statements within a block.

answered Mar 29, 2013 at 4:17

Ed S.'s user avatar

Ed S.Ed S.

121k21 gold badges181 silver badges262 bronze badges

2

I haven’t used visual in at least 8 years, but it seems that Visual’s limited C compiler support does not allow mixed code and variables. Is the line of the error on the declaration for int i=1; ?? Try moving it above the call to func();

Also, I would use extern void func(void);

answered Mar 29, 2013 at 4:18

Randy Howard's user avatar

Randy HowardRandy Howard

2,16015 silver badges26 bronze badges

this:

int i=1;
for(;i<=5; i++) {

should be idiomatically written as:

for(int i=1; i<=5; i++) {

because there no point to declare for loop variable in the function scope.

answered Mar 29, 2013 at 4:17

lenik's user avatar

leniklenik

22.9k4 gold badges32 silver badges43 bronze badges

8

I am extremely confused why I am getting this strange error all the sudden:

Time.h is a very simple class, and it has a semicolon at the end of the class description, so I am pretty sure my code is correct here.. Then I get the same errors in: Microsoft Visual Studio 10.0VCincludememory.. Any ideas!?!? Thanks!

Compiler Output

1>ClCompile:
1>  Stop.cpp
1>c:projectnextbusTime.h(17): error C2143: syntax error : missing ';' before 'using'
1>c:projectnextbusTime.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  NextBusDriver.cpp
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludememory(16): error C2143: syntax error : missing ';' before 'namespace'
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludememory(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Update:
Can’t really post all the code as this is for a school project and we aren’t supposed to post before we submit, but small snippets should be ok..

Time.h

#ifndef TIME_HPP
#define TIME_HPP

#include <string>
#include <sstream>

using namespace std;

class Time {
// Defines a time in a 24 hour clock

public:
    // Time constructor
    Time(int hours = 0 , int minutes= 0);

    // POST: Set hours int
    void setHours(int h);

    // POST: Set minutes int
    void setMinutes(int m);

    // POST: Returns hours int
    int getHours();

    // POST: Returns minutes int
    int getMinutes();

    // POST: Returns human readable string describing the time
    // This method can be overridden in inheriting classes, so should be virtual so pointers will work as desired
    string toString();

private: 
    string intToString(int num);
    // POST: Converts int to string type

    int hours_;
    int minutes_;

};

#endif

DepartureTime.h (inherited class)

#ifndef DEPARTURE_TIME_HPP
#define DEPARTURE_TIME_HPP

#include <string>
#include "Time.h"

using namespace std;

class DepartureTime: public Time {
public:
    // Departure Time constructor
    DepartureTime(string headsign, int hours=0, int minutes=0) : Time(hours, minutes), headsign_(headsign) { }

    // POST: Returns bus headsign
    string getHeadsign();

    // POST: Sets the bus headsign
    void setHeadsign(string headsign);

    // POST: Returns human readable string describing the departure
    string toString();

private:
    // Class variables
    string headsign_;
};
#endif

I am extremely confused why I am getting this strange error all the sudden:

Time.h is a very simple class, and it has a semicolon at the end of the class description, so I am pretty sure my code is correct here.. Then I get the same errors in: Microsoft Visual Studio 10.0VCincludememory.. Any ideas!?!? Thanks!

Compiler Output

1>ClCompile:
1>  Stop.cpp
1>c:projectnextbusTime.h(17): error C2143: syntax error : missing ';' before 'using'
1>c:projectnextbusTime.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  NextBusDriver.cpp
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludememory(16): error C2143: syntax error : missing ';' before 'namespace'
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludememory(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Update:
Can’t really post all the code as this is for a school project and we aren’t supposed to post before we submit, but small snippets should be ok..

Time.h

#ifndef TIME_HPP
#define TIME_HPP

#include <string>
#include <sstream>

using namespace std;

class Time {
// Defines a time in a 24 hour clock

public:
    // Time constructor
    Time(int hours = 0 , int minutes= 0);

    // POST: Set hours int
    void setHours(int h);

    // POST: Set minutes int
    void setMinutes(int m);

    // POST: Returns hours int
    int getHours();

    // POST: Returns minutes int
    int getMinutes();

    // POST: Returns human readable string describing the time
    // This method can be overridden in inheriting classes, so should be virtual so pointers will work as desired
    string toString();

private: 
    string intToString(int num);
    // POST: Converts int to string type

    int hours_;
    int minutes_;

};

#endif

DepartureTime.h (inherited class)

#ifndef DEPARTURE_TIME_HPP
#define DEPARTURE_TIME_HPP

#include <string>
#include "Time.h"

using namespace std;

class DepartureTime: public Time {
public:
    // Departure Time constructor
    DepartureTime(string headsign, int hours=0, int minutes=0) : Time(hours, minutes), headsign_(headsign) { }

    // POST: Returns bus headsign
    string getHeadsign();

    // POST: Sets the bus headsign
    void setHeadsign(string headsign);

    // POST: Returns human readable string describing the departure
    string toString();

private:
    // Class variables
    string headsign_;
};
#endif

  • Remove From My Forums
  • Question

  • The line of code which is causing this error is:-

    CD3DVertexCache *m_pVertexCache;

    CD3DVertexCache is a class.  Usually this is a stupid error meaning I’ve not included the header file for the class.  However on this occasion I have included the header file for the class.  Further more when I run the mouse cursor over the class name the little message box appears class CD3DVertexCache.  Which tells me the compiler knows of the class identifier.  I’m not sure why I’m getting the error message, wondering if someone can advise what other situations would cause this error to appear?

    Thanks,

    Paul.

Answers

  • Usually means that there is an error or omission in the previous line(s).

    Check for a missing semi-colon or other error(s) in the line(s) immediately

    *before* the one indicated by the error message.

    Check also for a missing semi-colon at the end of class and structure definitions.

    — Wayne

Содержание

  1. Краткий
    обзор среды разработки Visual
    Studio
    2008 2

  2. Создание
    простой консольной программы
    2

  3. Компиляция
    программы в Visual
    Studio.
    Исправление синтаксических ошибок
    8

  4. Отладка
    в Visual
    Studio.
    Поиск логических ошибок в программе
    12

  5. Приложение
    1. Таблица наиболее часто допускаемых
    ошибок 23

Краткий обзор среды разработки

Visual studio 2008

Начальная
страница

Когда вы впервые
запускаете Visual
Studio,
то открывается Начальная
страница
этой
среды разработки. На рис. 1 показан пример
Начальной
страницы.

Рисунок.1. Начальная
страница Visual
Studio
2008

В левом верхнем углу
окна Начальная
страница
имеется
область Последние
проекты
. Отсюда
можно загрузить проект, над которым
недавно работали, либо создать новый.

Создание простой консольной программы

Рассмотрим процесс
создания консольной программы в VS
на примере
несложной программы,
выполняющей
вывод на экран текстового сообщения
«Hello world».

Примечание.
Перед созданием вашего первого проекта
рекомендуется создать персональный
каталог в папке C:Users и присвоить ему
удобное для вас имя. Это поможет избежать
проблем в поиске созданных вами проектов.
На рисунке снизу изображён пример
созданной папки vmks.71aks.(Рис. 2)

Рисунок 2. Пример
созданной папки vmks.71aks

Шаг 1.
Создайте новый
проект консольного приложения,
выбрав команду
в меню FileNewProject,
как показано на
Рисунке 3.

Шаг 2.
В появившемся
окне New
Project(Рисунок
4) выберите
Visual C++ и
проект типа Win32..
После этого в
панели Templates
выберите тип
шаблона Win
32
console
application.
Затем в
текстовых полях Name
и Location
введите
соответственно имя вашего проекта. По
умолчанию VS
предлагает поместить файлы, относящиеся
к программе, в папку C:UsersAdminDocumentsVisual
Studio 2008Projects , а в поле имя проекта вы
увидите надпись <Enter_name>.

Примечание.
Имя проекта рекомендуется задавать на
английском языке, во избежание проблем
в использовании вашего проекта в других
версиях
VS.

В поле Location
укажите путь сохранения проекта. Для
этого нажмите кнопку Browse.
В открывшемся
окне Project
Location(Рисунок
5)
выберите путь к созданной ранее папке
в C:Users.
Нажмите ОК.

Шаг 3.
Далее в окне
Win32
application
wizard(Рисунок
6) нажмите
Next
и
Finish.

Рисунок 3. Создание
нового проекта

Рисунок 4. Диалоговое
окно New
Project

Рисунок 5. Диалоговое
окно Project
Location

Рисунок
6. Окно
Win32
application wizard

Шаг
4. После
завершения шага 3 откроется окно редактора
кода VS(Рисунок
7). Введите в нём текст примера(см. ниже).
Текст примера в окне редактора показан
на рисунке 8.

Рисунок 7. Окно
редактора кода

Пример
1.
Программа
на языке C/C++ с выводом сообщения “Hello
world”

#include
«stdafx.h»

#include
«conio.h» /*подключение
getch */

int
_tmain(int argc, _TCHAR* argv[])

{

printf(«Hello
world»); //вывод
на
экран
сообщения
“Hello world”

getch();
//ожидание
нажатия клавиши

return
0;

}

Шаг 5. Выберите в
меню Build
команду Build
Solution
для того, чтобы
cкомпилировать
программу .

Шаг 6. Выберите в
меню Debug
Start
Debugging
или на Стандартной панели нажмите кнопку
или на клавиатуре
нажмите клавишу
F5.
Через некоторое время после этого на
экране должно появиться окно консоли,
показанное на рисунке 9, с выведенным
на экране сообщением. Для завершения
работы приложения нажмите любую клавишу.

Рисунок 8.
Текст
программы в редакторе кода Visual
Studio

Рисунок
9.
Окно
консольного приложения

КОМПИЛЯЦИЯ
ПРОГРАММЫ В VISUAL STUDIO.

ИСПРАВЛЕНИЕ
СИНТАКСИЧЕСКИХ ОШИБОК

Компиляцией
программы
называется преобразование
программой-компилятором (входящей
в состав Visual
Studio) исходного
текста программы,
написанного на
языке программирования (например,
на C
или C++),
в машинный код.

Однако часто в
программах содержатся ошибки.
Некоторые из
этих

ошибок автоматически
обнаруживаются средствами VS.
После обнаружения
ошибки выдается соответствующее
диагностическое сообщение для
пользователя.
Такие программные
ошибки (фатальные
для процесса сборки приложения)
можно разделить
на две категории:
синтаксические
и ошибки
компоновки
.

Синтаксические
ошибки

это ошибки,
обнаруживаемые
во время компиляции исходного текста
программы и связанные с нарушениями
каких-либо
синтаксических правил языка
программирования.
Ошибки компоновки
– это
ошибки,
обнаруживаемые
во время объединения объектных
файлов
для
получения исполняемого
файла
.

Объектный
файл

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

Исполняемый
файл
— файл,
содержащий программу в том виде, в
котором она может быть исполнена
компьютером.

Рассмотрим
автоматическое обнаружение указанных
видов ошибок на

отдельных примерах.
Для этого создадим
консольное приложение способом,
указанным в
предыдущем разделе.
В окне редактора
кода наберите приведенный ниже текст
программы (см. пример 2). Затем выполните
сборку приложения, выбрав в меню Build
Build
Solution.
После этого в окне Output
должны появиться
сообщения об обнаруженных ошибках (рис.
10).

Для более удобной
работы со списком ошибок в VS предусмотрено
окно Error
list,
которое можно открыть, выбрав в меню
View
Other
windows
Error
list.
В открытом окне Error
list
дважды щелкните
по первой обнаруженной ошибке и убедитесь,
что при

этом в редакторе
кода курсор переместится на строку с
ошибкой (рис. 11).

СОВЕТ. Полезно
просматривать список ошибок
,
начиная с
первой
,
потому что одна
единственная
ошибка может вызвать цепную реакцию
,
появление
«наведенных»
ошибок.
Исправление
этой единственной ошибки приведет и к
исчезновению остальных
.
Однако
ограничиваться исправлением только
одной ошибки все же не стоит
,
поскольку вы
будете терять время на повторную сборку
решения
(а
оно может составлять в серьезных
приложениях до нескольких часов
!).
С опытом вы
научитесь легко отличать
«наведенные»
ошибки от
реальных
.

Пример 2. Программа
для преобразования массива, содержащая
в своем тексте ошибки

//
Дан массив размера N из различных целых
чисел.

//
Ввести элементы массива с клавиатуры.
Затем обнулить

//
те элементы, массива которые расположены
между его

//
минимальным и макcимальным элементами
(не включая

//
эти минимальный и максимальный элементы)

#include
«stdafx.h»

const
int Nmax = 10;

int
_tmain(int argc, _TCHAR* argv[])

{

int
a[Nmax], N = 0 /*
Ошибка cинтаксиса: отсутсвует ; в конце
объявления переменных */

printf(«Vvedite
razmer massiva N: «);

scnf(«%d»,
&N); /*
Ошибка cинтаксиса: неверное имя функции
(должно быть scanf_s) */

printf(«Vvod
elementov massiva a:n»);

for
(int i = 0; i < N; i++) {

printf(«Vvedite
element a[%d]: «, i);

scanf(«%d»,
&a[i]);

/*
Ошибка синтаксиса: нет закрывающей
скобки } */

//
Поиск максимального и минимального
элементов

int
iMax
= 0, iMin
= 0;

for
(int i = 1; i < N; i++) {

if
(a[iMax] < a[i]) iMax = i;

else

if
(a[iMin] > a[i]) iMin = i;

}

17

//
Обнуление элементов массива между

//
максимальным и минимальным его элементами

i1
= iMin;
/* Ошибка
cинтаксиса: не объявлен тип переменной
i1 (должно быть int i1 = iMin) */

int
i2 = iMax;

if
(iMin > iMax) {

i1
= iMax; i2 = iMin;

}

for
(int i = i1; i < i2; i++) /*
Логическая
ошибка:
должно
быть
i = i1 + 1 */

a[i]
= 0;

printf(«Vyvod
elementov massiva a:n»);

for
(int i = 0; i < N; i++)

printf(«Element
a[%d] = %dn», i, a[i]);

getch();
/*
Ошибка синтаксиса: в программе отсутсвует
описание функции _getch() */

/*
Чтобы исправить ошибку, добавьте в
начало программы #include <conio.h> */

return
0;

}

Рисунок
10.
Окно
Вывод
с
сообщениями об ошибках компиляции

Рисунок
11. Окно
Список
ошибок

Просмотрите весь
список обнаруженных при компиляции
ошибок. Точно установите строки текста
программы, содержащие ошибки (для этого
следует дважды щелкнуть по ошибке в
списке и курсор в редакторе кода
переместится на строку с ошибкой).
Используя указания в комментариях в
тексте программы, исправьте ошибки, а
затем перекомпилируйте программу. Если
все синтаксические ошибки были исправлены,
то компиляция пройдет успешно и будет
собран исполняемый файл.

Проверьте работу
программы, запустив ее на выполнение
командой меню Debug
Start
Debugging
(или нажав
клавишу F5). На рис. 12 показан пример
ввода-вывода программы, из которого
видно, что программа, хотя и работает,
но выдает неверный результат, поскольку
максимальный элемент массива тоже
обнуляется.

Рисунок
12. Ввод-вывод элементов массива

Это значит, что в
коде программы содержится ошибка,
которую автоматически не удалось
обнаружить. Средства поиска такого рода
ошибок (называемых логическими) будут
рассмотрены в следующем разделе.

Теперь рассмотрим
пример ошибки, которая обнаруживается
на этапе компоновки объектных файлов
в исполняемый файл. Представленная ниже
программа (пример 3) должна выводить
сообщение о том, является ли введенное
целое число четным или нечетным.

Пример
3.
Программа
с ошибкой,
обнаруживаемой
на этапе компоновки

#include
«stdafx.h»

#include
<conio.h>

int
isEven (int a);

int
_tmain(int argc, _TCHAR* argv[])

{

//
функция проверки числа на четность

//
прототип фукции есть, поэтому

//
компилятор не обнаружит ошибку

int
a = 0;

printf(«Vvedite
chislo a: «);

scanf(«%d»,
&a);

if
(isEven(a)) //
Ошибка компоновки: в программе

//
нет
описания
функции
isEven

printf(«Chislo
a = %d — chetn», a);

else

printf(«Chislo
a = %d — nechetn», a);

getch();

}

//int
isEven (int a) { return 0 == a % 2; }

В процессе компиляции
этой программы ошибок не будет обнаружено,
поскольку вся необходимая компилятору
информация о функции isEven дана в прототипе
(имя функции, тип возвращаемого ею
значения, количество, имена и типы ее
формальных параметров).

Однако на этапе
сборки компоновщику потребуется
определение функции isEven,
которое отсутствует
(закомментировано)
в программе,
что вызовет
появление соответствующего диагностического
сообщения (рис.
13). Внимательное
изучение содержимого окна Output
(рис.
14) показывает,
что программа
действительно успешно скомпилировалась,
а фатальная
ошибка произошла при компоновке.

Для того чтобы
исправить ошибку в нашем случае,
достаточно убрать знак комментария с
последней строки кода в данной программе,
после чего следует повторно сделать
сборку приложения и проверить его
работу. Работа программы после исправления
ошибок показана на рисунке 15.

Рисунок
13 Сообщение
компоновщика об ошибке

Рисунок
14.
Сообщения
компилятора и компоновщика в окне Output

Рисунок
15. Работа программы, после исправления
ошибок

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Аннотация: В этой лекции рассказывается о дефектах программного обеспечения — багах (ошибках) — которые не дают запуститься программам на Visual Basic. Вы узнаете о различных типах ошибок, появляющихся в программах, и о том, какие инструменты отладки Visual Studio .NET предоставляет для обнаружения и исправления этих ошибок.

В этой лекции вы узнаете, как:

  • определять в программах различные типы ошибок;
  • использовать инструменты для отладки Visual Studio .NET для установки точек останова и исправления ошибок;
  • использовать окно Watch для проверки значений переменных во время выполнения программы;
  • использовать окно Command (Окно команд) для изменения значений переменных и исполнения команд в Visual Studio.

В предыдущих лекциях у вас было достаточно возможностей допустить ошибки в программах. В отличие от человеческих диалогов, которые обычно не зависят от случайных грамматических ошибок и неверного произношения, общение между разработчиком программного обеспечения и компилятором Microsoft Visual Basic требует точного соблюдения всех правил и ограничений языка программирования Visual Basic. В этой лекции рассказывается о дефектах программного обеспечения — багах (ошибках) — которые не дают запуститься программам на Visual Basic. Вы узнаете о различных типах ошибок, появляющихся в программах, и о том, какие инструменты отладки Visual Studio .NET предоставляет для обнаружения и исправления этих ошибок. Эти знания будут вам крайне необходимы при написании ваших собственных программ.

Что нового в Visual Basic .NET?

  • Visual Basic .NET содержит несколько новых инструментов для поиска и корректировки ошибок. Многие из знакомых команд отладки Visual Basic 6 по прежнему являются частью Visual Studio (Start (Начать), Break (Приостановить), End (Закончить), Next (Следующий оператор), Step Into (Шаг с заходом), Step Over (Шаг с обходом)), но есть также ряд новых инструментов отладки и команд, включая пересмотренную панель Debug (Отладка), команды меню, которые управляют процессами и исключениями, и инструменты, которые поддерживают отладку многоязыких решений.
  • В интерфейс пользователя Visual Studio .NET добавлено несколько новых окон отладки, включая Autos (Видимые), Command (Окно команд), Call Stack (Список задач), Threads (Потоки), Memory (Память), Disassembly (Дизассемблированный код) и Registers (Регистры). Вы не будете использовать эти инструменты во время каждой сессии отладки, но они удобны при работе со сложными приложениями.

Поиск и исправление ошибок

Ошибки, с которыми вы до сих пор сталкивались в ваших программах, были просто опечатками, или синтаксическими ошибками. В программах встречаются и более сложные ошибки — такие, которые вы не можете найти, просто просмотрев используемые объекты, свойства и операторы. Среда разработки Visual Studio содержит несколько инструментов, которые помогут вам отследить и исправить ошибки в ваших программах. Эти инструменты не застрахуют вас от совершения ошибок, но облегчат их поиск и исправление.

Три типа ошибок

В программах на Visual Basic могут возникнуть три типа ошибок: синтаксические ошибки, ошибки времени исполнения и логические ошибки.

  • Синтаксическая ошибка (или ошибка компиляции) — это программная ошибка (например, неправильно написанное имя свойства или ключевое слово), которая нарушает правила написания программ на Visual Basic. Visual Basic распознает некоторые типы синтаксических ошибок при вводе операторов программы и не позволит запустить программу до тех пор, пока вы не исправите их все.
  • Ошибка времени исполнения — это ошибка, которая приводит к неожиданной остановке программы во время ее выполнения. Ошибки времени исполнения возникают, когда программа при выполнении останавливается из-за необнаруженной синтаксической ошибки. Ваш код сгенерирует ошибку времени исполнения, если вы, например, неправильно указали имя файла при использовании метода System.Drawing.Image.FromFile или при попытке считать данные с дисковода гибких дисков, когда в нем нет дискеты.
  • Логическая ошибка — это человеческая ошибка — ошибка в программе, которая приводит к тому, что код программы выдает неверные результаты. Большинство усилий при отладке тратится именно на поиск и исправление логических ошибок, совершенных программистом.

Если вы сталкиваетесь с синтаксической ошибкой, то чаще всего вы можете решить проблему с помощью справочной системы Visual Basic, из которой можно получить дополнительную информацию об ошибке, и исправить эту ошибку, уделив дополнительное внимание точному синтаксису используемых вами функций, объектов, методов и свойств. В Редакторе кода неверные операторы подчеркиваются синей волнистой линией. Удерживая указатель мыши над этим оператором, вы можете получить об ошибке дополнительную информацию. На следующей иллюстрации показано сообщение об ошибке, которое появляется в Visual Studio при некорректном вводе ключевого слова Case («Csae» вместо «Case»). Это сообщение об ошибке выглядит как всплывающая подсказка.

Если вы сталкиваетесь с ошибкой времени исполнения, то сможете решить проблему, исправив вводимые данные. Например, если в объект вывода изображений некорректно загружается растровое изображение, проблема наверняка заключается в неверно указанном пути к файлу. Однако многие ошибки времени исполнения требуют более сложного решения — структурного обработчика ошибок, который является специальным блоком кода программы, распознающим ошибку времени исполнения при ее возникновении. Он подавляет все сообщения об ошибках и подстраивает все условия программы для решения этой проблемы. Новый синтаксис структурных обработчиков ошибок обсуждается в
«Перехват ошибок с помощью структурной обработки ошибок»
.

Обнаружение логических ошибок

С точки зрения устранения, логические ошибки в программах зачастую являются наиболее сложными. Они — результат неверных предположений и планирования, а не просто неправильного понимания синтаксиса Visual Basic. Рассмотрим следующую структуру выбора If…Then, которая проверяет два условия, а затем, в зависимости от результата, отображает одно из двух сообщений:

If Age > 13 And Age < 20 Then
TextBox2.Text = "Вы тинэйджер"
Else
TextBox2.Text = "Вы не тинэйджер"
End If

Можете обнаружить ошибку в этой структуре? Тинэйджер — это человек, которому от 13 до 19 лет включительно, но эта структура не может идентифицировать человека, которому ровно 13 лет. Для этого возраста структура ошибочно отображает сообщение «Вы не тинэйджер». Этот тип ошибки не является синтаксической ошибкой (так как операторы соответствуют правилам Visual Basic); это интеллектуальная — или логическая ошибка. Правильная структура выбора содержит в первом сравнении оператора If dots Then оператор «больше или равно» (>=), как показано здесь:

If Age >= 13 And Age < 20 Then

Поверите вы или нет, но этот тип ошибок наиболее распространен в программах на Visual Basic.

Отладка 101: использование режима останова

Одним из способов обнаружить логическую ошибку является выполнение кода вашей программы по одной строке и изучение изменения содержимого одной или нескольких переменных. Для этого можно при работе вашей программы войти в режим останова, а затем просмотреть код в Редакторе кода. Режим останова дает возможность просмотреть программу во время ее исполнения компилятором Visual Basic. Это похоже на то, как если бы вы стояли за спиной пилота и наблюдали за тем, как он ведет самолет. Но в нашем случае вы сами можете трогать рычаги управления.

При отладке вашего приложения используется панель инструментов Debug (Отладка) — специальная панель инструментов, предназначенная для поиска ошибок. Эта панель инструментов показана на следующей иллюстрации. Ее можно открыть, выбрав команду Toolbars (Панели инструментов) в меню View (Вид), а затем щелкнув на Debug (Отладка).

В следующем упражнении вы установите точку останова, и используете режим останова для обнаружения и исправления логической ошибки в структуре If…Then. Эта ошибка является частью нормальной программы. Чтобы выявить проблему, вы будете использовать кнопку Step Into (Шаг с заходом), расположенную на панели инструментов Debug (Отладка), а для изучения значений ключевых переменных и свойств программы окно Autos (Видимые). Обратите особое внимание на эту методику отладки. Ее можно использовать для обнаружения и исправления ошибок в ваших собственных программах.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Visual studio произошла неизвестная ошибка при установке
  • Visual studio при запуске выбранного генератора кода произошла ошибка