Hossa
#include "stdio.h"
#include "conio.h"
> main()
{
int iarr[10]={2,3,8,1,43,13,22,32,11,7};
float farr[10]={...};
char sarr[10][20]={"Zeus\0","Hera\0","Athena\0","Artemis\0"....};
int i;
int iswap(),fswap(),sswap();
clrscr();
for(i=0;i
> 1) Die Zeile _int iswap(),fswap(),sswap()_ war mit
> "Declaration der Funktionspointer" kommentiert. Diese müssen
> aber doch nach dem Schema _\*iswap()..._ deklariert
> werden. Oder?
Was da im Quelltext steht sind Funktions-Prototypen, also Deklarationen von Funktionen, die anderswo definiert werden. Mit Zeigern auf Funktionen hat das nichts zu tun. Ich vermute mal, dass weiter unten im Quelltext die swap-Funktionen definiert sind. Durch die Prototypen werden die Funktionen dem Compiler schon vor ihrer Definition bekannt gemacht, so dass sie innerhalb der main-Funktion verwendet werden können.
> 2) Der Aufruf _sort(iarr,iswap)_ . Das ist eine Funktion
> oder Unterprogramm. Und dieser muss vorher bekannt gegeben
> worden sein. Ist er aber nicht. Kann das so funktionieren?
Ähnlich wie die Funktion "iswap" ist auch die Funktion "sort" nirgendwo sichtbar definiert. Daher muss zumindest die Deklaration mittels #include in den Quelltext eingebunden werden. Daher kann das so nicht funktionieren, weder die Swap-Funktionen noch die Funktion sort sind in oder in deklariert.
> 3) Generelle Frage. In der Zeile _char
> sarr[10][20]={"Zeus\0".._ wird ein mehrdimens. Array
> beschrieben. Wie werden Elemente beim schreiben in ein solches
> Adressiert? Passiert das hier überhaupt?
In C wird sarr als lineares Array mit 231 Elementen behandelt. Der Compiler nummeriert sie sozusagen linear durch und verwandelt einen Ausdruck der Form sarr[i][k] intern in sarr[21\*i+k]. Beim Befüllen läuft sozusagen der rechte Index von 0 bis 20 hoch. Dann springt der linke Index um 1 nach oben und der rechte beginnt wieder bei 0.
> Nach dem Hauptprogramm kommt die sort Routine.
Das Problem ist, dass die sort-Routine aufgerufen wird, bevor der Compiler weiß, was der Bezeichner sort bedeutet. Entweder muss die sort-Routine daher vor die main-Funktion gesetzt werden oder es muss ein Prototyp von sort vor der ersten Verwendung angegeben werden.
sort(void \*v, int (\*swp)())
{
int i,m;
...}
> 4) Es werden hier 2 Zeiger _\*v_ und _\*swp_ verwendet
> die aber vorher nirgendwo deklariert sind. Und mir ist nicht
> klar wohin die zeigen.
Diese Zeiger werden durch die Parameterdeklaration definiert. Der Compiler weiß durch die Funktionsdefinition, was die Bezeichner v und swp sein sollen. Diese Bezeichner werden beim Aufruf der Funktion durch die entsprechenen Parameter befüllt.
sort(iarr,iswap); ==\> v=iarr, swp=iswap
Tatsächlich werden alle Parameter einer Funktion als interne Variablen der Funktion behandelt, die auf dem Stack angelegt werden.
Viele Grüße