преобразование типов

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

помогите пожалуйста! все роди проще простого, но... если массив askii сделать большим и в цикле сравнивать  if (chislo==askii[i])... то этот иф не сработает, так как число сравнивается с аски кодом

void setup(){
Serial.begin(9600);}
void loop(){
  int chislo=1;
  char askii[1]={'1'};

если дописать так:
Serial.print("chislo=");
Serial.println(chislo,BIN);
Serial.print("askii=");
Serial.println(askii[0],BIN);}
будет вывод:
chislo=1
askii=110001
chislo=1
askii=110001
-----

как в даном примере преобразовать либо чило в аски код либо данные массива в число, чтобы вывод в двоичном коде у них был одинаков?

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

Для начала правильно оформите вставку кода http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

sergey_777-s
Offline
Зарегистрирован: 20.02.2015
void setup(){
Serial.begin(9600);}
void loop(){
  int chislo=1;
  char askii[1]={'1'};

//если дописать так:
Serial.print("chislo=");
Serial.println(chislo,BIN);
Serial.print("askii=");
Serial.println(askii[0],BIN);}

тут то и кода как такового нет....

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Если речь только о цифрах то Serial.println(askii[0]-48, BIN);

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

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

Datak
Offline
Зарегистрирован: 09.10.2014

Напишите, например,  int chislo='1';  или  char askii[1]={1};  - думаю, всё сравнится.

1 и '1'  - это же разные числа, print не врёт.

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



char ascii = '1';

byte chislo = ( ascii - '0' );

Такое  chislo  можно смело сравнивать с единицей, т.к. в нём действительно находится само число, а не его ASCII-код. 

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

а если в массиве будут буквы и другие символы а нужно будет найти вхождение цыфры тогда как?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Искомая цифра + 48 и сравниваем...

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Зачем парить себе мозг? Храните в переменной не число, а код числа, т.е. в том же самом виде, что и в массиве, т.е. не 1, а '1' и справнивайте хоть до посинения без всяких преобразований. Места в памяти займет ровно столько же.

 

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

наверное прийдется так, потому что предыдущий прием работал только от 0 до 9 если уже число 10 - увы...

Хорошо есть функция int ifunc(int x, int y) x=21 ... как в переменную х занести аскикод числа 21?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

У числа 21 нет аскикода. Аскикод есть у символа 2 и символа 1, соответственно 50 и 49. И еще цифры и числа это разные вещи, вы где-то цифры пишите где-то числа

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

меня интересует именно вхождение чисел в массив, как это правильно организовать?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

На корпоративе вроде много не пил, а бошка вообще не работает. Нарисуйте пример входного массива в котором будите искать числа среди символов и при этом массив char... Что-то я вообще туплю. Там же всё будет числами.. '1'=49=0х31=b110001 какая разница как его записать, это всё одно и тоже.

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

получается есть массив: 1p|1k12345|2p|1k9876|2k45678|21p|1k123|48p|1k567 и т.д. есть функция с двумя параметрами (два числа) например giveMeKey(21,1) нужно чтобы функция взяла число 21 и начала искать его по массиву если встречает число 21 проверяет есть ли после него символ "р" если есть то начинает дальше искать второй параметр функции "1" если находит и после него сразу идет символ "к" то последующие данные от "к" до "|" должна вернуть функция тоесть в данном примере функция вернет "123"

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

или хотябы как содержимое переменной преобразовать в askii код?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Если есть желание можно вот так поизвращаться :)

char buf[] = "1p|1k12345|2p|1k9876|2k45678|21p|1k123|48p|1k567";

int giveMeKey(int one, int two)
{
  char buf_one[20];
  char buf_two[10];
  itoa(one, buf_one, 10);
  itoa(two, buf_two, 10);
  strncat(buf_one, "p|", 2);
  strncat(buf_one, buf_two, 10);
  strncat(buf_one, "k", 1);
  char * pch;
  pch = strstr (buf, buf_one);  
  int i = strcspn(pch, "k");
  pch+=(i+1);
  i = strcspn(pch, "|");
  pch[i]='\0';
  return atoi(pch);
}

 

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

))) как раз так сейчас и извращаюсь через itoa ))

 

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

спасибо!

sergey_777-s
Offline
Зарегистрирован: 20.02.2015
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,7,177);
IPAddress dns1(192,168,7,1);
IPAddress gateway(192,168,7,1);
IPAddress subnet(255,255,255,0);
EthernetServer server(80);
 
File webFile;



 
void setup() {
    Ethernet.begin(mac, ip, dns1, gateway, subnet);
    server.begin();
    Serial.begin(9600);
    digitalWrite(10, HIGH);

    if (!SD.begin(4)) {
        return;
    }
}
 
void loop() {
    int BUFSIZ = 255;
    int index = 0;
    char clientline[BUFSIZ];
    EthernetClient client = server.available();
    if (client) { 
        boolean currentLineIsBlank = true;
        index = 0;
        while (client.connected()) {
            if (client.available()) {
                char c = client.read();
                if (c != '\n' && c != '\r') {
                  clientline[index] = c;
                  index++;
                  if (index >= BUFSIZ)
                    index = BUFSIZ -1;
 
                  continue;
                }
                clientline[index] = 0;
                char* filename = processFile(clientline);
                Serial.print("Requested: ");
                Serial.println(filename);
                /* Setup AJAX Requests Here:
                 * These are just direct output values that are requested
                 * with AJAX.
                 */
                if (strstr(clientline, "GET /?data=val1") != 0) {
                  Serial.println("file");
                  code200(client);
                  client.println(1337);
                  break;
                }
                
 
                if (SD.exists(filename)) {
                   code200(client);
                   webFile = SD.open(filename);
                   if (webFile) {
                       while(webFile.available()) {
                           client.write(webFile.read());
                       }
                       webFile.close();
                   }
                   break;
                } else {
                    if (strlen(filename) < 2) {
                      webFile = SD.open("index.htm");
                       if (webFile) {
                           while(webFile.available()) {
                               client.write(webFile.read());
                           }
                           webFile.close();
                       }
                    } else {
                      
                      client.println("HTTP/1.1 404 Not Found");
                      client.println("Content-Type: text/html");
                      client.println("Connection: close");
                      client.println();
                      client.println("<html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>");
                      break;
                    }
                }
                break;
            }
        }
        delay(1);
        client.stop();
    }
}
 
void code200(EthernetClient client) {
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connection: close");
    client.println();
}
 
char* processFile(char clientline[255]) {
   char *filename;
   filename = clientline + 5;
  (strstr(clientline, " HTTP"))[0] = 0;
  return filename;
}


int getRCcommand(int pult, int key){//получаем ключ вводя номер пульта и номер команды
char pultchar[20];//временный массив для получения аски кода пульта
char keychar[20];// масив для аскикода ключа
boolean nashelpult=0;
boolean nashelkey=0;
File configfile;
char configline[]={};//массив для хранения конф файла с карты памяти
int i=0;
int j=0;
char resultkey[]={};
itoa(pult,pultchar,10);// преобразуем номер пульта в аски код
itoa(key,keychar,10);//преобразуем номер команды в аски код
const char pultcharconst={pultchar[0]};//постоянное хранение аски кода пульта
const char keycharconst={keychar[0]};
if (!SD.exists("config.txt")){
    Serial.println("config.txt not exist!!!");
    return 0;}
configfile=SD.open("config.txt");//читаем файл
while (configfile.available()){//пока доступен делаем:

    configline[i]=configfile.read();//читаем первый символ файла
    if (i==0){
        i++;
        continue;};

    if (!nashelpult && configline[i-1]==pultcharconst && configline[i]=='p'){//если еще не нашли пульт и предыдущий символ равен номеру пульта а следующий ключевому символу "р"
        nashelpult=1;
        i++;
        continue;}//поскольку нашли в файле номер пульта в этот блок уже не попадем
    if (nashelpult && !nashelkey && configline[i]=='p'){
        Serial.println("!key not found error!!!!");
        configfile.close();
        resultkey[0]=0;
        return 0;}    

    if (nashelpult && !nashelkey && configline[i-1]==keycharconst && configline[i]=='k'){//если нашли пульт но не нашли команду и нашли номер команды и букву К
        nashelkey=1;
        i++;
        continue;}// команда и пульт найдены

    if (nashelkey && !(configline[i]=='|')){//если нашли позицию в файле с командой по очереди записываем в массив Резулт каждый символ пока не увидим "|"
        Serial.print ("Part of resultkey==");
        Serial.println (configline[i]);
        resultkey[j]=configline[i];
        i++;
        j++;
        continue;}
    
    
    if (nashelkey && configline[i]=='|'){//если команда закончилась закрываем файл и выводим результат преобразуя его из аски в интеджер
        resultkey[j]='\0';
        configfile.close();
        
        Serial.print ("resultkey==");
        Serial.println (resultkey);
        return atoi(resultkey);}
     
    i++;}
    configline[i]='\0';//записываем в конец массива символ окончания
    
if (configline[i]=='\0' && !nashelpult) {//если массив кончился и пульт не найден
        Serial.println("pult not found error!!!!");
        configfile.close();
        resultkey[0]=0;
        return 0;}
    if (configline[i]=='\0' && !nashelkey) {//если массив кончился и команда не найдена
        Serial.println("key not found error!!!!");
        configfile.close();
        resultkey[0]=0;
        return 0;}    
    configfile.close();}

Написал функцию getRCcode так, громоздкая может кривая но работает, но переслала работать остальная часть программы вернее участок:

webFile = SD.open(filename);
                   if (webFile) {
                       while(webFile.available()) {
                           client.write(webFile.read());
                       }
                       webFile.close();

тоесть webFile==0, при этом свою функцию в коде даже не вызываю, и если стереть функцию все работает как надо, подскажите плиз на что оно ругается?

sergey_777-s
Offline
Зарегистрирован: 20.02.2015
 if (!nashelpult && configline[i-1]==pultcharconst && configline[i]=='p'){
        i++;
        nashelpult=true;
        continue;}

- вот здесь ошибка, если в nashelpult занести "0" вся программа работает нормально, только заношу 1 - все через веб сервер файлы не открываются, почему так? что ему не нравится?

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

Добрый день, вы бы не могли краем глаза глянуть на мой код в этой ветке, может подскажете в чем причина?

sergey_777-s
Offline
Зарегистрирован: 20.02.2015

убрал последние два Serial.println и заработало! почему так я так и не понял...