Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

03.06.2011, 18:13

Erm... man kann jeder Variable etwas zuweisen, nicht nur Pointern. Nur die Datentypen müssen passen.

C-/C++-Quelltext

1
2
3
4
5
6
7
int x = 5;
float y = 0.5f;
std::string s = "foobar";

struct foo a;
struct foo b;
a = b;
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

12

03.06.2011, 18:23

Erm... man kann jeder Variable etwas zuweisen, nicht nur Pointern. Nur die Datentypen müssen passen.

Naja, ich dachte weil hptr weder Zeiger noch ein Array ist.
liste[i] ist ja eine Adresse, oder lieg ich da falsch? Und kann ich die Adresse einfach einer struct Variablen zuweisen?

Gleich noch eine Frage. Kann man liste[i] eigentlich "leeren"? Ich möchte eine Position aus der Liste löschen, was auch jetzt schon geht, indem ich den gesuchten Eintrag nach hinten kopiere und den Zähler um 1 verringere aber die Daten bleiben theoretisch ja noch da. Ist aber nicht so dringend, es geht auch so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void kuendigen(struct personal liste[], int *zaehler)
{
    int i=0, j=0;
    unsigned long nr=0;
    char antw='n';

    printf("Welche Pers.Nr.? ");
    scanf("%lu",&nr);

    for(i=0; i<(*zaehler); i++)
    {
        if(liste[i].nummer == nr)
        {
            printf("%s wirklich loeschen? (j/n) [n]: \n", liste[i].pname);
            fflush(stdin);
            scanf("%c",&antw);

            if(antw == 'j')
            {
                liste[i].nummer = 0;

                for(j=i; j<(*zaehler)-1; j++)
                {
                    liste[j]=liste[j+1];
                }
                *zaehler=(*zaehler)-1;
            }
            else
            {
                printf("%s wird nicht geloescht!\n", liste[i].pname);
            }
        }
    }
}
[/i]
„lean over the bowl and then take a dive all of you are dead. i am alive“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

03.06.2011, 18:51

liste[ i ] ist ja eine Adresse, oder lieg ich da falsch?

Ja, da liegst Du falsch. liste[ i ] ist ein struct. Genau so ist liste ja definiert. Als Array von Structs.
&struct[ i ] wäre eine Adresse.
Ich glaub Dir fehlen noch ein paar Grundlagen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

14

03.06.2011, 19:55

Ok, nochmal in meinen Skripten nachgeschlagen:

Quellcode

1
2
int *iptr;
int b[4];


Zeiger:

Quellcode

1
&b[i], b+i, iptr+i


Inhalt:

Quellcode

1
b[i], *(b+i), *(iptr+i)



Ich weise als den Inhalt

Quellcode

1
liste[i]
vom Typ struct personal der Variablen hptr vom Typ struct personal zu.
liste selbst müsste aber die Adresse vom ersten Element sein.
„lean over the bowl and then take a dive all of you are dead. i am alive“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

03.06.2011, 20:01

"liste" ist ein Array. In Deinem Fall da auch "b". Das ist keine Adresse, sondern eine Variable eines Array-Typs. "&b[0]" ist die Adresse des ersten Elements.

(Für die Klugscheißer: Ja, in C kann man eine Array-Variable in eine Adresse umcasten, das ist allerdings semantisch nicht sonderlich sinnvoll, auch wenn technisch korrekt)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

16

03.06.2011, 20:08

Stimmt stimmt, allerdings wird das & nicht wirklich oft benötigt, weder bei Übergabe an Funktion, beim Befüllen durch scanf (char array) oder beim zuweisen an Pointer-Variable.

Quellcode

1
2
3
4
5
6
char b[50];
char *cptr;

cptr=b;
scanf("%[^\n]s",b);
sort(b);


Wenn du allerdings sagst, dass b keine Adresse ist, dann ist folgender Satz (aus meinen Skripten) etwas falsch:
*(b+i) bedeutet, gehe von Anfangsadresse b um i Elemente weiter und nehme dort den Wert.
„lean over the bowl and then take a dive all of you are dead. i am alive“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

03.06.2011, 21:20

Es ist ein Unterschied zwischen Semantik und Technik. Technisch gesehen ist ein Array ein linearer Speicherbereich. Zumindest unter C/C++. Und somit ist die Variable selbst technisch gesehen ein Pointer auf den Anfang des Bereichs. Eine Addition und Dereferenzierung führt also zu einem Zugriff [*(b+i)], der identisch ist zu b[ i ].
Semantisch gesehen ist ein Array aber ein Array und und kein Zeiger auf einen Speicherbereich.
Ob der &-Operator also benötigt wird oder nicht, das ist nicht die Frage. Die Frage ist, ob die Semantik verschleiert werden sollte oder nicht.

Meiner Meinung macht das hier mehr Sinn:

C-/C++-Quelltext

1
2
int foo[10];
int* firstElement = &foo[0];

Als das hier:

C-/C++-Quelltext

1
2
int foo[10];
int* firstElement = foo;

Das heißt nicht, dass ich die erste Variante persönlich auch im Code schreibe, da mir die Bedeutung des Codes klar ist.
Aber auf die Idee zu kommen eventuell ein "delete firstElement" zu machen (was böse endet) ist beim zweiten Beispiel deutlich wahrscheinlicher (für Außenstehende oder beim Überfliegen des Codes) als im ersten, da im ersten die Semantik eindeutig die Adresse des ersten Elements ist und nicht die Zuweisung eines dynamisch allozierten Speichers über Pointer.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

18

03.06.2011, 21:26

Zumindest hätte man optisch keinen Bruch wenn man z.B. einen Call By Reference macht oder einen scanf.
„lean over the bowl and then take a dive all of you are dead. i am alive“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

03.06.2011, 21:32

Na ja, semantisch wäre die Verwendung von &b[0] als Übergabe eines ganzen Arrays by Reference auch nicht vernünftig. Es geht ja in diesem Fall nicht um die Adresse des ersten Elements, sondern um den ganzen Array. Da sollte man dann schon b übergeben ;)
In C++ wird insgesamt gerne geschludert, wenn es um Parameter geht. Arrays werden meist einfach als Pointer in der Funktions-Signatur deklariert. Besser wäre eine Referenz auf einen Array als Parameter. Dann wäre auch klar, was man genau übergeben muss. Einen Pointer auf eine Variable? Einen Array? Eine Referenz auf einen Array? Ein Pointer auf einen Array? Ist semantisch ja eben doch nicht alles das Selbe.

C-/C++-Quelltext

1
2
3
4
void foo(int* pointer);
void foo(int(&array) [100]);
void foo(int array[]);
void foo(int& single);


Aber wie gesagt, es geht hier nur um die Semantik. Technisch gesehen ist es eh das Gleiche und es kompilieren alle Varianten auch zu genau dem selben Code und genau deswegen schreiben in C++ eben viele doch einfach nur "int*". Und genau das führt oft auch zu hässlichen Fehlern beim Aufruf solcher Methoden ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »BlueCobold« (03.06.2011, 21:41)


20

04.06.2011, 08:13

Alles oft ganz logisch aber auch wieder verwirrend. Strukturen haben wir erst gelernt (ausser Verkettete Strukturen), davor waren Zeiger und dyn. Speicherverwaltung dran und auch wenn wir einige Übungen gemacht haben braucht man wohl noch viel mehr Praxis um das Zeug wirklich Intus zu haben. In diesen Themen und Dateizugriff (evtl. auch argv) schreiben wir diese Woche eine Arbeit :-(
„lean over the bowl and then take a dive all of you are dead. i am alive“

Werbeanzeige