Konstanten und Pointer

Hallo zusammen,

ich bin ein Anfänger was C betrifft und habe mich mal nach längerer Zeit wieder an C herangetraut :wink:

Undzwar will ich in dem Array „zahl“ nach dem nächsten Vorkommen des ersten Elements (zahl[0]) suchen:

...
#define ANZ 1000000
...

unsigned int \*next\_element;
next\_element = &lfind(&zahl[0], zahl, &ANZ, sizeof(int));

Referenz zu lfind:
http://www.gnu.org/software/libc/manual/html_node/Ar…

Also ich bin im Moment noch etwas ungeübt im Umgang mit Zeigern. Der Compiler meckert immer über das dritte Argument, aber ich weiß nicht, was ich stattdessen einsetzen soll. (Kann sein dass noch mehr nicht stimmt…)

Danke schonmal für eure Hilfe,

Nyx

Hallo,

Undzwar will ich in dem Array „zahl“ nach dem nächsten
Vorkommen des ersten Elements (zahl[0]) suchen:


#define ANZ 1000000

unsigned int *next_element;
next_element = &lfind(&zahl[0], zahl, &ANZ, sizeof(int));

lfind erwartet noch ein fünftes Argument, einen Pointer zu einer Funktion, die zwei void-Pointer erwartet und vergleicht:

int\* compare(void\* a, void\* b){
...
}

Mein Versuch (ungetestet) sieht so aus:

int ANZ = 1000000-1;
unsigned int \*next\_element;
next\_element = (unsigned int\*) lfind(zahl, zahl+1, &ANZ, sizeof(int), compare);

Ein Array ist nur ein Pointer auf das erste Element, zahl+1 dann auf das zweite.

Grüße,
Moritz

Hallo

ich bin ein Anfänger was C betrifft und habe mich mal nach
längerer Zeit wieder an C herangetraut :wink:

Und zwar will ich in dem Array „zahl“ nach dem nächsten
Vorkommen des ersten Elements (zahl[0]) suchen:

next_element = &lfind(&zahl[0], zahl, &ANZ, sizeof(int));

Warum mit lfind()? Das erscheint bei diesem
einfachen Beispiel unverständlich. Warum
nicht einfach im Array nachsehen?

Moritz hat ja schon das Nötige zu den Fehlern gesagt,
ich bringe mal ein Vergleichsbeispiel, wie man ‚lfind‘
und ‚simplen Vergleich‘ bei der Suche aller vorgegebenen
Werte in einem Feld einsetzen könnte.

erstmal mit lfind:

#include 
#include 
#include 
#include 

#define ANZ 1000000

 int ui\_compare(const void \*p1, const void \*p2)
{
 return \*(unsigned int\*)p1 - \*(unsigned int\*)p2;
}

 void mit\_lfind() 
{
 unsigned int i, anzahl = ANZ;
 unsigned int remaining = anzahl;
 unsigned int \*zahl = malloc(anzahl \* sizeof(\*zahl)); 
 unsigned int \*next\_element = zahl;
 
 assert(zahl != 0);
 for(i=0; i%u kommt bei Pos [%u]\n", \*next\_element, next\_element-zahl);
 remaining = anzahl - (next\_element - zahl);
 }
 free(zahl);
}

und dann ohne lfind:

#include 
#include 
#include 

#define ANZ 1000000

 void ohne\_lfind() 
{
 unsigned int i, anzahl = ANZ;
 unsigned int \*zahl = malloc(anzahl \* sizeof(\*zahl)); 
 unsigned int \*next\_element = zahl;

 assert(zahl != 0);
 for(i=0; i %u kommt bei zahl[%u]\n", \*next\_element, next\_element-zahl);

 free(zahl);
}

wie man sieht, ist es ohne lfind ganz einfach.
Aber möglicherweise wolltest Du gerade ‚lfind‘ übungs-
weise einsetzen?

Grüße

CMБ

Hallo zusammen,

@ Moritz

Danke für die schnelle Antwort!

Hab deinen Vorschlag gleich ausprobiert. Nur bei der Compare-Funktion hat der Compiler rumgemeckert, hab dann aber eine leicht andere Implementation der Funktion gefunden:

http://www.lrz-muenchen.de/services/compute/linux-cl…

@ Semjon Michailowitsch

Naja, dass es nicht bei der einen Zeile bleibt, wusste ich ja nicht im Voraus :wink: Und ich hatte keine Lust, jeden Sch… selbst zu machen.
Und eigentlich brauche ich nur das erste Vorkommen des gesuchten Elements (hab ich wohl nicht explizit erwähnt), also ist die while-Schleife bei deinem Beispiel mit lfind nicht notwendig oder?

Aber danke trotzdem für die Mühe die du dir mit den zwei Beispielen gemacht hast …

Gruß, Nyx

Hallo

@ Semjon Michailowitsch

Und eigentlich brauche ich nur das erste Vorkommen des
gesuchten Elements (hab ich wohl nicht explizit erwähnt), also
ist die while-Schleife bei deinem Beispiel mit lfind nicht
notwendig oder?

Ersetze einfach das ‚while‘ durch ‚if‘, denn wenn
nichts gefunden wird, brauchst Du ja auch nichts
auszugeben. Die ‚remainder‘-Berechnung kannst Du
dann auch entfernen.

Warum sollte das Ganze nochmal mit ‚lfind()‘ passieren?

Grüße

CMБ