2-D Array, Übergabe Probleme mit Nullterminator
-
Warum glaubst du mir das nicht? Es funktioniert, ist halt nur wie gesagt doof dass ich im Moment zwei solcher Funktionen benötige.
So wie du es vorgeschlagen hast:
void func(char **array, char extracted[], uint8_t Index){ // Im moment steht noch nichts drin }
Aufruf:
func(tabelle1, extract1, 5);
Meldung: warning:passing argument 1 of 'func' from incompatible pointer type
note: expected 'char **' but argument is of type 'char (*)[16]'oder:
func(tabelle1[5], extract1, 5);
note: expected 'char **' but argument is of type 'char *'
oder:
func(&tabelle1[5], extract1, 5);
note: expected 'char **' but argument is of type 'char (*)[16]'
-
@newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:
Warum glaubst du mir das nicht?
Weil Du in Deinem Code sicher nicht
void func1(char array[][16], char extracted, uint8_t Index])
hast, wie Du oben geschrieben hast.
-
@newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:
So wie du es vorgeschlagen hast
Sorry, hab auch Quatsch erzählt. Seit C99 geht es so:
void func(size_t length, char array[][length], char *extracted, size_t Index)
aber wie gesagt:
@swordfish sagte in 2-D Array, Übergabe Probleme mit Nullterminator:
Du suchst wahrscheinlich strcpy, eg.
strcpy(extract1, tabelle1[42]); strcpy(extract2, tabelle2[2]);
-
Ja genau, für die Tabelle extracted muss sogar kein stern stehen, da die übergabe der tabelle ja schon eine Adresse ist.
Danke für die Lösung mit strcpy, aber das gefällt mir nicht. Wollte das mit den Tabellen machen, weißt du was ich falsch mache wenn ich das mit den Doppel Zeiger machen will?
-
@newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:
Ja genau, für die Tabelle extracted muss sogar kein stern stehen, da die übergabe der tabelle ja schon eine Adresse ist.
void foo(char bar[]);
und
void foo(char *bar);
ist exakt dasselbe.
@newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:
Danke für die Lösung mit strcpy, aber das gefällt mir nicht.
Was gefällt Dir daran nicht? Was Du vorhast ist doch bloß unnötig komplifiziert!?
@newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:
Wollte das mit den Tabellen machen, weißt du was ich falsch mache wenn ich das mit den Doppel Zeiger machen will?
Es geht nicht, weil ein
char[m][n]
nicht in einenchar **
konvertierbar ist. Wie gesagt, ich habe Quatsch geschrieben.Außerdem, wenn Du sowieso nur auf
array[Index][...]
zugreifen willst, wie in@newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:
void func1(char array[][16], char extracted, uint8_t Index]) { uint8_t i; // zeichenketten sind mit \0 terminiert for(i=0; i < strlen(array[Index]); i++) { extracted[i] = array[Index][i]; } }
angedeutet, warum über gibst Du nicht gleich
tabelle1[Index]
bzw. tabelle2[Index]`:void func(char *array, char *extracted) { /* ... */ } int main(void) { char tabelle1[50][16] = { "foo", "bar", "baz" /* , ... */ }; char extract1[16]; func(tabelle1[42], extract1); }
was dann aber wieder auf
strcpy()
hinausläuft:#include <string.h> int main(void) { char tabelle1[50][16] = { "foo", "bar", "baz" /* , ... */ }; char extract1[16]; strcpy(extract1, tabelle1[42]); }
btw solltest Du auch nicht bei jedem Schleifendurchlauf
strlen()
aufrufen, wenn sicharray[Index]
nicht ändert, sondern das Ergebnis zwischenspeichern, oder besser gleich klassisch kopieren (while(*dst++ = *src++);
) wenn Du schon nichtstrcpy()
nehmen willst.
-
Dieser Beitrag wurde gelöscht!
-
strcpy ist hier eine schlechte Wahl, sie geht von Strings als Tabelleninhalt aus und überhaupt von initialisierten Tabelleninhalten.
-
@wutz Nichts anderes tut aber seine Funktion
func1()
die er oben gezeigt hat.
-
@swordfish
Das hindert dich nicht, den Frager auf sein Fehldesign und Fehlimplementierung hinzuweisen bzgl. UB usw.Hier mal eine Variante ohne strcpy und auch ohne memcpy:
void f(size_t n, const char a[][n], char *x, int i) { struct {char m[n];} *f = (void*)a[i], *t = (void*)x; *t = *f; } enum {N=20}; int main() { char a[][N]={"null","eins","zwei","drei"}; char x0[N]="",x1[N]="",x2[N]="",x3[N]=""; puts("====="); puts(x0); puts(x1); puts(x2); puts(x3); puts("====="); f(N,a,x1,1); f(N,a,x2,2); puts(x0); puts(x1); puts(x2); puts(x3); puts("====="); return 0; }
Falls sich jemand berufen fühlt, mit mir hier über UB oder nicht zu diskutieren, kann er gerne mal vorlegen.
-
@Wutz Was ist daran
@newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator sinngemäß:
void func1(char array[][16], char *extracted, uint8_t Index){ uint8_t i; // zeichenketten sind mit \0 terminiert for(i=0;i<strlen(array[Index]);i++){ extracted[i] = array[Index][i]; } }
UB?
-
strcpy ist hier eine schlechte Wahl, sie geht von Strings als Tabelleninhalt aus und überhaupt von initialisierten Tabelleninhalten.
-
@wutz Das beantwortet nicht meine Frage.
-
@swordfish
Nerv nicht rum sondern lies meine Antworten.
-
@wutz Arrogant und herablassend wie wir Dich kennen. Einfach herrlich, Wutzi.
-
@Wutz
Ja sieht sehr toll aus. Ist nur leider komplett unverständlich und wurde von dir auch nicht erklärt, und daher ist das am Ziel vorbei, meinst du nicht?