Pointer -> Array

11/30/2015 22:50 NRj™#1
Hi,

mir geht es darum eine Zahl x in dem Feld f über den Pointer index zu finden. Ich bekomme aber in den Zeilen 16, 17 und 21 den Fehler: array subscript is not an integer

Ich weiß nicht mehr weiter. Der Datentyp index ist doch schon int.

Code:
11/30/2015 23:38 .SkyneT.#2
Du fängst mitten in der main() einfach mal ne neue funktion an, das kann schonmal nicht funktionieren.
Die Funktion hat kein einziges return, das geht auch nicht, ausser du änderst den Rückgabetyp zu void.

Also, die Funktion ausserhalb von main() definieren und innerhalb von main() mittels is_in(1, f, &index) aufrufen.

Danach kannst du daran arbeiten die Funktion zu verbessern, die ist nämlich so nicht zu gebrauchen. Das erste was mir auffällt ist das du index nie dereferenzierst und somit immer die Adresse von index verwendest.
12/01/2015 00:03 warfley#3
Du mischst hier char int und Zeiger, das da nichts funktioniert ist nicht verwunderlich.

Auch wenn C nicht so typstreng ist wie andere Programmiersprachen sollte man sich schon an die Typen halten und nicht einfach durcheinander werfen wie man will. Sowas
Code:
int index = 0;
...
index = &f;
darf nicht vorkommen &f ist der Zeiger auf f also eine 8, 16, 32 oder 64 bit Adresse, und int ist immer 32 bit, das heißt auf jeder anderen Architektur als 32 Bit wirst du damit Probleme haben.
und dann mit
Code:
f[index]
Fabrizierst du einfach nur einen riesigen Haufen Müll. Dieser Code entspricht
Code:
*(char*)(&f + index)// mit index = &f
*(char*)(&f+&f)
Und das das nicht funktionieren kann sollte klar sein.

Ich glaube du solltest mit C nochmal mit Kapitel 1 anfangen
12/01/2015 00:26 algernong#4
Quote:
Du fängst mitten in der main() einfach mal ne neue funktion an, das kann schonmal nicht funktionieren.
Das geht sogar (aber nur mit GCC).

Was auch noch nicht geht: f ist gar nicht nullterminiert.
12/01/2015 00:40 NRj™#5
Ich habe das leicht abgeändert, aber weiter komme ich mit euren Tipps auch nicht:

bool is_in(int x, int f[MAX], int *index) ist in der Aufgabenstellung vorgegeben. x ist die Zahl, die in dem Feld f gesucht wird. Und über den Referenzparameter index soll die Stelle des Vorkommens bestimmt werden. Könnt ihr mir das bitte etwas einfacher erklären?
12/01/2015 01:03 warfley#6
Einen Array adressierst du über einen Index 0..ArrayLength-1, nicht über einen Zeiger. Das heißt index als int ist schon richtig, initialisiere den allerdings mit 0 und nicht mit der Adresse auf f.

Du übergibst dann den Zeiger auf index an deine Funktion, das hat den sinn das du diese bearbeiten kannst in der Funktion selbst und der wert erhalten bleibt, da C keine Vereinfachung von call by reference erlaubt (wie z.B. C++).
Allerdings musst du index in der Funktion dann auch als Zeiger behandeln und nicht als Integer.
also aus
Code:
f[index] ...
wird
f[*index]
oder
index = index+1
wird 
*index = *index+1
oder kürzer
*index++
außerdem gibt deine bool Funktion keinen wert zurück, wenn etwas gefunden wurde muss true zurückgegeben werden sonst false.

Nach dem Funktionsaufruf wird in index dann der Wert stehen den die Funktion zuletzt reingeschrieben hat (also wenn es gefunden wurde der index deines Elements)

und btw, seit wann kennt C den typen bool? Das ist mir neu, normalerweise verwendet man int für Wahrheitswerte mit x==0 ist false und x!=0 ist true

edit grade dein #define bool int gesehen
12/01/2015 01:04 ComputerBaer#7
Ich muss sagen, dein "int *index" ist mir nicht geheuer. Du benutzt deinen Zeiger als wäre es eine ganz normale Variable, also "int index". Da du den Zeiger aber nie als Zeiger verwendest, könnte das tatsächlich so funktionieren - aber gut ist das definitiv nicht.

Das fehlende "return" hast du bisher auch nicht korrigiert. Den Zeiger auf "index", den du in "main()" übergibst, kann es nicht geben, weil es "index" nicht gibt.

Quote:
Originally Posted by NRj™ View Post
bool is_in(int x, int f[MAX], int *index) ist in der Aufgabenstellung vorgegeben. x ist die Zahl, die in dem Feld f gesucht wird. Und über den Referenzparameter index soll die Stelle des Vorkommens bestimmt werden. Könnt ihr mir das bitte etwas einfacher erklären?
Ich versuche es mal: Du übergibst der Funktion deine Zahl x, von der du die Position in deinem Feld f haben willst. Außerdem übergibst du den Zeiger auf eine weitere Zahl, in der dann die Position gespeichert werden soll. Wenn du die Zahl x in dem Feld f findest, solltest true (ich nehme an 1 ? kann nur C++) zurück geben (return) und vorher die Position in index speichern (*index = pos; ). Solltest du sie nicht finden gibst du false (also 0 ?) zurück.

In main() siehst du dir dann den Rückgabewert an, also war es 1 oder 0, und gibst dann entsprechen "gefunden %index" oder "nicht gefunden" aus. Außerdem legst du dir dort vorher den Feld f, die Zahl x und die Zahl index an, von der du dann einen Zeiger an die Funktion übergibst.


So, ich hoffe ich habe nicht zu viel Blödsinn aufgeschrieben. Mit C habe ich bisher nichts gemacht und mein C++ ist auch noch ausbaufähig. Um dir noch genauer zu zeigen wie du das löst, müsste man wahrscheinlich die Lösung schreiben und das ist nicht ganz der Sinn der Sache.
12/01/2015 19:35 snow#8
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define bool int

// Funktion is_in
bool is_in(int x, int f[MAX], int *index)  {
    
    for (*index = 0; f[*index] != '\0'; ++*index) 
    {
        if (f[*index] == x) 
        {
            break;
        }
    }

    return f[*index] != '\0';
}

int main(int argc, char *argv[]) {
    
    int f [MAX] = {1,2};
    int x []= {2};
    int index;

    bool ret = is_in(1, f, &index);
    
    if (ret)
        printf("\nDas x befand sich an der %d. Stelle", (*index)+1);
    else
        printf("\nIhr string enthaelt kein 'a'\n");

    return 0;
}
ComputerBaer liegt da ziemlich richtig, denke ich. Du sollst vermutlich zurückgeben ob ein Index gefunden wurde (deshalb der return-Wert) und dieser soll im index-Zeiger hinterlegt werden.

Du solltest dir ein bisschen mehr Mühe geben mit deinem Codestil und am Besten nochmal den Unterschied zwischen Zeigern und primitiven Datentypen wie Integern anschauen.
12/03/2015 21:56 Computerfreek#9
Quote:
Originally Posted by snow View Post
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define bool int

// Funktion is_in
bool is_in(int x, int f[MAX], int *index)  {
    
    for (*index = 0; f[*index] != '\0'; ++*index) 
    {
        if (f[*index] == x) 
        {
            break;
        }
    }

    return f[*index] != '\0';
        return
    }
    else {
        printf("\nDas x befand sich an der %d. Stelle", index+1);
    }
}

int main(int argc, char *argv[]) {
    
    int f [MAX] = {1,2};
    int x []= {2};
    int index;

    bool ret = is_in(1, f, &index);
    
    if (ret)
        printf("\nDas x befand sich an der %d. Stelle", (*index)+1);
    else
        printf("\nIhr string enthaelt kein 'a'\n");

    return 0;
}
ComputerBaer liegt da ziemlich richtig, denke ich. Du sollst vermutlich zurückgeben ob ein Index gefunden wurde (deshalb der return-Wert) und dieser soll im index-Zeiger hinterlegt werden.

Du solltest dir ein bisschen mehr Mühe geben mit deinem Codestil und am Besten nochmal den Unterschied zwischen Zeigern und primitiven Datentypen wie Integern anschauen.
Auch deine Variante gibt auch noch nichts zurück und dürfte aufgrund der fehlenden Anweisung hinter dem return auch nicht kompilieren.
Bin gerade am Handy und kann das deswegen nicht wirklich verbessern. Coden am Handy ist eine Qual, wie ihr bestimmt wisst.
12/04/2015 11:45 snow#10
Mein Fehler, dieser Part:

Code:
    return
    }
    else {
        printf("\nDas x befand sich an der %d. Stelle", index+1);
    }
sollte eigentlich nicht mehr drinnen sein, ich habe es editiert.