Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите найти ошибку (http://forum.oszone.net/showthread.php?t=92970)

KEKS-KEKS 27-10-2007 20:33 668340

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

initialization of 'Index' is skipped by 'case' label
J:\C++\Lesson 13\main.cpp(33) : see declaration of 'Index'
J:\C++\Lesson 13\main.cpp(47) : error C2361: initialization of 'Index' is skipped by 'default' label
J:\C++\Lesson 13\main.cpp(33) : see declaration of 'Index'
Error executing cl.exe.

main.obj - 2 error(s), 0 warning(s)


#include <iostream>
#include <exception>
#include "PromptModule.h"
#include "ErrorHandlingModule.h"
using namespace std;

char GetOperator(void)
{
char Operator;
cout<<"OPERATOR =";
cin>>Operator;
return Operator;
}
float GetOperand(void)
{
float Operand;
cout<<"OPERAND =";
cin>>Operand;
return Operand;
}

void Tape(const char theOperator,const int theOperand)
{
static const int myTapeChunk=3;
static char *myOperator=new char[myTapeChunk];
static int *myOperand=new int[myTapeChunk];
static int myTapeSize=myTapeChunk;
static int myNumberOfEntries=0;
switch (theOperator)
{
case '?':for
(
int Index=0; ОШИБКА
Index < myNumberOfEntries;
Index++
)
{
cout <<
myOperator[Index]<<","<<myOperand[Index]<<endl;
};
break;
case '.': ОШИБКА
delete [] myOperator;
delete [] myOperand;
break;

default : // dobavitj k lente i passhiritj 51
if (myNumberOfEntries == myTapeSize)
{
char *ExpendedOperator=new char[myNumberOfEntries+myTapeChunk];
int *ExpendedOperand=new int [myNumberOfEntries+myTapeChunk];

char *FromOperator=myOperator;
int *FromOperand=myOperand;

char *ToOperator=ExpendedOperator;
int *ToOperand=ExpendedOperand;

for
(
int Index = 0;
Index<myNumberOfEntries;
Index++
)
{
*ToOperator++= *FromOperator++;
*ToOperand++= *FromOperand++;
};
delete[] myOperator;
delete[] myOperand;

myOperator=ExpendedOperator;
myOperand=ExpendedOperand;

myTapeSize+=myTapeChunk;
};
myOperator[myNumberOfEntries]=theOperator;
myOperand[myNumberOfEntries]=theOperand;
myNumberOfEntries++;
};
}

Alexej77 27-10-2007 21:59 668383

Попробуй чуть-чуть изменить (выделено жирным):

void Tape(const char theOperator,const int theOperand)
{
static const int myTapeChunk=3;
static char *myOperator=new char[myTapeChunk];
static int *myOperand=new int[myTapeChunk];
static int myTapeSize=myTapeChunk;
static int myNumberOfEntries=0;
int Index;
switch (theOperator)
{
case '?':for
(
Index=0; ОШИБКА
Index < myNumberOfEntries;
Index++
)
)
{
cout <<
myOperator[Index]<<","<<myOperand[Index]<<endl;
};
break;
case '.': ОШИБКА
delete [] myOperator;
delete [] myOperand;
break;

default : // dobavitj k lente i passhiritj 51
if (myNumberOfEntries == myTapeSize)
{
char *ExpendedOperator=new char[myNumberOfEntries+myTapeChunk];
int *ExpendedOperand=new int [myNumberOfEntries+myTapeChunk];

char *FromOperator=myOperator;
int *FromOperand=myOperand;

char *ToOperator=ExpendedOperator;
int *ToOperand=ExpendedOperand;

for
(
Index = 0;
Index<myNumberOfEntries;
Index++
)

KEKS-KEKS 27-10-2007 23:43 668433

Спасибо. Получилось. Не могли бы вы объяснить причину ошибки :tongue: . Заранее благодарен за ответ.

Gamover jr 28-10-2007 12:19 668556

KEKS-KEKS, я не нашёл в твоём коде объявление переменной Index.

Alexej77 28-10-2007 20:41 668784

Первая ошибка. В одной процедуре (Tape) два раза объявляется переменная Index - int Index=0.
Вторая ошибка. Переменная Index объявляется внутри оператора case '?', который может выполниться, а может и нет, в зависимости от значения переменной theOperator.

KEKS-KEKS 28-10-2007 23:00 668840

" Первая ошибка. В одной процедуре (Tape) два раза объявляется переменная Index - int Index=0." Но ведь это разные переменные, они же существуют в разное время . И почему нельзя объявить переменную внутри 'case ?' если он выполнится , то переменная возникнет. А если не выполнится ,то она (переменная) и не возникнет . Я так думаю :read:

Gamover jr, переменная Index объявляется в строке в которой и есть ошибка , хотя я так и не понял почему так делать нельзя.

Alexej77 28-10-2007 23:56 668861

Как это переменные разные?! Переменная одна в пределах процедуры. Не может быть разных переменных с одинаковым именем.

KEKS-KEKS 30-10-2007 22:00 669971

Alexej77, Мне непонятно почему нельзя объявить переменную внутри цикла "for"
case '?' вот так:
for
(
int Index = 0;
Index < myNumberOfEntries;
Index++
)

Alexej77 31-10-2007 20:16 670522

Объявить-то можно где угодно в процедуре, но повторюсь:
Цитата:

Цитата Alexej77
case '?', который может выполниться, а может и нет, в зависимости от значения переменной theOperator. »

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

KEKS-KEKS 01-11-2007 20:30 671083

Спасибо за ответ. Но всё-таки непонятно
Цитата:

Цитата Alexej77
case '?', который может выполниться, а может и нет, в зависимости от значения переменной theOperator. » »

, ну и что ,что case '?' не выполнится ,тогда и переменная не возникнет и не будет проблем. И почему компилятор пропускает в случае default :


default : // смотреть текст самого первого сообщения
.
.
.
for
(
int Index = 0; в этой строке никакой ошибки нет
Index<myNumberOfEntries;
Index++
)

,хотя в аналогичном коде в случае case '?' появляется ошибка


Время: 22:15.

Время: 22:15.
© OSzone.net 2001-