2-D Array, Übergabe Probleme mit Nullterminator
-
@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?