עזרה בקטע קוד C++
-
@OdedDvir
הקוד עובד די טוב, אבל יש קטע מוזר שהמקטע האחרון חוזר על עצמו.
זה הקוד הסופי כרגע:while(http.connected() && (len > 0 || len == -1)) { // get available data size size_t size = stream->available(); if(size) { // read up to 128 byte int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); // write it to Serial Serial.write(buff, c); doSomething((char *)buff, c); // decrease length if(len > 0) { len -= c; } } delay(1); } void doSomething(char * segment, int size) { result += segment; } Serial.println(result);
בעת שאני מדפיס את התוצאה
Serial.println(result);
נראה שהמקטע האחרון של ה 128 ביטים חוזר על עצמו.
אבל אני יכול לשים תו סיום ולהסתדר.
תודה בכל אופן. -
@איש-ימיני זה בגלל שהמקטע האחרון מכיל מידע שימושי פחות מ-128 תוים, ושאר התאים במערך מכילים שאריות מהמקטע הקודם. הפעולה:
result += segment;
מוסיפה את כל המקטע בגלל שאין תו null. אתה צריך להוסיף רק את size התוים האחרונים. אפשר להתחכם כך:
if (size < 128) segment[size] = '\0'; result += segment;
למעשה זה קצת מטריד אותי שזה עבד בלי לקרוס, כי לא ברור לי מניין ידוע גודל המערך segment להיות 128, בכל האיטרציות הקודמות. הקוד הזה לא מניח את דעתי לגמרי. הפתרון הכי טוב זה להעתיק תמיד size תוים.
ובלאו הכי, נראה לי שהפעולה += מבצעת המרה לא מפורשת לאובייקט String. הכי טוב להגדיר מראש את הגודל המקסימלי של result, ולהשתמש בהעתקה ישירה ע"י memcpy.// Globals define MAX_LEN 1000 char result[MAX_LEN+1]; // save space for trailing null char int resultSize = 0; ... void doSomething(char * segment, int size) { int charsToCopy; charsToCopy = resultSize+size > MAX_LEN ? MAX_LEN-resultSize : size; if (charsToCopy > 0) { memcpy(result[resultSize], segment, charsToCopy); resultSize += charsToCopy; result[resultSize] = '\0'; // add trailing null char } }
ככה זה יותר בטוח