لا يتم تحديث مرجع السلسلة في استدعاء الوظيفة في C++

StackOverflow https://stackoverflow.com/questions/2057523

  •  20-09-2019
  •  | 
  •  

سؤال

أنا أكتب مكتبة اردوينو لنشر طلب http على الويب.

أنا أستخدم فئة السلسلة من 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.

هل كانت مفيدة؟

المحلول

إذا فهمت الكود الخاص بك بشكل صحيح، فربما تريد أن تفعل شيئًا مثل هذا:

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

بدلاً من

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

ربما لا تكون هناك حاجة أيضًا لتمرير مؤشر (من المحتمل أن يجعل المرجع الكود يبدو أجمل بكثير).

نصائح أخرى

أولاً، أنت تقوم بتعديل عنوان من السلسلة وليس السلسلة نفسها.ولكن تم تمرير عنوان السلسلة إلى الوظيفة بالقيمة, ، وبالتالي نسخها.تعديلها داخل الوظيفة لن يعدلها من الخارج.

ثانيًا، هذا الكود هنا سيء:

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

لأنه يقوم بإنشاء مؤشر إلى كائن مؤقت – وهو ما يعني:مؤشر متدلي لأنه سيتم إتلاف الكائن المؤقت بعد تقييم التعبير.

ما لك حقًا المطلوب هو تمرير الكائن حسب المرجع (String& response) وتعديله وليس مؤشره:

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

هذا يجب أن يعمل، متاح ال String الفئة التي تستخدمها بشكل صحيح تزيد من سلوك عامل المهمة =.

الخط

 Serial.println((int)&response);

يوجد داخل وظيفتك استجابة خاطئة هي بالفعل مؤشر (استجابة سلسلة *)، مع &الاستجابة تحصل على المؤشر إلى المؤشر.
تغييره إلى

Serial.println((int)response);

ويجب أن تحصل على نفس العنوان كما هو الحال مع

 Serial.println((int)&body);

حيث body عبارة عن سلسلة و&body هو المؤشر إلى السلسلة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top