C in String-array basteln, brauche Hilfe

Gast #5102445
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
#5102450
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.
#5102454
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.
#5102463
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.
#5102478
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
}
Gast #5102494
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 );
}
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren