C Frage zur grafischen Darstellung eines Arrays

ElektroBayern

Newbie
Registriert
Jan. 2020
Beiträge
2
Hallo liebes Forum,

ich hätte eine kurze Frage zur grafischen Darstellung von Arrays.

Gegeben ist folgender Array:
C:
#define STR_SIZE 20


char AlgorithmName[][STR_SIZE] = {"Anton", "Berta", "Cäsar", "Dieter", "Erwin"};

Heißt das, man könnte diesen Array als 5 x 20-Matrix darstellen? Wie würde das aussehen und welche Werte stehen dann z.B. in den ersten beiden Zeilen?

Vielen Dank für eure Hilfe!
ElektroBayern
 
Unter der Annahme, dass man in C überhaupt Arrays generisch definieren kann (was ich gerade nicht testen will): ja. Fünf Zeilen, zwanzig Spalten, klassisches zweidimensionales Array. Was in den Zeilen steht sollte sich von selbst ergeben, wenn man sich zu zweidimensionalen Arrays einliest. Schau dazu mal hier und hier.
Was dann in den einzelnen Zellen steht kannst du selbst sehr schnell herausfinden, wenn du das einfach als Programm umsetzt und im Debugging schaust was drin steht. Damit kannst du deine theoretischen Überlegungen auch direkt belegen oder merkst, dass da ein Fehler drin war :)
 
  • Gefällt mir
Reaktionen: BAGZZlash und Revan1710
Mal den Zusammenhang String/Char in C angucken. Dann wird das klarer.
 
  • Gefällt mir
Reaktionen: Nero1
Lass dir doch einfach mal ausgeben, was in dem Array drinsteht:

Code:
int rows = sizeof(AlgorithmName)/sizeof(AlgorithmName[0])
int columns = sizeof(AlgorithmName[0])/sizeof(AlgorithmName[0][0]) // STR_SIZE
int i,j;

for (i = 0; i < rows; i++)
{
    for (j = 0; j < columns; j++)
    {
        printf("Element[%d][%d]: %c\n", i,  j, AlgorithmName[i][j]);
    }   
}

Hab den Code jetzt aber nicht getestet, steckt also evtl. noch ein Übungsfehler drin
 
Wie @RalphS bereits schreibt, in C werden Strings ganz platt als Array of Character behandelt. Die Initialisierung sieht damit eigentlich so aus:
Code:
char AlgorithmName[][STR_SIZE] = { {'A', 'n', 't', 'o', 'n' }, {'B', ...}, {'C', ...}, {'D', ...}, {'E', ...};
Dabei wird die Anzahl der Elemente der ersten Ebene implizit bei die Initialisierung auf 5 festgelegt.
 
Die Antwort auf die Eingangsfrage ist hier im Sprachstandard zu finden. In kurz, ja, es ist als Matrix darstellbar und die nicht benötigten Spalten jeder Zeile sind mit \0 initialisiert.
@new Account() Ich hab nachgelesen, und es ist interessanterweise tatsächlich kein Fehler, wenn das Array zu klein für den Nullterminator ist.
 
  • Gefällt mir
Reaktionen: KillerCow
Der Dieter ist evtl einen Blick wert.
In C gehen viele lustige Dinge, die keinen echten Sinn ergeben außer in C Programmen. Da muß man selbst immer ein bißchen aufpassen. Wenns um Strings geht, sind wir sofort bei Pointern und dann haben wir eine, zwei, n viele Abstraktionen und Pointerarithmetik.
 
  • Gefällt mir
Reaktionen: KillerCow
simpsonsfan schrieb:
@new Account() Ich hab nachgelesen, und es ist interessanterweise tatsächlich kein Fehler, wenn das Array zu klein für den Nullterminator ist.
Das was du er geschrieben hast, ist Aber falsch:
KillerCow schrieb:
Die Initialisierung sieht damit eigentlich so aus:

Und nein, es ist kein Fehler folgendes zu schreiben, Aber es ist dann auch kein string mehr und, wenn man anderes annimmt, passieren merkwürdige Dinge:
chars s[3]="123"
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: simpsonsfan und KillerCow
Ich weiß jetzt nicht recht, mit welchem deiner Sätze du dich auf mich beziehst, aber klar. Der Nullterminator fehlt dann, wenn das Array zu klein ist. Ich hätte nur angenommen, dass der Compiler dann einen Fehler bzw. eine Warning ausspuckt, so wie das passiert, wenn die restlichen Character nicht ins Array passen.
 
C, Fehler werfen weil es Sinn ergibt? :D

Ich bin auch irgendwie über die Matrix gestolpert. Definiert ist eine 5x20, aber verwendet wird (sinngemäß) eine 5x5, auch wenn ein Eintrag länger ist und auch wenn ja noch die Stringterminatoren fehlen.

Aber ich hab echt nicht auf dem Schirm gehabt, ob denn C nun mit 5x20
-5 Strings aus 20 Zeichen oder
-20 Strings aus 5 Zeichen anlegt (STR_SIZE ist sicher indikativ, aber nicht konklusiv).

Bei C sollte man sich auf GAR NICHTS verlassen. Wenn man ein zweidimensionales Array anlegt aus 5 x 20 Feldern, dann steht da irgendwas, keine Ahnung, kann 00h in einem Feld sein, aber vorher wissen tut das niemand. Deswegen ist ja C so performant; es tut keine Dinge, die es nicht gesagt kriegt.

Deshalb ist natürlich die Antwort völlig korrekt, daß man
A "Anton" als Literal reinschreiben kann, welches C als Array {'A','n','t','o','n',00} interpretiert; ODER
B daß man jene Interpretation selbst explizit angibt, sprich die fünf Buchstaben PLUS den 00-Terminator, welcher NICHT optional ist. Ohne diesen ist es einfach ein Array aus Zeichen und eben KEIN String.

Und WEIL ein String ein Array aus Zeichen PLUS 00 als Terminator ist, kann C das als Literal verwenden: nämlich indem einfach der Pointer auf das Zeichen am Index 0 im Array zeigt und dann implizit alle Zeichen zurückgegeben werden, bis jener Terminator gefunden wird. Gibt's keinen, weil man ihn vergessen hat, wird eben weitergelesen - irgendwo im Speicher findet sich bestimmt wieder eine 00 irgendwo und dann wird eben bis dorthin gelesen.

Rein von der Sache her kennt C keine Strings. Das, was man da hat, ist einfach ein syntaktischer Shortcut fürs Erstellen und auch fürs Lesen.

Zum Testen kann man ja einfach mal sowas wie
C:
printf("%s", AlgorithmName);
sagen. Da sollte einfach Anton rauskommen.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: KillerCow und Raijin
Ist die weiße Textfarbe beabsichtigt?
Ja, bei deinem printf würde dann "Anton" ausgegeben (und eine Compilerwarnung, dass der Typ von Algorithmname char** statt char* ist).
Durch die Initialisierung mit Klammerliste wird übrigens alles, was nicht angegeben ist, mit 0 initialisiert.
All array elements that are not initialized explicitly are initialized implicitly the same way as objects that have static storage duration.
und weiter
objects with static and thread-local storage duration are initialized as follows
- objects of integral types are initialized to unsigned zero
Schön sichtbar wird das bspw. hier:
Code:
#include <stdio.h>

int main()
{
    int test1[3][4];
    test1[0][0] = 1;
    int test2[3][4] = {{1}};
    return 0;
}
test1 enthält eine 1 und 11 Zufallswerte, test2 enthält eine 1 und 11 Nullen.
RalphS schrieb:
Aber ich hab echt nicht auf dem Schirm gehabt, ob denn C nun mit 5x20
-5 Strings aus 20 Zeichen oder
-20 Strings aus 5 Zeichen anlegt (STR_SIZE ist sicher indikativ, aber nicht konklusiv).
RalphS schrieb:
Rein von der Sache her kennt C keine Strings. Das, was man da hat, ist einfach ein syntaktischer Shortcut fürs Erstellen und auch fürs Lesen.
Weshalb es so gesehen zu einem geweissen Grad egal ist. char[5][20] reserviert Speicher für 100 chars. Beim Zugriff ist char[1][0] letztlich nichts anderes als *(*char+1*20+0).
Da in der Initializer-Bracket fünf StringLiterals angegeben sind, wird in dem Fall der erste Index mit der Größe fünf definiert. Oder anders formuliert, es werden in diesem Fall 5 Strings aus 20 Zeichen angelegt.
 
Zuletzt bearbeitet: (Klammerfehler)
  • Gefällt mir
Reaktionen: RalphS
Weiß? Sorry, ich hab den Darkmode an und mir schlüpfen tatsächlich immer mal irgendwelche Tastenkombinationen versehentlich irgendwelche Formatierungen an; wenn ichs sehe, schalt ich es wieder aus, aber mit dem DM sieht man das Weiß ja nicht.
Hab die Formatierungen jetzt (hoffentlich) entfernt.

Ansonsten... danke für die eingehenden Erläuterungen. Gut, wenn man weiß, unter welchen Umständen C was macht, dann paßt das natürlich wieder. Ich bin definitiv kein C Guru (will auch keiner sein 😉) und denke insbesondere deswegen, daß man - wenn man die Plattform nicht so genau kennt - mehr oder weniger "überall" nochmal ein Extraauge draufhalten sollte, was denn da wirklich gerade passiert. Vor allem, wenn nicht das Erwartete hinten rauskommt. Kann man ja notfalls einfach im Debugger angucken.
 
  • Gefällt mir
Reaktionen: simpsonsfan
Zurück
Oben