KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: C - pointer type auf char-Array Problem
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallöchen..
hab mich mal am programmieren versucht, und nachdem ich relativ viele Fehlermeldungen nach ner langen Weile wegbekommen hab, hänge ich nun.
Also erstmal Codeschnipsel
[anzahlSpieler ist eine IntegerVariable]

Code:
//Eine Eingabe-Funktion (Die glaub ich ziemlich doof ist aber das mit OSK fnd ich nich...
void eingabeStarten(char *dahinSchreiben[]);

//Eine Spieler-Struktur
typedef struct spieler{
        char *name[20];
        int punkte;
    } _spieler;

//Ein SpielerArray
_spieler spieler[MAX_SPIELER];

//Ein Array das alle Namen speichert [hatte das zuerst direct in der Spieler-Struktur, aber hat irgendwie auch Probleme gegeben dann hab ichs so probiert]

char namenDerSpieler[MAX_SPIELER][20];

//Und schließlich die Funktion die probleme macht..
void spielernamenEingeben(){
    int i;
    for(i = 1; i<=anzahlSpieler; ++i){
        eingabeStarten(&namenDerSpieler[i-1]);
        spieler[i-1].name = &namenDerSpieler[i-1];
        spieler[i-1].punkte = 0;
    }
}

Und dann erhalte ich diese Errors:

Code:
main.c:83: warning: passing argument 1 of 'eingabeStarten' from incompatible poi
nter type
main.c:84: error: incompatible types in assignment


Sollte der namenDerSpieler-Pointer nicht ein Pointer sein, der auf ein char-array zeigt, weil namenDerSpieler ist ja ein char-array aus char-arrays Smile ?
Vielleicht würde es gehn wenn ich das mit dem namenDerSpieler[][] weglasse und den Namen gleich mit in die Struktur schreib, aber dann würd ichs ja immernoch nicht verstehn^^

mfg
GigorSmile

void eingabeStarten(char *dahinSchreiben[]); macht mal gar nichts. Du solltest die übergebenen daten auch verarbeiten oder?
mach mal aus eingabeStarten(&namenDerSpieler[i-1]); das hier:
eingabeStarten(namenDerSpieler[i-1]);

und aus
void eingabeStarten(char *dahinSchreiben[]);
machste
void eingabeStarten(char *dahinSchreiben);

und torky hat natürlich recht, void eingabeStarten(char *dahinSchreiben[]); tut einfach überhauptnichts.
Ist sowieso doof programmiert. Wie soll das ganze funktionieren? Woher kommen die spieler namen? Ist die Maximale Spieleranzahl eine konstante (wovon ich mal ausgehe). Ich würde einfach eine add_player routine erstellen so bist du viel flexiebler und nicht alle spieler auf einmal initalisieren. Du machst dein spieler array einfach global ( was es eh schon ist) und machst ne routine in der der neue spieler initalisiert wird und gut ist.

ist jetzt nur aus dem kopf und nicht überprüft aber so würde ich das ganze sehen:

int playercount = 0;
int max_player = 4;

void add_player (char *name)
{
if(playercount < max_player)
{
spieler[playercount].name = name;
spieler[playercount].punkte = 0;
playercount +=1;
}
}
Hi,
also die Eingaben-Funktion hab ich nur die Signatur mal angegeben, die komplette Funktion ist
-->Mist hab gemerkt, dass ich die funktion nicht eingebunden habe, menge fehler,<--
-->bin am durchguggen<--
-->Ok es compiliert, hunderte warnings.. naja bin weiter am tüfteln.<--
Spoiler: (anzeigen)
Hab ich das richtig verstanden, dass bei Zeigern nicht unterschieden wird ob er auf ein Arrray oder ein einzelnes char zeigt?
Also hab das jetzt gemacht und bei dem Spieler-struct das [20] auch weg gemacht, jetzt hat es teilweise compiliert und ne menge warunung ausgespuckt, dass muss ich jetzt erstmal durchgehnSmile
Danke schonmal, ich fürchte aber ich muss mich dann nochmal melden..
mfg
Gigor

Gigor :
Hi,
also die Eingaben-Funktion hab ich nur die Signatur mal angegeben, die komplette Funktion ist
-->Mist hab gemerkt, dass ich die funktion nicht eingebunden habe, menge fehler,<--
Spoiler: (anzeigen)
Hab ich das richtig verstanden, dass bei Zeigern nicht unterschieden wird ob er auf ein Arrray oder ein einzelnes char zeigt?
Also hab das jetzt gemacht und bei dem Spieler-struct das [20] auch weg gemacht, jetzt hat es teilweise compiliert und ne menge warunung ausgespuckt, dass muss ich jetzt erstmal durchgehnSmile
Danke schonmal, ich fürchte aber ich muss mich dann nochmal melden..
mfg
Gigor


ein zeiger ist und bleibt ein zeiger, aber da der array-name auch nicht viel mehr als ein pointer ist, verlangst du mit char *dahinSchreiben[] nach einem einzelnen buchstaben wenn ich mich nicht irre. Das heißt du könntest z.B. mit dahinSchreiben[4] nach 4 buchstaben, oder mit *dahinSchreiben nach einem beliebig langen text verlangen. ist nicht so einfach zu erklären, du solltest die das kapitel zu pointern mal durchlesen, ich denke das hilft dir:

http://openbook.galileocomputing.de/c_vo...121b2c65c1
http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_007.htm

@Gigor: Du hast char* text global deklariert?
Übergib den Text doch besser als Parameter Wink
Ja du hast es richtig verstanden Wink
Dafür ist ja die Nullterminierung da...

mfg D3lta

EDIT: zu langsam Big Grin

Neutrosider :

Gigor :
Hi,
also die Eingaben-Funktion hab ich nur die Signatur mal angegeben, die komplette Funktion ist
-->Mist hab gemerkt, dass ich die funktion nicht eingebunden habe, menge fehler,<--
Spoiler: (anzeigen)
Hab ich das richtig verstanden, dass bei Zeigern nicht unterschieden wird ob er auf ein Arrray oder ein einzelnes char zeigt?
Also hab das jetzt gemacht und bei dem Spieler-struct das [20] auch weg gemacht, jetzt hat es teilweise compiliert und ne menge warunung ausgespuckt, dass muss ich jetzt erstmal durchgehnSmile
Danke schonmal, ich fürchte aber ich muss mich dann nochmal melden..
mfg
Gigor


ein zeiger ist und bleibt ein zeiger, aber da der array-name auch nicht viel mehr als ein pointer ist, verlangst du mit char *dahinSchreiben[] nach einem einzelnen buchstaben wenn ich mich nicht irre. Das heißt du könntest z.B. mit dahinSchreiben[4] nach 4 buchstaben, oder mit *dahinSchreiben nach einem beliebig langen text verlangen. ist nicht so einfach zu erklären, du solltest die das kapitel zu pointern mal durchlesen, ich denke das hilft dir:

http://openbook.galileocomputing.de/c_vo...121b2c65c1
http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_007.htm


Code:
void f(char *string);

und

Code:
void f(char string[]);

sind das selbe, weil ein Array dort zu einem Zeiger zuerfällt Wink
Aber hier nicht:

Code:
int main()
{
    //...
    char *str0; //ganz normaler C-String (Hier muss aber für den String manuell Speicher reserviert werden!)
//  char str1[]; //verboten, da keine Größe angegeben wurde (was bei Arrays umbedingt getan werden muss)
    char str2[4]; //char-Array für 4 Buchstaben, also 3 Zeichen + '\0' ohne Initialisierung,
                      //hier wird der Speicher bei der Deklaration reserviert
    char str3[] = "abc"; //noch ein char-Array für 4 Buchstaben, mit Initialisierung,
                                //hier wird der Speicher bei der Deklaration reserviert
    char ch // ein einzelner Buchstabe
    //...
}

mfg D3lta

P.S.: Array != Pointer

So also es klappt jetzt alles soweit, sogar keine warnungen beim compilierenSmile
Danke euch drei für Hilfe.!
mfg Gigor
Referenz-URLs