Die Implementierung eines generical 'anzeigen' - Funktion über arrays in C
Ich habe Schwierigkeiten die Implementierung eines generischen " map " - Funktion über arrays.
Angefangen habe ich mit dem folgenden Entwurf:
void MapArray(void * src, void * dest, void * (f)(void *), size_t n, size_t elem)
{
unsigned int i = 0, j = 0;
void * temp = malloc(elem);
for(i = 0; i<n, i++)
{
temp = (f)((char *) src) + i));
for(j = 0; j < elem; j++)
{
*(((char *) dest) + i) = *(((char *) temp) + i);
}
}
free(temp);
}
Verstehe ich, warum es nicht korrekt ist - ich bin-casting (char *), bevor er es auf 'f' - aber ich bin jetzt demotiviert und können nicht kommen mit einer Lösung. (Ich mache das in den Prozess des Lernens, C)
Meine Begründung war, erhalten Sie das Ergebnis von 'f' und, byte für byte, kopieren Sie es in dest[i].
Können Sie mir irgendeinen Hinweis?
für was benötigen Sie diesen Zeiger auf Funktion und was Karte, die Sie möchten, umzusetzen, ich glaube nicht, Sie wollen einige, zum Beispiel die Karte, die Behälter von der sgi?
Es ist die typische " map " - Anwendung finden Sie in nahezu jede funktionale Sprache, die es gibt. Sie senden eine Liste, eine Funktion und es gibt die Liste aus wie folgt: (f(l[1]), ..., f(l[n])).
Es ist die typische " map " - Anwendung finden Sie in nahezu jede funktionale Sprache, die es gibt. Sie senden eine Liste, eine Funktion und es gibt die Liste aus wie folgt: (f(l[1]), ..., f(l[n])).
InformationsquelleAutor Lasirc | 2010-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre erste problem ist, dass du tust viel zu viel in ein paar Ausdrücke. Sie müssen, um es zu brechen.
Nun Ihre zweite problem. Sie malloc ein Puffer, dann Sie .. zuweisen, die Zeiger? Wiederholt? Dann frei, nur die letzten f-call ist das Ergebnis? Das ist völlig unnötig.
Nun Ihre Dritte problem. Übergeben Sie einen Zeiger -, sondern nur zu verkohlen. Sie don ' T-pass in ein void*. Dies bedeutet, dass Ihre Funktion nicht generisch sein - f nicht angewendet werden, zu nichts. Wir brauchen ein array von void*s, so dass die Funktion beliebigen Typs als argument. Wir müssen auch die Größe des Typs als argument, so dass wir wissen, wie weit zu bewegen entlang dest.
Wir haben noch ein anderes problem - der Speicher temp. Wir nicht frei. Noch geben wir eine Benutzer-Daten-argument in f, die ihm erlauben würde, zurück heap-Speicher reserviert, den wir nicht brauchen, frei zu sein. Der einzige Weg, in die f arbeiten können, ist, wenn es wieder einen statischen Puffer.
Nun f kann auf so ziemlich, was er will und halten, was Staat es braucht. Aber wir noch nicht freie Puffer. Nun, f gibt eine einfache Struktur, die uns sagt, wenn wir brauchen, um das gratis-Puffer. Dies ermöglicht auch uns, frei oder nicht frei, den Puffer auf verschiedene Aufrufe von f.
Allerdings bin ich immer noch nicht verstehen, den Zweck dieser Funktion. All das ersetzen einer einfachen for-Schleife? Der code, den Sie versuchen zu ersetzen ist einfacher, als den code die Funktion aufrufen, und wahrscheinlich effizienter, und definitiv stärker (Sie können fortfahren/Pause, zum Beispiel).
Mehr als das, C saugt wirklich für diese Art von Arbeit. C++ ist viel besser. Es ist ziemlich trivial, es zur Anwendung einer Funktion auf jedes Element eines Arrays, zum Beispiel.
InformationsquelleAutor Puppy
Es gibt einen Grund, nichts ähnlich wie diese ist in die C-standard-Bibliothek-es ist weiter unmöglich, es gut zu machen in C. Sie können nicht kopieren Sie das Ergebnis, "byte für byte" zu
dest[i]
-- da hast du gegossendest
zu einemchar *
es nur Punkte auf einchar
(byte).Vermutlich
elem
soll die Größe unabhängig von der Artf
gibt, undn
ist die Anzahl der Elemente insrc
unddest
. In diesem Fall, der code ist nicht zu weit Weg, aber (da hast du anscheinend vermutet) der Weg du bist die Manipulation der Pointer (vor allem die Besetzung zuchar *
) nicht gehen, um es zu schneiden.Auch wenn du es reparieren, aber Sie haben ein anderes problem: Zuordnung des Rückgabewert-Typ aus
f
ohne zu wissen, der Typ ist wirklich (wirklich) schwierig. In der Tat, der einzige Weg, die ich denken kann, ist, wickeln Sie diesen code in einem makro statt:Die Sie verwenden würden, so etwas wie dieses:
Nehmen Sie zur Kenntnis: ich bin nicht empfehlen dieses. Diese ist eine Möglichkeit, das zu tun, was Sie gefragt, aber wie ich schon sagte, ist es unmöglich, gut zu tun in C. Dieser code funktioniert bis zu einem gewissen Grad, aber IMO ist es nicht qualifiziert tun, als die Arbeit gut.
InformationsquelleAutor Jerry Coffin
j
ist eigentlichSie sind mit
i
innerhalb der Schleife, obwohlAber im moment, die Schleife ist nur das kopieren des gleichen byte an der gleichen Stelle
elem
Zeiten. Sie müssen*(((char *) dest) + i * elem + j) = *(((char *) temp) + i * elem + j);
im inneren statt.Ich würde hinzufügen, dass, sollten Sie den index getrennt und dann hinunter zu
void*
vor dem Aufruff
eher alsf( ((char *)src) + i )
. Aber @DeadMg Antwort aus, dass alle redundant. @ j_random_hacker Dank für communicationg meine Gedanken mehr explizit.InformationsquelleAutor srean