C Lineare Suche in einem Vektor

Sponny

Lt. Commander
Registriert
März 2008
Beiträge
1.052
Hallo liebe Community,

ich habe folgendes auf meinem Windows Rechner unter dem IDE Eclipse (Compiler: MinGW Gcc) programmiert.

Das Programm soll, unter Eingabe einer Zahl (z.b. 5 oder 10) angeben, ob diese in meinem Zahlenarray vorhanden ist.
Desweitern soll die Position dazu angeben werden.

Mein Programm funktioniert einwandfrei für die im Array befindlichen Zahlen. Versuche ich es aber mit einer nicht im Array auftretenden Zahl, klappt das Ganze nicht.

Mein IDE zeigt mir bei den fett gedruckten Zeilen folgenden Warnungen:

"passing argument 3 of 'find' from incompatible pointer type [enable by default]" (siehe erste fett markierte Zeile unten)

"format '%d' expects argument of typ int, but argument 2 has typ 'int *' (siehe zweite fett markierte Zeile unten)

#include <stdio.h>
#define MAX 10
#define bool int
#define true 1
#define false 0

bool find(int x, int f[MAX], int *index) {
int i = 0;
for (i = 0; i <= MAX; i++) {
if (x == f) {
*index = i + 1;
return true;
}
}
return false;
}


int main() {
int* index = NULL;
int suche = 0;
int zahlen[MAX] = { 3, 5, 3, 4, 2, 1, 7, 8, 1, 9 };
printf("Welche Zahl soll gesucht werden? ");
fflush(stdout);
scanf("%d", &suche);
if (find(suche, zahlen, &index)) {
printf("true ");
printf("An der stelle %d", index);
} else
printf("false ");

return 0;
}


Ich hoffe Ihr könnt mir mit der Lösung meines Problems helfen.

Vielen Dank im Voraus.

LG
 
index ist bereits ein Zeiger. Du nimmst mit dem Adress-Operator nochmals die Adresse dieses Zeigers, übergibst also einer Funktion, die eigentlich einen Zeiger erwartet, einen Zeiger auf einen Zeiger.
Ergänzung ()

Die zweite Warnung sagt, daß du für printf-Format-Spezifizierer %d (der eigentlich einen Integer erwartet) einen Zeiger angegeben hast. Du willst ja hier nicht den Wert des Zeigers selbst ausgeben, sondern den Wert des Integers auf den er zeigt. Also ein * (Dereferenzierungsoperator) davorstellen.

Code:
if (find(suche, zahlen, index)) {
    ...
    printf("An der stelle %d", *index);
 
Zuletzt bearbeitet:
antred schrieb:
index ist bereits ein Zeiger. Du nimmst mit dem Adress-Operator nochmals die Adresse dieses Zeigers, übergibst also einer Funktion, die eigentlich einen Zeiger erwartet, einen Zeiger auf einen Zeiger.
Ergänzung ()

Die zweite Warnung sagt, daß du für printf-Format-Spezifizierer %d (der eigentlich einen Integer erwartet) einen Zeiger angegeben hast. Du willst ja hier nicht den Wert des Zeigers selbst ausgeben, sondern den Wert des Integers auf den er zeigt. Also ein * (Dereferenzierungsoperator) davorstellen.

Code:
if (find(suche, zahlen, index)) {
    ...
    printf("An der stelle %d", *index);

Danke für die schnelle Antwort. Das habe ich leider schon versucht.
Wenn ich das mache, funktioniert das Programm garnicht mehr.
Weder für die im Array befindlichen Zahlen, noch für die anderen. :rolleyes:
 
Dann ist in deinem Programm noch was anderes faul. Am besten mit Hilfe eines Debuggers weitersuchen.
 
antred schrieb:
index ist bereits ein Zeiger. Du nimmst mit dem Adress-Operator nochmals die Adresse dieses Zeigers, übergibst also einer Funktion, die eigentlich einen Zeiger erwartet, einen Zeiger auf einen Zeiger.
Ergänzung ()

Die zweite Warnung sagt, daß du für printf-Format-Spezifizierer %d (der eigentlich einen Integer erwartet) einen Zeiger angegeben hast. Du willst ja hier nicht den Wert des Zeigers selbst ausgeben, sondern den Wert des Integers auf den er zeigt. Also ein * (Dereferenzierungsoperator) davorstellen.

Code:
if (find(suche, zahlen, index)) {
    ...
    printf("An der stelle %d", *index);

Danke für die schnelle Antwort. Das habe ich leider schon versucht.
Wenn ich das mache, funktioniert das Programm garnicht mehr.
Weder für die im Array befindlichen Zahlen, noch für die anderen. :rolleyes:
 
Ja, und jetzt sehe ich auch, was. Du läßt mit

Code:
int* index = NULL;

den Zeiger index auf nichts zeigen. Du solltest ihn entweder auf einen int zeigen lassen:

Code:
int target = 0;
int* index = &target;

oder den Zeiger komplett einsparen und gleich direkt mit einem int arbeiten:

Code:
#include <stdio.h>
#define MAX 10
#define bool int
#define true 1
#define false 0

bool find(int x, int f[MAX], int *index) {
	int i = 0;
	for (i = 0; i <= MAX; i++) {
		if (x == f[i]) {
			*index = i + 1;
			return true;
		}
	}
	return false;
}


int main() {
	int index = 0;
	int suche = 0;
	int zahlen[MAX] = { 3, 5, 3, 4, 2, 1, 7, 8, 1, 9 };
	printf("Welche Zahl soll gesucht werden? ");
	fflush(stdout);
	scanf("%d", &suche);
	if (find(suche, zahlen, &index)) {
		printf("true ");
		printf("An der stelle %d", index);
	} else
	printf("false ");

	return 0;
}
Ergänzung ()

Hat C nicht schon von Haus aus den Datentyp bool so wie die Literale true und false?
 
Das kann gut sein, uns wurde das so gelernt. :)

Ich Programmiere erst seit ca. 2 Monaten.

Wenn ich das so mache, wie du beschrieben hast. Also den Zeiger auf ein Int zeigen lassen.
Dann bekomme ich bei der eingabe der Zahl 10 folgende Ausgabe:

True an der Stelle 11. :D

Das gleiche Ergebnis habe ich natürlich auch bei dem 33. Zeilen Code von dir.

Bei der Eingabe von 10 sollte aber "false" ausgegeben werden... :/
 
Ich sehe in deinem Code gerade noch ein Problem.

Code:
for (i = 0; i <= MAX; i++) {

Hier gehst du einen Index zu weit. Korrekt wäre:


Code:
for (i = 0; i < MAX; i++) {
 
antred schrieb:
Ich sehe in deinem Code gerade noch ein Problem.

Code:
for (i = 0; i <= MAX; i++) {

Hier gehst du einen Index zu weit. Korrekt wäre:


Code:
for (i = 0; i < MAX; i++) {

es lag tatsächlich an diesem '=' :D
danke dir, jetzt klappts (:
 
Zurück
Oben