Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стек описание методов 
:(
    Опции темы
mrprim
Дата 7.6.2016, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



Доброго времени суток
Возникла проблема с методом PUSH цикл работает не так как я хотел и не могу понять как исправить
[code=cpp]



по факту он должен пробежать по нашему массиву vm_programm_code[] и выдать на 5 10 0 0 0  но он находит первый элемент и сваливает 5 0 0 0 0

Это сообщение отредактировал(а) mrprim - 29.6.2016, 15:44
PM MAIL   Вверх
baldman88
Дата 7.6.2016, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



В 20-й строке в условии должен быть двойной знак равенства. И 24-я строчка не нужна. Да и ADD не определено. Оно вообще компилируется?

Это сообщение отредактировал(а) baldman88 - 7.6.2016, 15:31
PM MAIL   Вверх
Envy
Дата 7.6.2016, 15:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

if(vm_programm_code[i]==PUSH){


Код

stack[sp]=vm_programm_code[i+1];
sp++;
i++;


Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
mrprim
Дата 7.6.2016, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



Цитата(baldman88 @  7.6.2016,  15:22 Найти цитируемый пост)
Да и ADD не определено. Оно вообще компилируется?

это я код подтёр что бы не вкидывать кучу не нужной инфы сюда, а вызов остался, извините

Цитата(Envy @  7.6.2016,  15:33 Найти цитируемый пост)
код C++
1:
if(vm_programm_code[i]==PUSH){


код C++
1:
2:
3:
stack[sp]=vm_programm_code[i+1];
sp++;
i++;

i++ помогло но не на 100% теперь выводит 5 10 0 0 0
и если можно вопрос - Почему нужно дополнительно писать i++ если мы в условии указали?

НО при добавление в конец массива uint32_t vm_programm_code[LENGHT] = {PUSH, 5, PUSH, 10, ADD, PUSH, 3};
что бы протестить разные вариации кода
выдает всё равно 5 10 0 0 0 
PM MAIL   Вверх
Envy
Дата 7.6.2016, 16:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата

  Почему нужно дополнительно писать i++ если мы в условии указали?
  

Потому что i меняется в цикле как [0,1,2,3,4]
А нам нужно читать только команды, которые лежат по индексам [0, 2, 4, ...]

Цитата

  НО при добавление в конец массива ...
  выдает всё равно 5 10 0 0 0 
  


Это потому что если vm_programm_code[i] не равно PUSH, то выполнение функции завершается.

Код

else return;


Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
baldman88
Дата 7.6.2016, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Уберите else return, который в 24-й строке. Ну, и при добавлении элементов в массив, Вы не збываете мненять значение LENGHT? И в 19-й строке 5 лучше поменять на LENGHT.

Это сообщение отредактировал(а) baldman88 - 7.6.2016, 16:06
PM MAIL   Вверх
mrprim
Дата 7.6.2016, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



Цитата(baldman88 @  7.6.2016,  16:05 Найти цитируемый пост)
Уберите else return, который в 24-й строке. Ну, и при добавлении элементов в массив, Вы не збываете мненять значение LENGHT? И в 19-й строке 5 лучше поменять на LENGHT.

собственное теперь всё работает, хочу добавить обработчик исключений, если в коде будет допущена ошибка, и по логике нужно просто проскочить пишу 
после всех сравнений:
else i++; и видимо не верно
Код

#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdint.h"
//#include "board.h"

#define PUSH 0x06
#define ADD 0x01
#define POP 0x02
#define LENGHT 12

uint32_t stack[LENGHT];
uint32_t vm_programm_code[LENGHT] = {PUSH, 5, PUSH, 10, ADD, PUSH, 3, POP, PUSH, 4};
uint32_t sp=0;
uint32_t i=0;

void vm(void){
    for ( i = 0; i < LENGHT; i++ ) {
    if(vm_programm_code[i]==PUSH){
     if(sp >= LENGHT){
        printf("polon\n");
        return;
     } else{
        stack[sp]=vm_programm_code[i+1];
        sp++;
        i++;}
    }
    if(vm_programm_code[i]==POP){
     if(sp<0){
        printf("Pust\n");
        return 0;
    } else{
     stack[sp-1]=0;
        sp--;}
        //i++;
    }
    if(vm_programm_code[i]==ADD){
     if(sp >= LENGHT){
        printf("polon\n");
        return;
     } else{
        stack[sp] = stack[sp-2]+stack[sp-1];
        sp++;}
        //i++;
    }
    }
    }
    
int main()
{
    vm();
    printf("последнее число - %d\n", stack[sp]);
    printf("%d\n%d\n%d\n%d\n%d\n", stack[0], stack[1],stack[2],stack[3],stack[4]);
    getchar();
}




Это сообщение отредактировал(а) mrprim - 7.6.2016, 18:53
PM MAIL   Вверх
Envy
Дата 8.6.2016, 06:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я посоветую реализовать сначала стек, с его методами push и pop, а уже потом переходить к реализации vm. Так код будет проще и чище. Да и упражнение хорошее.
Вот этого вполне хватит.

А реализацию vm можно будет переделать на такой же стек и switch-case:
Код

Stack code;
Stack vm_stack;

while(true) {
  if (isEmpty(&code)) {
    break;
  }
  int command = pop(&code);
  switch(command) {
    case PUSH:
      int arg = pop(&code);
      push(&vm_stack, arg);
    break;
    case POP:
      // понятия не имею, что должна делать VM по команде POP      
    break;
    case ADD:
      int a = pop(&vm_stack);
      int b = pop(&vm_stack);
      push(&vm_stack, a+b);
    break;
    default:
      // а вот тут можно сделать обработку исключений
  }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.