digitalmars.D.learn - Unexpected result with -betterC
- DLearner (28/28) Nov 03 The two fragments below compiled and ran as expected using dmd
- monkyyy (10/38) Nov 03 Id expect this to fail, but nothing I see in yours
- DLearner (8/17) Nov 03 Surely the line:
- Paul Backus (10/14) Nov 03 The docs are wrong. Dynamic arrays themselves are allowed; you're
The two fragments below compiled and ran as expected using dmd -betterC under Windows. ``` string Scrn = "OPO NAM='DspVar1' POS='1,1' VAR=('IntVar1','I');E"; printf("\nWR_Createtest entered.\n"); OpStructFstPtr = WR_CreateFormatFile(Scrn); ``` ``` OpStruct* WR_CreateFormatFile(string parm_Format) { import core.stdc.stdio: printf; import core.stdc.stdlib: malloc; OpStruct* FstOpStructPtr; if (parm_Format[0..3] == "OPO"[0..3]) { printf("OPO Found.\n"); } else { printf("OPO NOT Found.\n"); } if (parm_Format[$-1..$] == "E"[0..1]) { printf("E Found.\n"); } else { printf("E NOT Found.\n"); } ``` However, the docs say dynamic arrays are not allowed with betterC, and 'string' implies a dynamic array. So I expected DMD to complain that my code was invalid. Any ideas?
Nov 03
On Sunday, 3 November 2024 at 19:00:33 UTC, DLearner wrote:The two fragments below compiled and ran as expected using dmd -betterC under Windows. ``` string Scrn = "OPO NAM='DspVar1' POS='1,1' VAR=('IntVar1','I');E"; printf("\nWR_Createtest entered.\n"); OpStructFstPtr = WR_CreateFormatFile(Scrn); ``` ``` OpStruct* WR_CreateFormatFile(string parm_Format) { import core.stdc.stdio: printf; import core.stdc.stdlib: malloc; OpStruct* FstOpStructPtr; if (parm_Format[0..3] == "OPO"[0..3]) { printf("OPO Found.\n"); } else { printf("OPO NOT Found.\n"); } if (parm_Format[$-1..$] == "E"[0..1]) { printf("E Found.\n"); } else { printf("E NOT Found.\n"); } ``` However, the docs say dynamic arrays are not allowed with betterC, and 'string' implies a dynamic array. So I expected DMD to complain that my code was invalid. Any ideas?Id expect this to fail, but nothing I see in yours ```d string foo="foo"; foo~="bar"; ``` []'s are both slices and dynamic arrays depending on use, theres a debate about that decision(im of the opinion a `[?]` should be a dynamic array and clean up the api), but the current situation will only break on appends
Nov 03
On Sunday, 3 November 2024 at 19:47:31 UTC, monkyyy wrote: [...]Id expect this to fail, but nothing I see in yours ```d string foo="foo"; foo~="bar"; ``` []'s are both slices and dynamic arrays depending on use, theres a debate about that decision(im of the opinion a `[?]` should be a dynamic array and clean up the api), but the current situation will only break on appendsSurely the line: ``` string Scrn = "OPO NAM='DspVar1' POS='1,1' VAR=('IntVar1','I');E"; ``` creates, by the definition of 'string', a dynamic array?
Nov 03
On Sunday, 3 November 2024 at 20:04:19 UTC, DLearner wrote:On Sunday, 3 November 2024 at 19:47:31 UTC, monkyyy wrote: [...]By default, a string literal is typed as a dynamic array, but the element count is known at compile time. So all string literals can be implicitly converted to an immutable static array. [spec](https://dlang.org/spec/expression.html#string_literals)Id expect this to fail, but nothing I see in yours ```d string foo="foo"; foo~="bar"; ``` []'s are both slices and dynamic arrays depending on use, theres a debate about that decision(im of the opinion a `[?]` should be a dynamic array and clean up the api), but the current situation will only break on appendsSurely the line: ``` string Scrn = "OPO NAM='DspVar1' POS='1,1' VAR=('IntVar1','I');E"; ``` creates, by the definition of 'string', a dynamic array?
Nov 03
On Sunday, 3 November 2024 at 20:04:19 UTC, DLearner wrote:Surely the line: ``` string Scrn = "OPO NAM='DspVar1' POS='1,1' VAR=('IntVar1','I');E"; ``` creates, by the definition of 'string', a dynamic array?I believe thats stored in the binary
Nov 03
On Sunday, 3 November 2024 at 19:00:33 UTC, DLearner wrote:However, the docs say dynamic arrays are not allowed with betterC, and 'string' implies a dynamic array. So I expected DMD to complain that my code was invalid. Any ideas?The docs are wrong. Dynamic arrays themselves are allowed; you're just not allowed to perform any *operations* on them that would cause memory allocation. This includes, for example, - concatenating two dynamic arrays with the `~` operator. - appending to a dynamic array with the `~=` operator. - extending a dynamic array by assigning to its `.length` property. - copying a dynamic array using the built-in `.dup` method.
Nov 03