Hallo, On Sun, 22 Jun 2003 at 17:31 (+0200), Arndt Stedler wrote:
Aber erklär mir doch mal, wie ein solcher struct zurückgebgeben wird. Denn a) er passt ggf. nicht (bei einem 80X86 Prozessor) in die Register b) Wenn man in Assembler den Stack erst nachher aufräumt, kann der Aufrufer natürlich daher seinen Rückgabewert bekommen. Wobei mir aber noch nicht klar ist, wie dass dann gehen soll. Kannst du mal einen Assembler-output davon erzeugen? (Assembler Egal) Würde mich mal interessieren.
Ich weiss es nicht. Mit Assembler kenne ich mich ueberhaupt nicht aus. ---------------------------------------------------- .file "test.c" .version "01.01" gcc2_compiled.: .text .align 4 .globl demo .type demo,@function demo: pushl %ebp movl %esp,%ebp subl $24,%esp movl 8(%ebp),%eax movl $1,-12(%ebp) movl $2,-8(%ebp) movl $3,-4(%ebp) movl -12(%ebp),%edx movl %edx,(%eax) movl -8(%ebp),%edx movl %edx,4(%eax) movl -4(%ebp),%edx movl %edx,8(%eax) jmp .L2 .L2: movl %eax,%eax leave ret $4 .Lfe1: .size demo,.Lfe1-demo .section .rodata .LC0: .string "Std: %d\nMin: %d\nSek: %d\n" .text .align 4 .globl main .type main,@function main: pushl %ebp movl %esp,%ebp subl $24,%esp leal -12(%ebp),%eax addl $-12,%esp pushl %eax call demo addl $12,%esp movl -4(%ebp),%eax pushl %eax movl -8(%ebp),%eax pushl %eax movl -12(%ebp),%eax pushl %eax pushl $.LC0 call printf addl $16,%esp xorl %eax,%eax jmp .L3 .p2align 4,,7 .L3: leave ret .Lfe2: .size main,.Lfe2-main .ident "GCC: (GNU) 2.95.4 20011002 (Debian prerelease)" ---------------------------------------------------- Wenn Du das dann noch fuer Assembler-unkundige wie mich interpretieren koenntest waere ich Dir sehr dankbar.
Es sei denn, du hast das unten genannte Beispiel durch einen C++ Compiler gescheucht, dann verstehe ich das ganze, denn die neuen C++ Compiler behandeln struct und class identisch und somit hast du keinen struct im eigentlichen sinne sondern eine class und damit übergibt der Compiler (mal wieder) eine Referenz. Oder liege ich da falsch? (Ich muss mir das mal anschauen, wenn ich zeit habe)
Nein, es ist kein C++ Compiler. Es ist gcc. Und ich habe auch mal gelesen, dass modernes C (C99, nicht C++) sowas kann. Nur wie das in C++ funktioniert kapiere ich jetzt auch nicht, was heisst "uebergibt eine Referenz". Ein Zeiger im eigentlichen Sinne kann's ja nicht sein, sonst muesste man das Rueckgabeobjekt ja mit delete wieder freigeben. Stattdessen wird ja das Objekt auf dem Stack abgelegt und der Copy-Konstruktor aufgerufen.
Zu Java: Erwischt, bin halt ein Java-Hasser ;-) Nein, habe mich nur Rudimentär mit Java auseinander gesetzt. Aber alles als statisch zu deklarieren ist vielleicht auch nicht das Grüne vom Ei... ;-)
Habe ich auch nicht behauptet. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Applaus: Rauschmittel, unter dessen Einwirkung Politiker sich zu den seltsamsten Erklärungen verleiten lassen. -- Ron Kritzfeld