D - struct sort
- Brian Hammond (15/15) Apr 21 2004 From http://www.prowiki.org/wiki4d/wiki.cgi?HelmutLeitner/StructSort
- Brian Hammond (68/83) Apr 21 2004 Can anyone try compiling this?
-
Carlos Santander B.
(93/93)
Apr 24 2004
"Brian Hammond"
wrote in message - Brian Hammond (1/94) Apr 24 2004
- Brian Hammond (3/96) Apr 24 2004 [Sorry about empty message]
-
Carlos Santander B.
(10/10)
Apr 25 2004
"Brian Hammond"
wrote in message
From http://www.prowiki.org/wiki4d/wiki.cgi?HelmutLeitner/StructSort Attempting to compile the example with the latest compiler version fails. $ dmd|head -1 Digital Mars D Compiler v0.82 $ dmd ssort.d gcc ssort.o -o ssort -lphobos -lpthread -lm ssort.o(.gnu.linkonce.t_Dmain+0x1f): In function `_Dmain': : undefined reference to `_init_19TypeInfo_S5ssort2As' collect2: ld returned 1 exit status --- errorlevel 256 This is on Linux: $ uname -a GNU/Linux Thanks
Apr 21 2004
Can anyone try compiling this? /* ** ssort.d (C) Helmut Leitner 2003 ** struct sort example */ struct As // a struct { int x; char [] name; int cmp(As *p2) { int a = x; int b = p2.x; printf("compare %d %d\n",a,b); return a < b ? -1 : a > b ? 1 : 0; } } class TypeInfo_S8ssort_As : TypeInfo { int tsize() { return As.size; } int compare_name(void *p1, void *p2) { char [] a = ((As *) p1).name; char [] b = ((As *) p2).name; // printf("compare %d %d\n",a,b); return a < b ? -1 : a > b ? 1 : 0; } int compare_x(void *p1, void *p2) { int a = ((As *) p1).x; int b = ((As *) p2).x; // printf("compare %d %d\n",a,b); return a < b ? -1 : a > b ? 1 : 0; } int compare(void *p1, void *p2) { return compare_name(p1,p2); } } void AsPrint(As a) { printf("x=%d name=%.*s\n",a.x,a.name); } As sasar[3]= [ // static As array { 2, "Gamma" }, { 1, "Beta" }, { 3, "Alpha" } ]; void AsArrayPrintTitle(As [] array, char [] title) { if(title.length) { printf("%.*s",title); } for(int i=0; i<array.length; i++) { AsPrint(array[i]); } } int main() { AsArrayPrintTitle(sasar,"\nbefore sorting:\n"); sasar.sort; AsArrayPrintTitle(sasar,"\nafter sorting:\n"); return (0); } In article <c669k9$1est$1 digitaldaemon.com>, Brian Hammond says...From http://www.prowiki.org/wiki4d/wiki.cgi?HelmutLeitner/StructSort Attempting to compile the example with the latest compiler version fails. $ dmd|head -1 Digital Mars D Compiler v0.82 $ dmd ssort.d gcc ssort.o -o ssort -lphobos -lpthread -lm ssort.o(.gnu.linkonce.t_Dmain+0x1f): In function `_Dmain': : undefined reference to `_init_19TypeInfo_S5ssort2As' collect2: ld returned 1 exit status --- errorlevel 256 This is on Linux: $ uname -a GNU/Linux Thanks
Apr 21 2004
"Brian Hammond" <d brianhammond.com> wrote in message news:c66o06$2amo$1 digitaldaemon.com | Can anyone try compiling this? | | /* | ** ssort.d (C) Helmut Leitner 2003 | ** struct sort example | */ | | struct As // a struct | { | int x; | char [] name; | | int cmp(As *p2) | { | int a = x; | int b = p2.x; | printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | } | | class TypeInfo_S8ssort_As : TypeInfo | { | int tsize() | { | return As.size; | } | | int compare_name(void *p1, void *p2) | { | char [] a = ((As *) p1).name; | char [] b = ((As *) p2).name; | // printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | | int compare_x(void *p1, void *p2) | { | int a = ((As *) p1).x; | int b = ((As *) p2).x; | // printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | | int compare(void *p1, void *p2) | { | return compare_name(p1,p2); | } | } | | void AsPrint(As a) { | printf("x=%d name=%.*s\n",a.x,a.name); | } | | As sasar[3]= [ // static As array | { 2, "Gamma" }, | { 1, "Beta" }, | { 3, "Alpha" } | ]; | | void AsArrayPrintTitle(As [] array, char [] title) | { | if(title.length) { | printf("%.*s",title); | } | for(int i=0; i<array.length; i++) | { | AsPrint(array[i]); | } | } | | int main() | { | AsArrayPrintTitle(sasar,"\nbefore sorting:\n"); | sasar.sort; | AsArrayPrintTitle(sasar,"\nafter sorting:\n"); | | return (0); | } | I didn't try this on Linux, but I think name mangling works the same in both compilers. The key is this line: class TypeInfo_S8ssort_As : TypeInfo Instead of what follows to the "S" (8ssort_As) you have to write: the length of your module's name, your module's name, the length of the struct name, and the struct name. So, if this file is in module foo, that line would be replaced by: class TypeInfo_S3foo2As : TypeInfo ----------------------- Carlos Santander Bernal
Apr 24 2004
In article <c6eo0s$297r$1 digitaldaemon.com>, Carlos Santander B. says..."Brian Hammond" <d brianhammond.com> wrote in message news:c66o06$2amo$1 digitaldaemon.com | Can anyone try compiling this? | | /* | ** ssort.d (C) Helmut Leitner 2003 | ** struct sort example | */ | | struct As // a struct | { | int x; | char [] name; | | int cmp(As *p2) | { | int a = x; | int b = p2.x; | printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | } | | class TypeInfo_S8ssort_As : TypeInfo | { | int tsize() | { | return As.size; | } | | int compare_name(void *p1, void *p2) | { | char [] a = ((As *) p1).name; | char [] b = ((As *) p2).name; | // printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | | int compare_x(void *p1, void *p2) | { | int a = ((As *) p1).x; | int b = ((As *) p2).x; | // printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | | int compare(void *p1, void *p2) | { | return compare_name(p1,p2); | } | } | | void AsPrint(As a) { | printf("x=%d name=%.*s\n",a.x,a.name); | } | | As sasar[3]= [ // static As array | { 2, "Gamma" }, | { 1, "Beta" }, | { 3, "Alpha" } | ]; | | void AsArrayPrintTitle(As [] array, char [] title) | { | if(title.length) { | printf("%.*s",title); | } | for(int i=0; i<array.length; i++) | { | AsPrint(array[i]); | } | } | | int main() | { | AsArrayPrintTitle(sasar,"\nbefore sorting:\n"); | sasar.sort; | AsArrayPrintTitle(sasar,"\nafter sorting:\n"); | | return (0); | } | I didn't try this on Linux, but I think name mangling works the same in both compilers. The key is this line: class TypeInfo_S8ssort_As : TypeInfo Instead of what follows to the "S" (8ssort_As) you have to write: the length of your module's name, your module's name, the length of the struct name, and the struct name. So, if this file is in module foo, that line would be replaced by: class TypeInfo_S3foo2As : TypeInfo ----------------------- Carlos Santander Bernal
Apr 24 2004
[Sorry about empty message] Thanks that worked... From where did you learn about the name mangling? In article <c6eo0s$297r$1 digitaldaemon.com>, Carlos Santander B. says..."Brian Hammond" <d brianhammond.com> wrote in message news:c66o06$2amo$1 digitaldaemon.com | Can anyone try compiling this? | | /* | ** ssort.d (C) Helmut Leitner 2003 | ** struct sort example | */ | | struct As // a struct | { | int x; | char [] name; | | int cmp(As *p2) | { | int a = x; | int b = p2.x; | printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | } | | class TypeInfo_S8ssort_As : TypeInfo | { | int tsize() | { | return As.size; | } | | int compare_name(void *p1, void *p2) | { | char [] a = ((As *) p1).name; | char [] b = ((As *) p2).name; | // printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | | int compare_x(void *p1, void *p2) | { | int a = ((As *) p1).x; | int b = ((As *) p2).x; | // printf("compare %d %d\n",a,b); | return a < b ? -1 : a > b ? 1 : 0; | } | | int compare(void *p1, void *p2) | { | return compare_name(p1,p2); | } | } | | void AsPrint(As a) { | printf("x=%d name=%.*s\n",a.x,a.name); | } | | As sasar[3]= [ // static As array | { 2, "Gamma" }, | { 1, "Beta" }, | { 3, "Alpha" } | ]; | | void AsArrayPrintTitle(As [] array, char [] title) | { | if(title.length) { | printf("%.*s",title); | } | for(int i=0; i<array.length; i++) | { | AsPrint(array[i]); | } | } | | int main() | { | AsArrayPrintTitle(sasar,"\nbefore sorting:\n"); | sasar.sort; | AsArrayPrintTitle(sasar,"\nafter sorting:\n"); | | return (0); | } | I didn't try this on Linux, but I think name mangling works the same in both compilers. The key is this line: class TypeInfo_S8ssort_As : TypeInfo Instead of what follows to the "S" (8ssort_As) you have to write: the length of your module's name, your module's name, the length of the struct name, and the struct name. So, if this file is in module foo, that line would be replaced by: class TypeInfo_S3foo2As : TypeInfo ----------------------- Carlos Santander Bernal
Apr 24 2004
"Brian Hammond" <d brianhammond.com> wrote in message news:c6fihm$f3n$1 digitaldaemon.com | [Sorry about empty message] | | Thanks that worked... From where did you learn about the name mangling? | I wish I remembered. I guess from looking assembly output... Or maybe someone said once how it worked... I can't really remember. ----------------------- Carlos Santander Bernal
Apr 25 2004