Sorry, you must be logged in to use the shoutbox!

Auteur Sujet: Support for multi-dimensional arrays and function return types  (Lu 524 fois)

sparky

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Can anyone suggest if there is a way to do the following:
1) Define and use a 2-dimensional array of a particular data type
I am unable to find a way to declare or use a 2-dimensional array using the existing blocks in the 'Array' category. I can still workaround the problem by converting the code use 1-dimensional array but it comes at a cost of code size and complexity.

2) Define a function with a return value
If I use the existing block in the 'Functions' category, it translates it to C code with 'Dynamic' data type. The compiler does not understand this and craps out.

My apologies if the above has been discussed before. I tried searching for the above in the forum archives but every time it gives me the following error:
"Due to a high load on the server, the search function was automatically and temporarily disabled. Try again later."

Thanks,

SebCanet

  • Administrator
  • Sr. Member
  • *****
  • Messages: 457
    • Voir le profil
Re : Support for multi-dimensional arrays and function return types
« Réponse #1 le: juin 15, 2018, 07:09:11 pm »
Hello,
you're right, I did not finished working on array type, so multi dimensionnal is yet implemented. I have to put it on the top of my todo list.

And for the 2nde problem, you're right again, I did not finished my work... :-[ The idea is to implement automatic typing of the function, looking forward the type of the result sent back.

For the server error, as the forum is on a personnal server I pay every month for my work with no aid from my boss, it's the cheapest I found...

Thanks for your message, I have few things to do, but I don't think I can have time to do this until a month or two, sorry. I also saw that array block are not entirely translated  ???, if you have any idea or if you want to help  ;)

Regards.

fontaine.jp

  • Full Member
  • ***
  • Messages: 114
    • Voir le profil
Re : Support for multi-dimensional arrays and function return types
« Réponse #2 le: juin 21, 2018, 12:35:08 am »
Salut,
Désolé de répondre en français mais c'est plus facile comme ça.
J'ai essayé de bricoler quelque chose, dites moi ce que vous en pensez.

blocks:
Blockly.Blocks["creer_tableau"] = {
    init: function() {
        this.appendDummyInput()
            .appendField(Blockly.Msg.ARRAY_create)
            .appendField(new Blockly.FieldVariable(Blockly.Msg.VARIABLES_GET_ITEM), 'VAR')
            .appendField(Blockly.Msg.VARIABLES_AS)
            .appendField(new Blockly.FieldDropdown(Blockly.Types.getValidTypeArray()), "type");
this.appendDummyInput()
            .setAlign(Blockly.ALIGN_RIGHT)
.appendField(new Blockly.FieldCheckbox("FALSE"),"dim")
            .appendField(Blockly.Msg.ARRAY_dim);
        this.appendValueInput("contenu")
            .setAlign(Blockly.ALIGN_RIGHT)
            .appendField(new Blockly.FieldDropdown([
                [Blockly.Msg.ARRAY_taille, "c1"],
                [Blockly.Msg.ARRAY_contenu, "c2"]
            ]), "choix");
        this.setInputsInline(false);
        this.setPreviousStatement(true, null);
        this.setNextStatement(true, null);
        this.setColour("#804000");
        this.setTooltip(Blockly.Msg.ARRAY_GETINDEX_TOOLTIP2);
        this.setHelpUrl(Blockly.Msg.HELPURL)
        this.contextMenuMsg_ = Blockly.Msg.tab_create_fix
    },
    contextMenuType_: "fixer_tableau",
    customContextMenu: Blockly.Blocks["variables_get"].customContextMenu,
    getVarType: function(varName) {
        return Blockly.Types.getChildBlockType(this)
    },
    renameVar: function(oldName, newName) {
        if (Blockly.Names.equals(oldName, this.getFieldValue("VAR"))) this.setFieldValue(newName, "VAR")
    }
};

generators:
Blockly.Arduino['creer_tableau']=function(block){
    var argument0 = Blockly.Arduino.valueToCode(block, 'contenu', Blockly.Arduino.ORDER_ASSIGNMENT) ;
var varName = Blockly.Arduino.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
var typeBlock = Blockly.Arduino.getArduinoType_(Blockly.Types[block.getFieldValue('type')]);
var menu = block.getFieldValue("choix");
var dimension = block.getFieldValue("dim")=='TRUE';
switch (menu) {
        case "c1":
            if (dimension){
Blockly.Arduino.variables_[varName] = typeBlock + ' ' + varName + '['+argument0+']['+argument0+'];';
} else {
Blockly.Arduino.variables_[varName] = typeBlock + ' ' + varName + '['+argument0+'];';
}
break;
        case "c2":
            if (dimension){
var argument = argument0.split('{');
var nb1 = argument.length - 2 ;
var arg = argument[2].split(',')
var nb2 = arg.length - 1 ;
Blockly.Arduino.variables_[varName] = typeBlock + ' ' + varName + '['+ nb1+']'+ '['+ nb2+'] = '+argument0+';';
} else {
Blockly.Arduino.variables_[varName] = typeBlock + ' ' + varName + '[] = '+argument0+';';
}
break;
}
return '';
};

A+

SebCanet

  • Administrator
  • Sr. Member
  • *****
  • Messages: 457
    • Voir le profil
Re : Support for multi-dimensional arrays and function return types
« Réponse #3 le: juin 21, 2018, 09:15:51 pm »
Merci de ce code ! Ca me semble sympa pour commencer, à voir en fonction des retours.
Mais il faut que je me penche dessus car mon premier copier coller provoque des erreurs...

Bzhtitude

  • Full Member
  • ***
  • Messages: 106
  • Ad astra ...
    • Voir le profil
Re : Support for multi-dimensional arrays and function return types
« Réponse #4 le: juin 21, 2018, 10:55:48 pm »
Le code fonctionne sauf la partie menu contextuel que j'ai du commenter pour pouvoir avoir le bloc
Peut être cette ligne :
this.contextMenuMsg_ = Blockly.Msg.tab_create_fix

Je ne vois pas vers quoi ça pointe ??


Il faut penser à rajouter la variable
Blockly.Msg.ARRAY_dim = " de dimension 2 ";
dans le fr.js pour que ça fonctionne correctement.




fontaine.jp

  • Full Member
  • ***
  • Messages: 114
    • Voir le profil
Re : Support for multi-dimensional arrays and function return types
« Réponse #5 le: juin 21, 2018, 11:23:07 pm »
Salut,
En effet j'ai modifié beaucoup de choses et le menu contextuel retourne le bloc d'affectation d'un élément du tableau.
 ;)

fontaine.jp

  • Full Member
  • ***
  • Messages: 114
    • Voir le profil
Re : Support for multi-dimensional arrays and function return types
« Réponse #6 le: juin 21, 2018, 11:54:11 pm »
les 2 lignes à modifier :
this.contextMenuMsg_ = Blockly.Msg.tab_create_fix
    contextMenuType_: "fixer_tableau"

à remplacer par :
this.contextMenuMsg_ = "créer 'affecter à l élément de rang..'"
    contextMenuType_: "array_modify"

SebCanet

  • Administrator
  • Sr. Member
  • *****
  • Messages: 457
    • Voir le profil
Re : Support for multi-dimensional arrays and function return types
« Réponse #7 le: juin 22, 2018, 01:50:15 am »
Merci beaucoup !
J'ai pu retester et je me suis permis une modif à voir sur Github.
Sinon le défaut est qu'on n'autorise que les matrices carrées, je pense qu'il va fallor passer par un mutator pou rajouter des lignes de définition.
A voir...