es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Divide un valor de matriz constante en un área de texto con un número seleccionado para obtener una nueva matriz numerada de forma individual.

Necesito una función de javascript que se pueda usar para dividir (con el número definido especificado) una matriz dentro de un área de texto después de hacer clic en el botón.

<textarea id="source">
    const uint8_t ArrayName [] PROGMEM = {  // 10 líneas
      0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
      0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
      0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
      0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
      0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
      0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
      0x00, 0x00, 0x00, 0x00, 0x00,
      0x01, 0x01, 0x01, 0x01, 0x01,
      0x22, 0x22, 0x22, 0x22, 0x22,
      0x33, 0x33, 0x33, 0x33, 0x33,
    };
</textarea>

En la siguiente área de texto (este ejemplo se divide en 3):

<textarea id="result">
    const uint8_t ArrayName_0 [] PROGMEM = {
      0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
      0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
      0xCC, 0xCC, 0xCC, 0xCC, 0xCC
    };
    const uint8_t ArrayName_1 [] PROGMEM = {
      0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
      0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
      0xFF, 0xFF, 0xFF, 0xFF, 0xFF
    };
    const uint8_t ArrayName_2 [] PROGMEM = {
      0x00, 0x00, 0x00, 0x00, 0x00,
      0x01, 0x01, 0x01, 0x01, 0x01,
      0x22, 0x22, 0x22, 0x22, 0x22
    };
    const uint8_t ArrayName_3 [] PROGMEM = {  // resto de la línea
      0x33, 0x33, 0x33, 0x33, 0x33
    };
</textarea>

Utilizo esta función que obtengo de aquí, pero el resultado es incorrecto. Estoy confundido acerca de agregar una copia de la primera línea al principio de cada matriz resultante.

function divide() {
  var lines = $('#source').val().split(/\n/);
  var texts = [];
  for (var i = 0; i < lines.length; i++) {
    if (/\S/.test(lines[i])) {
      texts.push($.trim(lines[i]));
    }
  }
  var list = texts;
  var li = '';

  for (var e = 0; e < list.length; e++) {
    if (e % 3) {
      var lit = li + list[e];
      li = lit.substring(0, lit.length - 1);
      li = li + '\n}\n';
    } else {
      li = li + list[e] + '\n';
    }
  }
  li = lit.substring(0, lit.length - 1);
  li = li + '\n}';

  document.getElementById("result").value = li;
}

Gracias a todos por su ayuda en este documento de origen.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una función que puede dividir un arreglo dentro de un área de texto con un número definido especificado, puedes modificar la función existente de la siguiente manera:

    function divide() {
      const lines = $('#source').val().split('\n');
      const texts = [];
    
      // remover líneas vacías y espacios en blanco
      for (let i = 0; i < lines.length; i++) {
        if (/\S/.test(lines[i])) {
          texts.push($.trim(lines[i]));
        }
      }
    
      // obtener el número definido especificado
      const divideBy = parseInt($('#divideBy').val());
    
      const result = [];
      let currentArray = [];
    
      // dividir el arreglo en subarreglos con el número definido especificado
      for (let i = 0; i < texts.length; i++) {
        currentArray.push(texts[i]);
        if ((i+1) % divideBy === 0) {
          result.push(currentArray.slice());
          currentArray = [];
        }
      }
    
      // añadir los elementos restantes en un nuevo subarreglo
      if (currentArray.length > 0) {
        result.push(currentArray);
      }
    
      let li = '';
    
      // crear nuevos arreglos usando los subarreglos
      for (let i = 0; i < result.length; i++) {
        let arrayName = `ArrayName_${i}`;
        li += `const uint8_t ${arrayName} [] PROGMEM = {\n`;
        for (let j = 0; j < result[i].length; j++) {
          li += `${result[i][j]}, `;
        }
        li = li.slice(0, -2) + '\n};\n\n';
      }
    
      $('#result').val(li);
    }
    

    En esta función, el área de texto de entrada se identifica con el atributo id source, y el área de texto de resultado se identifica con el atributo id result.

    Para especificar el número deseado para dividir el arreglo, puedes agregar un elemento de entrada de tipo number con el atributo id divideBy.

    La función funciona obteniendo primero las líneas de texto del área de texto de entrada, eliminando las líneas vacías y eliminando los espacios en blanco de cada línea.

    Luego, obtiene el valor del elemento de entrada divideBy y lo convierte a un número entero.

    A continuación, la función crea subarreglos del arreglo de entrada con el número deseado de elementos. Cualquier elemento restante se agrega a un nuevo subarreglo.

    La función luego crea nuevos arreglos usando los subarreglos, siendo que cada arreglo se nombra como ArrayName_x, donde x es el índice del subarreglo.

    Finalmente, la función establece el valor del área de texto de resultado con las cadenas generadas.

    Ten en cuenta que esta función asume que el arreglo de entrada contiene la misma cantidad de elementos que se pueden dividir de manera uniforme por el número especificado. Si esto no es el caso, los subarreglos resultantes pueden contener elementos vacíos.

Comments are closed.