Case label editor ошибка связи

█ 02.02.2017 12:25

День добрый
Есть весы Cas 5000j, прошивка при включении 2.1.7.S
Встала задача печати состава продукта.
Скачал Cl-works pro. Настроил сообщения — закинул в весы.
Теперь пытаюсь сделать этикетку —

попытки прочесть этикетки с весов дают ошибку
192.168.0.15 Vesi Communication Error (0)

Делаю этикетку руками (штрих код, текст, состав), номер 51 и пробовал другие, попытка залить

192.168.0.15 Vesi System.Drawing.Bitmap Not support in this model (-1007)

Этикетки 58-40. Хотел на таких уместить состав..
Хорошо, ну не выходит. Пробую указать под конкретный товар свою этикетку, допустим 60 формат. Там есть состав.
Если ставлю в сам товар в поле LabelNo — что в весах, что через утилиту — весы все равно печатают ОБЩУЮ этикетку заданную в меню 1510.

Объясните как или присвоить конкретному товару свой формат этикетки и как можно загрузить свой формат этикетки в весы ? (58-40 с текстами сообщений состава продукта).

█ 02.02.2017 13:14

Для начала необходимо удостовериться, что коннект с весами проходит:

Миниатюры

Нажмите на изображение для увеличения
Название: Screenshot_104.png
Просмотров: 732
Размер:	25.3 Кб
ID:	8111   Нажмите на изображение для увеличения
Название: Screenshot_105.png
Просмотров: 575
Размер:	19.5 Кб
ID:	8112  

█ 02.02.2017 13:21

Цитата:

Vacony ➤ Хорошо, ну не выходит. Пробую указать под конкретный товар свою этикетку, допустим 60 формат. Там есть состав.
Если ставлю в сам товар в поле LabelNo — что в весах, что через утилиту — весы все равно печатают ОБЩУЮ этикетку заданную в меню 1510.

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

█ 02.02.2017 13:46

Коннект есть. И в тесте, и товары заливаются.

Проблема что весы не понимают индивидуальный номер этикетки. И не дают считать этикетки из весов на ПК.

У меня бумага 58-40, был формат этикетки 4. Просто хотел добавить ниже состав ) Думал будет проще..

Прикладываю этикетку

█ 02.02.2017 13:47

Методом перебора выяснил, что если добавлять в этикетку текст — выгрузка не проходит…
Т.е. вывести цену можно, а рядом подпись ЦЕНА — не дает.

█ 02.02.2017 14:32

Vacony, убрал sample text, т.к. данное поле не поддерживается этой моделью. Добавил ЦЕНА, СУММА, ВЕС. Проверяйте. У меня все работает.

█ 02.02.2017 15:10

спасибо большое ) пока ковырял примерно к этому же пришел..

итого — вытянуть форматы с весов этикеток в ПК — нельзя тут.
надписи можно брать только с коллекции что идет в этикетке. написать свое что то нельзя.
Подвязать разный формат этикеток на разные товары тоже не выходит — печатается всегда общая этикетка заданная в меню 1510 на PLU. поле формат этикетки из таблицы PLU почему то игнорируется. что туда ни ставишь этикетка не меняется.

И последний вопрос, вдруг знаете. В весы всегда закидывал товары через библиотеку ForCas2.dll . Теперь вот надо закидывать состав, метод SendMSG отрабатывает , но в самих весах если вычитывать то что передалось — получается каша.

█ 02.02.2017 15:18

Цитата:

Vacony ➤ вытянуть форматы с весов этикеток в ПК — нельзя тут

только с 51 по 60 форматы

Цитата:

Vacony ➤ надписи можно брать только с коллекции что идет в этикетке. написать свое что то нельзя.

да, поле «текст» не поддерживается

Цитата:

Vacony ➤ Подвязать разный формат этикеток на разные товары тоже не выходит — печатается всегда общая этикетка заданная в меню 1510 на PLU. поле формат этикетки из таблицы PLU почему то игнорируется. что туда ни ставишь этикетка не меняется.

Можно, если предварительно создать и загрузить пользовательский формат с номером от 51 до 60.

Цитата:

Vacony ➤ И последний вопрос, вдруг знаете. В весы всегда закидывал товары через библиотеку ForCas2.dll . Теперь вот надо закидывать состав, метод SendMSG отрабатывает , но в самих весах если вычитывать то что передалось — получается каша.

Тут не подскажу

█ 02.02.2017 15:22

да точно, попробовал старой версией Cl work — 2.96.10
Указал 59-60, вытянул файлики. Но она не работает с отделами.. ни выгрузить ни загрузить…

Т.е. к товарам можно подвязать только 51-60 форматы индивидуально ? сейчас попробую…

█ 02.02.2017 15:29

Вот товары с выбранными разными этикетками. При печати печатается всегда одна общая для всех товаров в настройках весов

Миниатюры

Нажмите на изображение для увеличения
Название: Безымянный.JPG
Просмотров: 621
Размер:	61.4 Кб
ID:	8117  

Часовой пояс GMT +3, время: 21:26.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.

Здравствуйте!
Если загрузка товаров в категории программы «Товары» происходит без появления сообщений «Communication failed»,проблема может быть в данных, которые вы пытаетесь загрузить в весы, например, загрузка не поддерживаемого весами формата штрихкода или  загрузка формата этикетки, содержащего не поддерживаемые весами поля. Убедитесь, пожалуйста, в том, что формат штрихкода поддерживается весами (стр.33 Руководства по эксплуатации:

https://cascis.ru/images/materials/CL5000J-I-2014-11.pdf

),поля формата этикетки и другие загружаемые данные поддерживаются весами. Если загрузка и выгрузка товаров также происходит с прерываниями «Communication failed»,попробуйте заменить Ethernet-кабельна новый и, если это не поможет, обратитесь в ближайшее отделение сервисной
службы для диагностики весов.

С уважением,
Техническая служба ООО «КСТ»

Я написал программу, которая включает в себя использование операторов switch… Однако при компиляции она показывает:

Ошибка: переход к метке case.

Почему он это делает?

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

using namespace std;

class contact
{
public:
    string name;
    int phonenumber;
    string address;
    contact() {
        name= "Noname";
        phonenumber= 0;
        address= "Noaddress";
    }
};

int main() {
    contact *d;
    d = new contact[200];
    string name,add;
    int choice,modchoice,t;//Variable for switch statement
    int phno,phno1;
    int i=0;
    int initsize=0, i1=0;//i is declared as a static int variable
    bool flag=false,flag_no_blank=false;

    //TAKE DATA FROM FILES.....
    //We create 3 files names, phone numbers, Address and then abstract the data from these files first!
    fstream f1;
    fstream f2;
    fstream f3;
    string file_input_name;
    string file_input_address;
    int file_input_number;

    f1.open("./names");
    while(f1>>file_input_name){
        d[i].name=file_input_name;
        i++;
    }
    initsize=i;

    f2.open("./numbers");
    while(f2>>file_input_number){
        d[i1].phonenumber=file_input_number;
        i1++;
    }
    i1=0;

    f3.open("./address");
    while(f3>>file_input_address){
        d[i1].address=file_input_address;
        i1++;
    }

    cout<<"tWelcome to the phone Directoryn";//Welcome Message
    do{
        //do-While Loop Starts
        cout<<"Select :n1.Add New Contactn2.Update Existing Contactn3.Display All Contactsn4.Search for a Contactn5.Delete a  Contactn6.Exit PhoneBooknnn";//Display all options
        cin>>choice;//Input Choice from user

        switch(choice){//Switch Loop Starts
        case 1:
            i++;//increment i so that values are now taken from the program and stored as different variables
            i1++;
            do{
                cout<<"nEnter The Namen";
                cin>>name;
                if(name==" "){cout<<"Blank Entries are not allowed";
                flag_no_blank=true;
                }
            }while(flag_no_blank==true);
            flag_no_blank=false;
            d[i].name=name;
            cout<<"nEnter the Phone Numbern";
            cin>>phno;
            d[i1].phonenumber=phno;
            cout<<"nEnter the addressn";
            cin>>add;
            d[i1].address=add;
            i1++;
            i++;
            break;//Exit Case 1 to the main menu
        case 2:
            cout<<"nEnter the namen";//Here it is assumed that no two contacts can have same contact number or address but may have the same name.
            cin>>name;
            int k=0,val;
            cout<<"nnSearching.........nn";
            for(int j=0;j<=i;j++){
                if(d[j].name==name){
                    k++;
                    cout<<k<<".t"<<d[j].name<<"t"<<d[j].phonenumber<<"t"<<d[j].address<<"nn";
                    val=j;
                }
            }
            char ch;
            cout<<"nTotal of "<<k<<" Entries were found....Do you wish to edit?n";
            string staticname;
            staticname=d[val].name;
            cin>>ch;
            if(ch=='y'|| ch=='Y'){
                cout<<"Which entry do you wish to modify ?(enter the old telephone number)n";
                cin>>phno;
                for(int j=0;j<=i;j++){
                    if(d[j].phonenumber==phno && staticname==d[j].name){
                        cout<<"Do you wish to change the name?n";
                        cin>>ch;
                        if(ch=='y'||ch=='Y'){
                            cout<<"Enter new namen";
                            cin>>name;
                            d[j].name=name;
                        }
                        cout<<"Do you wish to change the number?n";
                        cin>>ch;
                        if(ch=='y'||ch=='Y'){
                            cout<<"Enter the new numbern";
                            cin>>phno1;
                            d[j].phonenumber=phno1;
                        }
                        cout<<"Do you wish to change the address?n";
                        cin>>ch;
                        if(ch=='y'||ch=='Y'){
                            cout<<"Enter the new addressn";
                            cin>>add;
                            d[j].address=add;
                        }
                    }
                }
            }
            break;
        case 3 : {
            cout<<"ntContents of PhoneBook:nntNamestPhone-NumberstAddresses";
            for(int t=0;t<=i;t++){
                cout<<t+1<<".t"<<d[t].name<<"t"<<d[t].phonenumber<<"t"<<d[t].address;
            }
            break;
                 }
        }
    }
    while(flag==false);
    return 0;
}

4b9b3361

Ответ 1

Проблема состоит в том, что переменные, объявленные в одном case, все еще видны в следующем case, если не используется явный блок { }, но они не будут инициализированы, потому что код инициализации принадлежит другому case.

В следующем коде, если foo равно 1, все в порядке, но если оно равно 2, мы случайно используем переменную i, которая существует, но, вероятно, содержит мусор.

switch(foo) {
  case 1:
    int i = 42; // i exists all the way to the end of the switch
    dostuff(i);
    break;
  case 2:
    dostuff(i*2); // i is *also* in scope here, but is not initialized!
}

Обертка корпуса в явном блоке решает проблему:

switch(foo) {
  case 1:
    {
        int i = 42; // i only exists within the { }
        dostuff(i);
        break;
    }
  case 2:
    dostuff(123); // Now you cannot use i accidentally
}

Изменить

Чтобы уточнить, утверждения switch являются всего лишь особенно причудливым видом goto. Здесь аналогичный фрагмент кода имеет ту же проблему, но с использованием goto вместо switch:

int main() {
    if(rand() % 2) // Toss a coin
        goto end;

    int i = 42;

  end:
    // We either skipped the declaration of i or not,
    // but either way the variable i exists here, because
    // variable scopes are resolved at compile time.
    // Whether the *initialization* code was run, though,
    // depends on whether rand returned 0 or 1.
    std::cout << i;
}

Ответ 2

Заявление о новых переменных в заявлениях о случаях вызывает проблемы. Включение всех операторов case в {} ограничивает область новых объявленных переменных текущим исполняемым случаем, который решает проблему.

switch(choice)
{
    case 1: {
       // .......
    }break;
    case 2: {
       // .......
    }break;
    case 3: {
       // .......
    }break;
}    

Ответ 3

Стандарт С++ 11, перепрыгивающий через некоторые инициализации

JohannesD дал объяснение, теперь для стандартов.

Проект стандарта С++ 11 N3337 6.7 «Заявление декларации» гласит:

3 Можно передавать в блок, но не так, чтобы обойти объявления с инициализацией. Программа, которая переходит (87) из точки, в которой переменная с автоматическим хранением находится вне области действия, до точки, в которой она находится в области видимости, плохо сформирована, если переменная не имеет скалярного типа, типа класса с тривиальным конструктором по умолчанию и тривиальным деструктор, cv-квалифицированная версия одного из этих типов или массив одного из предыдущих типов и объявляется без инициализатора (8.5).

87) Переход от условия оператора switch к метке регистра считается скачком в этом отношении.

[ Пример:

void f() {
   // ...
  goto lx;    // ill-formed: jump into scope of a
  // ...
ly:
  X a = 1;
  // ...
lx:
  goto ly;    // OK, jump implies destructor
              // call for a followed by construction
              // again immediately following label ly
}

— конец примера]

Начиная с GCC 5.2, сообщение об ошибке теперь говорит:

пересекает инициализацию

С

C позволяет это: C99 Перейти к инициализации

Проект стандарта C99 N1256 Приложения я «Общие предупреждения» гласит:

2 Блок с инициализацией объекта, который имеет автоматическую продолжительность хранения, перемещается в

Ответ 4

JohannesD ответ правильный, но я чувствую, что не совсем ясно по аспекту проблемы.

Пример, который он приводит, объявляет и инициализирует переменную i в случае 1, а затем пытается использовать ее в случае 2. Его аргумент заключается в том, что если бы переключение перешло прямо к случаю 2, i бы использовал его без инициализации, и именно поэтому ошибка компиляции. В этот момент можно подумать, что не будет проблем, если переменные, объявленные в одном случае, никогда не будут использоваться в других случаях. Например:

switch(choice) {
    case 1:
        int i = 10; // i is never used outside of this case
        printf("i = %dn", i);
        break;
    case 2:
        int j = 20; // j is never used outside of this case
        printf("j = %dn", j);
        break;
}

Можно ожидать, что эта программа скомпилируется, так как i и j используются только внутри случаев, которые их объявляют. К сожалению, в C++ он не компилируется: как объяснил Ciro Santilli 包子 露 宪 六四 事件 法轮功, мы просто не можем перейти к case 2: так как это пропустит объявление с инициализацией i, и даже если case 2 вообще не использует i, это все еще запрещено в C++.

Интересно, что с некоторыми корректировками (#ifdef для #include соответствующего заголовка и точка с запятой после меток, поскольку за метками могут следовать только операторы, а объявления не считаются как операторы в C), эта программа компилируется как C:

// Disable warning issued by MSVC about scanf being deprecated
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#ifdef __cplusplus
#include <cstdio>
#else
#include <stdio.h>
#endif

int main() {

    int choice;
    printf("Please enter 1 or 2: ");
    scanf("%d", &choice);

    switch(choice) {
        case 1:
            ;
            int i = 10; // i is never used outside of this case
            printf("i = %dn", i);
            break;
        case 2:
            ;
            int j = 20; // j is never used outside of this case
            printf("j = %dn", j);
            break;
    }
}

Благодаря онлайн-компилятору, например http://rextester.com, вы можете быстро попытаться скомпилировать его как C или C++, используя MSVC, GCC или Clang. Как C всегда работает (только не забудьте установить STDIN!), Как C++ ни один компилятор не примет это.

Ошибка: error 001: expected token: «;», but found «бла-бла»

Решение: Идём на строку выше той, что указана в ошибке и ставим в конце ; (точку с запятой).

Ошибка: error 021: symbol already defined: «бла-бла» или warning 219: local variable «бла-бла» shadows a variable at a preceding level

Решение: Ошибка появляется, если вы несколько раз создали одну и ту же переменную,stock,public.Для решения вам просто требуется удалить дубликат.

Ошибка: error 024: «break» or «continue» is out of context

Решение: break,continue используется только в цикле (for), данная ошибка появляется, если вы использовали их не в цикле. Для решения вам нужно просто заменить их.

Ошибка: error 032: array index out of bounds (variable «cartek»)

Решение: Ошибка появляется, если у вас превышен индекс массива. Для решение вам просто надо увеличить ‘число’ в создании массива.

Ошибка: error 040: duplicate «case» label (value %d)

Решение: Ошибка появляется, если вы два раза используете case с одним и тем же параметром.

 

Ошибка: fatal error 100: cannot read from file: «бла-бла»

Решение: Ошибка появляется, если вы подключили инклуд и не добавили в папку pawno/include. Для решения вам просто надо добавить в папку данный инклуд.

Ошибка: warning 203: symbol is never used: «бла-бла»

Решение: Ошибка появляется, если созданная переменная нигде не используется. Для решения вам просто требуются ещё удалить.

Ошибка: warning 209: function «бла-бла» should return a value

Решение: Для решения проблемы в данной функции/команде вам следует добавить в конец return true/return false.

Ошибка: warning 217: loose indentation

Решение: Для решения проблемы выровняйте строки.

Ошибка: warning 235: public function lacks forward declaration (symbol «бла-бла»)

Решение: Ошибка появляется, если вы создали public,а forward нет. Для решения вам просто надо создать forward к public’y.

По мере возможности тема будет дополняться

Punk_Joker

1 / 1 / 1

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

Сообщений: 59

1

01.05.2015, 02:12. Показов 7650. Ответов 4

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


Студворк — интернет-сервис помощи студентам

Проблема в фунциии prim начиная с ветки case NAME. Пишу в CodeBlocks+MinGW.

Кликните здесь для просмотра всего текста

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
#include <string>
#include <map>
#include <cctype>
 
using namespace std;
 
enum Token_value
{
    NAME,      NUMBER,     END,
    PLUS='+',  MINUS='-',  MUL='*', DIV='/',
    PRINT=';', ASSIGN='=', LP='(',  RP=')'
};
 
Token_value curr_tok=PRINT;
double number_value;
string string_value;
map<string, double> table;
int no_of_errors;
 
//сложение и вычитание
double expr(bool get);
double term(bool get);
double prim(bool get);
Token_value get_token();
double error(const string& s);
 
double expr(bool get)
{
    double left=term(get);
 
    for ( ; ; )
        switch(curr_tok)
        {
            case PLUS:
                left+=term(true);
                break;
            case MINUS:
                left-=term(get);
                break;
            default:
                return left;
        }
}
 
//умноржение и деление
double term(bool get)
{
    double left=prim(get);
 
    for ( ; ; )
        switch(curr_tok)
        {
            case MUL:
                left*=prim(get);
                break;
            case DIV:
                if (double d = prim(true))
                {
                    left/=d;
                    break;
                }
                return error("devide by 0");
            default:
                return left;
        }
}
 
double prim(bool get)
{
    if (get) get_token();
    switch(curr_tok)
    {
        case NUMBER:
            double v = number_value;
            get_token();
            return v;
        case NAME:
            double& v=table[string_value];
            if (get_token() == ASSIGN) v=expr(true);
            return v;
        case MINUS:
            return -prim(true);
        case LP:
            double e=expr(true);
            if (curr_tok != RP) return error("')' expected");
            get_token();
            return e;
        default:
            return error("primary expected");
    }
}
 
Token_value get_token()
{
    char ch = 0;
    cin>>ch;
    switch(ch)
    {
        case 0:
            return curr_tok=END;
        case ';':
        case '*':
        case '/':
        case '+':
        case '-':
        case '(':
        case ')':
        case '=':
            return curr_tok=Token_value(ch);
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
        case '.':
            cin.putback(ch);
            cin>>number_value;
            return curr_tok=NUMBER;
        default:
            if (isalpha(ch))
            {
                cin.putback(ch);
                cin>>string_value;
                return curr_tok=NAME;
            }
            error("bad token");
            return curr_tok=PRINT;
    }
}
 
double error(const string& s)
{
    no_of_errors++;
    cerr<<"error: " << s <<'n';
    return 1;
}
 
 
 
int main()
{
    table["pi"]=3.1415926535897932385;
    table["e"]=2.7182818284590452354;
    while(cin)
    {
        get_token();
        if (curr_tok==END) break;
        if (curr_tok==PRINT) continue;
        count << expr(false) << 'n';
    }
    return no_of_errors;
}

Лог компиляции

Кликните здесь для просмотра всего текста

||=== Build: Debug in Hello (compiler: GNU GCC Compiler) ===|
D:WorkspaceC++Hellomain.cpp||In function ‘double prim(bool)’:|
D:WorkspaceC++Hellomain.cpp|78|error: jump to case label [-fpermissive]|
D:WorkspaceC++Hellomain.cpp|75|error: crosses initialization of ‘double v’|
D:WorkspaceC++Hellomain.cpp|79|error: conflicting declaration ‘double& v’|
D:WorkspaceC++Hellomain.cpp|75|error: ‘v’ has a previous declaration as ‘double v’|
D:WorkspaceC++Hellomain.cpp|82|error: jump to case label [-fpermissive]|
D:WorkspaceC++Hellomain.cpp|75|error: crosses initialization of ‘double v’|
D:WorkspaceC++Hellomain.cpp|84|error: jump to case label [-fpermissive]|
D:WorkspaceC++Hellomain.cpp|75|error: crosses initialization of ‘double v’|
D:WorkspaceC++Hellomain.cpp|89|error: jump to case label [-fpermissive]|
D:WorkspaceC++Hellomain.cpp|85|error: crosses initialization of ‘double e’|
D:WorkspaceC++Hellomain.cpp|75|error: crosses initialization of ‘double v’|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘NAME’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘END’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘PLUS’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘MINUS’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘MUL’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘DIV’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘PRINT’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘ASSIGN’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘LP’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp|72|warning: enumeration value ‘RP’ not handled in switch [-Wswitch]|
D:WorkspaceC++Hellomain.cpp||In function ‘int main()’:|
D:WorkspaceC++Hellomain.cpp|155|error: ‘count’ was not declared in this scope|
D:WorkspaceC++Hellomain.cpp||In function ‘double prim(bool)’:|
D:WorkspaceC++Hellomain.cpp|92|warning: control reaches end of non-void function [-Wreturn-type]|
||=== Build failed: 12 error(s), 11 warning(s) (0 minute(s), 0 second(s)) ===|



0



Tulosba

:)

Эксперт С++

4773 / 3267 / 497

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

Сообщений: 9,046

01.05.2015, 09:27

2

Нужно добавить фигурные скобки внутрь case’ов:

C++
1
2
3
4
case NUMBER: {
   double v = number_value;
   get_token();
   return v; }

и т.д.



0



0 / 0 / 1

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

Сообщений: 16

02.06.2017, 18:16

3

Обьясни в чем дело, к чему эти скобки в кейсах? Я столкнулся с такой же ошибкой.



0



DrOffset

17452 / 9279 / 2269

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

Сообщений: 16,244

02.06.2017, 18:40

4

Цитата
Сообщение от Сашка Бородач
Посмотреть сообщение

Обьясни в чем дело, к чему эти скобки в кейсах?

Объясняю «на пальцах»: switch — работает как goto, и каждая из меток case не вносит своей собственной области видимости, т.е. все, что ты объявляешь внутри switch, будет сквозняком видно в нижестоящих case`ах. Из-за этого, если мы не сделаем сами область видимости посредством {}, то мы вынуждены будем перепрыгивать через инициализацию, получая обращение к невалидному объекту. Поэтому компилятор такое запрещает. Вот это же на примере:

C++
1
2
3
4
5
6
7
8
9
10
switch(val)
{
case ONE:
    double c = someFunc();
    break;
case TWO:
    // здесь нам будет видна с, но инициализации ее не было.
    // если для простых типов это в меньшей степени страшно, то для классов это может закончиться плачевно - падением программы
    // поэтому лучший вариант - не допускать такого вообще и сразу выдавать ошибку.
}



0



TheCalligrapher

Вездепух

Эксперт CЭксперт С++

10968 / 5953 / 1628

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

Сообщений: 14,943

02.06.2017, 18:46

5

Цитата
Сообщение от Сашка Бородач
Посмотреть сообщение

Обьясни в чем дело, к чему эти скобки в кейсах? Я столкнулся с такой же ошибкой.

В языке С++ запрещается «прыгать» в область видимости локальной переменной в обход ее объявления с инициализатором

C++
1
2
3
goto label;
int x = 42;
label:;       // Ошибка - метка позволяет обойти инициализацию переменной x

А делается ли такой «прыжок» через goto или switch/case — уже не важно.



0



  • Cas ci200a как сбросить ошибки
  • Cas ci 5010a ch02 ошибка
  • Carx drift racing ошибка unity
  • Carscanner как посмотреть ошибки
  • Carrier холодильная установка ошибки