struc unterprogramm call by reference



  • moin,
    hab da ein kleines prob.,
    wie bekooem ich c dazu das er in der ausgabe wieder von struc platz 0 anfängt??
    ich möchte eine reihe von adressen einlesen und alle in eins wieder ausgeben.

    #include <stdio.h>
    
    #define   max 200
    
      struct adressen
      {
        char name[21];
        char forename[21];
      };
    
    int i, n, auswahl, miss, ende=0, anzahl=0;
    
    void anzeige  (struct adressen *p_adi, int anzahl);
    void eingeben (struct adressen *p_adi, int *p_anzahl);
    
    /* +++ Main Programm +++ */
    
    int main (void)
    {
    do
    {
      struct adressen adi[max]; 
      struct adressen *p_adi = adi;
    
      do
      {
        auswahl = 0;
        miss = 0;
    
    	printf("  1 - Alle Adressen ausgeben\n");
    	printf("  2 - Adresse eingebenn\n");
    
        miss = scanf("%d", &auswahl);          
    	fflush (stdin);
        if ((auswahl<0) || (auswahl>4) || (miss==0))
    	{
          printf("ungültige eingabe, 0-4\n\n");
          miss=0;
    	}
      }while (miss==0);
    
      switch (auswahl)
      {
        case 1:  anzeige(p_adi, anzahl);
                 break;
    
        case 2:  eingeben(p_adi, &anzahl);
                 anzahl++;
                 p_adi++;
                 break;
    
    ........default usw....
      };
    return 0;
    };
    
    /* +++++ Sub-Programm +++++ */
    
    /* + anzeigen der daten + */
    
    void anzeige (struct adressen *p_adi, int anzahl)
    {
      for (i=0; i<anzahl; i++)
      {
        printf("%s " 	, p_adi->forename);
        printf("\n\n");
       };											
    };
    
    /* + eingeben der daten + */
    
    void eingeben (struct adressen *p_adi, int *p_anzahl)
    {
      printf("Vorname eingeben: ");
      scanf("%s", p_adi->forename);
      fflush(stdin);
    }
    


  • Bin nicht ganz sicher was du willst.
    Vielleicht folgendes ?

    case 1:  
                 /* alle adressen ausgeben */
                 anzeigen( adi, anzahl ); /* adi zeigt auf adi[0] */
                 break;
    

    Kurt



  • ich hab das gefühlder pointer zeigt nicht auf die richtige stelle...
    er sollte beim ersten anfangen beim einlesen und bei der ausgabe möchte ich natürlich wieder an den anfang... aber wie komme ich dahin?



  • Vielleicht, schreibst du noch mal genau was dein Problem ist. Das ist alles andere als klar. Nimm dir ruhig etwas Zeit. Das Ding ist folgendes. Je besser wir dein Problem verstehen desto wahrscheinlicher ist es dass du eine Antwort bekommst.

    In deinem ersten Posting steht keine Frage und dein letztes Posting ergibt garkeinen Sinn, wenn man sich nich zufällig in dein Gehirn eingeklinkt hat.



  • @taugenichts
    Die Lösung hat dir doch schon ZuK geschrieben. Du darfst an Anzeige nicht p_adi, was auf das Element nach deiner zuletzt eingegebenen Adresse zeigt, übergeben, sondern du musst adi, was auf das erste Element bzw. die erste Adresse zeigt, übergeben.

    Beispiel:
    1 Mustermann Manfred
    2 Schüler Klaus
    3 Meier Bernhard
    4

    adi zeigt auf 1
    p_adi zeigt auf 4

    Wenn du nun p_adi an anzeige() übergibst, bekommst du natürlich schmarrn.

    Alles klar?



  • Hi.
    Habe gerade bemerkt dass in der funktion anzeige() noch ein fehler ist.

    void anzeige (struct adressen *p_adi, int anzahl)
    {
      for (i=0; i<anzahl; i++)
      {
        printf("%s "     , p_adi->forename);
        printf("\n\n");
        p_adi++; /* pointer incrementieren zeigt jetzt auf die nächste adresse */
       };                                           
    }
    

    K.


Anmelden zum Antworten