Войти

Показать полную графическую версию : Помогите найти ошибку


KEKS-KEKS
27-10-2007, 20:33
Код из самоучителя, всё переписал ошибки в двух строках выделенных жирным шрифтом.

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
Попробуй чуть-чуть изменить (выделено жирным):

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
Спасибо. Получилось. Не могли бы вы объяснить причину ошибки :tongue: . Заранее благодарен за ответ.

Gamover jr
28-10-2007, 12:19
KEKS-KEKS, я не нашёл в твоём коде объявление переменной Index.

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

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

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

Alexej77
28-10-2007, 23:56
Как это переменные разные?! Переменная одна в пределах процедуры. Не может быть разных переменных с одинаковым именем.

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

Alexej77
31-10-2007, 20:16
Объявить-то можно где угодно в процедуре, но повторюсь:
case '?', который может выполниться, а может и нет, в зависимости от значения переменной theOperator. »
Компилятор, по идее, должен предупреждать об этом.
И если в дальнейшем попытаться обратиться к этой переменной (необъявленной), х.е.з., какое значение выдаст, или ошибка возникнет.
Вообще, обычно все переменные объявляют в начале процедуры, и переменные цикла тоже.

KEKS-KEKS
01-11-2007, 20:30
Спасибо за ответ. Но всё-таки непонятно case '?', который может выполниться, а может и нет, в зависимости от значения переменной theOperator. » », ну и что ,что case '?' не выполнится ,тогда и переменная не возникнет и не будет проблем. И почему компилятор пропускает в случае default :


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

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




© OSzone.net 2001-2012