C in String-array basteln, brauche Hilfe

Gast #5102445
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
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
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
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
@ 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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.