Support for multi-dimensional arrays and function return types

Démarré par sparky, Juin 14, 2018, 04:34:47 pm

« précédent - suivant »

sparky

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

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

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

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

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

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

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

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...