Forum: PC-Programmierung Wert im Array zugreifen


von Felix (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Felix (Gast)


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".

von René H. (Gast)


Lesenswert?

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é

von foobar (Gast)


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 ...

von René H. (Gast)


Lesenswert?

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é

von Rolf M. (rmagnus)


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.

: Bearbeitet durch User
von René H. (Gast)


Lesenswert?

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é

von Felix (Gast)


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

von A. S. (Gast)


Lesenswert?

Felix schrieb:
> if(moves.arr[x]=="s1")

schau mal "strcmp" und generell was strings sind

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Felix schrieb:
> {code}

Wie schwer fällt es eigentlich, den Text hier wenige Zentimeter oberhalb 
der Eingabebox zu lesen?

von foobar (Gast)


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 :-(

von Johnny B. (johnnyb)


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

von Cyblord -. (cyblord)


Lesenswert?

So muss es aussehen wenn E-Techniker Schülern das Programmieren 
beibringen. Gruselig.

von Programmiersprachentheaterintendant (Gast)


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.

von Johnny B. (johnnyb)


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

von Cyblord -. (cyblord)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.