[gelöst] Warnung: Zuweisung von inkompatiblem Zeigertyp
-
Hallo,
ich komme gerade mit folgender Warnung nicht weiter:
Warnung: Zuweisung von inkompatiblem Zeigertyp
Die Warnung tritt an folgenden Stellen im Programm auf:
data->input = (float **) calloc(num_data, sizeof(float *)); data->output = (float **) calloc(num_data, sizeof(float *)); //... data->output[i] = data_output; data->input[i] = data_input;
Kann mir jemand erklären, was diese Fehlermeldung grundsätzlich bedeutet (soll das was rechts vom Gleichheitszeichen steht nicht mit dem was links vom Gleichheitszeichen steht kompatibel sein? Oder was ist womit nicht kompatibel?).
Hat vielleicht jemand eine Ahnung welche Unachtsamkeit diese Warnung ausgelöst haben könnte und wie ich sie beheben kann?
Danke! :schland:
PS: Das Programm ist sehr umfangreich (um genau zu sein ist es diese Bib: http://leenissen.dk/fann/) und da es wahrscheinlich unnötig ist, lasse ich den Rest der Funktion weg. Ich gehe gerade davon aus, dass von euch jemand mit dieser Warnung ohne weitere Angaben sofort etwas anfangen kann
-
Du weist einem float* ein float** zu.
-
Die Frage ist: was ist data_output oder data_input für ein Datentyp.
Sind es floats? Dann ist das Problem, dass einem float* ein float zugewiesen wird.
float**[n] = float* an der Position n.
-
Wutz schrieb:
Du weist einem float* ein float** zu.
Woran machst du das fest? Wir sehen hier leider keine Deklarationen.
-
_matze schrieb:
Wutz schrieb:
Du weist einem float* ein float** zu.
Woran machst du das fest? Wir sehen hier leider keine Deklarationen.
Das sieht man an der obigen Typkonvertierung, welche offenbar fehlerfrei durchführbar ist, da er keinen Fehler aufführte.
-
Danke! Hier noch die Deklaration von data_output/data_input und data:
float *data_input, *data_output; struct fann_train_data *data = (struct fann_train_data *) malloc(sizeof(struct fann_train_data));
Und so sieht es in der Struktur aus:
struct fann_train_data { //... fann_type **input; fann_type **output; };
Der Datentyp fann_type ist hier ein float.
-
Vielleicht will der Compiler einfach nur fann_type statt float...
-
Soweit ich weiß, liefert calloc einen Zeiger und nicht einen Zeiger auf einen Zeiger. Also einfach den Cast von (Float**) zu (float*) ändern und alles ist toll. Dann passt auch mit dem Type von input.
-
calloc liefert alles was Du haben willst, es allokiert ja nur einen Speicherberreich. Wenn Du einen Speicherbereich für einen Zeiger allokierst, erhältst Du einen Zeiger auf einen "Zeigerspeicher".
-
Heimelchen schrieb:
Soweit ich weiß, liefert calloc einen Zeiger und nicht einen Zeiger auf einen Zeiger. Also einfach den Cast von (Float**) zu (float*) ändern und alles ist toll. Dann passt auch mit dem Type von input.
Das bringt genau die gleiche Warnung.
data->input = (float *) calloc(num_data, sizeof(float *));
RR schrieb:
calloc liefert alles was Du haben willst, es allokiert ja nur einen Speicherberreich. Wenn Du einen Speicherbereich für einen Zeiger allokierst, erhältst Du einen Zeiger auf einen "Zeigerspeicher".
Das würde doch heißen, dass ich die Warnung ignorieren kann und alles ist okay?
-
Wernungen kannst Du natürlich immer ignorieren...propier doch mal:
data->input = (fann_type**) calloc(num_data, sizeof(fann_type*));
-
Die Warnung könnte auch daran liegen, dass data->input ein FanType-Pointer ist und nicht ein float-Pointer, wie der Rückgabewert von calloc gecastet wird.
-
Danke. Jetzt sind die Warnungen weg. Es lag tatsächlich an dem Mix aus fann_type und float.
RR schrieb:
Wernungen kannst Du natürlich immer ignorieren...
Ja, ich wollte nur sichergehen, dass ich keinen wildgewordenen Zeiger in meinem Programm habe...
-
Diese Haltung ist löblich...ich wollte auch nicht sagen, dass man generell Warnungen ignoriern sollte.