Mehrfachpointer, verschiedene datentypen?



  • Hey also ich habe folgende Aufgabe bekommen:
    "Speichern Sie die Namen von n Schülern in einem c-string, desweiteren sollen mündliche Noten(max. 10) und schriftliche Noten(max. 3) dem Schüler zugeordnet werden. Zu lösen ist diese Aufgabe mit Mehrfachpointern. Eingabe und Ausgabe des Namen + Noten selbstverständlich auch. Dies soll desweiteren per dyn. Speicher erfolgen."

    Hier mein bisheriger Quelltext für den Namen:

    char **ptr = new char*[size];    
      for (i=0; i<size; ++i)           
      { ptr[i] = new char[20];         
      }
    

    Nun zu meinen Fragen:
    1. Wie erstelle ich daraus einen Mehrfachpointer mit 4-facher Rangordnung
    2. Es ist normalerweise ja nicht möglich in einem char Pointer int (für die Noten zu speichern) Hat jemand eine Idee zur lösung der aufgabe?

    PS: Es MUSS mit Mehrfachpointern gehen, NICHT mit klassen/strukturen...

    Vielen Dank für eure Hilfe



  • warum solltest du noten nich in chars speichern können

    char val = 5;
    char val_array[6] = { 1,2,3,4,5,6 };
    

    was verstehst du unter vierfacher rangordnung?
    char****
    oder
    char[][][][]



  • Jo klar geht das ^^ gibt es aber eine möglichkeit char Arrays und int arrays per pointer zu "verlinken" ? nein oder?

    btw: weißt du vielleicht den quelltext für nen 4-fachpointer mit namen + 2 notentypen?

    EDIT: Quasi das am ende ptr[][][][] dabei rauskommt...
    Es sollen ausserdem Notenpunkte sein also von 1-15 und char speichert ja nur eine stelle 😕



  • wie verlinken?
    is nich gerade hübsch aber meinst du sowas?

    char* ptr[2] = {NULL,NULL};
    int val[2]= {100,200};
    
    ptr[0] = ( char* ) &val[0];
    ptr[1] = ( char* ) &val[1];
    
    int read_val[2] = { *( int* ) ptr[0], *( int* ) ptr[1] };
    


  • char **ptr = new char*[3*size];    
    for (i=0; i<3*size; i+=3)           
    { 
      ptr[i] = new char[20];
      ptr[i+1] = new char[1];
      ptr[i+2] = new char[1];
    }
    

    Du kannst in einem Char ja entweder eine Zahl zwischen 0 und 255 speichern oder du nimmst einfach das Zeichen '1', '2', ...
    Bzw du nimmst char[2] und speicherst es als "1", "2" (0-terminierter String) und beim Ausgeben machst du:

    cout << "Name: " << ptr[i] << "\tS-Note: " << ptr[i+1] << "\tM-Note : " << ptr[i+2] << endl;
    

    und da wieder ne Schleife drum wie oben.

    so far

    Phil

    EDIT1/2: Tippfehler



  • del me



  • nope mhm vielleicht versuch ich mal anders ranzugehen
    also:

    char **ptr = new char*[size];     
      for (i=0; i<size; ++i)           
      { ptr[i] = new char[20];         
      }
    

    erstellt ja nen 2-dim. Array > ptr[][]

    wie muss ich diesen Quelltext umändern um einen 4-dim. Array hinzubekommen - siehe aufgabenstellung?!
    also > ptr[][][][];



  • int i,j,k;
      int size = 10;
      char**** ptr;
      ptr = new char*** [size];
    
      for ( i = 0; i < size; i++ )
        ptr[i] = new char** [size];
    
      for ( i = 0; i < size; i++ )
        for ( j = 0; j < size; j++ )
          ptr[i][j] = new char* [size];
    
      for ( i = 0; i < size; i++ )
        for ( j = 0; j < size; j++ )
          for ( k = 0; k < size; k++ )
            ptr[i][j][k] = new char [size];
    


  • ACidernie schrieb:

    Es sollen ausserdem Notenpunkte sein also von 1-15 und char speichert ja nur eine stelle 😕

    Wenn du es als Zeichen ausgibst ja, als Wert stehen aber 256 Zahlen zur Verfuegung.

    pli schrieb:

    cout << "Name: " << ptr[i] << "\tS-Note: " << ptr[i+1] << "\tM-Note : " << ptr[i+2] << endl;
    

    aendern in

    cout << "Name: " << ptr[i] << "\tS-Note: " << (int)ptr[i+1][0] << "\tM-Note : " << (int)ptr[i+2][0] << endl;
    

    und schon gehts.



  • thx Sovok sieht super aus ^^
    glaub damit kann ich was anfangen, wenn ich noch probs hab poste ich hier wieda rein...

    EDIT: mhm ich glaub es is doch viel zu viel speicher reserviert ^^
    ich brauch ja z.b. bei 5 namen max. 20 zeichen also

    5*20 = 100 zeichen + 5*10 mündl. notenpunkte = 50 + 5*3 schriftl. Notenpunkte = 15 = 165 zeichen...

    aber wenn ich nun > ptr[5][20][10][3] = ptr[Anzahl][Zeichen][mündl.][schriftl.]

    zuordne sind das doch viel zu viel oder irre ich mich?



  • So also ich wollte nun den Namen speichern und habe folgendes Problem...
    Hier erstmal der Quelltext...

    int main()
    { int i,j,k,l; 
      int size = 5; 
      char**** ptr; 
    
      ptr = new char*** [size]; 
    
      for ( i = 0; i < size; i++ ) 
        ptr[i] = new char** [20]; 
    
      for ( i = 0; i < size; i++ ) 
        for ( j = 0; j < 20; j++ ) 
          ptr[i][j] = new char* [10]; 
    
      for ( i = 0; i < size; i++ ) 
        for ( j = 0; j < 20; j++ ) 
          for ( k = 0; k < 10; k++ ) 
            ptr[i][j][k] = new char [3]; 
    
      for ( i = 0; i < size; i++ ) 
        for ( j = 0; j < 20; j++ )
          for ( k = 0; k < 10; k++ )
            for ( l = 0; l < 3; l++ )  
            { ptr[i][j][k][l] = '\0';
            }  
    
      for ( i = 0; i < size; i++ ) 
        for ( j = 0; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ )
        { ptr[i][j][0][0] = cin.get();
        }   
    
      for ( i = 0; i < size; i++ ) 
        for ( j = 0; j < 20; j++ )   
        { cout<<ptr[i][j][0][0];
        }        
    
      getchar();
      return 0;
    }
    

    in

    for ( j = 0; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ )
    

    überprüfe ich ja ob Enter gedrückt wurde allerdingt kommt eine fehlermeldung beim ausführen... änder ich jedoch [j-1] in [j] gehts, jedoch ist ja so der sinn "entstellt"



  • for ( j = 0; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ )
    

    denk mal über den ersten durchlauf nach

    ptr[i][-1][0][0] != '\n';

    natürlich gibt das n fehler... kannst ja ned auf index -1 zugreifen



  • ahh vielen dank für die schnelle hilfe ^^



  • ##include <iostream.h>
    #include <conio.h>
    void clear();
    int main()
    { int i,j,k,l; 
      int size_sch=1, size_mdl=1, size_sfl=1,Summe_mdl=0,Summe_sfl=0; 
      char**** ptr; 
    
      ptr = new char*** [size_sch]; 
    
      for ( i = 0; i < size_sch; i++ ) 
        ptr[i] = new char** [20]; 
    
      for ( i = 0; i < size_sch; i++ ) 
        for ( j = 0; j < 20; j++ ) 
          ptr[i][j] = new char* [size_mdl]; 
    
      for ( i = 0; i < size_sch; i++ ) 
        for ( j = 0; j < 20; j++ ) 
          for ( k = 0; k < size_mdl; k++ ) 
            ptr[i][j][k] = new char [size_sfl]; 
    
      for ( i = 0; i < size_sch; i++ ) 
        for ( j = 0; j < 20; j++ )
          for ( k = 0; k < size_mdl; k++ )
            for ( l = 0; l < size_sfl; l++ ) 
            { ptr[i][j][k][l] = '\0';
            }
    
      i=0;           
      while(i<size_sch)
      { clear();
        clrscr();
    
        cout<< i+1 << ". Name: ";
        for ( j = 1; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ )
          ptr[i][j][0][0] = cin.get(); 
    
        clear();
        for( k = 0; k < size_mdl; k++ )
        { clear();
          cout<< k+1 << ". Notenpunkte mündl.: ";
          cin>>ptr[i][0][k][0];
    
        }
    
        clear();
        for( l = 0; l < size_sfl; l++ )     
        { clear();
          cout<< l+1 << ". Notenpunkte schriftl.: ";
          cin>>ptr[i][0][0][l];          
    
        }    
        i++;         
      } 
    
      cout<< endl<<endl;
      i=0;
    
      while(i<size_sch)
      { for ( j = 1; j < 20; j++ )
          cout<< ptr[i][j][0][0]; 
    
        for( k = 0; k < size_mdl; k++ )
        { cout<< endl << ptr[i][0][k][0]<<endl;      
        }
    
        for( l = 0; l < size_sfl; l++ ) 
        { cout<<ptr[i][0][0][l]<<endl;          
        }    
        i++;         
      }        
    
      getchar();
      return 0;
    }
    
    void clear()
    { cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); 
    }
    

    nun folgendes problem:

    bei der ausgabe der mündl. note gibt er immer die schriftliche aus...
    is ja klar weil einma die beiden fälle gleich sind... aber ka wie ich das umschreibe



  • -.-


Anmelden zum Antworten