Как пишут рекурсивные функции для sendto() ?

Тема в разделе "WASM.BEGINNERS", создана пользователем __sheva740, 10 июн 2021.

  1. __sheva740

    __sheva740 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2017
    Сообщения:
    310
    Доброго дня ребята!
    Пишу пограмку для себя
    на "С"
    Windows32

    Прожка отсылает сформированный пакет, в котором поле data = 128bit
    Нужно переслать строку someBigstring[] - пересылаемая строка любого размера strlen(someBigstring[]) bit
    Следовательно мне нужно разбить
    strlen(someBigstring[]) / 128 = n
    ... и n-раз вызвать функцию sendto()

    Вопрос:

    1. Правильно ли я думаю- мне нужна функция, которая выглядит примерно так ... ?
    Код (Text):
    1. myfunc(char* someBigstring, int strlen(someBigstring[]), int frame /*(128)*/,FARPROC sendto)
    2. Как на cpp пишутся рекурсивные функции под задачу типа моей?

    3. МОжет эту задачу решают как-то оригинальнее?
    Всегда Спасибо!!!
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Не понял, зачем тут рекурсия. У тебя будет функция sendto(char* someBigString, int start, int frame) и в цикле ее вызываешь, увеличивая start на frame, пока start меньше длины someBigString. Ну и на последней иттерации просто подкорректировать размер frame, если размер строки не кратен frame.
     
  3. __sheva740

    __sheva740 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2017
    Сообщения:
    310
    ... ну да, как вариант.
    Спасибо.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (C):
    1.  
    2. static void send (const uint8_t* data, uint32_t size)
    3. {
    4.     while (size > 128)
    5.     {
    6.         sendto (data, 128);
    7.         data += 128;
    8.         size -= 128;
    9.     }
    10.     sendto (data, size);
    11. }
    12.  
     
    M0rg0t нравится это.
  5. __sheva740

    __sheva740 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2017
    Сообщения:
    310
    Спасибо!
    --- Сообщение объединено, 10 июн 2021 ---
    ... просто если кому интересно
    Код (Text):
    1.  
    2. #include <stdio.h>
    3. #include <string.h>
    4. #include <windows.h>
    5. using namespace std;
    6. void sendtopr(char* dataz, int sizez) {
    7. char* test1;
    8. test1 = (char*)malloc(256);
    9. memset(test1,00, 256);
    10. memcpy(test1, dataz, sizez);
    11. printf("%s\n", test1);
    12. free(test1);
    13. }
    14. int main(int argc, char* argv[])
    15. {
    16. char str_in   []="1234567890a1a2a3a4a5a6a7a8a9a0b1b2b3b4b5b6b7b8b900";// 50
    17. int size_in,frame;
    18. char* wind;
    19. wind = str_in;
    20. size_in = strlen(str_in);
    21. frame = 3;
    22.     while (size_in > frame)
    23.     {
    24. sendtopr(wind, frame);
    25. wind += frame;
    26.         size_in -= frame;
    27.     }
    28.     sendtopr (wind, size_in);
    29. return 0;
    30. }
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Ну, выделять 256 байт на куче для данной программы не имеет смысла, проще и быстрее выделить на стеке. Да и по хорошему надо проверить, что sizez меньше 256. Но это так, просто побрюзжать.
     
    __sheva740 нравится это.
  7. __sheva740

    __sheva740 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2017
    Сообщения:
    310
    Справедливо, спасибо.