Скетч на итальнском

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Доброго времени суток! Помогите пожалуйста с переводом кола с итальянского на английский...(оговорюсь сразу что переводчики не помогли так как нарушается роботоспособность данного скетча..

// Libraries for DS1307 RTC
#include <Wire.h>
#include <RTClib.h>

// Keyboard libraries
#include <Key.h>
#include <Keypad.h>

// Libraries for creating OTP codes
#include <sha1.h>
#include <TOTP.h>

// Serial software for the display
#include <SoftwareSerial.h>

// config file
#include "CONFIG.h"


// variables
RTC_DS1307 rtc;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEY_ROWS, KEY_COLUMNS);
SoftwareSerial displaySerial(A1, A2);
TOTP totp = TOTP(hmacKey, 10);
char codiceInserito[7];
int codiceIndex;
char bufferSeriale[14];
int serialIndex;


void setup() {

  // Initialize RTC is configured the time when the sketch was compiled
  Wire.begin();
  rtc.begin();

  // Initialize serial communication
  Serial.begin(9600);
  displaySerial.begin(9600);
  
  // Expect the display boot and the disappearance of the splash screen
  delay(500);

  Serial.println("Door lock OTP");
  Serial.println();

  // Initialization PIN
  pinMode(PIN_BUZZER, OUTPUT);
  pinMode(PIN_LEDROSSO, OUTPUT);
  pinMode(PIN_LEDVERDE, OUTPUT);
  pinMode(PIN_RELAY, OUTPUT);

  // Initialize variables
  codiceIndex = -1;
  serialIndex = -1;

  // Initial state, lock CLOSED
  pulisciSchermo();
  cambiaStatoSerratura(false);
  aggiornaSecondaRiga();  
}

void loop() {

  // Check whether you have received a serial character
  if (Serial.available() > 0) {

    byte inByte = Serial.read();

    // If the received byte is the character of NewLine (0x0A) interpret the command received
    if(inByte == 0x0A) eseguiComandoSeriale();

    // Otherwise I record in the buffer
    else {
      serialIndex++;
      if(serialIndex == 14) serialIndex = 0;
      bufferSeriale[serialIndex] = inByte;
    }
  }

  // Check if you press a key on the keyboard
  char key = keypad.getKey();
  if (key != NO_KEY){

    // Emit a sound
    #ifdef BUZZER_ON
      tone(PIN_BUZZER, 440);
      delay(100);
      noTone(PIN_BUZZER);
    #endif 
    
    // If the key is a number, I visualize and memorize the array
    if(key - '0' >= 0 && key - '0' < 10) {

      codiceIndex++;
      codiceInserito[codiceIndex] = key;
      displaySerial.write(key);

      // If it were inserted 6 digits, check the code
      if(codiceIndex == 5) verificaCodice();
    }

    // If the button is '*' gate the last number entered
    else if(key == '*' && codiceIndex >= 0) {

      codiceIndex--;
      aggiornaSecondaRiga();
    }

    // If the button is '#' it resets the insertion
    else if(key == '#') {

      codiceIndex = -1;
      aggiornaSecondaRiga();    
    }
  }
}


void eseguiComandoSeriale() {

  // Possible commands are:
   //? displays date and time from the RTC beds
   //! GgMMaahhmmss sets the new date and time (dd / mm / yy hh: mm: ss) RTC

   // Reset the buffer
  serialIndex = -1;
  
  if(bufferSeriale[0] == '?') stampaDataOra();
  
  else if(bufferSeriale[0] == '!') {

    // Verify that the twelve following characters are numbers
    for(int i = 1; i < 13; i++) 
      if(!isDigit(bufferSeriale[i])) {
        Serial.print(F("Carattere non valido (non e' un numero): "));
        Serial.println(bufferSeriale[i]);
        return;
      }

    // Convert in two by two in number characters
    int giorno = (bufferSeriale[1] - '0') * 10 + (bufferSeriale[2] - '0');
    int mese = (bufferSeriale[3] - '0') * 10 + (bufferSeriale[4] - '0');
    int anno = 2000 + (bufferSeriale[5] - '0') * 10 + (bufferSeriale[6] - '0');
    int ora = (bufferSeriale[7] - '0') * 10 + (bufferSeriale[8] - '0');
    int minuti = (bufferSeriale[9] - '0') * 10 + (bufferSeriale[10] - '0');
    int secondi = (bufferSeriale[11] - '0') * 10 + (bufferSeriale[12] - '0');
    
    // I perform data validation checks
    if(giorno < 1 || giorno > 31) {
      Serial.print(F("Il giorno specificato non e' valido: "));
      Serial.println(giorno);
      return;      
    }
    if(mese < 1 || mese > 12) {
      Serial.print(F("Il mese specificato non e' valido: "));
      Serial.println(mese);
      return;      
    }
    if(ora > 24) {
      Serial.print(F("L'ora specificata non e' valida: "));
      Serial.println(ora);
      return;      
    }
    if(minuti > 59) {
      Serial.print(F("I minuti specificati nono sono validi: "));
      Serial.println(minuti);
      return;      
    }
    if(secondi > 59) {
      Serial.print(F("I secondi specificati non sono validi: "));
      Serial.println(secondi);
      return;      
    }
    
    // Save time and visualize updated
    rtc.adjust(DateTime(anno, mese, giorno, ora, minuti, secondi));
    Serial.println(F("RTC aggiornato"));
    stampaDataOra();
  }

  else {
    Serial.print(F("Comando sconosciuto: "));
    Serial.println(bufferSeriale[0]);
  }
}

void stampaDataOra() {

  DateTime now = rtc.now();
  Serial.print(F("Data e ora attuali: "));
  Serial.print(now.day(), DEC); 
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.year(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}


void cambiaStatoSerratura(bool serraturaAperta) {

  if(serraturaAperta) {
    digitalWrite(PIN_RELAY, HIGH);
    digitalWrite(PIN_LEDVERDE, HIGH);
    digitalWrite(PIN_LEDROSSO, LOW);
    displaySerial.write(254);
    displaySerial.write(128);
    displaySerial.write("     APERTA     ");
  }
  else {
    digitalWrite(PIN_RELAY, LOW);
    digitalWrite(PIN_LEDVERDE, LOW);
    digitalWrite(PIN_LEDROSSO, HIGH);
    displaySerial.write(254);
    displaySerial.write(128);
    displaySerial.write("     CHIUSA     ");         
  }
}


void pulisciSchermo() {
  
  displaySerial.write(254);
  displaySerial.write(128);
  displaySerial.write("                ");
  displaySerial.write("                ");
}


void aggiornaSecondaRiga() {

    displaySerial.write(254);
    displaySerial.write(192);
    displaySerial.write("PIN -->         ");
    displaySerial.write(254);
    displaySerial.write(200);
    for(int i = 0; i <= codiceIndex; i++)
      displaySerial.write(codiceInserito[i]);   
}


void verificaCodice() {

  // Get the current timestamp from the RTC and I divide it by 30 (TimeStep Google Authenticator)
  DateTime now = rtc.now();
  long GMT = now.unixtime();
  long timeStep = GMT / 30;

  // Verify if the code matches one of the three codes "close" to the current timestamp
  bool codiceOk = false;
  for(int i = -1; i <= 1; i++) {  
    char* codiceGenerato = totp.getCodeFromSteps(timeStep + i);
    Serial.println(codiceGenerato);
    if(strcmp(codiceInserito, codiceGenerato) == 0) codiceOk = true;
  }

  // I clean the screen
  pulisciSchermo();

  // If the code is ok, it emits a sound and I open the lock
  if(codiceOk) {

      #ifdef BUZZER_ON 
        tone(PIN_BUZZER, 660);
        delay(100);
        noTone(PIN_BUZZER);
        delay(200);
        tone(PIN_BUZZER, 660);
        delay(100);
        noTone(PIN_BUZZER); 
      #endif
    
    cambiaStatoSerratura(true);

    // If the mode is MODO_IMPULSO, look TEMPO_APERTURA milliseconds so I close the lock
    if(modoSerratura == MODO_IMPULSO) {
      delay(TEMPO_APERTURA);
      cambiaStatoSerratura(false);
    }

    // If it is MODO_STABILE, expect the pressure of TASTO_CHIUSURA button then close the lock
    else {
      char key;
      do {
        key = keypad.getKey();
      } while(key != TASTO_CHIUSURA);
      cambiaStatoSerratura(false);
    }
  }

  // If the code is wrong, I see a message and emit a sound
  else {
  
    for(int i = 0; i < 3; i++) {
      
      #ifdef BUZZER_ON 
        tone(PIN_BUZZER, 220); 
      #endif
      
      displaySerial.write(254);
      displaySerial.write(128);
      displaySerial.write(" CODICE ERRATO! ");
      delay(500);
      
      #ifdef BUZZER_ON
        noTone(PIN_BUZZER); 
      #endif
      
      pulisciSchermo();
      delay(500);
    }
    displaySerial.write(254);
    displaySerial.write(128);
    displaySerial.write("     CHIUSA     ");    
  }

  // reset
  codiceIndex = -1;
  aggiornaSecondaRiga();
}

 

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018
// Private key for generating the OTP codes
uint8_t hmacKey[] = {0x65, 0x6c, 0x65, 0x74, 0x74, 0x72, 0x6f, 0x2d, 0x69, 0x6e};                    

// Buzzer on / off (comment out the line below to disable it
#define BUZZER_ON

// Of the lock operation mode
// impulse mode = // if the code is ok, the lock remains open for many milliseconds (defined below)
//  stabile mode = // if the code is ok, the lock remains open until you press a key (defined below)
#define impulse mode  0
#define  stabile mode  1
byte Lock mode = impulse mode;

// Of the lock opening time (in milliseconds) if impulse mode
#define OPENING TIME 2000

// Button to close the lock if  stabile mode
#define CLOSING KEY 'D'



// ----- Usually you not need to change anything below this line -----

// Definition of PIN
#define PIN_BUZZER      6
#define PIN_LEDRED     11
#define PIN_LEDGREEN   12
#define PIN_RELAY      13


#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup()
{
 Serial.begin(9600);
}
 
void loop()
{
char customKey = customKeypad.getKey();
 
if (customKey) {// same as if(customKey != NO_KEY)
Serial.println(customKey);
   }
 }

byte rowpins[] = { 8, 7, 6, 5 };
byte colpins[] = { 12, 11, 10, 9 };

 

Logik
Offline
Зарегистрирован: 05.08.2014

Охренеть.

Надо переводчик доработать?

ПС. Так мы скоро дождемся и "помогите! бумажка в сортире закончилась!" Инфантилы вконец уху кушают.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а он чо, по-итальянске плохо работает?   Аптамуш, у тебя Ардуина китайская.  Купи родную, и код засверкает своими яркими красками. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

spamys пишет:

Помогите пожалуйста с переводом кола с итальянского на английский..

Насколько я вижу, данный "кол" написан не С++, а не на итальянском. Потому перевести его с итальянского невозможно ввиду отсутствия предмета перевода. А если перевести с С++ на англиский, то он не будет работать, т.к. компилятора с английского в коды AVR в поставке IDE нет.

Или Вы имеете в виду перевести текстовые сообщения типа "Il giorno specificato non e' valido: "? Так переводите их в переводчике по одному и втавляйте - не ленитесь.

b707
Offline
Зарегистрирован: 26.05.2017

spannys - сколько платите? Итальянского не знаю, но знаю испанский - они очень похожи. Сообщения в скетче легко могу перевести без гугля

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Или Вы имеете в виду перевести текстовые сообщения типа "Il giorno specificato non e' valido: "? Так переводите их в переводчике по одному и втавляйте - не ленитесь.

А форум тогда на что?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

А форум тогда на что?

Тоже верно, чёт я не подумал.

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Перевести не проблемма даже если по слову переводить... вся проблемма в том что после перевода скетч не проходит компиляцию....появляется куча ошибок... я не очень пока что силен в этом...

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ошибки тоже на италянском?

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Ошибка синтаксисе команды  или нескольких после перевода ... а я что то могу исправить а что то не выходит..

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Звиздец, ты тугой. 

gfx125
Offline
Зарегистрирован: 27.05.2017

услуги переводчика - $10

b707
Offline
Зарегистрирован: 26.05.2017

Spamys - а "итальянский" то код компилируется без ошибок и работает правильно? - вы проверяли?

А то может в нем исходно ошибки есть, и дело не в переводе?

 

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Приложеный код удачно скомпилирован и залит.. выполняются почти все нужные функции.. (немогу пока понять по какой причине не работает экран и коды OTP с приложением не синхронизуруются.. а так работает..

b707
Offline
Зарегистрирован: 26.05.2017

spamys пишет:

Приложеный код удачно скомпилирован и залит.. выполняются почти все нужные функции.. (немогу пока понять по какой причине не работает экран и коды OTP с приложением не синхронизуруются.. а так работает..

а что там за нужные функции кроме экрана и клавиатуры?

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

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

b707
Offline
Зарегистрирован: 26.05.2017

готов попробовать перевести Вам сообщения с сохранением компилируемости кода. Но поскольку это потребует разбираться в скетче и ставить все библиотеки - не бесплатно.

Если хотите обсудить - пишите ded@cur-ex.ru

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

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

b707
Offline
Зарегистрирован: 26.05.2017

почта точно живая, попробуйте еще раз чуть позже. Или напишите свою

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно, т.е. получили задание. Нормального кода в сети не нашли, а код с итальянскими сообщениями показывать преподу боитесь, т.к. тот не поверит, что Вы сами писали (и правильно сделает, т.к. сами Вы даже текстовые константы поменять не можете). Всё правильно?

b707 и Вы всерьёз собрались помогать?

Блин, у нас тут есть специалист по таким "заказчикам", мож появится - наведёт порядок :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ЕвгенийП пишет:

b707 и Вы всерьёз собрались помогать?

Ну поможет, заработает денежку. А потом отправил информацию  ректору, как сознательный гражданин :-)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, вот и говорю. Куда ворота задевался? Он уже это проделывал с одним кренделем :)

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Так, вот и говорю. Куда ворота задевался? Он уже это проделывал с одним кренделем :)

думаете диплом? - тогда я пас

b707
Offline
Зарегистрирован: 26.05.2017

dimax пишет:

Ну поможет, заработает денежку. А потом отправил информацию  ректору, как сознательный гражданин :-)))

не, мы это уже обсуждали. "Сигнализировать" не стану. Просто откажусь делать.

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Люди!!!! Что вы городите!? Не хотите что то путное подсказать -ПОМОЛЧИТЕ ТОГДА!  Я начинающий ардуинщик  нашел интересный девайс и хочу реализовать дома.. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так хотел бы, выложил бы свою попытку, и спросил бы что не так сделано. А так, похоже, хочется просто получить готовое.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, те, кто хотят сделать, выкладывают свои коды, которые у них не работают, а не стыренные - работающие.

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

1) код НЕ ТЫРЕНЫЙ! А свободно распостроняемый! 

2)Пока что я не умею писать такие проэкты так как с ардуино работаю недавно.. а девай нужен в ближайшее время.. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

spamys пишет:

1) код НЕ ТЫРЕНЫЙ! А свободно распостроняемый! 

2)Пока что я не умею писать такие проэкты так как с ардуино работаю недавно.. а девай нужен в ближайшее время.. 

Нада исчо ношкой топнуть!!!

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

так что надо то ?

щоб это

Serial.print(F("Carattere non valido (non e' un numero): "));

стало этим

Serial.print (F ("Недопустимый символ (не число):"));

 

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Что вроди этого.. в данном коде  есть команды на итальянском.. после транслейта на английский ардуино ругаетя так как не хватает то переменных то нще чего то.. 

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Только сами команды что бы коректно потом работали. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

spamys пишет:

 в данном коде  есть команды на итальянском.. 

вы серьезно ?

например ?

b707
Offline
Зарегистрирован: 26.05.2017

spamys пишет:

Что вроди этого.. в данном коде  есть команды на итальянском.. после транслейта на английский ардуино ругаетя так как не хватает то переменных то нще чего то.. 

Spamys - в данном коде НЕТ команд на итальянском. Если считаете иначе - приведите для примера номер строки с такой командой.

Все, что вам нужно сделать - это перевести ТОЛЬКО ТЕКСТОВЫЕ строки (в кавычках. подсвечены голубым в коде) Все, что "по-итальянски" в самом коде - ТРОГАТЬ НЕ НАДО.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгкенийП & dimax - обломали меня :) хотел похвастать знанием языков... не только языков программирования :)

 

Говорю по-русски. читаю на английском и испанском. пишу на Перле и Си. :))))

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018
int >giorno <= (bufferSeriale[1] - '0') * 10 + (bufferSeriale[2] - '0');
143
    int >mese <= (bufferSeriale[3] - '0') * 10 + (bufferSeriale[4] - '0');
144
    int >anno <= 2000 + (bufferSeriale[5] - '0') * 10 + (bufferSeriale[6] - '0');
145
    int >ora <= (bufferSeriale[7] - '0') * 10 + (bufferSeriale[8] - '0');
146
    int >minuti <= (bufferSeriale[9] - '0') * 10 + (bufferSeriale[10] - '0');
147
    int >secondi <= (bufferSeriale[11] - '0') * 10 + (bufferSeriale[12] - '0');

 

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Я так и переводил.. что то проходит а что то потом ругается... вечером сяду за комп перепробую варианты  отпишусь.. спасибо за подсказки ребят! 

b707
Offline
Зарегистрирован: 26.05.2017

spamys пишет:

int >giorno <= (bufferSeriale[1] - '0') * 10 + (bufferSeriale[2] - '0');
143
    int >mese <= (bufferSeriale[3] - '0') * 10 + (bufferSeriale[4] - '0');
144
    int >anno <= 2000 + (bufferSeriale[5] - '0') * 10 + (bufferSeriale[6] - '0');
145
    int >ora <= (bufferSeriale[7] - '0') * 10 + (bufferSeriale[8] - '0');
146
    int >minuti <= (bufferSeriale[9] - '0') * 10 + (bufferSeriale[10] - '0');
147
    int >secondi <= (bufferSeriale[11] - '0') * 10 + (bufferSeriale[12] - '0');

 

это имена переменных. Их, конечно, можно тоже перевести :) но для реальной задачи это нафик не нужно, так как абсолютно пофиг. как они называются - mese, month,  месяц или вообще ds5665

Если для вас важно перевести эти идентификаторы - это доказывает. что это диплом...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

хорошо, а это тады какой язык ?

    int minutki = (bufferSeriale[9] - '0') * 10 + (bufferSeriale[10] - '0');

    int secundocki = (bufferSeriale[11] - '0') * 10 + (bufferSeriale[12] - '0');

 

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Язык уси-пуси....

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Ну так это в корни дело меняет! Я то думал что нужно все переводить.. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

spamys пишет:

Я так и переводил.. 

А нафига переводил-то?

spamys
spamys аватар
Offline
Зарегистрирован: 30.10.2018

Я ж не знал что не все переводить нужно то.. я ж говорю что только начал работу с ардуино..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

xDriver пишет:

хорошо, а это тады какой язык ?

    int minutki = (bufferSeriale[9] - '0') * 10 + (bufferSeriale[10] - '0');

    int secundocki = (bufferSeriale[11] - '0') * 10 + (bufferSeriale[12] - '0');

Не, такой неправильно. Надо вот так:

int minutki = (grebanyPosledovatelniyBufer[9] - '0') * 10 + (grebanyPosledovatelniyBufer[10] - '0');
int secundocki = (grebanyPosledovatelniyBufer[11] - '0') * 10 + (grebanyPosledovatelniyBufer[12] - '0');

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

spamys пишет:

Я ж не знал что не все переводить нужно то.. я ж говорю что только начал работу с ардуино..

Вот почему отечественное процессостроение провалилось. Видно все пытаются перевести на русский, включая создание "русского" Си. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

spamys пишет:

Я ж не знал что не все переводить нужно то.. я ж говорю что только начал работу с ардуино..

Вот почему отечественное процессостроение провалилось. Видно все пытаются перевести на русский, включая создание "русского" Си. 


Была же Рапира, почему нельзя Си, а у Тихонова отличный интерпретатор в его Инфо-Бухгалтере тоже на русском )))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ua6em пишет:
Была же Рапира, почему нельзя Си, а у Тихонова отличный интерпретатор в его Инфо-Бухгалтере тоже на русском )))
А теперь вопрос- почему не взлетело.:)

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

nik182
Offline
Зарегистрирован: 04.05.2015

А как же Мир-2?