5 ms·
You can very easily make a struct consisting of a pointer and length, is adding such a thing to the standard really a big deal? Personally, I don't see a proble
by dooglius 7y ago
You can very easily make a struct consisting of a pointer and length, is adding such a thing to the standard really a big deal? Personally, I don't see a problem with passing two arguments.
- Someone1234 7y ago- In your example there's no guarantee that the length will be accurate, or that the data hasn't been modified independently elsewhere in the program. - In other words you've created a fantastic shoe-gun. One update line missed (either length or data, or data re-used outside the struct) and your "simple" struct is a huge headache, including potential security vulnerabilities. - Re-implementing a common error prone thing is exactly what language improvements should target.
- rwmj 7y agoI mean, this is C so "fantastic shoe-gun" is part of the territory. But in C you can wrap this vector struct in an abstract data type to try to prevent callers from breaking invariants.
- dooglius 7y ago>In your example there's no guarantee that the length will be accurate, or that the data hasn't been modified independently elsewhere in the program. And having a special data-and-length type would make these guarantees... how? You're ultimately going to need to be able to create these objects from bare data and length somehow, so it's a case of garbage-in-garbage-out.
- gbear605 7y agoDeclaring it with a custom struct: int raw_arr[4] = {0,0,0,0}; struct SmartArray arr; arr.length = 4; arr.val = raw_arr; some_function(arr); Smart declaration with custom type: (assume that they'll come up with a good syntax) smart_int_arr arr[4] = {0,0,0,0}; some_function(arr); With the custom struct, it requires the number `4` to be typed twice manually, while in the second it only needs a single input.
- fkeeal 7y agoYou actually never need to specify the size explicitly in C. Here are some other ways to declare your struct without needing as much boiler plate per declaration. #define MAKE_SMARTARRAY(_smartarr, _array) \ do {\ _smartarr.val = (_array);\ _smartarr.len = sizeof((_array))/sizeof((_array[0]));\ }while(0) struct SmartArray { int *val; int len; }; int main() { int array[] = {0,0,0,0}; struct SmartArray arr = {.val = array, .len = sizeof(array)/sizeof(array[0])}; struct SmartArray arr2; struct SmartArray arr3; MAKE_SMARTARRAY(arr2, ((int[]){5,6,7,8})); MAKE_SMARTARRAY(arr3, array); return 0; }
- flatfinger 7y agoHow about having an attribute which, if applied to a structure that contains a `T*` and an integer type, would allow a `T[]` to be implicitly converted to that structure type?
- FpUser 7y agoIn Delphi/FreePascal there are dynamic arrays (strings included) that are in fact fat pointers that hide inside more info than just length. All opaque types and work just fine with automatic lifecycle control and COW and whatnot.