Hallo,
wir haben eine Definition für arrays ( in C )bekommen
1
// Definition for arrays:
2
// typedef struct arr_##name {
3
// int size;
4
// type *arr;
5
// } arr_##name;
6
//
7
// arr_##name alloc_arr_##name(int len) {
8
// arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};
9
// return a;
10
// }
11
//
12
//
ein Array, der als Parameter in einer Funktion kommt ist z.B.
1
moves: ["s4", "s1", "s2"]
Jetzt möchte ich zunächst die länge (also Anzahl der Elemente) des
Arrays ermitteln. Dann wollte ich eine schleife machen und auf jedes
einzelne Element zugreifen.
1
int moveLength = sizeof(moves)/sizeof(moves[0]);
Allerdings bekomme ich die Fehlermeldung:
file.c on line 16:48: error: subscripted value is neither array nor
pointer nor vector
int moveLength = sizeof(moves)/sizeof(moves[0]);
Zu meinem zweitem Schritt komme ich ja schon gar nicht.
Wie bekomme ich denn die Anzahl der Elemente und vor allem, wie kann ich
dann darauf zugreifen?
Was bedeuten die zwei definitionen? Bzw. was kann ich mit denen machen?
Felix
Felix schrieb:> int moveLength = sizeof(moves)/sizeof(moves[0]);
Das ist korrekt.
Der von Dir gepostete Rest aber hat mit C nur wenig zu tun.
> typedef struct arr_##name
## ist in Bezeichnern nicht zulässig.
> // arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};
Diese Zuweisung kann so irgendwie nicht funktionieren. Was soll das
sein?
> moves: ["s4", "s1", "s2"]
Was auch immer das ist, mit C hat auch das nichts zu tun.
Zeige Deinen tatsächlichen Code, nicht dieses wirre Zeug.
so steht es dort.
Ein Funktionsaufruf wäre z.B. mit den Parametern:
playercount: 4
moves: ["c", "s5", "c", "s4", "s1", "c", "s3", "s2"]
Damit sollen wir was berechnen und das Ergebnis ausgeben. Das Berechnen
ist nicht wirklich das Problem. Aber auf die Werte zugreifen verstehe
ich nicht wirklich.
Ich kenne es eigentlich so, dass ich mit der eckigen Klammer auf einen
wert zugreifen kann. Z.B.
moves[1] ist "s5".
Felix schrieb:> moves: ["c", "s5", "c", "s4", "s1", "c", "s3", "s2"]
Nochmals, um Rufus zu rezitieren: das ist kein C.
Du sprichst für uns in Rätsel.
Grüsse,
René
> arr_integer guno(int playercount, arr_string moves) { ... }
Auf die Länge kommst du mit moves.size, auf die Elemente mit
moves.arr[i].
Sieht mir nach Schule aus und ich finde es ziemlich traurig, was der
Lehrer da anstellt. Anfängern mit irgendwelchen Macrotricksereien das
Leben schwer machen und dann noch verpönte Sachen wie Structure-passing
benutzen ...
foobar schrieb:> Sieht mir nach Schule aus
Natürlich ist es Schule, aber ohne gesamte Aufgabenstellung muss man
mutmassen. Es lässt sich alles erschliessen, aber ehrlich gesagt, ist es
mir das nicht Wert wenn der TO nur Stückchen präsentiert.
Grüsse,
René
Rufus Τ. F. schrieb:> Der von Dir gepostete Rest aber hat mit C nur wenig zu tun.>>> typedef struct arr_##name>> ## ist in Bezeichnern nicht zulässig.
Ich hätte vermutet, dass vor diesem hässlichen Codeblock eigentlich noch
ein #define hätte stehen müssen.
>> // arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};>> Diese Zuweisung kann so irgendwie nicht funktionieren.
Das ist keine Zuweisung, sondern eine Initialisierung. Warum soll die
nicht funktionieren? Es ist nur ziemlich hässlicher Code.
>> moves: ["s4", "s1", "s2"]>> Was auch immer das ist, mit C hat auch das nichts zu tun.>> Zeige Deinen tatsächlichen Code, nicht dieses wirre Zeug.
Das "wirre Zeug" wird vermutlich das sein, was er von seinem Lehrer
bekommen hat.
foobar schrieb:> Sieht mir nach Schule aus und ich finde es ziemlich traurig, was der> Lehrer da anstellt.
Wenn man so C beigebracht bekommt, kann das eigentlich nix werden. Ich
bin ganz froh, dass ich C schon einigermaßen konnte, als uns das ein
Prof beibringen wollte. Hätte ich es nach dem Nonsens gelernt, den der
verzapft hat, hätte ich keine Chance gehabt, das zu verstehen.
Rolf M. schrieb:> ätte ich es nach dem Nonsens gelernt,
Da sagst Du was. Mein Prof meinte zB. i++++;
Ist i=i+2;
(Was haben wir gelacht ....).
Grüsse,
René
Hallo,
die Aufgebenstellung habe ich nicht mit angegeben, da diese für mein
Problem irrelevant ist. Aber gerne trage ich diese nach
Guno, a variant of Uno, is a card game where players score points for
each card discarded from their hand during the round. Action cards
(Skip, Draw Two and Reverse) are worth 20 Points while Wild and Wild
Draw Four cards are worth 50 Points. All other coloured cards are worth
0. The only difference between Uno and Guno is how the scoring works -
in Uno, your score is the sum of cards in your hand at the end of the
game, while in Guno, your score increases as you discard each card.
You and your friends have just finished a game of Guno and you are all
unable to agree on everyone's score. Hence, you have decided to write an
algorithm to calculate each player's score.
Given an integer playercount representing the number of players, and an
array moves representing each of the cards that were played, in the
order in which they were played, your task is to return an array
containing each player's score.
The moves array contains the following types of cards:
c - A coloured card (colour and number irrelevant); 0 points awarded
s1 - A skip; 20 points awarded, and the next player skips their turn
s2 - A draw two; 20 points awarded
s3 - A reverse; 20 points awarded, and the turn order is reversed
s4 - A wild draw four; 50 points awarded
s5 - A wild; 50 points awarded
Example:
For playercount = 4 and moves = ["c", "s5", "c", "s4", "s1", "c", "s3",
"s2"], the output should be guno(playercount, moves) = [20, 50, 20, 70].
Input / Output
[input] integer playercount
The number of players playing. This will determine the length of the
outputted array.
Guaranteed constraints:
2 ≤ n ≤ 4
[input] array.string moves
An array representing all the cards played, in the order in which they
were played.
Guaranteed constraints:
0 ≤ moves.length ≤ 105
moves[i] ∈ {"c", "s1", "s2", "s3", "s4", "s5"}
[output] array.integer
An array of integers containing the score of each player. For example,
in a game with 3 players, the first player's score would be at index 0
and the last player's score would be at index 2.
[C] Syntax Tips
// Prints help message to the console
// Returns a string
char * helloWorld(char * name) {
char * answer = malloc(strlen(name) + 8);
printf("This prints to the console when you Run Tests");
strcpy(answer, "Hello, ");
strcat(answer, name);
return answer;
}
foobar schrieb:> Auf die Länge kommst du mit moves.size, auf die Elemente mit> moves.arr[i].
die größe bekomme ich, aber auf das Element wird irgendwie nicht
zugegriffen
Input:
playercount: 3
moves: ["s4", "s1", "s2"]
{code}
arr_integer guno(int playercount, arr_string moves) {
int playerCountArray[playercount];
int player = 0;
printf("%d \n", moves.size);
for(int x=0; x<moves.size; x++)
{
if(moves.arr[x]=="c") { printf("c "); }
else if(moves.arr[x]=="s1") { printf("s1 "); }
else if(moves.arr[x]=="s2") { printf("s2 "); }
else if(moves.arr[x]=="s3") { printf("s3 "); }
else if(moves.arr[x]=="s4") { printf("s4 "); }
else if(moves.arr[x]=="s5") { printf("s5 "); }
}
}{/code}
Jetzt wird nur eine 3 Ausgegeben (größe des arrays). Aber ansonsten wird
nichts ausgegeben.
Gruß Felix
> Wie schwer fällt es eigentlich, den Text hier wenige Zentimeter> oberhalb der Eingabebox zu lesen?
Schau dir doch mal den Text des Lehrers mit seinen schlampigen und
ständig wechselnden Notationen an, dann weißt du, in welche Richtung der
seine Schüler trainiert: Genauigkeit und Exaktheit ist nebensächlich,
ihr wißt ja, wie es gemeint ist. Dumm nur, dass es beim Programmieren
genau darauf ankommt :-(
Rufus Τ. F. schrieb:> Der von Dir gepostete Rest aber hat mit C nur wenig zu tun.>>> typedef struct arr_##name>> ## ist in Bezeichnern nicht zulässig.>>> // arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};>> Diese Zuweisung kann so irgendwie nicht funktionieren. Was soll das> sein?
Mittels ## kann man den Preprocessor anweisen, zwei Zeichenketten
miteinander zu verbinden.
https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html
Rolf M. schrieb:> Das "wirre Zeug" wird vermutlich das sein, was er von seinem Lehrer> bekommen hat.Cyblord -. schrieb:> So muss es aussehen wenn E-Techniker Schülern das Programmieren> beibringen. Gruselig.Johnny B. schrieb:>>> // arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};>>>> Diese Zuweisung kann so irgendwie nicht funktionieren. Was soll das>> sein?>> Mittels ## kann man den Preprocessor anweisen, zwei Zeichenketten> miteinander zu verbinden.> https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html
Ich finde das toll: genau so muss der Erstkontakt mit C erfolgen, denn
nur so wird den Lenrnenden die Lust darauf komplett vergällt.
Allen Entscheider und Mitentscheider die darauf bestehen dass weiterhin
mit C zu programmieren sei wünsche ich ebenfalls solchen und nur solchen
Quellcode an den Hals.
Programmiersprachentheaterintendant schrieb:> Allen Entscheider und Mitentscheider die darauf bestehen dass weiterhin> mit C zu programmieren sei wünsche ich ebenfalls solchen und nur solchen> Quellcode an den Hals.
Lieber diesen C Code aus der Hölle als dein Pascal. Das kannste aber
wissen Junge.