* unsigned-int @ 2017-06-22 9:42 Catonano 2017-06-22 9:56 ` unsigned-int Catonano 2017-06-22 16:20 ` unsigned-int Mark H Weaver 0 siblings, 2 replies; 11+ messages in thread From: Catonano @ 2017-06-22 9:42 UTC (permalink / raw) To: guile-user I can't extract correct values from unsigned-int's I can extract correct values from int, unsigned-short but NOT form an unsigned-int In that case the number that comes out is plainly wrong This is how I extract a number from an int (and it works) (bytevector-uint-ref (pointer->bytevector outcome-ptr (sizeof int)) 0 (endianness big) 1) ) This is an unsigned-short (and it works) (bytevector-uint-ref (pointer->bytevector columns-ptr (sizeof unsigned-short)) 0 (endianness big) 1) This is an unsigned-int and it DOESN'T work (bytevector-uint-ref (pointer->bytevector rows-ptr (sizeof unsigned-int)) 0 (endianness big) 1) Thanks in advance ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 9:42 unsigned-int Catonano @ 2017-06-22 9:56 ` Catonano 2017-06-22 16:20 ` unsigned-int Mark H Weaver 1 sibling, 0 replies; 11+ messages in thread From: Catonano @ 2017-06-22 9:56 UTC (permalink / raw) To: guile-user The relevant code is here https://gitlab.com/humanitiesNerd/guile-freexl/blob/master/freexl/common.scm and the not working function is "freexl-worksheet-dimensions" on line 132 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 9:42 unsigned-int Catonano 2017-06-22 9:56 ` unsigned-int Catonano @ 2017-06-22 16:20 ` Mark H Weaver 2017-06-22 19:13 ` unsigned-int Catonano 1 sibling, 1 reply; 11+ messages in thread From: Mark H Weaver @ 2017-06-22 16:20 UTC (permalink / raw) To: Catonano; +Cc: guile-user Catonano <catonano@gmail.com> writes: > I can't extract correct values from unsigned-int's > > I can extract correct values from int, unsigned-short > > but NOT form an unsigned-int > > In that case the number that comes out is plainly wrong > > This is how I extract a number from an int (and it works) > > (bytevector-uint-ref (pointer->bytevector > outcome-ptr (sizeof int)) 0 > (endianness big) 1) ) You need to use 'bytevector-int-ref', not 'bytevector-uint-ref', to extract a signed integer. > This is an unsigned-short (and it works) > > (bytevector-uint-ref (pointer->bytevector > columns-ptr (sizeof unsigned-short)) 0 > (endianness big) 1) > > This is an unsigned-int and it DOESN'T work > > (bytevector-uint-ref (pointer->bytevector > rows-ptr (sizeof unsigned-int)) 0 > (endianness big) 1) There's also a problem with all three of your examples above. You're passing '1' as the final argument to 'bytevector-uint-ref'. That's the width in bytes of the numeric field to access. In all cases, those 1s should be replaced with (sizeof <type>). Also, I'm not sure why you're specifying (endianness big) here. I would think (native-endianness) would be appropriate here. Given this, and the fact that you're passing the wrong width, makes me surprised that this is working for you at all. Mark ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 16:20 ` unsigned-int Mark H Weaver @ 2017-06-22 19:13 ` Catonano 2017-06-22 19:33 ` unsigned-int Catonano 2017-06-23 12:16 ` unsigned-int Mark H Weaver 0 siblings, 2 replies; 11+ messages in thread From: Catonano @ 2017-06-22 19:13 UTC (permalink / raw) To: Mark H Weaver; +Cc: guile-user 2017-06-22 18:20 GMT+02:00 Mark H Weaver <mhw@netris.org>: > Catonano <catonano@gmail.com> writes: > > > I can't extract correct values from unsigned-int's > > > > I can extract correct values from int, unsigned-short > > > > but NOT form an unsigned-int > > > > In that case the number that comes out is plainly wrong > > > > This is how I extract a number from an int (and it works) > > > > (bytevector-uint-ref (pointer->bytevector > > outcome-ptr (sizeof int)) 0 > > (endianness big) 1) ) > > You need to use 'bytevector-int-ref', not 'bytevector-uint-ref', to > extract a signed integer. > I am extracting an unsigned-int here. (sizeof int) and (sizeof unsigned-int) happen to be te same > > > This is an unsigned-short (and it works) > > > > (bytevector-uint-ref (pointer->bytevector > > columns-ptr (sizeof unsigned-short)) 0 > > (endianness big) 1) > > > > This is an unsigned-int and it DOESN'T work > > > > (bytevector-uint-ref (pointer->bytevector > > rows-ptr (sizeof unsigned-int)) 0 > > (endianness big) 1) > > There's also a problem with all three of your examples above. You're > passing '1' as the final argument to 'bytevector-uint-ref'. That's the > width in bytes of the numeric field to access. In all cases, those 1s > should be replaced with (sizeof <type>). > Ah. I had misunderstood the signature of bytevector-*-ref Fixed. > Also, I'm not sure why you're specifying (endianness big) here. I just attempted with (endianness big). It worked, so I assumed it had to be right > I would > think (native-endianness) would be appropriate here. Ah ! I hadn't noticed (native-endianness) existed ! Fixed > Given this, and > the fact that you're passing the wrong width, makes me surprised that > this is working for you at all. Mark, thank you so much for your review. I appreciate that I apologize if my questions are naive. I wrote my last scrap of C code in about 2004 and it never was my thing Also the manual is a great reference but not a great tutorial and I'm not a great reader, probably. Still I'd like to use guile-freexl to extract data from a bunch of xls files and store such data in a Postgresql db. I believe that this could be useful to other guilers too Last time I used a Clojure wrap around an Apache Foundation Java library. But guile-freexl would be free software ! So, yeah, I'm sorry for the fuss All that said, I applied the fixes that you suggested and I still get completely wrong number of rows of the spreadsheets and correct number of columns Exactly as before your correctons So maybe this thingie of mine could use some further attention. Thanks again ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 19:13 ` unsigned-int Catonano @ 2017-06-22 19:33 ` Catonano 2017-06-22 19:55 ` unsigned-int Catonano 2017-06-23 12:37 ` unsigned-int Mark H Weaver 2017-06-23 12:16 ` unsigned-int Mark H Weaver 1 sibling, 2 replies; 11+ messages in thread From: Catonano @ 2017-06-22 19:33 UTC (permalink / raw) To: Mark H Weaver; +Cc: guile-user 2017-06-22 21:13 GMT+02:00 Catonano <catonano@gmail.com>: > > > I apologize if my questions are naive. > I wrote my last scrap of C code in about 2004 and it never was my thing > Also the manual is a great reference but not a great tutorial and I'm not a great reader, probably. Something that is concerning me is that in the example a "rows" variable and a "columns" variable get declared as unsigned int rows; unsigned short columns; and then they get passed as arguments to freexl_worksheet_dimensions as &rows, &columns like this ret = freexl_worksheet_dimensions (handle, &rows, &columns); In scheme I am NOT declaring anything because I don't now how to I am just passing void pointers to freexl_worksheet_dimensions But when you declare a variable of some type, some memory gets reserved for the value to be contained in that variable, right ? But I am passing void pointers here, so is any memory region being reserved ? I'm afraid not That might be the reason why I get garbage rows numbers. Because I am making it read some random memory region that has been already reserved for something else, that's already populated with God knows what and I am making it interpreting that stuff as numbers. I don't know, I'm speaking freely, here, this is a wild hypothesis I can't make so much sense of this code Please bear with me :-/ Thanks in advance ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 19:33 ` unsigned-int Catonano @ 2017-06-22 19:55 ` Catonano 2017-06-22 20:01 ` unsigned-int Catonano 2017-06-23 12:37 ` unsigned-int Mark H Weaver 1 sibling, 1 reply; 11+ messages in thread From: Catonano @ 2017-06-22 19:55 UTC (permalink / raw) To: Mark H Weaver; +Cc: guile-user 2017-06-22 21:33 GMT+02:00 Catonano <catonano@gmail.com>: > 2017-06-22 21:13 GMT+02:00 Catonano <catonano@gmail.com>: > > > > > > I apologize if my questions are naive. > > I wrote my last scrap of C code in about 2004 and it never was my thing > > Also the manual is a great reference but not a great tutorial and I'm > not a great reader, probably. > > Something that is concerning me is that in the example a "rows" variable > and a "columns" variable get declared as > > unsigned int rows; > unsigned short columns; > > and then they get passed as arguments to freexl_worksheet_dimensions as > > &rows, &columns > > like this > > ret = freexl_worksheet_dimensions (handle, &rows, &columns); > > In scheme I am NOT declaring anything because I don't now how to > Maybe you make a bytevector the size of <type> and then you use bytevector->pointer ? Ah ! ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 19:55 ` unsigned-int Catonano @ 2017-06-22 20:01 ` Catonano 2017-06-22 20:53 ` unsigned-int Catonano 0 siblings, 1 reply; 11+ messages in thread From: Catonano @ 2017-06-22 20:01 UTC (permalink / raw) To: Mark H Weaver; +Cc: guile-user 2017-06-22 21:55 GMT+02:00 Catonano <catonano@gmail.com>: > 2017-06-22 21:33 GMT+02:00 Catonano <catonano@gmail.com>: > >> 2017-06-22 21:13 GMT+02:00 Catonano <catonano@gmail.com>: >> > >> > >> > I apologize if my questions are naive. >> > I wrote my last scrap of C code in about 2004 and it never was my thing >> > Also the manual is a great reference but not a great tutorial and I'm >> not a great reader, probably. >> >> Something that is concerning me is that in the example a "rows" variable >> and a "columns" variable get declared as >> >> unsigned int rows; >> unsigned short columns; >> >> and then they get passed as arguments to freexl_worksheet_dimensions as >> >> &rows, &columns >> >> like this >> >> ret = freexl_worksheet_dimensions (handle, &rows, &columns); >> >> In scheme I am NOT declaring anything because I don't now how to >> > > Maybe you make a bytevector the size of <type> > > and then you use bytevector->pointer ? > > Ah ! > No :-/ I tried. The number of rows keeps being completely off ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 20:01 ` unsigned-int Catonano @ 2017-06-22 20:53 ` Catonano 0 siblings, 0 replies; 11+ messages in thread From: Catonano @ 2017-06-22 20:53 UTC (permalink / raw) To: Mark H Weaver; +Cc: guile-user For now I renounced to extract numbers from my bytevectors The culprit is: #vu8(232 3 0 0) There are 27 lines in the sheet, so this bytevector should represent 27, somehow. The good bytevector is: #vu8(5 0) In fact, the sheet has 5 columns On another sheet in the same file, this is what happens: (#vu8(118 0 0 0) #vu8(17 0)) The sheet has 17 columns indeed. And it has 23 rows :-/ This is where I'm at, right now I even made a commit out of this https://gitlab.com/humanitiesNerd/guile-freexl/commit/bddc8bb33c5dc5fbe5acf4b954dfb7d42453f956 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 19:33 ` unsigned-int Catonano 2017-06-22 19:55 ` unsigned-int Catonano @ 2017-06-23 12:37 ` Mark H Weaver 1 sibling, 0 replies; 11+ messages in thread From: Mark H Weaver @ 2017-06-23 12:37 UTC (permalink / raw) To: Catonano; +Cc: guile-user Catonano <catonano@gmail.com> writes: > 2017-06-22 21:13 GMT+02:00 Catonano <catonano@gmail.com>: >> >> >> I apologize if my questions are naive. >> I wrote my last scrap of C code in about 2004 and it never was my thing >> Also the manual is a great reference but not a great tutorial and I'm not > a great reader, probably. > > Something that is concerning me is that in the example a "rows" variable > and a "columns" variable get declared as > > unsigned int rows; > unsigned short columns; > > and then they get passed as arguments to freexl_worksheet_dimensions as > > &rows, &columns > > like this > > ret = freexl_worksheet_dimensions (handle, &rows, &columns); > > In scheme I am NOT declaring anything because I don't now how to > I am just passing void pointers to freexl_worksheet_dimensions No, you need to allocate the memory where 'rows' and 'columns' will be stored, and pass pointers to that memory. freexl_worksheet_dimensions will then store the values in those locations. I looked at your code, and I see you've updated the code since you posted these messages, but it's still not right: > (define freexl-worksheet-dimensions > (let* ((ptr (freexl-func "freexl_worksheet_dimensions")) > (proc (pointer->procedure int ptr (list '* '* '*)))) > (lambda (handle-ptr) > (let* ((rows-ptr (bytevector->pointer (make-bytevector (sizeof '*)))) > (columns-ptr (bytevector->pointer (make-bytevector (sizeof '*)))) In the two lines above, instead of (sizeof '*), it should be (sizeof unsigned-int) for the rows bytevector, and (sizeof unsigned-short) for the columns bytevector. > (result (proc (unwrap-handler handle-ptr) rows-ptr columns-ptr))) > (if (not (= result 0)) > (throw 'get-worksheet-dimensions-error 'error-code result) > ;;(list (dereference-pointer rows-ptr) (dereference-pointer columns-ptr)) > (list > (pointer->bytevector > rows-ptr (sizeof unsigned-int)) > > > > (pointer->bytevector > columns-ptr (sizeof unsigned-short)) > )) This returns a list of two bytevectors. Wouldn't it be better to return the actual values? Also, instead of using 'pointer->bytevector' here, it would be better to have saved the bytevectors that you created in the first place. Maybe something like this (untested): (define freexl-worksheet-dimensions (let* ((ptr (freexl-func "freexl_worksheet_dimensions")) (proc (pointer->procedure int ptr (list '* '* '*)))) (lambda (handle-ptr) (let* ((rows-bv (make-bytevector (sizeof unsigned-int))) (columns-bv (make-bytevector (sizeof unsigned-short))) (result (proc (unwrap-handler handle-ptr) (bytevector->pointer rows-bv) (bytevector->pointer columns-bv)))) (unless (zero? result) (throw 'get-worksheet-dimensions-error 'error-code result)) (list (bytevector-uint-ref rows-bv 0 (native-endianness) (sizeof unsigned-int)) (bytevector-uint-ref columns-bv 0 (native-endianness) (sizeof unsigned-short))))))) Mark ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-22 19:13 ` unsigned-int Catonano 2017-06-22 19:33 ` unsigned-int Catonano @ 2017-06-23 12:16 ` Mark H Weaver 2017-06-24 9:17 ` unsigned-int Catonano 1 sibling, 1 reply; 11+ messages in thread From: Mark H Weaver @ 2017-06-23 12:16 UTC (permalink / raw) To: Catonano; +Cc: guile-user Catonano <catonano@gmail.com> writes: > 2017-06-22 18:20 GMT+02:00 Mark H Weaver <mhw@netris.org>: > >> Given this, and >> the fact that you're passing the wrong width, makes me surprised that >> this is working for you at all. > > > Mark, thank you so much for your review. I appreciate that > > I apologize if my questions are naive. No, not at all. I appreciate your work on guile-freexl. My surprise that it was working at all was not a judgement of you, rather it was a sincere confusion, but now I understand. The combination of two mistakes: (endianness big) and width 1, actually had the effect of making this work for numbers small enough to fit in 1 byte, which means unsigned numbers between 0 and 255 and signed numbers between -128 and 127. > So, yeah, I'm sorry for the fuss No need to apologize. > All that said, I applied the fixes that you suggested and I still get > completely wrong number of rows of the spreadsheets and correct number of > columns > > Exactly as before your correctons Except that now it will work for larger numbers, and on architectures that are truly big endian, whereas before it wouldn't have. > For now I renounced to extract numbers from my bytevectors > > The culprit is: #vu8(232 3 0 0) > > There are 27 lines in the sheet, so this bytevector should represent 27, > somehow. On a little-endian architecture (which includes Intel and most other popular architectures), #vu8(232 3 0 0) represents 1000. If that's the number you're getting, then that part of the code is working correctly. > On another sheet in the same file, this is what happens: > > (#vu8(118 0 0 0) #vu8(17 0)) > > The sheet has 17 columns indeed. And it has 23 rows :-/ #vu8(118 0 0 0) represents 118. I'm not sure why it's a different number than you're expecting, but I can tell you that's the number in that bytevector. Mark ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: unsigned-int 2017-06-23 12:16 ` unsigned-int Mark H Weaver @ 2017-06-24 9:17 ` Catonano 0 siblings, 0 replies; 11+ messages in thread From: Catonano @ 2017-06-24 9:17 UTC (permalink / raw) To: Mark H Weaver; +Cc: guile-user 2017-06-23 14:16 GMT+02:00 Mark H Weaver <mhw@netris.org>: > > No need to apologize. > Cool, tanks :-) > > #vu8(118 0 0 0) represents 118. > > I'm not sure why it's a different number than you're expecting, but I > can tell you that's the number in that bytevector. > I was expecting a different numbr of rows because I opened the spreadsheet with Librreoffice and counted the rows with my eyes In my opinion, tey are not 118. They are way less BUT I tried to run an example C program that comes with Freexl that extracts the same information On most sheets I agree with what tis test program reports Only on 1 of them I disagree The good news is that the numbers that are coming out form my scheme functions are the same numbers that are coming out from the test C program They output the same numbers As for why I disagree on the number of rows on one sheet I don't understand why 118 rows come up. Maybe there are some cells filled with spaces So there's no glitch in my scheme wrap. Not anymore This is all I needed to know Than you Mark. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-06-24 9:17 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-06-22 9:42 unsigned-int Catonano 2017-06-22 9:56 ` unsigned-int Catonano 2017-06-22 16:20 ` unsigned-int Mark H Weaver 2017-06-22 19:13 ` unsigned-int Catonano 2017-06-22 19:33 ` unsigned-int Catonano 2017-06-22 19:55 ` unsigned-int Catonano 2017-06-22 20:01 ` unsigned-int Catonano 2017-06-22 20:53 ` unsigned-int Catonano 2017-06-23 12:37 ` unsigned-int Mark H Weaver 2017-06-23 12:16 ` unsigned-int Mark H Weaver 2017-06-24 9:17 ` unsigned-int Catonano
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).