Erstes Arrayelement löschen C < Wettbewerbe < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 09:17 Di 13.10.2009 | Autor: | Paul94 |
Hi!
Ich versuche mich gerade an C, bin aber auf das Problem gestoßen, das ich bei einem Array das erste Element löschen möchte. In PHP würde ich array_shift verwenden, aber soweit ich weiß gibt es diese Funktion in C nicht.
Wäre nett, wenn ihr mir helfen könntet,
Paul
|
|
|
|
Hallo Paul94,
> Ich versuche mich gerade an C, bin aber auf das Problem
> gestoßen, das ich bei einem Array das erste Element
> löschen möchte. In PHP würde ich array_shift verwenden,
... oder in Python: a=[1,2]; del a[0] ergibt a==[2] (aber dort ist a eigentlich eine Liste.)
> aber soweit ich weiß gibt es diese Funktion in C nicht.
In C geht das nicht so einfach. Es kommt natürlich auf den Kontext an, wo du das Array verwenden möchtest, aber ein allgemeiner Ansatz, der vermutlich in jedem Programm funktionieren sollte, wäre all deinen Arrays dynamisch mittels malloc() (new[] in C++) Speicher zuzuweisen. Dadurch könntest du beim Löschen eines Elements das erste Array in ein Anderes ohne das zu löschende Element umkopieren und danach das erste Array löschen.
Eine andere Möglichkeit wäre vielleicht bestimmte Elemente im Array als gelöscht zu markieren und die Programmlogik danach auszurichten. Oder man verwendet eine verkettete Liste.
Grüße
Karl
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:10 Di 13.10.2009 | Autor: | Paul94 |
Hi!
Kannst du mir dazu bitte ein Beispiel posten?
Danke, Paul
|
|
|
|
|
> Kannst du mir dazu bitte ein Beispiel posten?
Ok, hier ein Beispiel. Da der Zeigertyp hier int* ist, müßte der Compiler Konstrukte, wie *(pa+i) richtig interpretieren, d.h. intern sollte der Compiler so etwas machen: *(pa+sizeof(int)*i). Ob das bei deinem Compiler der Fall ist, kannst du an der Ausgabe der Zeiger erkennen. Falls dem nicht so ist, mußt du den gesamten Code entsprechend anpassen.
1: |
| 2: | #include <stdio.h>
| 3: | #include <stdlib.h>
| 4: |
| 5: | void del_arr_elem(int** pparr_in, int* pcnt_arr_in_elem, int i_elem_to_del) {
| 6: | /* alloziere Speicher fuer array mit einem element weniger */
| 7: | int* parrtmp; parrtmp = malloc(sizeof(int)*(*pcnt_arr_in_elem-1));
| 8: |
| 9: | int kadjust; kadjust = 0; /* array-index fuer arrtmp */
| 10: |
| 11: | int k; for(k = 0; k < *pcnt_arr_in_elem; k++)
| 12: | if(k == i_elem_to_del)
| 13: | continue; /* kadjust "hinkt" k ab hier um 1 element "hinterher". */
| 14: | else {
| 15: | *(parrtmp+kadjust) = *(*pparr_in+k);
| 16: | kadjust++;
| 17: | }
| 18: |
| 19: | *pcnt_arr_in_elem = *pcnt_arr_in_elem - 1;
| 20: |
| 21: |
| 22: | free(*pparr_in);
| 23: | *pparr_in = parrtmp;
| 24: | }
| 25: |
| 26: | int main(int argc, char* argv[]) {
| 27: | /* a = [1,2,3] */
| 28: | int* pa; pa = malloc(sizeof(int)*3);
| 29: | int i; for(i = 0; i < 3; i++) {
| 30: | printf("pointer: %d\n", pa+i);
| 31: | *(pa+i) = i+1;
| 32: | }
| 33: |
| 34: | /* print(a) */
| 35: | for(i = 0; i < 3; i++) {
| 36: | printf("%d\n", *(pa+i));
| 37: | }
| 38: |
| 39: | printf("del a[1]; print(a)\n");
| 40: | int dummy; dummy=3;
| 41: | del_arr_elem(&pa, &dummy, 1);
| 42: |
| 43: | for(i = 0; i < dummy; i++) {
| 44: | printf("zeiger: %d, inhalt: %d\n", pa+i, *(pa+i));
| 45: | }
| 46: |
| 47: | printf("del a[0]; print(a)\n");
| 48: | del_arr_elem(&pa, &dummy, 0);
| 49: |
| 50: | for(i = 0; i < dummy; i++) {
| 51: | printf("zeiger: %d, inhalt: %d\n", pa+i, *(pa+i));
| 52: | }
| 53: |
| 54: | return 0;
| 55: | }
|
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:08 Mi 14.10.2009 | Autor: | Paul94 |
Vielen Dank, du hast mir sehr geholfen.
Paul
|
|
|
|