Missed the return type of poll() ``` fun {n: nat | n > 0}{l: addr} poll ( fds_pf: !array_v( pollfd_t, l, n) >> _ (* proof, that we have access to address range (l,n), which contains initialized array of elements of type pollfd_t *) | fds: ptr l (* address *) , nfds: size_t n (* range size *) , timeout: int ): int = "ext#" ```
вт, 7 июл. 2020 г. в 07:28, ice.r...@gmail.com <ice.redm...@gmail.com>: > > Hi, > I need to provide a type for exteenal call poll() from libc. > > My initial try was that: > ``` > typedef pollfd_t = $extype_struct"struct pollfd" of > { fd = int > , events = sint > , revents = sint > } > fun {n: nat | n > 0}{l: addr} > poll > ( fds_pf: !array_v( pollfd_t, l, n) >> _ (* proof, that we have > access to address range (l,n), which contains initialized array of elements > of type pollfd_t *) > | fds: ptr l (* address *) > , nfds: size_t n (* range size *) > , timeout: int > ) = "ext#" > ``` > > Then I try to use it: > ``` > fn foo(): void = { > val nfds = g1int2uint_int_size(1) > val (fds_pf, fds_free_pf | fds_addr) = array_ptr_alloc<pollfd_t>(nfds) > (* how should I initialize array here so fds_pf will switch it's type > from array_v(pollfd_t?, l, nfds) into array_v(pollfd_t, l, nfds)? *) > val _ = poll( fds_pf | fds_addr, nfds) > val () = array_ptr_free( fds_pf, fds_free_pf | fds_addr) > } > ``` > > I was not able to understand how should I proof to compiler,. that I had > initialized array at fds_addr. I had tried to use `array_iforeach`, but it > does not require any proofs, so fds_pf keeps being uninitialized > > Based on: > 1. type of array_ptr_free (which expects fds_pf to be of type > array_v(pollfd_t?,l,n)); > 2. the fact, that most of functions in array.sats are working with flat > arrays, for example, array_iforeach, which has type > ``` > fun {a:vt0p} > array_iforeach > {n:int} > ( A0: &(@[INV(a)][n]) >> @[a][n] > , asz: size_t(n) > ) : sizeLte(n) // end of [array_iforeach] > ``` > I conclude, that I misunderstood the purpose of array_v and it's > interconnection with flat arrays. > > So my questions are: > 1. what should be the type of poll()? > 2. Am I using array_v(pollfd_t,l,n) correctly or is there other > motivation behind array_v? > 3. why array_foreach and etc do not require proofs? > 4. And how could I switch fds_pf's type from uninitialized to initialized > array with some library function (I saw the implementation of > array_ptr_tabulate in the tutorial, but I thought, that if std library does > not use similar types for functions, then I misunderstood something) > > -- > You received this message because you are subscribed to a topic in the > Google Groups "ats-lang-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/ats-lang-users/w6OiwDxucBM/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > ats-lang-users+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/ats-lang-users/558eb0ab-3306-45e6-ad62-5054afbe26ebn%40googlegroups.com > <https://groups.google.com/d/msgid/ats-lang-users/558eb0ab-3306-45e6-ad62-5054afbe26ebn%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "ats-lang-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to ats-lang-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/CAHjn2Kzy3_ntef7S%2BdDGGNnONAGwvsxO%2BmmaPa0D5NNQx-oO7A%40mail.gmail.com.