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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разделить строку и вывести результат на экране 
V
    Опции темы
SmErTs
  Дата 6.5.2017, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Разделить строку и вывести результат на экране

всем привет!
пишу маленькую программу на c++, столкнулся с небольшой проблемой, которая портит весь результат.
не могли ли вы помочь?

Описание программы.

буфер "32,225228.000,A,5540.613048,N,3741.581676,E,2.22,112.47,240417,,E,A"

вызываем подпрограмму get_GPS

Далее чтение из буфера 5540.613048
чтение из буфера N

вызываем подпрограмму convert2Degrees

конвертируем строчное число 5540.613048 в число с плавающей точкой float
5540.613048==>55
5540.613048==>44
5540.613048==>0.613048*60= 36,78288
конвертируем число с плавающей точкой 55, 44 36,78288 в строку
55°40'36,7828"N

чтение из буфера 3741.581676
чтение из буфера E

вызываем подпрограмму convert2Degrees

конвертируем строчное число 3741.581676 в число с плавающей точкой float
3741.581676==>37
3741.581676==>41
3741.581676==>0.581676*60= 34.90056
конвертируем число с плавающей точкой 37, 41 34.90056 в строку
37°41'34.9005"E

чтение из буфера 2.22
конвертируем строчное число 2.22 в число с плавающей точкой float
2.22*1.852=4.11
конвертируем число с плавающей точкой 4.11 в строку

чтение из буфера 112.47

печатаем на экране результат 55°40'36,7828"N
печатаем на экране результат 37°41'34.9005"E
печатаем на экране результат 4.11
печатаем на экране результат 112.47

Код программы

Код


#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#include <string.h>

using namespace std;

char RMC_buffer[]="32,225228.000,A,5540.613048,N,3741.581676,E,2.22,112.47,240417,,E,A";
char latitude[15];

char longitude[15];
char speedOTG[8];
char course[8];


int convert2Degrees(char *coord1, char coordDir, char *coord){//input data coord1 and coordDir output coord
int DD=0, MM=0;
float SS=0;
//memset(coord,0,sizeof(char)*15);
SS=atof(coord1);                                      //convert input data coord1 to float
                                                      //5540.613048 = DDMM.mmmmmm from datasheet simcom 908
DD = (int)SS/100L;                                    //extract DD
MM = (int)SS % 100L;                                  //extract MM
SS=(SS-((DD*100)+MM))*60;                               //extract .mmmmmm and convert him to SS
//dtostrf(SS, 2, 4, SS_SSSS);                           //convert float SS to string SS.SSSS
sprintf(coord,"%d°%d\'%.4f\"%c",DD,MM,SS,coordDir);//regrupe DD°MM'SS.SSSS"N
return 0;
}

void get_GPS(char *buff, char *lat, char *log, char *spee_d,  char *dir){
    char latitude1[15]={0}, latitudeDir;
    char longitude1[15]={0}, longitudeDir;
    char *istr = 0;
    int len=0, i;
    float speed_f=0;

    istr = strtok(buff, ",");                    //from buffer
    for (i=0; i<3; i++)
    istr = strtok(NULL,",");

    len=strlen(istr);
    for(i=0; i < len; i++){                    //Get latitude1
        latitude1[i]=istr[i];
    }
    latitude1[i++] = '\0';

    istr = strtok(NULL,",");
    latitudeDir = istr[0];                  // Get latitude directon

    convert2Degrees(latitude1, latitudeDir, lat);

    istr = strtok(NULL,",");
    len = strlen(istr);
    for(i=0; i < len; i++)                        //Get longitude1
        longitude1[i]=istr[i];
    longitude1[i++] = '\0';

    istr = strtok(NULL,",");
    longitudeDir = istr[0];

    convert2Degrees(longitude1, longitudeDir, log);

    istr = strtok(NULL,",");
    len = strlen(istr);
    for(i=0; i < len; i++)                        // Get speed over ground. Unit is knots.
        spee_d[i]=istr[i];
    spee_d[i++] = '\0';
    speed_f=atof(spee_d);
    speed_f=speed_f*1.852;
    sprintf(spee_d,"%.2f",speed_f);

    istr = strtok(NULL,",");
    len = strlen(istr);
    for(i=0; i < len; i++)                        //Get course
        dir[i]=istr[i];
    dir[i++] = '\0';

}


/*
void get_GPS(char *buff, char *lat, char *log,c har *spee_d,  char *dir){

char latitude1[15]={0}, latitudeDir[2]={0};
char longitude1[15]={0}, longitudeDir[2]={0};
float speed_f=0;

strtok(buff, ",");                                    //from buffer
strtok(NULL, ",");
strtok(NULL, ",");
strcpy(latitude1,strtok(NULL, ","));                  //Get latitude
strcpy(latitudeDir,strtok(NULL, ","));                // Get latitude directon

convert2Degrees(latitude1, latitudeDir, lat);

strcpy(longitude1,strtok(NULL, ","));                 // Get longitude
strcpy(longitudeDir,strtok(NULL, ","));               // Get longitude directon

convert2Degrees(longitude1, longitudeDir, log);

strcpy(spee_d,strtok(NULL, ","));                   // Get speed over ground. Unit is knots.

    speed_f=atof(spee_d);
    speed_f=speed_f*1.852;
    sprintf(spee_d,"%.2f",speed_f);

strcpy(dir,strtok(NULL, ","));                     // Get course

}*/

int main() {
    memset(latitude,0,sizeof(latitude));
    memset(longitude,0,sizeof(longitude));
    memset(speedOTG,0,sizeof(speedOTG));
    memset(course,0,sizeof(course));
    get_GPS(RMC_buffer,latitude, longitude, speedOTG, course );
    //cout << latitude << endl;
    //printf("%s\n",latitude);
    printf("latitude = %s\n",latitude);
printf("longitude = %s\n",longitude);
printf("speedOTG = %s\n",speedOTG);
printf("course = %s\n",course);

   // printf("%s\n",longitude);
   // printf("%s\n",speedOTG);
   // printf("%s\n",course);
    return 0;
}






проблема в том, что. на терминале совсем другое печатается

Код

latitude = 55░40'36.7969"N37░41'34.9072"E4.11
longitude = 37░41'34.9072"E4.11
speedOTG = 4.11
course = 112.47


а должно быть так:

Код

latitude =55░40'36.7969"N
longitude =37░41'34.9072"E
speedOTG = 4.11
course = 112.47


да, результаты не совпадают потому что я не использовал double.
Эта программа будет перенесена на Arduino. а Arduino, float и double имеют такое же значение.
спасибо.
PM MAIL   Вверх
volatile
Дата 6.5.2017, 23:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(SmErTs @  6.5.2017,  22:41 Найти цитируемый пост)
55░40'36.7969"N

длина строки 15 символов.

Цитата(SmErTs @  6.5.2017,  22:41 Найти цитируемый пост)
char longitude[15];

место для нуля где?
PM MAIL   Вверх
SmErTs
Дата 7.5.2017, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(volatile @ 6.5.2017,  23:56)
Цитата(SmErTs @  6.5.2017,  22:41 Найти цитируемый пост)
55░40'36.7969"N

длина строки 15 символов.

Цитата(SmErTs @  6.5.2017,  22:41 Найти цитируемый пост)
char longitude[15];

место для нуля где?

volatile, благодарю за ответ, я не был внимателен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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