Zum Inhalt springen

uga_dawg

Mitglieder
  • Gesamte Inhalte

    7
  • Benutzer seit

  • Letzter Besuch

Beiträge von uga_dawg

  1. Warum willst du denn mit einem Zeiger durch dein Array laufen?

    Es ist so, dass in dem eigentlichen Programm die Funktion h() in einer anderen Klasse liegt und auch liegen soll. wenn ich dann ein mehrdimensionales Array uebergebe, erhalte ich ja nur einen Zeiger darauf. das (aus meiner sicht)groessere Probelem ist aber, dass die dimensionen des Arrays zwar zum Zeitpunkt der Funktion h() fest sind, aber eingabenabhaengig sind. daher geht soeien const zeilen = ...; nicht und ich koennte auch nicht sowas schreiben wie

    
    h(std::vector<int> M[zeilen][spalten]);
    
    
    denn zeilen und spalten sind wie gesagt von aufruf zu aufruf verschieden. falls es jedoche eine andere Moeglichkeit gibt das Array zu traversieren, dann bin ich mehr als bereit mir das anzuschauen und zu nutzen (sofern nuetzlich ;))
    Und ist es wirklich unbedingt notwendig, dass die Elemente Zeiger sind?
    na also ich dachte an zeiger, da ich wie in dem codebeispiel oben neue Objekte erstellen will und muss. Da ich hierfuer nicht immer einen kopierkonstruktor anschmeissen will, hab ich gehofft mit zeigerumbiegen das zu erreichen was ich will. also was ich eigentlich will ist praktisch nicht
    
    std::vector<int> M[zeilen][spalten];
    
    
    sondern
    
    std::vector<*int> M[zeilen][spalten];
    
    
    aber sowas wird wohl nicht funktionieren, oder ich hab noch nicht raus wie. kurzum ich will keinen Vector von objekten, sondern einen Vector mit zeigern auf diese Objekte um mir kopieraktionen zu sparen um effizienter zu arbeiten. gibt es eine anderen moeglichkeit, bin ich natuerlich offen. es kann natuerlich sein, dass mein fehler in der sprachkenntnis liegt. gibt es eine andere moeglichkeit einem vectoreintrag eine variable zuzuordnen ohne zu kopieren?
    Und das hier:
    *(new int(rand() % 9 + 1))

    ist ein astreines Speicherleck. Die Zeiger kannst du nie wieder freigeben.

    seh ich ein, schon bloed, danke, sowas soll natuerlich unbedingt vermieden werden ;)

    ich hoffe es ist ungefaehr klar was ich ueberhaupt will...

  2. okay, das scheint so weit das zu machen was ich will und brauche. nun habe ich das problem, dass ich nicht weiss, wie ich, wenn ich das ganze an eine function uebergebe, an meine daten komme. insbesondere weiss ich nicht so recht wie weit ich meine schreittweite waehlen muss wenn ich mit nem zeiger durch meine 2dimArray laufe.

    ich habe momentan folgenden code, vielleicht (d.h. bestimmt) habt ihr noch weitere hilfsvorschlage.

    
    #include <iostream>
    
    #include <stdlib.h>
    
    #include <time.h>
    
    #include <vector>
    
    
    void h( std::vector<int> *M, int zeilen, int spalten,int laenge){
    
    	std::vector<int> *pointer = M;
    
    	std::vector<int> helfer;
    
    
    	for(int i=0; i<zeilen; i++){
    
    		std::cout << "\t*[  ";
    
    		for(int j=0; j<spalten; j++){
    
    			helfer = *pointer;
    
    			std::cout << "(";
    
    			for(int k=0; k<laenge; k++){
    
    				std::cout << helfer[k] << ",";
    
    			}
    
    			pointer += sizeof(pointer); // denke hier liegt u.a. ein fehler
    
    			std::cout << ")  ";
    
    		}
    
    		std::cout << "]\n";
    
    	}
    
    }
    
    
    
    int main()
    
    {
    
    	int zeilen = 3;
    
    	int spalten = 4;
    
    	int laenge = 2; // spater verschieden
    
    	srand(15);
    
    
    	std::vector<int> *M[zeilen][spalten];
    
    
    	for(int i=0; i<zeilen; i++){
    
    		std::cout << "\t[  ";
    
    		for(int j=0; j<spalten; j++){
    
    			M[i][j] = new std::vector<int>(laenge);
    
    			std::cout << "(";
    
    			for(int k=0; k<laenge; k++){
    
    				(*M[i][j])[k] =  *(new int(rand() % 9 + 1));
    
    				std::cout << (*M[i][j])[k] << ",";
    
    			}
    
    			std::cout << ")  ";
    
    		}
    
    		std::cout << "]\n";
    
    	}
    
    	std::cout << "**************************\n";
    
    
    	h(M[0][0],zeilen,spalten,laenge);
    
    
    	std::cout << "\nprog ended successfully\n";
    
    	return 0;
    
    } // end main()
    
    

    dabei habe ich mich erstmal nicht auf eine matrix[][] klasse versteift, da gehofft hatte mir den aufwand zu ersparen eine geeignete klasse zu suchen (die soll ja pointer belieber typen enthalten und neuschreiben wollte ich's als newbie auch erstmal nicht, da ich dann auch operatoren neudefinieren muesst um sie wirklich sinnvoll einsetzen zu koennen...)

  3. hmn...

    ich schaetze soeine Matrixklasse wird wohl auch ueber arrays definiert sein, nur dass man dann in einer methode die die matrix uebergeben bekommt ganz einfach drauf zugreifen kann mit der doppelindizierung [][].

    und die vector<int> klasse wird wohl auch zugriff in O(1) gewaehrleisten und mit bekannten groessen keinen speicheroverhead haben.

    perfect, klingt supi! danke fuer den tipp, dann muss ich mich hier nichtmehr rumquaelen.

    vielen dank fuer's augen oeffnen :D

  4. Musst Du das mit Zeigern machen?

    Oder könntest Du auch höhere Datentypen, wie Template-Klassen nehmen?

    also allg geht es um eine approximation von funktionen in der numerik, also mathematische berechnung. daher sind also viele koeffizienten direkt zu benennen, daher mein ansatz mit arrays. ich bin aber natuerlich gerne bereit andere modellierungen zu waehlen.

    Momentan hab ich mich leider darauf beschraenken muessen, in der letzten dimension die groesstmoegliche tiefe rauszusuchen, das ganze dreidim mit festen letzten groessen zu machen und dann nur zeiger im array zu haben. ABER, das wird wohl nur fuer testbeispiele gehen, fuer interessante groessen befuerchte ich, dass mir die kiste dann mit speicherplatz um die ohren fliegt... na ja. also zumindest daher meine intention effizienz bzgl speicherplatz und performance.

    Und wo genau ist Dein Problem? Deklaration, Instanziieren, Füllen?

    leider bei so ziemlich allem. zu testzwecken arbeite ich mit integern. ich schaetze, dass sich bei mir das verstaendnis fuer zeiger noch nicht genuegend gesetzt hat.

    also gedacht ist ja wie oben geschrieben ein 2dim array mit zeigern, daher schreibe ich

    int * M[zeilen][spalten],

    damit sollte ich ja nun ein 2dim array mit zeigern auf ints haben. um die eintraege festzulegen schreibe ich dann

    M[j] = new int[laenge]

    wobei diese laenge fuer alle iterationen der i,j verschieden sind. das hier kann aber schonmal nicht stimmen, da ich ja keine array mit integern haben moechte, sondern mit zeigern auf integers. und da liegt das hase im pfeffer.

    ich hab's mit sachen wie int ** M[zeilen][spalten] probiert und so, aber da reicht dann mein verstaendnis der zeiger eben nicht weit genug... na ja, zumindest sollte dann letztlich sowas stehen wie

    M[j][k] = new int(2);

    oder so, wobei ich schaetze, dass ich es wohl kaum schaffen werde die letzte dimension mit diesen einfach [] klammern anzusprechen.

    hoffe es ist nun klarer wo mein problem liegt und wo ich hin will.

    danke uebrigens fuer die fixe antwort.

  5. hallo erstmal.

    ich habe folgendes problem und wie ihr sicher schon erraten habt, geht es um ein allseits bekanntes: zeigerzeugs. ich bin neu in C++ und habe auch schon viel nachgelesen und versucht, aber irgendwie klappt es diesmal nicht so recht.

    folgendes: ich brauche ein 3-dimensionales array von zeigern, wobei jedoch die letzte dimension erst zur laufzeit bekannt ist und alle verschieden sind.

    meine idee ist bisher wie folgt

    ein zweidimensionales array von zeigern erzeugen (ich nenn's mal A). die zeiger darin zeigen abermals auf arrays verschiedener groessen die auch wieder zeiger enthalten. diese letzten zeiger sollen dann auf die objekte gerichtet sein, die ich tatsaechlich benoetige.

    damit nicht genug, ich muss das ganze noch an eine methode uebergeben, da ich schaetze, dies kann ich mit einem pointer auf A[0][0] oder so regeln und mich dann durchhangeln.

    ich hoffe ihr koennt mir helfen und falls ich noch etwas unklar erlaeutert habe, dann sagt es schnell an, damit das dann aus der welt ist und ich hier weiterkomme :(

    DANKE

  6. (...)

    Ich weiss nicht mehr genau, welches Paket ich verwendet habe, aber ich kann gern die Befehle posten, die in meiner Header-File stehen:

    \usepackage[T1]{fontenc}

    \usepackage[latin1]{inputenc}

    \usepackage{helvet}

    \usefont{T1}{phv}{m}{n}

    \renewcommand{\encodingdefault}{T1}

    \renewcommand{\rmdefault}{phv}

    Vielleicht hilft das ja weiter.

    LG tarris

    hallo.

    also ich haette eine anmerkungen dazu: mit dem befehl

    \renewcommand{\rmdefault}{phv}

    ueberschreibst du dir deine "normale" schrift (das sollte die roman sein, daher das rm im namen). das willst du eigentlich nicht. solltest du naemlich auf verschieden schriftfamilien zugreifen, dann tut es nicht dass was du willst. ich bin mir auch nicht sicher, aber ich glaube, dass du damit den font in footnotes nicht aenderst. dies sollte naemlich fndefault sein... oder so.... ach ja, bei minipages klappt das dann auch nicht, das waere mpdefault oder so. na ja, das dazu, also du willst nicht x-verschieden schriften umbiegen um dann spaeter nur mit umstaendlicher art und weise wieder auf eine serifenschrift zu gelangen. der befehl den du suchst ist:

    \renewcommand{\familydefault}{\sfdefault}

    womit du die standardschrift auf serifenlos (sans-family) setzt. aus:

    TeX, LaTeX, DANTE e.V.: FAQ - Fragen und Antworten (Part 10 of 11)

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...