2010-01-13 3 views
3

Я пишу библиотеку arduino, чтобы отправлять HTTP-запрос в Интернете.Ссылка на строку не обновляется при вызове функции в C++

Я использую класс String, из http://arduino.cc/en/Tutorial/TextString

Мой код ведет себя странно, когда я имею в виду мои определенные объекты строки после вызова функции.

На самом деле я пытаюсь получить тело моего запроса GET и удалять заголовки http из ответа HTTP GET.

Ниже приводится описание:

Вызов метода:

String body; 
    if(pinger.Get(host,path,&body)) 
    { 
    Serial.println("Modified String Outside :"); 
    Serial.println(body); 
    Serial.println(); 
    Serial.println("Modified String Outside Address"); 
    Serial.println((int)&body); 
    } 

Выход

Modified String Outside : 
HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: text/html 
Content-Length: 113 
Date: Wed, 13 Jan 2010 14:36:28 GMT 

<html> 
<head> 
<title>Ashish Sharma 
</title> 
</head> 
<body> 
Wed Jan 13 20:06:28 IST 2010 
</body> 
</html> 


Modified String Outside Address 
2273 

Метод Описание:

bool Pinger::Get(String host, String path, String *response) { 
    bool connection = false; 
    bool status = false; 

    String post1 = "GET "; 
    post1 = post1.append(path); 
    post1 = post1.append(" HTTP/1.1"); 

    String host1 = "Host: "; 
    host1 = host1.append(host); 

    for (int i = 0; i < 10; i++) { 
     if (client.connect()) { 
      client.println(post1); 
      client.println(host1); 
      client.println(); 
      connection = true; 
      break; 
     } 
    } 

    int nlCnt = 0; 
    while (connection) { 
     if (client.available()) { 
      int c = client.read(); 
      response->append((char) c); 
      if (c == 0x000A && nlCnt == 0) { 
       nlCnt++; 
       if (response->contains("200")) { 
         status = true; 
         continue; 
        } else { 
         client.stop(); 
         client.flush(); 
         break; 
        } 
      } 
     } 
     if (!client.connected()) { 
      client.stop(); 
      connection = false; 
     } 
    }   
    response = &response->substring(response->indexOf("\n\r\n"),response->length());  
    Serial.println("Modified String: "); 
    Serial.println(*response); 

    Serial.println(); 
    Serial.print("Modified String Address: "); 
    Serial.println((int)&response); 
    return status; 
} 

Выход:

Modified String: 
Ø 
<html> 
<head> 
<title>Ashish Sharma 
</title> 
</head> 
<body> 
Wed Jan 13 20:06:28 IST 2010 
</body> 
</html> 

Modified String Address: 2259 

Как видно из примера, ссылочный объект строки дает мне правильную строку внутри метода Get, но ссылка на содержимое строки изменяется при возврате метода Get.

ответ

3

Если я правильно понял ваш код, вы, вероятно, хотите сделать что-то вроде этого:

*response = response->substring(response->indexOf("\n\r\n"),response->length()); 

вместо

response = &response->substring(response->indexOf("\n\r\n"),response->length()); 

И нет, наверное, не нужно передать указатель (ссылка будет вероятно, сделать код намного приятнее).

3

Во-первых, вы модифицируете адрес строки, а не строку. Но адрес строки был передан функции значением и, таким образом, скопирован. Изменение его внутри функции не будет изменять его снаружи.

Во-вторых, этот код здесь плохо:

response = &response->substring(response->indexOf("\n\r\n"),response->length()); 

Поскольку это создает указатель на временный объект - это значит: повисшего указатель, так как временный объект будет уничтожен после того, как выражение было оценено.

Что вы действительно хотите передать объект по ссылке (String& response) и изменить его, а не его указатель:

response = response->substring(response->indexOf("\n\r\n"),response->length()); 

Это должно работать, при условииString класса используется правильно перегружает поведение оператора присваивания =.

1

Линия

Serial.println((int)&response); 

внутри функции неверный ответ уже указатель (String * ответ), с & ответ вы получите указатель на указатель.
Изменить его

Serial.println((int)response); 

и вы должны получить тот же адрес, с

Serial.println((int)&body); 

где тело представляет собой строку и & тела является указателем на строку

Смежные вопросы