преобразование типов
- Войдите на сайт для отправки комментариев
Пт, 20/02/2015 - 14:45
помогите пожалуйста! все роди проще простого, но... если массив 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
-----
как в даном примере преобразовать либо чило в аски код либо данные массива в число, чтобы вывод в двоичном коде у них был одинаков?
Для начала правильно оформите вставку кода http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
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);}тут то и кода как такового нет....
Если речь только о цифрах то Serial.println(askii[0]-48, BIN);
нет, не только, на самом деле в этот массив попадают данные из sd карты из конф файла, дальше он разбирается на части и после определенного знака в массиве нужно сравнить содержимое нужной ячейки массива с переменной в которой находится цыфра и если они равны нужно исполнить некоторые действия, как это правильно сделать ума не приложу...
Напишите, например, int chislo='1'; или char askii[1]={1}; - думаю, всё сравнится.
1 и '1' - это же разные числа, print не врёт.
Для преобразования, строго говоря, положено пользоваться специальными функциями, но в большинстве случаев достаточно такого простого фокуса.
Такое chislo можно смело сравнивать с единицей, т.к. в нём действительно находится само число, а не его ASCII-код.
а если в массиве будут буквы и другие символы а нужно будет найти вхождение цыфры тогда как?
Искомая цифра + 48 и сравниваем...
Зачем парить себе мозг? Храните в переменной не число, а код числа, т.е. в том же самом виде, что и в массиве, т.е. не 1, а '1' и справнивайте хоть до посинения без всяких преобразований. Места в памяти займет ровно столько же.
наверное прийдется так, потому что предыдущий прием работал только от 0 до 9 если уже число 10 - увы...
Хорошо есть функция int ifunc(int x, int y) x=21 ... как в переменную х занести аскикод числа 21?
У числа 21 нет аскикода. Аскикод есть у символа 2 и символа 1, соответственно 50 и 49. И еще цифры и числа это разные вещи, вы где-то цифры пишите где-то числа
меня интересует именно вхождение чисел в массив, как это правильно организовать?
На корпоративе вроде много не пил, а бошка вообще не работает. Нарисуйте пример входного массива в котором будите искать числа среди символов и при этом массив char... Что-то я вообще туплю. Там же всё будет числами.. '1'=49=0х31=b110001 какая разница как его записать, это всё одно и тоже.
получается есть массив: 1p|1k12345|2p|1k9876|2k45678|21p|1k123|48p|1k567 и т.д. есть функция с двумя параметрами (два числа) например giveMeKey(21,1) нужно чтобы функция взяла число 21 и начала искать его по массиву если встречает число 21 проверяет есть ли после него символ "р" если есть то начинает дальше искать второй параметр функции "1" если находит и после него сразу идет символ "к" то последующие данные от "к" до "|" должна вернуть функция тоесть в данном примере функция вернет "123"
или хотябы как содержимое переменной преобразовать в askii код?
Если есть желание можно вот так поизвращаться :)
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); }))) как раз так сейчас и извращаюсь через itoa ))
спасибо!
#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, при этом свою функцию в коде даже не вызываю, и если стереть функцию все работает как надо, подскажите плиз на что оно ругается?
if (!nashelpult && configline[i-1]==pultcharconst && configline[i]=='p'){ i++; nashelpult=true; continue;}- вот здесь ошибка, если в nashelpult занести "0" вся программа работает нормально, только заношу 1 - все через веб сервер файлы не открываются, почему так? что ему не нравится?
Добрый день, вы бы не могли краем глаза глянуть на мой код в этой ветке, может подскажете в чем причина?
убрал последние два Serial.println и заработало! почему так я так и не понял...