Mehrdimensionale Vektoren



  • Hallo.
    Ich habe mich irgendwie an folgender Sache festgebissen:

    Ich deklariere einen mehrdimensionalen Vektor und möchte nachfolgend strings in bestimmte Felder einschreiben.
    dies funzt jedoch nicht wie ich es will.
    Folgende möglichkeit ist mir natürlich bekannt:

    char namenliste[10][10]={{"dödel"},{"affe"},{"spacken"}};

    ich möchte es aber folgendermassen(ist mir klar das der folgende code falsch ist - soll nur darstellen wie ich es vor habe):

    char namenliste[][];
    namenliste[0][0]="dödel";
    namenliste[1][0]="affe";
    namenliste[2][0]="spacken";

    Ich möchte also eine beliebig grosse Matrix bilden und im nachhinein die Felder füllen.
    Der compiler versteht nun aber nicht was ich von ihm will.

    Wie müsste dies richtig aussehen, das der compiler wieder mein Freund wird...

    danke schon mal.



  • Wenn du die Maximalanzahl an Strings kennst:
    char *foo[N];

    ansonsten:

    char **foo;



  • also,ich hätte vielleicht noch erwähnen sollen, das ich noch lang kein profi im programmieren bin.

    was heissen soll mit: wenn nicht das, ansonsten das, kann ich nicht wirklich was anfangen.

    Was ist denn foo?

    Soll das ganze heissen ich muss ein zeiger auf meinen vektor zeigen lassen?



  • Das erste foo ist ein Array von Zeiger auf char. Da ein String in C nichts anderes ist als ein (null terminiertes) Char-Array, kann quasi jedes Element von foo einen String aufnehmen:

    int main(int argc, char *argv[]) {
        char *foo[10]; // 10elementiges Array von char* (jedes char* ist ein String)
        foo[0] = "Hallo";
        foo[1] = "Welt";
    
        printf("%s %s\n", foo[0], foo[1]);´
        return 0;
    }
    

    Das zweite foo ist ein Zeiger auf Zeiger vom Typ char. Damit kannst du zur Laufzeit die richtige Anzahl Speicher reservieren, falls du zu Beginn noch nicht weißt, wie viele Strings du benötigst:

    int main(int argc, char *argv[]) {
       int n = 20;
       char **foo;
    
       foo = (char**)malloc(sizeof(char*) * n);
       foo[0] = "Hallo";
       foo[1] = "Welt";
    
       printf("%s %s\n", foo[0], foo[1]);
       return 0;
    }
    


  • aha, das liest sich doch schon mal sehr gut, werds gleich probieren.eine frage vorab sei noch gestattet:
    kann ich dies bedenkenlos auf mehrdimensionale vektoren anwenden?

    vielen dank für deine mühe.



  • Ich weiß nicht genau was du meinst. Im Grunde ist ja bereits char foo[3] oder char foo[11] ein mehrdimensionaler Vektor.
    Meinst du damit sowas wie einen Würfel/Hyper-Würfel von Vektoren?



  • ich meine sowas zum beispiel:

    http://www.fh-augsburg.de/informatik/vorlesungen/c_cplus/tutorial/cyris/c-kurs3.htm#3_felder_und_zeiger

    oder wie einer mathematische matrix.
    eindimensional sind es ja nur zeilen, mehrdimensional sind es zeilen und spalten.



  • Naja, ein Feld kann eben in einen Zeiger konvertiert werden bzw. ein Zeiger kann auf ein Feld zeigen.
    Was genau du nun wissen willst, ist mir nicht klar. Aber ich glaube, du solltest dich noch etwas mit Zeigern und Arrays beschäftigen 😉



  • this->that schrieb:

    foo = (char**)malloc(sizeof(char*) * n);
    

    und wieder die altbekannte unsitte: den rückgabewert von malloc bitte nicht casten.
    🙂



  • Hallo.

    Ja das stimmt, nur Übung macht den Meister.
    Aber ich denke es haut jetzt hin, der compiler war zufrieden (auch wenn das nix heissen muss).

    [cpp]/***********************************************/
    /*        Pointer als Funktionenparamter       */
    /*   Zugriff auf Vektorelemente über Pointer   */
    /*	    	   Datei Ein-/Ausgabe              */
    /*                                             */
    /*             xx.xx.2007 xxx                  */
    /***********************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <math.h>
    #include <string.h>
    
    #define NAME 50
    #define LAENGE 20
    
    int  pruefealphabet (char *p_name1,char *p_name2 );				//Funktionsdeklaration
    void namentausch    (char *p_name1,char *p_name2 );				//Funktionsdeklaration
    
    int i_status;
    
    int main ()
    {
    
    // Variablendefinitionen und Feldinitialisierung
    
    	char p_name [NAME][LAENGE]={0};
    	char DateiName[10];
    	FILE *pNAMEN;
    
    	int i=0,i_vertauschstatus,i_counter=0;
    
    //Abfrage des Dateinamens
    	printf("\nBitte Dateinamen eingeben:");
    	scanf ("%s",DateiName);
    
    //Datei öffnen mit Fehlerbehandlung
    	if((pNAMEN=fopen(DateiName,"r"))==NULL)
    	{
    		printf("\nFehler beim Oeffnen der Datei %s",DateiName);
    		return(-1);													//Fehlercode zurück ans Betriebssystem
    	}
    	printf("\nDatei %s wurde erfolgreich geoeffnet-Daten werden eingelesen\n",DateiName);
    
    //Daten wortweise einlesen bis Dateiende--->feof
    	for(i; !feof(pNAMEN); i++)
       {
    		fgets(&p_name[i][0], 100, pNAMEN);
    		i_counter++;
       }
    	i_counter--;
    
    //eigentliche Überprüfung auf Rangfolge, mit anschließendem evtl.vertauschen durch Funktionen	
    	do
    	{i_vertauschstatus=0;
    
    		for(i=0;p_name[i+1][0]!=0;i++)
    		{	if(i==(NAME-1))
    			break;
    			i_status=pruefealphabet (&p_name[i][0],&p_name[i+1][0]);
    			if(i_status==-1)
    			{
    				namentausch(&p_name[i][0],&p_name[i+1][0]);
    				i_vertauschstatus=1;
    			}
    
    		}
    	}while(i_vertauschstatus==1);
    
    //Bildschirmausgabe
    
    	for(i=0;i<i_counter;i++)
    	{	
    
    		printf(p_name[i]);
    	}
    
    return 0;	
    }	
    
    //Funktion zur Feststellung der alphabetischen Reihenfolge
    
    int pruefealphabet (char *name1,char *name2)
    {
    	int j=0,i_zeichen1,i_zeichen2,len1=0,len2=0;
    
    //Bestimmung der Länge der Strings zur Verwendung als Abbruchbedingung
    	len1=strlen(name1)-1;
    	len2=strlen(name2)-1;
    
    	/*printf("\n%d\n",len1);
    	printf("%d\n",len2);*/
    
    //Prüfung auf Reihenfolge,ansonsten <Return i_status=0>, wenn kein Unterschied bis stringende
    		for (j=0; j!=len1 || j!=len2  ;j++)
    		{
    
    			i_zeichen1=name1[j];
    			i_zeichen2=name2[j];
    			if (i_zeichen1<i_zeichen2)
    			{
    				i_status= 1;
    				break;
    			}
    
    			if (i_zeichen1>i_zeichen2)
    			{
    				i_status= -1;
    				break;
    			}
    
    		}
    
    return i_status;
    
    }
    
    //Funktion zum Tauschen zweier Namen
    
    void namentausch (char *name1,char *name2)
    {
    	char temp[LAENGE];
    
    	strcpy(temp,name1);
    	strcpy(name1,name2);
    	strcpy(name2,temp);
    
    }[/cpp]
    

    Danke für die Hilfe


Anmelden zum Antworten