Forum: Mikrocontroller und Digitale Elektronik C in String-array basteln, brauche Hilfe


von Thomas R (Gast)


Lesenswert?

Hallo,
ich versuche in C ein String-array zu basteln.
Da mache ich wohl Fehler, denn das will nicht funktionieren:

int main( void )
{
  lcd_init(0);  lcd_init(1); lcd_init(2);  lcd_init(3);  // LCD: 40*4
  clearLCDline(0,0); clearLCDline(1,0); clearLCDline(2,0); 
clearLCDline(3,0);

  char line_0[50] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
  lcd_print_at ( line_0, 0, 0 );
  _delay_ms(1000);
// bis hier funktioniert alles bestens

// ab hier funktioniert nichts, nur leere Zeilen
  char  line[50][4];
  line[50][0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
  line[50][1] = "A quick brown fox jumps over the lazydog";
  line[50][2] = "1234567890123456789012345678901234567890";
  line[50][3] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN";

  lcd_print_at ( line[0], 0, 0 );
  lcd_print_at ( line[1], 0, 1 );
  lcd_print_at ( line[2], 0, 2 );
  lcd_print_at ( line[3], 0, 3 );
}

Vielen Dank,
Thomas

von Rene K. (xdraconix)


Lesenswert?

Thomas R schrieb:
> char  line[50][4];
>   line[50][0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
>   line[50][1] = "A quick brown fox jumps over the lazydog";
>   line[50][2] = "1234567890123456789012345678901234567890";
>   line[50][3] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN";

Das geht so nicht... wenn dann wenigstens:
1
char line[50][4][40];
2
3
4
line[50][0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
5
line[50][1] = "A quick brown fox jumps over the lazydog";
6
line[50][2] = "1234567890123456789012345678901234567890";
7
line[50][3] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN";
8
9
lcd_print_at ( line[50][0], 0, 0 );
10
lcd_print_at ( line[50][1], 0, 1 );
11
lcd_print_at ( line[50][2], 0, 2 );
12
lcd_print_at ( line[50][3], 0, 3 );


Oooooder, so wie ich denke du das eigentlich wolltest: ;-)
1
char line[4][50];
2
3
4
line[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
5
line[1] = "A quick brown fox jumps over the lazydog";
6
line[2] = "1234567890123456789012345678901234567890";
7
line[3] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN";
8
9
lcd_print_at ( line[0], 0, 0 );
10
lcd_print_at ( line[1], 0, 1 );
11
lcd_print_at ( line[2], 0, 2 );
12
lcd_print_at ( line[3], 0, 3 );

Normalerweise müsste aber der Compiler bei deinem Konstrukt eine Warnung 
werfen.

von Felix U. (ubfx)


Lesenswert?

Thomas R schrieb:
> line[50][0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";

Also so kannst du generell keinen "String" irgendwo reinschreiben. "xy" 
ist ein pointer, also musst du strcpy verwenden.

Ich würde es so machen:
1
char lines[4][50] = { "abc123", "zweite zeile", "dritte", "vierte" };
2
3
//und wenn du später neue Werte reinschreiben willst:
4
5
strcpy(lines[1], "neuer string zweite zeile");

Edit:
Rene K. schrieb:
> Oooooder, so wie ich denke du das eigentlich wolltest: ;-)
>
> char line[4][50];
>
> line[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";


Also mein Compiler kann sowas nicht ;) Generell bezweifle ich, dass 
irgendein Compiler da automatisch einen copy generiert, würde nur bei 
einem Array von 4 Pointern sinn ergeben.

von The D. (thedaz)


Lesenswert?

Nimm mal besser einen array von pointern :

const char* lines[] = { "line1", "line2", "line3", "line4" };

Das sind allerdings unveränderliche Strings. Wenn das nicht akzeptabel 
ist musst du einen veränderlichen Array, also z.B.

char lines[4][50];

definieren und einzeln z.B. per strncpy oder memcpy initialisieren.

von Falk B. (falk)


Lesenswert?

@ Thomas R (Gast)

>Da mache ich wohl Fehler, denn das will nicht funktionieren:

In der Tat. Du hast vergessen, in einem C-Buch nachzulesen, wie Strings 
in C funktionieren.

>// ab hier funktioniert nichts, nur leere Zeilen
>  char  line[50][4];
>  line[50][0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";

Das geht so nicht, da müßte mindestens eine Warnung oder ein Fehler vom 
Compiler kommen. Eine direkte Stringzuweisung ist in C NICHT möglich. 
Außerdem ist deine Definition falsch.

char  line[50][4];

definiert ein Array mit 50x4 chars. Du willst aber eher 4x50. Das ist 
ein Unterschied, vor allem in der Datenorganisation. Weiterhin ergibt 
der Ausdruck

line[50][0] =

auf der linken Seite den INHALT eines chars in deinem Array. Das ist 
aber kein lvalue, dem man einen Wert zuweisen kann. Hier muss der 
Compiler meckern!

Wenn, dann eher so.
1
char line[4][50] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn",
2
                     "A quick brown fox jumps over the lazydog",
3
                     "1234567890123456789012345678901234567890",
4
                     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN"};
5
6
  lcd_print_at ( line[0], 0, 0 );
7
  lcd_print_at ( line[1], 0, 1 );
8
  lcd_print_at ( line[2], 0, 2 );
9
  lcd_print_at ( line[3], 0, 3 );
10
}

von Thomas R (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle die mir geholfen haben, ich muß mir C und deren Strings noch 
mal genauer anschauen.

So funktioniert alles bestens:

int main( void )
{
  lcd_init(0);  lcd_init(1); lcd_init(2);  lcd_init(3);  // LCD: 40x4 
Zeichen
  clearLCDline(0,0); clearLCDline(1,0); clearLCDline(2,0); 
clearLCDline(3,0);

// das funktioniert:
  char line_0[50] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
  lcd_print_at ( line_0, 0, 0 );
  _delay_ms(1000);

// das funktioniert auch!
  char line[4][50] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn",
                     "A quick brown fox jumps over the lazydog",
                     "1234567890123456789012345678901234567890",
                     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN"};

  lcd_print_at ( line[0], 0, 0 );
  lcd_print_at ( line[1], 0, 1 );
  lcd_print_at ( line[2], 0, 2 );
  lcd_print_at ( line[3], 0, 3 );
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.