Wert im Array zugreifen

Gast #5540669
Lesenswert?

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
Persönliche Seite #5540701
Lesenswert?

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.
Gast #5540718
Lesenswert?

Ähm, das ist tatsächlich.
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
//
13
arr_integer guno(int playercount, arr_string moves) {
14
}

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".
Gast #5540738
Lesenswert?

> 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 ...
#5540794
Lesenswert?

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.
Gast #5542348
Lesenswert?

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
Gast #5542413
Lesenswert?

> 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 :-(
#5553050
Lesenswert?

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
Gast #5553183
Lesenswert?

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.
#5553897
Lesenswert?

Vielleicht ist der Dozent ein Fan vom "The International Obfuscated C 
Code Contest".
https://www.ioccc.org/
Aber ich finde auch, dass solcher Code völlig ungeeignet ist um C zu 
lernen.

Beispiel https://www.ioccc.org/2018/burton1/hint.text
1
  char     O,o[  20];L(O){
2
  putchar  ( O+  48+39  *(9<
3
  O));}    I(O)  {L(~     15);
4
  O|| puts(o);}  main     (l){
5
  for(;~(l=getchar())     ;I(O
6
  &=15     ))o[  O++      ]=4<
7
  (4^l     >>5)  ?l:     46,L
8
  (l>>     4),L  (l&15);O&&
9
  I(o[     O]=0  );}//157c

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