Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Invalid entry point exception σε κλήση F# συνάρτησης από C#

Îåêßíçóå áðü ôï ìÝëïò opterios. Τελευταία δημοσίευση από το μέλος opterios στις 04-11-2012, 13:42. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-11-2012, 18:29 71523

    Invalid entry point exception σε κλήση F# συνάρτησης από C#

    Καλησπέρα σε όλους.

    Έχω φτιάξει στην F# μία συνάρτηση (primesTo x) που επιστρέφει μία λίστα από όλους τους ακέραιους διαιρέτες μίας ακολουθίας αριθμών. Δηλαδή, για είσοδο x θα επιστρέψει μία λίστα διάστασης x, όπου κάθε στοιχείο της λίστας θα περιέχει τους ακέραιους διαιρέτες όλων των ακέραιων από το 1 μέχρι το x. Για παράδειγμα, για είσοδο "10":

    > primesTo 10;;
    val it : int list list =
      [[1]; [2; 1]; [3; 1]; [4; 2; 1]; [5; 1]; [6; 3; 2; 1]; [7; 1]; [8; 4; 2; 1];
       [9; 3; 1]; [10; 5; 2; 1]]
    > 

    Επίσης, έχω και μία άλλη (divs x) που χρησιμοποιείται από την primesTo, η οποία επιστρέφει μία λίστα από όλους τους ακέραιους διαιρέτες ενός αριθμού (εκτός του εαυτού του). Παράδειγμα:

    > divs 10;;
    val it : int list = [5; 2; 1]
    > 
    Τις συναρτήσεις αυτές τις έβαλα σε μία βιβλιοθήκη και θέλω να τις καλέσω από ένα WebForms C# project. Ενώ λοιπόν η κλήση για την divs τρέχει κανονικά, όπως φαίνεται εδώ:

    foreach (int i in TestFSharp.divs(10))
                {
                    this.listBox1.Items.Add(i.ToString());
                }
    στην κλήση της primeTo μου χτυπά exception "EntryPointNotFound".

    System.EntryPointNotFoundException was unhandled
      HResult=-2146233053
      Message=Entry point was not found.

    Παραθέτω και τον C# κώδικα που καλεί την primeTo (δοκιμάζω με τιμές τάξεως του 10):

    List<int> innerList = new List<int>();
    List<List<int>> returnList = new List<List<int>>();
    foreach (FSharpList<int> l in TestFSharp.primesTo(10))
                {
                    foreach (int v in l)
                    {
                        innerList.Add(v);
                    }
                    returnList.Add(innerList);
                }
                return returnList;

    Με λίγα λόγια, η primeTo επιστρέφει μία nested FSharpList<FSharpList<int>> που θεωρώ έχει interface IEnumerable (αφού μπορεί και κάνει iteration σε FSharpList). Το πρόβλημα που αντιμετωπίζω είναι επειδή κάνω κάτι λάθος εγώ, ή υπάρχει κάποιος ειδικός χειρισμός στην κλήση nested λιστών έξω από το περιβάλλον της F#;

    Αν θέλετε, να βάλω και τον κώδικα της F#, ωστόσο οι συναρτήσεις στο FSI εκτελούνται κανονικά χωρίς πρόβλημα όπως είδαμε και πιο πάνω, ακόμα και για αριθμούς της τάξεως 10^5, οπότε τον παραλείπω για να μη μεγαλώσει πολύ το post. Το πρόβλημά μου εμφανίζεται αποκλειστικά στην C#.


    Ευχαριστώ εκ των προτέρων.

    Θέμης
    twitter: @devopterios
  •  03-11-2012, 22:18 71526 σε απάντηση της 71523

    Απ: Invalid entry point exception σε κλήση F# συνάρτησης από C#

    Δοκίμασε να βάλεις reference στο FSharp.Core.dll.
    Γενικά, είναι καλό practice να μην κάνεις expose F# types σε C# projects. Δηλαδή αντι για int list list, καλύτερα είναι seq<seq<int>>.

    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  04-11-2012, 12:05 71527 σε απάντηση της 71526

    Απ: Invalid entry point exception σε κλήση F# συνάρτησης από C#

    Το FSharp.Core.dll το έκανα ήδη reference, αλλιώς δεν έβλεπε το FSharpList.

    Θα χρησιμοποιήσω seq, όπως είπες.

    Επειδή γενικώς σκοπεύω να χρησιμοποιήσω αρκετά την F# μέσω της C#, μήπως είναι καλύτερη ιδέα να χρησιμοποιήσω τα System.Collections.Generic από την πλευρά της F# πρώτα; Απλώς δεν ήθελα να χρησιμοποιώ mutable συλλογές στην F# για να μην ξεφύγω πολύ από τον συναρτησιακό προγραμματισμό για...ακαδημαϊκούς λόγους, αλλά αν η πραγματικότητα το απαιτεί, τότε μπορώ να βάλω λίγο νερό στο κρασί μου :P

    Ευχαριστώ για την απάντηση!

    Θέμης
    twitter: @devopterios
  •  04-11-2012, 12:24 71528 σε απάντηση της 71527

    Απ: Invalid entry point exception σε κλήση F# συνάρτησης από C#

    Δεν χρειάζεται να χρησιμοποιείς mutable collections by default.
    Απλά φρόντιζε το boundary. Δεν είναι πολύ φιλικό για τους C# programmers να βλέπουν types που δεν τα γνωρίζουν. Το seq είναι type alias για το IEnumerable, οποτε δεν χρειάζεται reference στο FSharp.Core. Απλά στο boundary κανε ένα απλό και σχετικά φτηνό transformation. px [[1]; [1; 2]] |> Seq.map (fun v -> v :> seq<int>). Επίσης καλο είναι στην C# να μην κανεις expose F# modules, καλύτερα φτιάξε ένα class με ένα απλό interface.

    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  04-11-2012, 13:42 71530 σε απάντηση της 71528

    Απ: Invalid entry point exception σε κλήση F# συνάρτησης από C#

    Τα συγκεκριμένα projects αφορούν ένα κύκλο εργασιών που έχω αναλάβει μόνος μου (εκτός δουλειάς), οπότε έχω πλήρη ελευθερία στην αρχιτεκτονική. Ωστόσο, μου φαίνεται και πολύ λογικό αυτό που λες και πιο σωστό, οπότε θα προσπαθήσω να πατώ πάνω σε αυτή τη λογική. Εξάλλου, ποτέ δεν ξέρεις αν θα χρειαστεί να βάλει το χέρι του στο μακρινό μέλλον και κάποιος τρίτος :)

    Thanks!

    Θέμης
    twitter: @devopterios
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems