Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
-
Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
-
Kontaktdaten:
Beitrag
von Xin » Mi Sep 17, 2008 12:57 pm
Dirty Oerti hat geschrieben:Die Übergabe per ANZ ist zwar nicht unbedingt die schönste/normalste/etc...
Deswegen möchte sie eigentlich vermeiden.
Arrays sollten (nahezu) grundsätzlich nicht als ValueType übergeben werden.
Dirty Oerti hat geschrieben:Wobei die Frage ist, ob man nicht ein gewisses Grundwissen in einem Artikel über Bubblesort verlangen kann...
Darf man. Der Artikel steht im hinteren Bereich des Tutorials.
Allerdings sollte man sich über die Kosten von Übergabeparametern vielleicht mal deutlicher auslassen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Beitrag
von Dirty Oerti » Mi Sep 17, 2008 1:00 pm
Xin hat geschrieben:Dirty Oerti hat geschrieben:Die Übergabe per ANZ ist zwar nicht unbedingt die schönste/normalste/etc...
Deswegen möchte sie eigentlich vermeiden.
Arrays sollten (nahezu) grundsätzlich nicht als ValueType übergeben werden.
Ja, ich weiß. Nur für einen Anfänger wäre Übergabe per ANZ evtl verständlicher.
Xin hat geschrieben:
Dirty Oerti hat geschrieben:Wobei die Frage ist, ob man nicht ein gewisses Grundwissen in einem Artikel über Bubblesort verlangen kann...
Darf man. Der Artikel steht im hinteren Bereich des Tutorials.
Allerdings sollte man sich über die Kosten von Übergabeparametern vielleicht mal deutlicher auslassen.
Ok, vllcht sollten wir an den Anfang der "Fortgeschrittenen" Kapitel einen Hinweis setzen, dass bestimmte Grundkenntnisse erforderlich sind.
Über die Kosten von Übergabeparametern sollte wirklich mal was geschrieben werden.
Bei
Fragen einfach an
daniel[ät]proggen[Punkt]org
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
-
fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
-
Kontaktdaten:
Beitrag
von fat-lobyte » Mi Sep 17, 2008 1:18 pm
Xin hat geschrieben:Arrays sollten (nahezu) grundsätzlich nicht als ValueType übergeben werden.

Wird das etwa by Value übergeben??? Also das ganze array auf den Stack kopiert, und wenns eine nicht const variable ist dann nochmal in die lokale Variable???
Erscheint mir schon seltsam. Ich dachte, arr[ANZ] sei nur eine Empfehlung, ein "Alias" für *arr.
Haters gonna hate, potatoes gonna potate.
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mi Sep 17, 2008 1:22 pm
Der Feldname ohne die Indexklammern ist auch nur die Adresse des 1. Feldelementes. Wenn man es dann mit
übergibt, wird ja die Adresse übergeben. Also nicht viel anderes als ein Pointer.
-
Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Beitrag
von Dirty Oerti » Mi Sep 17, 2008 1:28 pm
fat-lobyte hat geschrieben:Xin hat geschrieben:Arrays sollten (nahezu) grundsätzlich nicht als ValueType übergeben werden.

Wird das etwa by Value übergeben??? Also das ganze array auf den Stack kopiert, und wenns eine nicht const variable ist dann nochmal in die lokale Variable???
Erscheint mir schon seltsam. Ich dachte, arr[ANZ] sei nur eine Empfehlung, ein "Alias" für *arr.
Meines Wissens nach übergibt
per Value...
Bei
Fragen einfach an
daniel[ät]proggen[Punkt]org
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
-
fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
-
Kontaktdaten:
Beitrag
von fat-lobyte » Mi Sep 17, 2008 1:32 pm
Dirty Oerti hat geschrieben:Meines Wissens nach übergibt
per Value...
Ja klar. Da übergibst du ja auch nur ein Element des Arrays. Nicht das ganze Array.
Ich hab das grade nachgerprüft. Da wird trotzdem nur der Zeiger übergeben. Wer mir nicht glaubt, hier ist der Code:
Code: Alles auswählen
const unsigned ANZ = 5;
void foo(int arr[ANZ])
{
unsigned i;
for (i =0; i < ANZ; i++)
;
}
int main()
{
int arr[ANZ];
foo(arr);
return 0;
}
und hier der Disassembly
Code: Alles auswählen
(gdb) disassemble main
Dump of assembler code for function main:
0x08048410 <main+0>: lea ecx,[esp+4]
0x08048414 <main+4>: and esp,0xfffffff0
0x08048417 <main+7>: push DWORD PTR [ecx-4]
0x0804841a <main+10>: push ebp
0x0804841b <main+11>: mov ebp,esp
0x0804841d <main+13>: push ecx
0x0804841e <main+14>: sub esp,0x24
0x08048421 <main+17>: lea eax,[ebp-24]
0x08048424 <main+20>: mov DWORD PTR [esp],eax
0x08048427 <main+23>: call 0x80483f4 <_Z3fooPi>
0x0804842c <main+28>: mov eax,0x0
0x08048431 <main+33>: add esp,0x24
0x08048434 <main+36>: pop ecx
0x08048435 <main+37>: pop ebp
0x08048436 <main+38>: lea esp,[ecx-4]
0x08048439 <main+41>: ret
0x0804843a <main+42>: nop
0x0804843b <main+43>: nop
0x0804843c <main+44>: nop
0x0804843d <main+45>: nop
0x0804843e <main+46>: nop
0x0804843f <main+47>: nop
End of assembler dump.
(gdb) disassemble foo
Dump of assembler code for function _Z3fooPi:
0x080483f4 <_Z3fooPi+0>: push ebp
0x080483f5 <_Z3fooPi+1>: mov ebp,esp
0x080483f7 <_Z3fooPi+3>: sub esp,0x10
0x080483fa <_Z3fooPi+6>: mov DWORD PTR [ebp-4],0x0
0x08048401 <_Z3fooPi+13>: jmp 0x8048407 <_Z3fooPi+19>
0x08048403 <_Z3fooPi+15>: add DWORD PTR [ebp-4],0x1
0x08048407 <_Z3fooPi+19>: cmp DWORD PTR [ebp-4],0x4
0x0804840b <_Z3fooPi+23>: jbe 0x8048403 <_Z3fooPi+15>
0x0804840d <_Z3fooPi+25>: leave
0x0804840e <_Z3fooPi+26>: ret
0x0804840f <_Z3fooPi+27>: nop
End of assembler dump.
Haters gonna hate, potatoes gonna potate.
-
Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Beitrag
von Dirty Oerti » Mi Sep 17, 2008 1:40 pm
fat-lobyte hat geschrieben:Dirty Oerti hat geschrieben:Meines Wissens nach übergibt
per Value...
Ja klar. Da übergibst du ja auch nur ein Element des Arrays. Nicht das ganze Array.
Ich hab das grade nachgerprüft. Da wird trotzdem nur der Zeiger übergeben. Wer mir nicht glaubt, hier ist der Code:
Hupps. Tschuldigung.
Hab da was verwechselt^^
Bei
Fragen einfach an
daniel[ät]proggen[Punkt]org
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
-
Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
-
Kontaktdaten:
Beitrag
von Xin » Mi Sep 17, 2008 7:51 pm
fat-lobyte hat geschrieben:Ich hab das grade nachgerprüft. Da wird trotzdem nur der Zeiger übergeben. Wer mir nicht glaubt, hier ist der Code:
Code: Alles auswählen
const unsigned ANZ = 5;
void foo(int arr[ANZ])
{
unsigned i;
for (i =0; i < ANZ; i++)
;
}
int main()
{
int arr[ANZ];
foo(arr);
return 0;
}
arr ist ein Zeiger auf arr[0]. Dementsprechend passt das, C/C++ ist hier widersprüchlich. Die Signatur der Funktion verlangt eigentlich eine Anzahl von ANZ ints.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mi Sep 17, 2008 8:18 pm
Ok... und wie solls im Tutorial stehn?
-
Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Beitrag
von Dirty Oerti » Mi Sep 17, 2008 8:22 pm
dani93 hat geschrieben:Ok... und wie solls im Tutorial stehn?
Das ist die alles entscheidende Frage.
Ich würde es als Zeiger ins Tutorial schreiben.
Bei
Fragen einfach an
daniel[ät]proggen[Punkt]org
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.