דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. עזרה בקטע קוד C++

עזרה בקטע קוד C++

מתוזמן נעוץ נעול הועבר תכנות
22 פוסטים 4 כותבים 432 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • איש ימיניא מנותק
    איש ימיניא מנותק
    איש ימיני
    כתב ב נערך לאחרונה על ידי
    #21

    @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 ביטים חוזר על עצמו.
    אבל אני יכול לשים תו סיום ולהסתדר.
    תודה בכל אופן.

    OdedDvirO תגובה 1 תגובה אחרונה
    0
    • OdedDvirO מנותק
      OdedDvirO מנותק
      OdedDvir
      השיב לאיש ימיני ב נערך לאחרונה על ידי OdedDvir
      #22

      @איש-ימיני זה בגלל שהמקטע האחרון מכיל מידע שימושי פחות מ-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
         }
      }
      

      ככה זה יותר בטוח

      תגובה 1 תגובה אחרונה
      2

      • 1
      • 2
      בא תתחבר לדף היומי!
      • התחברות

      • אין לך חשבון עדיין? הרשמה

      • התחברו או הירשמו כדי לחפש.
      • פוסט ראשון
        פוסט אחרון
      0
      • דף הבית
      • קטגוריות
      • פוסטים אחרונים
      • משתמשים
      • חיפוש
      • חוקי הפורום