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

1

03.06.2011, 17:29

[C] Adressen umhängen bei einfachem Strukt-Array möglich?

Adressen umhängen in einer Funktion, also sortieren eines
struct xyz *liste[10]
ist problemlos möglich
aber wie sortiere ich möglichst einfach ein
struct xyz liste[10]
???

Dieses Beispiel funktioniert (Funktion zum befüllen hab ich weglassen):
============================================

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
35
36
37
38
39
40
41
void sort(struct personal *liste[], int zaehler);

int main()
{
    int zaehler=0;
    struct personal *liste[10]={NULL};

    sort(liste, zaehler)

    _getch();
    return 0;
}

void sort(struct personal *liste[], int zaehler)
{
    struct personal *hptr=NULL;
    int mini = 0;
    int i=0, j=0;

    printf("Es wird nach Namen sortiert\n");

    for(i=0; i<zaehler-1; i++)
    {
        mini = i;
        for(j=i+1; j<zaehler; j++)
        {
            if(strcmp(liste->pname,liste[j]->pname) > 0)
            {
                mini = j;
            }
        }

        hptr=liste;
        if(strcmp(liste->pname,liste[mini]->pname) != 0)
        {
            printf("Tausche: %s mit %s\n", liste->pname, liste[mini]->pname);
        }
        liste=liste[mini];
        liste[mini]=hptr;
    }
}
„lean over the bowl and then take a dive all of you are dead. i am alive“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »JoeChip« (03.06.2011, 18:02)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

03.06.2011, 17:50

Für mich sieht dein Code sehr abenteuerlich aus, aber was spricht dagegen, einfach die Startadresse von liste[10] zu übergeben?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

03.06.2011, 17:51

Genauso, nur ohne 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]

4

03.06.2011, 17:52

Für mich sieht dein Code sehr abenteuerlich aus, aber was spricht dagegen, einfach die Startadresse von liste[10] zu übergeben?

Wieso abenteuerlich? Is halt nur ein Ausschnitt oder soll ich die 479 Zeilen des ganzen Programms posten?
Ich probier aber mal den Vorschlag mit Startadresse, das hört sich gut an.
Aber, wenn ich liste übergebe, ist das doch bereits die Startadresse, oder?

@BlueCobold: Wo ohne Pointer? Wie kann ich dann Adressen umhängen?
„lean over the bowl and then take a dive all of you are dead. i am alive“

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

5

03.06.2011, 17:56

Du kannst in einem Array nicht einfach Adressen "umhängen", da die Strukturen am Stück im Speicher liegen. Du könntest aber die Strukuren mit memcpy kopieren, und sie dann "umsortieren".

C-/C++-Quelltext

1
void * memcpy ( void * destination, const void * source, size_t num );

Wenn du dir das Leben leicht machen willst solltest du dir qsort ansehen.

C-/C++-Quelltext

1
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

Was für eine Compiler benutzt du eigentlich? Wenn er den c99 Standard unterstützt dann solltest du auch die neuen Features verwenden. Das kann den Code wesentlich übersichtlicher machen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Aus
void foo(void)
{
    int j, i;
    for(i = 0, i < 10, i++)
    {
         for(j = 0, j < 10 , j++)
         {
              //Mach was
         }
    }
}

//Wird
void fooC99(void)
{
    for(int i = 0, i < 10, i++)
    {
         for(int j = 0, j < 10 , j++)
         {
              //Mach was
         }
    }
}

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »foreach« (03.06.2011, 18:05)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

03.06.2011, 17:56

Du kannst keine Adressen umhängen, wenn Du nicht mit Adressen arbeitest. Du kopierst dann die gesamten Structs. Zum Glück macht C das schon ganz allein, ohne memcopy.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
struct personal liste[10];
...
struct personal hptr;
hptr=liste[i];
if(strcmp(liste[i].pname,liste[mini].pname) != 0)
{
printf("Tausche: %s mit %s\n", liste[i].pname, liste[mini].pname);
}
liste[i]=liste[mini];
liste[mini]=hptr;
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]

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

03.06.2011, 17:58

Benutz bitte die Code Tags. Sonst ist es ein graus das zu lesen.

8

03.06.2011, 18:06

Du kannst keine Adressen umhängen, wenn Du nicht mit Adressen arbeitest. Du kopierst dann die gesamten Structs. Zum Glück macht C das schon ganz allein, ohne memcopy.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
struct personal liste[10];
...
struct personal hptr;
hptr=liste[i];
if(strcmp(liste[i].pname,liste[mini].pname) != 0)
{
printf("Tausche: %s mit %s\n", liste[i].pname, liste[mini].pname);
}
liste[i]=liste[mini];
liste[mini]=hptr;

Das klappt tatsächlich !!!
Wie kann ich direkt in 'struct personal hptr' kopieren ?!
„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

9

03.06.2011, 18:10

Mit dem Zuweisungsoperator, so wie es da steht? Oder was meinst Du mit "in XXX direkt kopieren"?
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]

10

03.06.2011, 18:12

Mit dem Zuweisungsoperator, so wie es da steht? Oder was meinst Du mit "in XXX direkt kopieren"?

Ja, das klappt aber wieso? hptr ist doch kein Zeiger, wie kann ich das so einfach zuweisen? Also theoretisch ist mir nicht ganz klar wieso das funktioniert.
„lean over the bowl and then take a dive all of you are dead. i am alive“

Werbeanzeige